Forum: Compiler & IDEs AVR - In ISR gesetztes volatile flag kann nicht gelesen werden


von Alexander Hungenberg (Gast)


Lesenswert?

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?

von Peter II (Gast)


Lesenswert?

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?

von Oliver S. (oliverso)


Lesenswert?

volatile

Oliver

von Alexander Hungenberg (Gast)


Lesenswert?

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

von Rolf M. (rmagnus)


Lesenswert?

Alexander Hungenberg schrieb:
> Ich weiss, dass die ISR aufgerufen wird und die globale variable entsprechend
> setzt.

Woher?

>__attribute__((_interrupt_))
> static void adc_int_handler(void) {

Das ist eine ungewöhnliche Art, bei avr-gcc eine ISR zu definieren.

von Stefan E. (sternst)


Lesenswert?

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.

von test (Gast)


Lesenswert?

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?

von Stefan E. (sternst)


Lesenswert?

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);

von Oliver S. (oliverso)


Lesenswert?

Stefan Ernst schrieb:
> Die Zuordnung dürfte in init_intc() passieren.

Oder in Zeile 42, oder gar nicht.

Daher, wie immer, den ganzen Code zeigen.

Oliver

von Alexander Hungenberg (Gast)


Lesenswert?

hier habe ich einmal den kompletten Code angehängt... Vielleicht hilft 
es mehr

http://pastebin.com/nMibYBDW

P.S. Stefan hat perfekt geraten ;)

von Krapao (Gast)


Lesenswert?

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

von Alexander Hungenberg (Gast)


Angehängte Dateien:

Lesenswert?

das ist keine short URL ;-) www.pastebin.com ist einfach eine Seite um 
plain-text schön zu formatieren.

Aber ich lade es noch einmal als Anhang hoch

von Krapao (Gast)


Lesenswert?

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

von Alexander Hungenberg (Gast)


Lesenswert?

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.

von Krapao (Gast)


Lesenswert?

Nochmal zurück zu dem
> Ich weiss, dass die ISR aufgerufen wird und die globale variable
> entsprechend setzt.

Woher weisst du das?

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.