#include #include #define F_CPU 24000000UL #define setbit(P,BIT) ((P) |= (1<<(BIT))) #define clearbit(P,BIT) ((P) &= ~(1<<(BIT))) #define LED_RED_PORT PORTF #define LED_RED_BIT 1 #define LED_red_on() setbit(LED_RED_PORT.OUT,LED_RED_BIT) #define LED_red_off() clearbit(LED_RED_PORT.OUT,LED_RED_BIT) #define LED_GREEN_PORT PORTF #define LED_GREEN_BIT 0 #define LED_green_on() setbit(LED_GREEN_PORT.OUT,LED_GREEN_BIT) #define LED_green_off() clearbit(LED_GREEN_PORT.OUT,LED_GREEN_BIT) volatile uint16_t sys_tick_ms = 0; uint16_t sec_counter = 0; ISR(TCA1_CMP0_vect) { LED_green_on(); sys_tick_ms++; setbit(TCA1_SINGLE_INTFLAGS,TCA_SINGLE_CMP0_bp); LED_green_off(); } int main(void) { // crystal #define CPP_value 0xD8 // 0xD8 IOREG Unlock protected I/O reg CPU_CCP = CPP_value; // unlock protected register for 4 cycles CLKCTRL.MCLKCTRLA = 0x03; // Main clk src: ext clock (on evaluation board: 16MHz) CPU_CCP = CPP_value; CLKCTRL.XOSCHFCTRLA = 0b00010101; // crystal; startup time 1000 cycles, // oscillator enabled // overrides normal pin function // LEDs LED_red_off(); setbit(LED_RED_PORT.DIR,LED_RED_BIT); LED_green_off(); setbit(LED_GREEN_PORT.DIR,LED_GREEN_BIT); // 1. timer enable, Prescaler:1 clearbit(TCA1.SINGLE.CTRLA,TCA_SINGLE_CLKSEL_2_bp); clearbit(TCA1.SINGLE.CTRLA,TCA_SINGLE_CLKSEL_1_bp); clearbit(TCA1.SINGLE.CTRLA,TCA_SINGLE_CLKSEL_0_bp); setbit(TCA1.SINGLE.CTRLA,TCA_SINGLE_ENABLE_bp); // 2. Vergleichswert: OCR2 = F.CPU / PRESCALER * seconds; TCA1.SINGLE.CMP0 = F_CPU / 1 * 0.001; // 3. compare0 enable, clear timer on compare clearbit(TCA1.SINGLE.CTRLB,TCA_SINGLE_CMP0EN_bp); clearbit(TCA1.SINGLE.CTRLB,TCA_SINGLE_WGMODE_2_bp); clearbit(TCA1.SINGLE.CTRLB,TCA_SINGLE_WGMODE_1_bp); setbit(TCA1.SINGLE.CTRLB,TCA_SINGLE_WGMODE_0_bp); // 4. enable output compare match interrupt setbit(TCA1.SINGLE.INTCTRL,TCA_SINGLE_CMP0_bp); sei(); while (1) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { if (sys_tick_ms > 999) { sys_tick_ms -= 1000; sec_counter++; } } if (sec_counter >= 1) { LED_red_on(); sec_counter = 0; LED_red_off(); } } }