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

#define SSR_ON		PORTD |= (1<<PD1);					// Makro: SSR einschalten
#define SSR_OFF		PORTD &= ~(1<<PD1);					// Makro: SSR ausschalten


volatile int32_t timer = 0;								// Timer
volatile uint32_t dimm = 100;							// Dimmer-Wert
uint8_t i = 0;											// Zähler
uint8_t add = 0;										// Flag



	// Zero-Cross-Detection
	ISR(INT0_vect)										// Externer Interrupt
	{

		timer = 0;										// Timer zurücksetzen

	}

	// Timer-Tick:
	ISR (TIMER0_COMPA_vect)								// Timer-Overflow (1MHz / 256 = 3906 Hz = 256µs)
	{

		timer++;										// Timer-Tick weiterzählen

		if (timer >= 170) timer = 0; 					// Nächster Nulldurchgang

			if (timer > dimm)							// Timer hat Wert erreicht (0-40)
			{
				SSR_ON									// SSR einschalten
			}
			else										// Wert noch nicht erreicht
			{
				SSR_OFF									// SSR ausschalten
			}

	}

int main (void) {

	DDRD  |= (1 << PD1);								// SSR zünden (Ausgang)
	DDRD &= ~ (1 << PD2);								// ZC (Eingang)

	// Interrupt ZC-Detection:
	sei();												// Interrupts global aktivieren
	EICRA |= (1<<ISC01) | (1<<ISC00); 					// Steigende Flanke
	EIMSK |= (1<<INT0);									// für INT0 (ZC)

	// Timer

	TCCR0A = (1 << WGM01);
	TCCR0B = (0 << CS02) | (0 << CS01) | (1 << CS00); 	 // kein Vorteiler
	TIMSK0 = (1 << OCIE0A); 							 // Compare Match Interrupt
	OCR0A = 100;

	while (1)
	{ }

return 0;

}
