Hallo, versuche folgendermassen einen periodischen 1s interrupt zu generieren. - Normaler Clock wie nach Aufstarten (2MHz). - RTC auf internem 32768Hz mit 32x prescaler (1024Hz) - Interrupt auf periodisch setzen (Period Register) - Periode auf 1024 -> Logischerweise sollte das OVFIF nach 1s gesetzt werden, aber die Interrupt-Routine wird nicht aufgerufen. Dadurch, dass ich den RTC-Clock auf den Ausgang PR0 setze kann ich den Clock messen, welcher 1024Hz clockt, das funktioniert also.
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | ISR(RTC_OVF_vect) { |
5 | PORTD.OUTTGL = 0x08; |
6 | }
|
7 | |
8 | int main(void) { |
9 | PORTA_DIR = 0xFF; |
10 | PORTC_DIR = 0xFF; |
11 | PORTD_DIR = 0xFF; |
12 | PORTR_DIR = 0x03; |
13 | PORTA.OUT = 0x20; // Reset control |
14 | my_delay(500, 0, 0); |
15 | PORTA.OUT = 0x00; // End Reset control |
16 | |
17 | // cli();
|
18 | PMIC.CTRL = 0x07; // Enable all interrupt levels |
19 | CLK.RTCCTRL = (CLK_RTCSRC_RCOSC_gc | CLK_RTCEN_bm); // select 32768/32 int osc |
20 | RTC.CTRL = RTC_PRESCALER_DIV1_gc; // no prescaler |
21 | RTC.PER = 0x0400; // Set the period for 1s (2^10) |
22 | RTC.INTCTRL = RTC_OVFINTLVL_HI_gc; // Enable of interrupt and set to level High |
23 | PORTCFG.CLKOUT = (PORTCFG_RTCCLKOUT_PR0_gc); // RTC to Pin R0 |
24 | |
25 | // sei();
|
26 | |
27 | while (1) { |
28 | PORTD.OUT = 0x01; |
29 | my_delay(300, 0, 0); |
30 | PORTD.OUT = 0x02; |
31 | my_delay(300, 0, 0); |
32 | }
|
33 | }
|