ATxmega256A3 Timer interrupt?

OP #2328504
Lesenswert?

Hallo,

ich benutze das AVRStudio 5 mit dem ASF. Aus dem ASF benutze ich den 
TC-Driver.

Nun möchte ich der Timer 0 mit einer Frequenz von 1Hz konfigurieren und 
aller 1s einen (compare-)interrupt auslösen. Ich möchte die "Frequency 
Waveform Generation" (FRQ) nutzen. Ich krieg es aber nicht hin, hier ein 
paar Code-Auszüge:

aus der main.c
1
volatile uint8_t tc_flag=0;
2

3
void main()
4
{
5
   //...
6
   tc_enable(&TCC0);
7
   tc_set_wgm(&TCC0, TC_WG_FRQ);
8
   tc_write_clock_source(&TCC0, TC_CLKSEL_DIV64_gc);
9
   tc_set_direction(&TCC0, TC_UP);
10
   tc_enable_cc_channels(&TCC0, TC_CCAEN);
11
   tc_set_cca_interrupt_callback(&TCC0, tc_callback);
12
   tc_set_cca_interrupt_level(&TCC0, PMIC_LVL_HIGH );
13
   double freq = 1.0;
14
   tc_write_cc(&TCC0, TC_CCA, (tc_get_resolution(&TCC0)/freq) - 1 );
15
   pmic_init();
16
   pmic_enable_level(PMIC_LVL_HIGH);
17
   //...
18
   while(1)
19
   {
20
      // ...
21
      if(tc_flag)
22
      {
23
           printf("tick\r\n");
24
           tc_flag=0;
25
      }
26
      // ...
27
   }
28
}
29

30
void tc_callback()
31
{
32
   tc_flag = 1;
33
}
Wo ist der Fehler? Alles andere (USART usw.) funktioniert.
OP #2328645
Lesenswert?

Ich jetzt eine Lösung die mir aber nicht gefällt. Wenn man das Interrupt 
Level des Compare-Interrupts auf:
1
tc_set_cca_interrupt_level(&TCC0, PMIC_LVL_NMI );
also Non Maskable Interrupt deklariert, dann geht es. Auch wenn man das 
pmic_enable_level(...) weglässt.

Allerdings habe ich das Datenblatt so verstanden, dass wenn ich das 
entsprechende Level (z.B. High) im PMIC aktiviere und den 
Compare-Interrupt das gleiche Level gebe, der Interrupt aktiviert wäre?! 
Oder habe ich da was falsch verstanden?
OP #2333286
Lesenswert?

Du meinst generell Interrupts enablen (sei)? Das habe ich mittlerweile 
gemacht und jetzt funktioniert es auch. Im ASF macht man das mit 
"cpu_irq_enable();". Scheibar war das des Pudels Kern...

Jetzt kann ich die Prio (low, med, high) vergeben und es funktioniert 
auch.

Das ASF ist eine feine Sache, kann ich jedem ans Herz legen.
#2333291
Lesenswert?

Mario Grafe schrieb:
> Du meinst generell Interrupts enablen (sei)?
Genau das :-) Dabei wird eben jenes GM-Bit im Status-Register gelöscht 
(insofern ist meine Aussage oben nicht ganz richtig, da es sich um ein 
MASK-Register handelt -> löschen = enable).
Ich versuch mich ohne Framework durchzumogeln, da weiß man wenigstens, 
wo was passiert - bis auf die Interrupts hab ich bis jetzt auch fast 
alles hinbekommen.
OP #2333406
Lesenswert?

Hinbekommen ist nicht das Problem, aber bei der Fülle der (neuen) 
Möglichkeiten der XMEGA finde ich das Framework recht praktisch. Bisher 
habe ich mit den ATMegas gearbeitet, da habe ich auch alle 
"handgestrickt", aber der gekapselte Zugriff spart einfach unheimlich 
Zeit und der Code bleibt lesbar. Ins User manual des XMEGA muss man sich 
trotzdem reinarbeiten, sonst versteht man die Fülle der Optionen 
nicht...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren