AVR - In ISR gesetztes volatile flag kann nicht gelesen werden

Gast #2608177
Hallo zusammen,

ich habe leider ein Problem mit meinem Code und einer ISR.

http://pastebin.com/WLTzYjRV

hier sind die relevanten Teile. Der Haken ist: Ich weiss, dass die ISR 
aufgerufen wird und die globale variable entsprechend setzt. Nur leider 
wird das If in der main() Funktion nie als true validiert. Habt ihr eine 
Idee?
Gast
nein, aber finde die synteax der ISR sehr merkwürdig. Ich kenn da nur 
die Varianten aus Tutorial.

Warum simulierst du die ganze sache nicht einfach?
Gast
Das ist eben das Problem: Das volatile steht dort.

Und auch der atomic zugriff kann es eigentlich nicht sein, da es nur 
eine 1-byte lange Variable ist...
Gast
Stefan Ernst schrieb:
> Rolf Magnus schrieb:
>> Das ist eine ungewöhnliche Art, bei avr-gcc eine ISR zu definieren.
>
> Ich würde eher auf avr32-gcc tippen, und dafür sieht es ok aus.

Ohne zu wissen wie das beim avr32-gcc funktioniert, aber woher soll da 
die Information kommen, welcher Interrupt-Vektor das ist?
test schrieb:
> Ohne zu wissen wie das beim avr32-gcc funktioniert, aber woher soll da
> die Information kommen, welcher Interrupt-Vektor das ist?

Die Zuordnung dürfte in init_intc() passieren.
Da sollte so was drin stehen:
1
INTC_register_interrupt (&adc_int_handler, AVR32_ADC_IRQ, AVR32_INTC_INT0);
Gast
> http://pastebin.com/nMibYBDW

[offtopic]
Bei Short-URLs bin ich vorsichtig.

Besonders, wenn jemand diese ohne Not nenutzt.

Hier im Forum kann man den Sourcecode so bequem uploaden und gut lesbar 
formatiert anzeigen lassen.

Stattdessen versucht mich jemand in "unbekanntes Terrain" zu locken?
[/offtopic]
Gast
Die Programmlogik sieht für mich out-of-sequence aus: Zuerst wird der 
ADC IRQ Handler gesetzt, dann werden Interrupts global enabled und dann 
wird der ADC konfiguriert. Ich hätte das Konfigurieren zuerst gemacht.

Wenn du

> Ich weiss, dass die ISR aufgerufen wird und die globale variable
> entsprechend setzt. Nur leider wird das If in der main() Funktion nie als > true 
validiert.

an der Funktion/Nichtfunktion von update_pwm() fest machst, dann 
bedenke:

adc->cdr0 (&AVR32_ADC) wird nicht dann ausgelesen, wenn der Messwert 
vorliegt nämlich in dem ADC-Handler, sondern irgendwann später in 
main(). Die ADC-Einheit hat dann eine neue Messung gestartet und 
eventuell die Daten bereits verändert (Datenblatt nachsehen, ob 
Pufferung vorhanden).
Gast
Hallo Krapo,

ich habe versucht die Intialisierungsreihenfolge zu verändern - das hat 
leider nichts gebracht...

Darüberhinaus habe ich auch noch mal über andere Wege versucht 
herauszufinden ob das If aufgerufen wird: Auch mit einem GPIO toggle pin 
ändert sich nichts...
Das mit dem UpdatePWM sollte aber eigentlich auch funktionieren, da laut 
Datenblatt das End-Of-Conversion Flag vom ADC erst beim Lesen des 
Registers gecleared wird, und so lange dieses noch gesetzt ist auch 
keine neue conversion stattfindet.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.