Hallo erst mal
Ich möchte mit dem ATxMega128A3U einen 32 Bit counter initialisieren.
Ich verwende TCE0 als untere 16bit, über Eventchannel 0 tackte ich TCE1.
Der Code sieht wie folgt aus. Funktioniert aus irgend einem Grund aber
noch nicht.
1 | //#################################### Timer
|
2 | #define IMPULSE_TIMER0 TCE0
|
3 | #define IMPULSE_TIMER1 TCE1
|
4 |
|
5 | //####################################################### Int Timer
|
6 | ISR(TCE1_CCA_vect) // Top 16 Bit Capture
|
7 | {
|
8 | put_Nr(0,pageBreak(),0,0,BLACK,IMPULSE_TIMER1.CNT,HEX);
|
9 | IMPULSE_TIMER1.CTRLA = 0x00; // Turnoff Timer 1
|
10 | IMPULSE_TIMER1.CNT = 0;
|
11 | IMPULSE_TIMER1.INTCTRLB = 0x00;
|
12 | IMPULSE_TIMER0.PER = (uint16_t)((CommandPtr->Time)*4);
|
13 | IMPULSE_TIMER0.CNT = 0; // Reset Timer
|
14 | IMPULSE_TIMER0.INTCTRLA = TC_OVFINTLVL_HI_gc; // Interrupt when low 16 bit Value is reached.
|
15 | }
|
16 |
|
17 | ISR(TCE0_OVF_vect)
|
18 | {
|
19 | IMPULSE_TIMER0.CTRLA = 0x00; // Turnoff Timer 0
|
20 | IMPULSE_TIMER0.CNT = 0;
|
21 | IMPULSE_TIMER0.INTCTRLA = 0x00;
|
22 | SWITCH_HW_PORT.OUT ^= CommandPtr->SwitchNr; // Invert Output
|
23 | ExternalClick();
|
24 | }
|
25 |
|
26 | void startTimer(TC0_t * Timer0, TC1_t * Timer1, uint32_t Compare)
|
27 | {
|
28 | Timer0->CTRLA = TC_CLKSEL_DIV8_gc;
|
29 | Compare *= 4;
|
30 | if (Compare > 0xFFFF)
|
31 | {
|
32 | EVSYS.CH0MUX = EVSYS_CHMUX_TCE0_OVF_gc;
|
33 | Timer1->CTRLA = TC_CLKSEL_EVCH0_gc;
|
34 | Timer1->CTRLB = TC1_CCAEN_bm;
|
35 | Timer1->CCA = (uint16_t)(Compare>>16);
|
36 | Timer0->CNT = 0; // Reset Timer
|
37 | Timer1->CNT = 0;
|
38 | Timer1->INTCTRLB = TC_CCAINTLVL_HI_gc; // IntLVL HIGH
|
39 | }
|
40 | else
|
41 | {
|
42 | Timer0->CTRLB = 0;
|
43 | Timer0->PER = (uint16_t)Compare;
|
44 | Timer0->CNT = 0; // Reset Timer
|
45 | Timer0->INTCTRLA = TC_OVFINTLVL_HI_gc; // IntLVL HIGH
|
46 | }
|
47 | }
|
Vielleicht kann mir ja einer helfen.
Schon mal danke im Voraus.
Jérôme