Forum: Mikrocontroller und Digitale Elektronik externer Interrupt INT0


von cprog (Gast)


Angehängte Dateien:

Lesenswert?

Guten Abend.
Das Programm soll das Signal an INT0 erfassen und auswerten:
- PD5 tooglen
- Variable "counter" hochzählen und ausgeben auf einen Port.
Ob die Variable am Port etwas ausgibt, sehe ich durch einen BCD Dekoder, 
der eine 7Segmentanzeige ansteuert.


Fakt ist:
-PD5 tooglet bei Eingangssignal
-"counter" zählt nicht hoch
-schreibe ich zusätzlich in die whileschleife PORTD|=(1<<PD6);, wird PD6 
gesetzt
>also springt er ja auf jeden Fall in die whileschleife rein.
Aber warum gibt der Controller mir die Variable "counter" nicht aus.?


Vielen Dank und einen schönen Abend noch.

von Codix (Gast)


Lesenswert?

cprog schrieb:
> "counter"

Mach mal aus dieser Variable ein uint8_t (also ein unsigned char).
Ein int-Typ ist 16 Bit. 16 Bit Variablen sollte man in Interrupts 
vermeiden, bzw. der Zugriff darauf sollte in der Hauptschleife atomar 
erfolgen.
Die andere Frage ist, wie hoch ist die Taktrate am INT0 Eingang?
Denn Du setzt counter immer wieder auf Null.
Evt. ist Dein INT0-Takt zu schnell?
Falls Du einen Taster angeschlossen hast.....die prellen wie die Wutz!

von cprog (Gast)


Lesenswert?

Codix schrieb:
> Mach mal aus dieser Variable ein uint8_t (also ein unsigned char).
> Ein int-Typ ist 16 Bit. 16 Bit Variablen sollte man in Interrupts
> vermeiden, bzw. der Zugriff darauf sollte in der Hauptschleife atomar
> erfolgen

habe ich geändert.

Codix schrieb:
> Die andere Frage ist, wie hoch ist die Taktrate am INT0 Eingang?

Ich habe einen Induktiven Sensor als Eingang. Mit Pulldown Widerstand.
Quasi dürfte nichts mehr prellen.

Codix schrieb:
> Denn Du setzt counter immer wieder auf Null.

weil die 7Segmentanzeige nach der 9 wieder bei 0 anfangen soll.
Das ist eine Torstandsanzeige für einen Tischkicker.


...

PD5 tooglet ungleichmäßiger als vorher. allerdings zählt die Variable 
hoch. leider nicht immer plus 1. kann auch mal plus 2 oder 3 sein

von Holger L. (max5v)


Lesenswert?

cprog schrieb:
> PD5 tooglet ungleichmäßiger als vorher. allerdings zählt die Variable
> hoch. leider nicht immer plus 1. kann auch mal plus 2 oder 3 sein

Hört sich aber stark an als ob der Interrupt mehrfach ausgelöst wird.

Da es sich nur um eine Punktestandanzeige handelt könnte man versuchen 
direkt nach dem Auslösen in der ISR die Interrupts zu sperren und nach 
einer Wartezeit von ein paar Millisekunden in der Main wider zu 
aktivieren.

von Hannes L. (hannes)


Lesenswert?

Holger L. schrieb:
> könnte man versuchen

...das Signal ordentlich im Timer-Interrupt zu entprellen anstatt einen 
Ext-Interrupt zu verwenden.

Wenn's unbedingt der Ext-Int sein muss, ist die Flanke korrekt 
eingestellt? Nicht dass der Level-Modus aktiv ist und es zu mehreren 
Auslösungen kommt.

...

von cprog (Gast)


Lesenswert?

Holger L. schrieb:
> Hört sich aber stark an als ob der Interrupt mehrfach ausgelöst wird.

aber woher kommt das.?

von cprog (Gast)


Lesenswert?

was ist der Levelmodus.?
in welchem Register sollte man den einstellen.?

von Hannes L. (hannes)


Lesenswert?

cprog schrieb:
> was ist der Levelmodus.?

Die externen Interrupts haben 4 Modi:

- Low-Level,
- beide Flanken,
- fallende Flanke,
- steigende Flanke

> in welchem Register sollte man den einstellen.?

Das kommt auf den Typ des AVRs an, den Du ja nicht genannt hast.
Beim Mega8 war das MCUCR, beim Mega328 EICRA.

...

von cprog (Gast)


Lesenswert?

wie oben im code schreibe ich ins register mcucr

dort sage ich ja, dass eine fallende Flanke am INT0 den interrupt 
aufrufen soll.

Hannes L. schrieb:
> Nicht dass der Level-Modus aktiv ist und es zu mehreren
> Auslösungen kommt.

wie soll das geschehen durch dieses register.?

ich nutze einen atmega32
im datenblatt finde ich auch noch die bits SE SM2 SM1 SM0 im mcucr

gibt aber keine beschreibung dafür die ich deuten kann

von Karl M. (Gast)


Lesenswert?

Hallo,

mit dieser Bemerkung wirst Du nur Spott ernten, im Datenblatt steht das 
alles zum INTx sehr ausführlich beschrieben.

