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?
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?
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...
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.
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.
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); |
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
hier habe ich einmal den kompletten Code angehängt... Vielleicht hilft es mehr http://pastebin.com/nMibYBDW P.S. Stefan hat perfekt geraten ;)
> 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]
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
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).
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.