/* monoflop_01.c ATmega88 @ 8MHz */
#include <avr/io.h>
#include <avr/interrupt.h>

#define led1 (1<<PB0)
#define led2 (1<<PB1)


uint8_t glowtime = 10, glowtime_led_2, taster_flag = 0;
uint16_t timer_overflow_counter = 0;

void init_timer_0 (void)
{
	TCCR0B = (1<<CS01) + (1<<CS00);		// Prescaler = 64 -> 8Mhz/64 = 125000 clockspeed
	TIMSK0 = (1<<TOIE0);				// Timer0 overflow interrupt enable
	TCNT0 = 6;							// Timer mit 6 vorladen
}

int main(void)
{
	DDRB = 0xFF;	// PORTB Richtungsregister = Ausgang
	DDRC = 0xF0;	// PC0...PC3 auf Eingang
	PORTC = 0xF1;	// PC0 = Pull up
	
	init_timer_0(); // Timer 0 initialisieren
	sei();			// Interrupts einschalten
	
	while(1)
	{
		if (PINC &(1<<PINC0))			// Wenn Taster gedrückt wurde...
		{
			taster_flag = 1;			// Flag für Taster wurde gedrückt setzen
			glowtime_led_2 = glowtime;	// glowtime_led_2 auf Anfangswert 10 setzen
		}
	}
}

ISR(TIMER0_OVF_vect)
{
	if (timer_overflow_counter <= 499)	// Zählvariable 499 mal hochzählen
		timer_overflow_counter ++;
		
	else								// Den else-Zweig beim jedem 500, Durchlauf ausführen
	{
		TCNT0 = 6;						// reload timer0
		PORTB ^= led1;					// LED1 toggeln
		
		timer_overflow_counter = 0;		// Zähler zurücksetzen
		
		if (taster_flag == 1)			// Taster wurde gedrückt
		{
			PORTB |= led2;				// LED ON
			glowtime_led_2 --;			// glowtime_led_2 pro Sekunde um 1 runter zählen
			
			if (glowtime_led_2 == 0)
			{
				PORTB &= ~led2;				// LED OFF
				glowtime_led_2 = glowtime;	// glowtime_led_2 auf Anfangswert 10 setzen
				taster_flag = 0;			// Taster flag zurücksetzen
			}
		}
	}
}