Lösung: Arduino UNO LED-Dimmer

Aufgabe a

C-Quelltext:

#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	DDRD = 0b11111111;
	
	PORTB = 0b00000110;
	
	OCR0A = 0;
	OCR0B = 0;
	
	TCCR0A = 0b10100011;
	TCCR0B = 0b00000101;
	
	
	while (1)
	{
		if (!(PINB & 0b00000010))
		{
			OCR0A += 10;
			OCR0B += 10;
			_delay_ms(100);
		}
			
		if (!(PINB & 0b00000100))
		{
			OCR0A -= 10;
			OCR0B -= 10;
			_delay_ms(100);
		}
	}
}

Aufgabe b

C-Quelltext:

#include <avr/io.h>
#include <stdint.h>


int main(void)
{
	DDRD = 0b11111111;
	
	PORTB =0b00000110;
	
	TCCR0B = 0b00000101;
	
	uint8_t soll=30;
	uint8_t delay=255;
	
	while (1)
	{
		if (!(PINB & 0b00000010))
		{
			soll = soll + 10;
			for (int i=0 ; i<=delay ; i++)
			{
				for(int j=0 ; j<=delay; j++)
				{
					if (TCNT0 <= soll)
					{
						PORTD = 0b11111111;
					}
					else
					{
						PORTD = 0b00000000;
					}
				}
			}
		}
			
		if (!(PINB & 0b00000100))
		{
			soll = soll - 10;
			for (int i=0 ; i<=delay ; i++)
			{
				for(int j=0 ; j<=delay; j++)
				{
					if (TCNT0 <= soll)
					{
						PORTD = 0b11111111;
					}
					else
					{
						PORTD = 0b00000000;
					}
				}
			}
		}
		
			
	if (TCNT0 <= soll)
	{
		PORTD = 0b11111111;
	}
	else
	{
		PORTD = 0b00000000;
	}
		
	}
}

C-Quelltext (mit Funktion):

#include <avr/io.h>
#include <stdint.h>

void PWM(int soll)
{
	if (TCNT0 <= soll)
	{
		PORTD = 0b11111111;
	}
	else
	{
		PORTD = 0b00000000;
	}
}

int main(void)
{
	DDRD = 0b11111111;
	PORTD |= 0b00000000;
	
	PORTB =0b00000110;
	
	TCCR0B = 0b00000101;
	
	uint8_t soll=30;
	uint8_t delay=255;
	
	while (1)
	{
		if (!(PINB & 0b00000010))
		{
			soll = soll + 10;
			for (int i=0 ; i<=delay ; i++)
			{
				for(int j=0 ; j<=delay; j++)
				{
					PWM(soll);
				}
			}
		}
			
		if (!(PINB & 0b00000100))
		{
			soll = soll - 10;
			for (int i=0 ; i<=delay ; i++)
			{
				for(int j=0 ; j<=delay; j++)
				{
					PWM(soll);
				}
			}
		}