Ich versuche gerade, einen Bausatz, den wir bislang mit ATtiny24
ausgerüstet haben, auf AVR16EB14 umzubauen.
Dazu gehört ein periodischer Timer-Interrupt, Wunschfrequenz ist 600 Hz.
Wenn ich in der Overflow-ISR einen IO-Pin einen Impuls ausgeben lasse,
dann messe ich allerdings 2,4 kHz.
Rechnung: der interne RC-Oszillator läuft mit voreingestellten 20 MHz,
die als Haupttakt durch 24 geteilt werden. (So schnell muss das Teil eh
nicht sein, und es spart Strom.) Das macht 833 kHz. Um auf 600 Hz
Periodendauer für Timer E0 zu kommen, wird dessen Periodenregister auf
1388 gesetzt, oder 0x56c.
Der Compiler rechnet das anhand einiger symbolischer Konstanten so aus,
aber das Compilat passt eigentlich:
1 | // 20 MHz high frequency RC oscillator / 24 => 0.866 MHz main system clock
|
2 | CLKCTRL.MCLKCTRLB = CLKCTRL_PEN_bm | CLKCTRL_PDIV_DIV24_gc;
|
3 | 25e: 87 e1 ldi r24, 0x17 ; 23
|
4 | 260: 80 93 61 00 sts 0x0061, r24 ; 0x800061 <__RODATA_PM_OFFSET__+0x7f8061>
|
5 |
|
6 | 00000264 <.Loc.147>:
|
7 | CLKCTRL.MCLKTIMEBASE = 1; // actually 1.2 µs, must be larger than 1 µs
|
8 | 264: 91 e0 ldi r25, 0x01 ; 1
|
9 | 266: 90 93 66 00 sts 0x0066, r25 ; 0x800066 <__RODATA_PM_OFFSET__+0x7f8066>
|
10 |
|
11 | 0000026a <.Loc.149>:
|
12 |
|
13 | /* TCE0: interrupt each 1/F_TIMER */
|
14 | TCE0.PER = F_CPU / F_TIMER;
|
15 | 26a: 2c e6 ldi r18, 0x6C ; 108
|
16 | 26c: 35 e0 ldi r19, 0x05 ; 5
|
17 | 26e: 20 93 26 0a sts 0x0A26, r18 ; 0x800a26 <__RODATA_PM_OFFSET__+0x7f8a26>
|
18 | 272: 30 93 27 0a sts 0x0A27, r19 ; 0x800a27 <__RODATA_PM_OFFSET__+0x7f8a27>
|
19 |
|
20 | 00000276 <.Loc.151>:
|
21 | TCE0.CMP0 = F_CPU / F_TIMER / DIM_DUTYCYCLE; /* dimmed LED turnoff time */
|
22 | 276: 25 e4 ldi r18, 0x45 ; 69
|
23 | 278: 30 e0 ldi r19, 0x00 ; 0
|
24 | 27a: 20 93 28 0a sts 0x0A28, r18 ; 0x800a28 <__RODATA_PM_OFFSET__+0x7f8a28>
|
25 | 27e: 30 93 29 0a sts 0x0A29, r19 ; 0x800a29 <__RODATA_PM_OFFSET__+0x7f8a29>
|
26 |
|
27 | 00000282 <.Loc.153>:
|
28 | TCE0.INTCTRL = TCE_CMP0_bm | TCE_OVF_bm; /* overflow and compare 0 interrupts */
|
29 | 282: 81 e1 ldi r24, 0x11 ; 17
|
30 | 284: 80 93 0a 0a sts 0x0A0A, r24 ; 0x800a0a <__RODATA_PM_OFFSET__+0x7f8a0a>
|
31 |
|
32 | 00000288 <.Loc.155>:
|
33 | TCE0.CTRLA = TCE_ENABLE_bm;
|
34 | 288: 90 93 00 0a sts 0x0A00, r25 ; 0x800a00 <__RODATA_PM_OFFSET__+0x7f8a00>
|
Dummerweise hat der 14-Pinner kein Pin für CLKOUT, einen AVR16EBxx mit
größerer Pinanzahl habe ich gerade nicht da. Sonst hätte ich einfach
schon mal den Haupttakt direkt messen können.
Hat jemand auf Anhieb eine Idee, warum das Teil viermal so schnell ist
wie geplant?