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.
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!
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
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.
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. ...
Holger L. schrieb: > Hört sich aber stark an als ob der Interrupt mehrfach ausgelöst wird. aber woher kommt das.?
was ist der Levelmodus.? in welchem Register sollte man den einstellen.?
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. ...
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
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
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.?
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... ...
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? ...
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.?
würde es gehen, wenn man in der ISR vom Externen Interrupt das softwaremäßig entplrellt.?
Eine Frage am Rande: weshalb wird INT1 freigegeben, ohne dass die dazugehörende ISR definiert ist?
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
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 ...
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.