Atmega - Probleme mit externem Interrupt

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 05 1 2025  03:19:36      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


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.

_________________


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 22 Beiträge im Durchschnitt pro Tag       heute wurden bisher 1 Beiträge verfasst
© x sparkkelsputz        Besucher : 182670915   Heute : 708    Gestern : 8112    Online : 217        5.1.2025    3:19
3 Besucher in den letzten 60 Sekunden        alle 20.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0520589351654