Wenn Du kein Englisch kannst, wie weit kommst Du mit einem 
Übersetzungsprogramm ?

Wo genau ist ein generelles oder das Verständnisproblem?

cprog schrieb:
> wie oben im code schreibe ich ins register mcucr
>
> dort sage ich ja, dass eine fallende Flanke am INT0 den interrupt
> aufrufen soll.
>
> Hannes L. schrieb:
>> Nicht dass der Level-Modus aktiv ist und es zu mehreren
>> Auslösungen kommt.
>
> wie soll das geschehen durch dieses register.?
>
> ich nutze einen atmega32
> im datenblatt finde ich auch noch die bits SE SM2 SM1 SM0 im mcucr
>
> gibt aber keine beschreibung dafür die ich deuten kann

von cprog (Gast)


Lesenswert?

Jetzt weiß ich was ihr mit Levelmodus meint.
das steht im datenblatt.

1 ISC01
0 ISC00
The falling edge of INT0 generates an interrupt request.

ich dachte aber ihr meint die anderen 4 bits. zu denen finde ich nur 
nichts im datenblatt.


egal. aber wie kommt es nun zu mehreren auslösungen.? und was dagegen 
tun.?

von Hannes L. (hannes)


Lesenswert?

cprog schrieb:
> wie oben im code schreibe ich ins register mcucr

Da ich kein C kann, es auf meine alten Tage auch nicht mehr lernen will, 
habe ich mir Deinen Quelltext erstmal nicht angesehen. Nun aber doch, da 
Du darauf verwiesen hast. Ja, Du hast auf Flanke getriggert, auch wenn 
Dir das nicht bewusst war. Denn sonst hättest Du ja nicht nachfragen 
müssen.

cprog schrieb:
> im datenblatt finde ich auch noch die bits SE SM2 SM1 SM0 im mcucr

Achja, Sleep-Enable und die Sleep-Modi...

> gibt aber keine beschreibung dafür die ich deuten kann

Ja sicher doch. Steht im Datenblatt alles haarklein drin. Da sollte es 
auch eine Tabelle geben, in der die Sleep-Modi zusammen mit den 
deaktivierten Taktquellen und den Weckmöglichkeiten aufgelistet sind. 
Und ja, mein Englisch ist auch sehr rudimentär.

Karl M. schrieb:
> mit dieser Bemerkung wirst Du nur Spott ernten,

Von mir nicht...

...

von Hannes L. (hannes)


Lesenswert?

cprog schrieb:
> aber wie kommt es nun zu mehreren auslösungen.?

Vielleicht "sehen" Deine Sensoren das Objekt bei einer Annäherung ja 
mehrfach?

> und was dagegen tun.?

Eine ordentliche Entprellung, wie ich oben vorschlug?

...

von cprog (Gast)


Lesenswert?

Hannes L. schrieb:
> Ja, Du hast auf Flanke getriggert, auch wenn
> Dir das nicht bewusst war.

wie meinst du das.? wie sollte ich es sonst machen.?

von cprog (Gast)


Lesenswert?

würde es gehen, wenn man in der ISR vom Externen Interrupt das 
softwaremäßig entplrellt.?

von S. Landolt (Gast)


Lesenswert?

Eine Frage am Rande: weshalb wird INT1 freigegeben, ohne dass die 
dazugehörende ISR definiert ist?

von ich (Gast)


Lesenswert?

S. Landolt schrieb:
> Eine Frage am Rande: weshalb wird INT1 freigegeben, ohne dass die
> dazugehörende ISR definiert ist?

Hat das eine Bedeutung/Auswirkung, wenn INT1 freigegeben ist aber nicht 
definiert ist???

Karl M. schrieb:
> mit dieser Bemerkung wirst Du nur Spott ernten

WARUM?
Haben nicht alle mal klein angefangen?

Grüße

von Hannes L. (hannes)


Lesenswert?

cprog schrieb:
> würde es gehen, wenn man in der ISR vom Externen Interrupt das
> softwaremäßig entplrellt.?

Wie sollte denn eine solche Entprellung aussehen?

Ich halte zyklisches Abfragen (Polling) der Eingänge per Timer-Interrupt 
für die bessere Methode. Änderungen werden erst übernommen, wenn sie 4 
mal hintereinander registriert wurden. Und das in beiden Richtungen, 
H->L also genauso wie L->H. Dazu noch die Flanken-Selektion, um nur auf 
die gewünschte Flanke zu reagieren.
Entprellung

...

von S. Landolt (Gast)


Lesenswert?

> Hat das eine Bedeutung/Auswirkung, wenn INT1 freigegeben
> ist aber nicht definiert ist???

Es ist nicht korrekt und führt evtl. zu Problemen: INT1 ist als Eingang 
definiert und der interne pull-up ist nicht eingeschaltet, wenn also 
extern nichts angeschlossen ist (Schaltplan habe ich nicht gesehen), so 
könnte sporadisch der Interrupt ausgelöst werden, was bei c, soweit ich 
weiß, zu einem Reset führt.

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.