Hallo zusammen, ich habe angefangen den CD Wechsler Emulator code von hier: http://www.mikrocontroller.net/attachment/33106/cdc_emu.c für einen Arduino umzuschreiben. Das Ergebnis hängt im Beitrag. Leider hängt sich der Arduino (Nano mit Atmega328) auf, sobald ich einen Interrupt nutzen will (Int0 mit Pin2). Sobald sich am Pin2 etwas ändert, Blinkt die LED am Arduino schnell und das Programm scheint zu hängen, da kein "Test" mehr über UART ausgegeben wird. Auch ein Reset über den Button oder den FTDI bringt nichts, um neuen Code zu übertragen, muss ich das USB Kabel abziehen und neu anstecken. Die CDC Emulation über SPI scheint aber weiter zu laufen!? Ich würde gerne verstehen was hier passiert, da ich es mir nicht erklären kann. Kann mir jemand einen Tip geben? Grüße
Ich habe den Code nochmal als .c Datei angehängt, das vereinfacht das ansehen :)
Daniel schrieb: > Kann mir jemand einen Tip geben? Titelüberschrift "Arduino friert ein" sowas kann nur die Arduino-Fraktion formulieren :-)) Entsprechend also die qualifizierte Antwort: Dann spendiere ihm einen funktionablen Frostschutz!
Daniel schrieb: > Leider hängt sich der Arduino (Nano mit Atmega328) auf, sobald ich einen > Interrupt nutzen will (Int0 mit Pin2). Und wo ist der Interrupthandler dazu? Wenn Du einen Interrupt auslöst, springt die CPU an den entsprechenden Vector. Und wenn da kein Handler steht, läuft sie eben in den Wald.
ich würde sagen hier: attachInterrupt(0, stateChange, RISING); Laut: http://arduino.cc/en/Reference/AttachInterrupt attachInterrupt(interrupt, function, mode) wenn ich es richtig verstanden habe springt er zu stateChange(), sobald eine Steigende flanke an INT0 (Pin 2) erkannt wird. Sorry für meine laienhafte Beschreibung, so tief bin ich leider noch nicht im Thema.
Ich könnte mir vorstellen, dass es ein Problem mit der UART Ausgabe innerhalb des Interrupt gibt. Probier mal was einfacheres in den Interupt zu packen, zum Beispiel nur einen Pin an / aus zu schalten. Häng an den Pin eine LED dran, und guck ob das dann funktioniert. @ Peter > Und wo ist der Interrupthandler dazu? Beim Arduino wird das indirekt über handles gemacht.
1 | void setup(){ |
2 | // ...
|
3 | attachInterrupt(0, stateChange, RISING); |
4 | // ...
|
5 | }
|
6 | |
7 | void stateChange(){ |
8 | Serial.println("Test"); |
9 | }
|
Die Reinfolge ist zwar nicht ideal (kein Prototype), aber meines Erachtens nach sollte das klappen.
Ja, das funktioniert :) Danke Eine Frage noch, meint Ihr ich kann das folgende Signal mit einem Interrupt und einer Timer Library zerlegen? http://martinsuniverse.de/projekte/cdc_protokoll/radio_out.gif Ich möchte letztendlich auswerten welche Taste am Radio gedrückt wurde. Mein Ansatz wäre: bei steigender Flanke -> Timer starten bei fallender Flanke --> Timer stoppen und Zeit auswerten / merken Wäre das machbar oder bin ich hier auf dem Holzweg?
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.