Forum: Mikrocontroller und Digitale Elektronik ATxmega256A3 Timer interrupt?


von Mario G. (mario)


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.

von Mario G. (mario)


Lesenswert?

Keiner eine Idee?

von Mario G. (mario)


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?

von Mario G. (mario)


Lesenswert?

keiner eine Idee?
Wie funktioniert denn nun der PMIC des XMEGA.

Wenn ich es richtig verstanden habe muß doch nur das entsprechnede Level 
(low, med, high) aktiviert werden und dann z.B. dem Timer-Interrupt das 
entsprechende Level zugeteilt werden, oder?

von Michael K. (aemkai)


Lesenswert?

Hallo,

mit dem ASF hab ich noch nicht so viel gemacht. Dein Problem, dass der 
NMI funzt, die anderen aber nicht klingt für mich danach, dass du das 
GM-Bit (Global Mask) für die Interrupts im Statusregister noch nicht 
gesetzt hast.

Gruß,

Michael

von Mario G. (mario)


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.

von Michael K. (aemkai)


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.

von Mario G. (mario)


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...

von Michael K. (aemkai)


Lesenswert?

Uuuups, war in Gedanken noch beim AVR32 - von daher sind meine obigen 
Erklärungen bezüglich der Registernamen obsolet.

Muss ja jeder selbst entscheiden wie er es macht, wollte damit nur 
ausdrücken, dass ich mich mit den Framework-Funktionensnamen etc. nicht 
so auskenne

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.