Forum: Mikrocontroller und Digitale Elektronik Timer Interrupt Atmel SAM G53N


von fly (Gast)


Lesenswert?

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
}

von fly (Gast)


Lesenswert?

Jetzt funktioniert es seltsamerweise...

Ich wollte schauen welche Bits im Statusregister gesetzt sind, wenn der 
Handler aufgerufen wird. Wenn ich die darin abfrage funktioniert es auf 
einmal richtig.
1
void TC0_Handler()
2
{
3
  pio_toggle_pin_group(PIOA, SERVO_A2);
4
  aktuellerwert = TC->TC_CHANNEL[0].TC_CV ;
5
  test = TC->TC_CHANNEL[0].TC_SR;
6
}

Ich kann mir das nichts erklären.
Nichts wurde geändert ausser dieser Zeile.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.