#include #include #include volatile uint32_t milli_ticks; void led1on() { PORTB.OUTSET |= PIN0_bm; } void led1off() { PORTB.OUTCLR |= PIN0_bm; } void led2on() { PORTC.OUTSET |= PIN0_bm; } void led2off() { PORTC.OUTCLR |= PIN0_bm; } void led3on() { PORTC.OUTSET |= PIN1_bm; } ISR(TCB0_INT_vect) { milli_ticks++; TCB0.INTFLAGS |= 1; } void led3off() { PORTC.OUTCLR |= PIN1_bm; } uint32_t get_millis() { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { return milli_ticks; } } void set_millis(uint32_t newVal) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { milli_ticks = newVal; } } void main(void) { //LED 1-3 PORTB.DIRSET |= PIN0_bm; PORTC.DIRSET |= (PIN0_bm | PIN1_bm); led2on(); led3on(); //Timer auf 20000 (1 ms), aktivieren mit Interrupt TCB0.CCMPL = 0b00100000; TCB0.CCMPH = 0b01001110; //Enable Timer TCB0.CTRLA |= 1; //Enable Capture TCB0.INTCTRL |= 1; sei(); while (1) { uint32_t loop_millis = get_millis(); //0-1000 an, 1001-2000 aus if (loop_millis > 400) { set_millis(0); } else if (loop_millis > 200) { led1off(); } else { led1on(); } } }