Autor |
Atmega - Probleme mit externem Interrupt Suche nach: atmega (406) |
|
|
|
|
BID = 707432
gerhard54 Gelegenheitsposter
Beiträge: 76 Wohnort: Wien
|
|
Hallo,
ich habe folgendes Problem mit einem externen Interrupt:
Meine Routine soll eine Bitfolge von einem externen Gerät einlesen und als Byte an das Hauptprogramm zurückgeben.
Die Leitung ist an PD2/INT0 angeschlossen. Inm Ruhezustand ist das Signal High, Bits werden als LOW übetragen. Ich habe daher den Interrupt 0 mit fallender Flanke aktiviert. (MCUCR Bit ISC01 gesetzt und den Interrupt freigegeben GICR Bit INT0)
Eine fallende Flanke triggert den Interrupt, der wiederum eine Routine zum Einlesen der Bitfolge startet. (ebenfalls Interrupt-gesteuert über Counter0 im CTC-Mode und das OCIE0 Bit in TIMSK).
Soweit so, so gut, das funktioniert.
NUR: Damit mir der INT0 während des Einlesen nicht dazwischen funkt (es treten ja fallende Flanken auf) deaktiviere ich ihn nach der ersten Flanke (Bit INT0 in GICR auf 0). Nach dem Einlesen des letzen Bits, die Leitung ist stabil auf HIGH, aktiviere ich ihn wieder (Bit INTF0 in GICR auf 1). UND jetzt triggert INT0 noch einmal!. Es sieht so aus, als würden die fallenden Flanken im Bitmuster irgend wie "gespeichert" bleiben...
Warum?
Was mache ich falsch?
Hat jemand eine Idee?
Was ich schon (erfolglos) probiert habe:
-) das Flag INTF0 in GIFR auf 0 gestzt befor ich den Interrupt wieder aktiviere
-) die globale Interruptfreigabe vor dem Aktivieren gelöscht und erst danach wieder aktiviert cli()/sei().
Ich komme da nicht weiter und wäre für einen Hinweis dankbar.
LG
Gerhard
|
|
BID = 707436
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
|
Du hast vermutlich eine 0 nach INTF0 geschrieben, um die Flagge zu löschen.
Du musst aber eine 1 reinschreiben, damit die Flagge zurückgesetzt wird.
Das ist nicht unbedingt intuitiv, aber bei allen Interruptflaggen gleich.
Muss man sich merken oder einfach im Datenblatt nachlesen.
P.S.: gehen nicht Daten verloren, wenn zwischenzeitlich neue Flanken auftreten?
(Ist mir prinzipiell egal, du wirst schon wissen, was du tust )
_________________
|
|
BID = 707446
gerhard54 Gelegenheitsposter
Beiträge: 76 Wohnort: Wien
|
Danke DonComi!
Das wars!
Nein, es geht nichts verloren.
Der Int0 gibt ja nur die Auslese-Routine frei (über eine globale Variable) und die tastet zyklisch (alle 0,46 ms...) den Pin ab und schiebt die Bits in die Ausgangsvariable, maskiert das Startbit und prüft die Parity...
Nach 10 Bit ist der Vorgang beendet und ich starte den Int0 wieder für das nächste Byte. Natürlich könnte ich auch den UART verwenden aber in den fertigen Schaltung ist der für die Kommunikation "nach oben" vorgesehen.
Nochmals Danke!
Gerhard
|
BID = 707458
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Gerne
_________________
|
BID = 707465
gerhard54 Gelegenheitsposter
Beiträge: 76 Wohnort: Wien
|
Ja, ja ich ich hab das auch ohne das Emoticon schon richtig verstanden:
Ich schulde Dir ein Bier (mindestens).
Nur ist das für heute Abend schon ein bißchen spät, als muß das leider warten bis ich das nächste mal in Deiner Gegend bin.
Liebe Grüße aus Wien
Gerhard
|
BID = 707479
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Ach, Quatsch.
Ich freute mich nur, dass sich jemand (mehrfach) bedankt hat. Das ist heute ja auch nicht mehr selbstverständlich.
_________________
|