Forum: Mikrocontroller und Digitale Elektronik Arduino friert ein: SPI und PinChange Interrupt


von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

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

von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe den Code nochmal als .c Datei angehängt, das vereinfacht das 
ansehen :)

von BASCOM für Arduino (Gast)


Lesenswert?

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!

von Peter D. (peda)


Lesenswert?

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.

von Daniel (Gast)


Lesenswert?

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.

von Verwirrter Anfänger (Gast)


Lesenswert?

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.

von Daniel (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.