mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR32 Timer Interrupt -> RC Trigger funktioniert nicht!?


Autor: Kossi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
folgendes Problem, ich programmiere einen Atmel 32UC3A1512.

Jede ms soll ein Wert vom ADC eingelesen werden. Hierzu rufe ich jede ms 
eine ISR mittels Timer-Interrupt auf. Der Timer läuft in Waveform-Mode.

Ausschnitt aus Main:
int main(void)
{

...

static const tc_interrupt_t TC_INTERRUPT =  // OPTIONEN Interrupts
{
...
  .cpcs  = 1,  // Compare RC    <--

... // sonst alle 0
};

static const tc_waveform_opt_t TC_WAVEFORM =
{
... 
// Werte hiervor sind alle: TC_EVT_EFFECT_NOOP,
.wavsel = TC_WAVEFORM_SEL_UP_MODE_RC_TRIGGER,
...
.tcclks = TC_CLOCK_SOURCE_TC2 // fPBA/2 --> (fPBA = 48MHz)
};

...

tc_write_rc(&AVR32_TC, TC_CHANNEL, 24000);   // 1KHz

...

while(1)
{...}

return 0;
}

Das funktioniert auch alles, d.h. die ISR wird ausgeführt.
Die Option RC_Trigger bedeutet meines Erachtens, dass der Timerwert 
wieder auf Null gesetzt wird und der Timer neu startet wenn der Timer 
den Wert, der im Register C geladen wurde, erreicht. Ist das richtig?
Durch die Interrupt-Einstellungen wird bei Compare_RC in die ISR 
gesprungen.

Nun muss ich aber immer am Ende(!) der ISR den Software-Trigger 
ausführen, damit das Ganze funktioniert. Das finde ich komisch, da ja 
eigentlich dieser Trigger automatisch bei RC-Compare ausgeführt werden 
sollte..?!?!

Hier die ISR:
static void led_ISR(void)
{
... // Wert aus dem ADC auslesen

tc_read_sr(&AVR32_TC, TC_CHANNEL); // Interrupt Flag löschen
tc_software_trigger(&AVR32_TC, TC_CHANNEL);
}

Wie gesagt, das Ganze funktioniert, aber so wird ja nun nicht jede ms 
die ISR ausgeführt, sondern jede

ms + (Bearbeitungszeit der ISR)

Um diese Zeit wirklich auf 1ms schrumpfen zu lassen, müsste der Timer, 
nachdem er den Wert RC erreicht hat sofort wieder auf Null gesetzt 
werden und neustarten. Hier wird der Timer aber erst nach Abarbeitung 
der ISR genullt und neugestartet.
Kurios ist, wenn ich das Löschen des Interrups Flags und den Software 
Trigger am Anfang der ISR schreibe, dann wird die ISR zwar ein paar Mal 
aufgerufen (das erkenne ich weil ich eine LED toggeln lasse) aber dann 
ist die ISR tot bzw. sie wird nicht mehr aufgerufen (LED toggelt nicht 
mehr). Dieses Verhalten verstehe ich nun gar nicht mehr.

Ich hoffe, Ihr könnt mir ein wenig Aufschluß geben;)

Autor: Kossi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schade, hat denn niemand eine Idee, die mir behilflich wäre?

Ich wäre wirklich sehr dankbar über einige Anregungen..

MfG Kossi

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit den Timern beim AVR32 habe ich auch noch so meine Schwierigkeiten - 
mal vorweg, die RC Triggerung hat bei mir aber funktioniert ;o). Ich 
hatte folgende Einstellungen:
AVR32_TC.channel[0].CMR.capture.cpctrg = 1;
AVR32_TC.channel[0].CMR.capture.wave = 1;   
AVR32_TC.channel[0].CMR.capture.cpctrg = 1;  <-- das triggert den Counter
AVR32_TC.channel[0].rc = WERT;
AVR32_TC.channel[0].IER.cpcs = 1;
AVR32_TC.channel[0].CCR.clken = 1;

Ich habe das Problem, das der RB Interrupt nicht kommt! RA und RC 
funktionieren, aber der RB Interrupt wird nicht ausgelöst. Mir ist noch 
ein wenig unklar, was im Capture Mode funktioniert und was im Waveform 
Mode. Meine Einstellungen sind:
AVR32_TC.channel[0].CMR.waveform.wave = 1;
AVR32_TC.channel[0].CMR.waveform.tcclks = 1;
AVR32_TC.channel[0].IER.cpas = 1;
AVR32_TC.channel[0].IER.cpbs = 1;
AVR32_TC.channel[0].IER.cpcs = 1;

mfg
hamsti

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.