Hallo,
ich habe ein Problem mit dem Timer Interrupt auf einem SAM G53N.
Ich will beim Wert in RA einen Interrupt auslösen.
Der Timer läuft Ordnungsgemäß, das habe ich getestet.
Nur der Interrupt funktioniert nicht richtig.
Er wird viel zu oft aufgerufen, und scheinbar auch willkürlich.
Habe deshalb mal geschaut bei welchen Werten die ISR ausgerufen wird.
Diese sind immer unterschiedlich.
Auf dem Oszi sehe ich ca. 260khz.
Ich finde das Problem nicht.
1 | uint32_t aktuellerwert = 0;
|
2 | uint32_t ra, rc; // PWM
|
3 | uint8_t wt = 0;
|
4 |
|
5 | int main (void)
|
6 | {
|
7 | sysclk_init(); // 48Mhz einstellen
|
8 | wdt_disable(WDT); // Watchdog ausschalten
|
9 | SystemCoreClockUpdate(); // Systemclock akualisieren
|
10 | pmc_enable_periph_clk(ID_PIOA);
|
11 | pio_set_output ( PIOA, SERVO_A1 | SERVO_A2 | SERVO_B1 | SERVO_B2 | SERVO_C1 | SERVO_C2 ,LOW,DISABLE,DISABLE);
|
12 |
|
13 | // TIMER
|
14 | NVIC_EnableIRQ(TC0_IRQn);
|
15 |
|
16 | sysclk_enable_peripheral_clock(ID_TC0);
|
17 | tc_init(TC, 0,
|
18 | TC_CMR_TCCLKS_TIMER_CLOCK1 // Waveform Clock Selection
|
19 | | TC_CMR_WAVE // Waveform mode
|
20 | | TC_CMR_WAVSEL_UP_RC // Bei RC zurücksetzen
|
21 | );
|
22 |
|
23 | rc = (SystemCoreClock /2 /10000); // 10khz
|
24 | tc_write_rc(TC, 0, rc); // RC einstellen
|
25 | ra = (rc / 2); // 50%
|
26 | tc_write_ra(TC, 0, ra); // RA einstellen
|
27 |
|
28 | TC->TC_CHANNEL[0].TC_IER = TC_IER_CPAS;
|
29 | tc_start(TC, 0);
|
30 |
|
31 |
|
32 | while(1)
|
33 | {
|
34 | wt++;
|
35 | }
|
36 | }
|
37 |
|
38 | void TC0_Handler()
|
39 | {
|
40 | pio_toggle_pin_group(PIOA, SERVO_A2);
|
41 | aktuellerwert = TC->TC_CHANNEL[0].TC_CV ;
|
42 | }
|