Hi,
ich wollte ein Programm schreiben, um festzustellen ob ein Taster
gedrückt ist oder nicht.
Hierfür habe ich diesen mit Hilfe einer Schaltung an ein Interrupt
angeschlossen.
Mein Problem ist, dass das Interrupt bei Beginn des Programms ausgeführt
wird und dadurch meine Variable auf true gesetzt wird. Das darf aber
nicht geschehen.
Im weiteren Verlauf funktioniert alles tadellos, jedoch darf die
Variable nicht bereits am Beginn des Programms auf true gesetzt werden.
Wie kann ich das vermeiden?
Hallo
Ich würde mal schauen warum der Interrupt beim Starten ausgelöst wird,
was nicht sein darf.
Wenn nicht, als Bastel-Lösung eine zusätzliche Variable auf 0
initialisieren und wenn diese beim Interrupt Handler 0 ist, nichts
machen und diese dann auf 1 setzen. Beim nächsten IRQ ist diese dann 1
und bleibt es auch und der IRQ wird korrekt ausgeführt...
Gruss
Frag doch im Interrupt ab, ob der Taster gedrückt ist oder nicht.
Anna Maier schrieb:> ich wollte ein Programm schreiben, um festzustellen ob ein Taster> gedrückt ist oder nicht.
Ist das nicht ein bisschen zu viel für eine Diplomarbeit? ;-)
Wenn er nicht "gedrückt" liefert dann sollt das interrupt ja nicht
auslösen, deshalb verstehe ich das nicht.
Danke füf die antworten.
Es wird ein roboter und die taster benötige ich für die endabschalter
falls der roboter zu weit fahren sollt. Immer nlch zu wenig? ;)
Daß man das Flag eines externen Interrupts nach dessen Initialisierung
vor der globalen Freigabe löschen muß, ist normal.
>Immer nlch zu wenig? ;)
Das hast du mit dem Threadtitel aber auch herausgefordert. "Problem mit
Interrupt" wäre treffender gewesen.
mfg.
Sicher das du auf LOW triggern willst?
attachInterrupt(input, doReference, LOW);
Der Interrupt wird so lange abgearbeitet wie das eingangssignal low ist.
Ich gehe davon aus das du mittels des PORT Registers den "Pull Up"
eingeschalten hast.
Falls nicht:
DEINPORT|=(1<<DEINPIN);
und schon ist der Pull Up "ein"
Versuche dann mal das:
attachInterrupt(input, doReference, FALLING);
Dadurch wird der Interrupt nur bei fallender Flanke ausgelöst.
Grüße
Huhu Anna,
warum liefert der offene Taster denn HIGH am Eingang?
Dachte immer man hat so einen Schalter (Bumper unten am Robi zb.)und
wenn der Schalter geschlossen ist kann der Strom "fließen" und dann hat
man gegebenenfalls 3,3 oder 5 V auf einen Eingang des Mikroprozessors
(welchen benutzt du nochmal gleich? Schaut nach Atmel aus, so ne Arduino
Geschichte?).
Vielleicht könntest du das etwas erläutern und sagen welcher Chip und
so... vielleicht wirds ja so ein Schwarmroboter, wo ne handvoll
versuchen eine Aufgabe zu erledigen ;o)
Gruß
dat
Beast
BeastyK der seine Anmeldedaten verschluderte schrieb im Beitrag
#3591736:
> warum liefert der offene Taster denn HIGH am Eingang?> Dachte immer man hat so einen Schalter (Bumper unten am Robi zb.)und> wenn der Schalter geschlossen ist kann der Strom "fließen" und dann hat> man gegebenenfalls 3,3 oder 5 V auf einen Eingang des Mikroprozessors
Ein offener Taster liefert erstmal nichts (d.h. einen undefinierten
Zustand am Eingangspin). Daher braucht man einen Ziehwiderstand, der den
Ruhepegel liefert, und den kann man nach GND oder Vcc schalten und den
Taster entsprechend umgekehrt. Abhängig davon ist der Ruhezustand Low
oder High.
Gruß Dietrich
Hi Anna
Vielleicht kannst du dich ja mal für einen Namen entscheiden, oder wie
ist
Anna und Falcon zu definieren? Zum Thema. Eine Endabschaltung realisiert
man mit einem Öffner. Stell dir vor,, der Schalter ist defekt, ein
Kabelbruch oder was auch immer, er liefert einfach kein Schaltsignal.
Dann läuft dein Roboter, bis ihn nur massive Hindernisse aufhalten oder
er sich seine Energien selber kappt. Bei einem Öffner ist zumindest ein
Kabelbruch oder Ausfall der Signalversorgung erkennbar und der Roboter
fährt gar nicht erst in die Richtung.
Sollte eigentlich als Grundlage für eine Diplomarbeit klar sein. Auch
würde ich einen Schalter niemals in einen Interrupt packen. Warum? Damit
er sicher erkannt wird? Das wird ein Schalter in einem vernünftigen
Programm im Polling auch. Sollte Polling zeitlich nicht reichen, ist das
Programm für einen Roboter sowieso nicht brauchbar. Eine lange
Zykluszeit müsste dann nicht nur Signale im Interrupt erfassen, sondern
auch noch die nötigen Bearbeitungsschritte bis hin zur Ausgabe
durchführen. Dann besteht 80% deines Programmes aus ISR.
Bau dein Programm ereignisgesteuert auf. Dann hast du auch keine
Probleme mit Zykluszeit und du kannst die Interrupts für sinnvolle
Aufgaben freihalten. Z.B. Signale von Winkeldekodern oder
Drehimpulsgebern.
Gruß oldmax
Immer dieses religiöse anti-Tasten-auf-Interrupt-Evangelium.
Bei Benutzereingaben verstehe ich es ja noch, wegen der Entprellung,
aber in diesem Fall?
oldmax schrieb:> Auch> würde ich einen Schalter niemals in einen Interrupt packen. Warum?
Die Frage muss lauten: Warum nicht!
Der Endtaster soll ja hier scheinbar den ganzen Roboter ausschalten, da
stört Prellen ja wohl nicht.
Warum denn nicht?
Das Pollen auch geht ist kein sinnvolles Argument.
Hi
Ehrlich gesagt, ist es mir völlig wurscht, ob irgend welche Schalter im
Interrupt abgefragt werden oder nicht, das Ergebnis zählt am Ende. Dem
Anwender ist es genauso egal, Hauptsache, es funzt. Aber ist das eine
Basis für eine Diplomarbeit?
Deshalb, warumm kontaktbehaftete Schalter in einen Interrupt packen? Die
Schaltzeiten liegen weit höher als jede vorstellbare Zykluszeit in einem
Maschinenprogramm. Und wo ist da ein Unterschied zu einem manuell
betätigten Taster und einem Endschalter?
>Der Endtaster soll ja hier scheinbar den ganzen Roboter ausschalten, da>stört Prellen ja wohl nicht.
Nein, ein Endschalter schaltet nicht den ganzen Roboter aus. Energien
bleiben selbstverständlich bei einem Endschalter aufgeschaltet und wenn
man's richtig macht, werden Antriebe dann geregelt herunter gefahren.
Nicht verwechseln mit "NOT"-Aus. Da darf ein Antrieb ruhig austrudeln...
na ja, fast.... Auch hier gibt es verschiedene Ausführungen, was
kinetische Energien betrifft.
Ein Not-Aus wird auch in der Regel nicht über einen Controller
geschaltet. Warum auch, da wird das Netz gekappt und gut is. (meistens)
gruß oldmax