Forum: Mikrocontroller und Digitale Elektronik Externer Interrupt


von Bastian K. (triple2448)


Lesenswert?

Hallo

In der Fachhochschule haben wir einen kleinen Roboter, der
vorne einen Taster hat. Der hängt an INT0 von einem mega32.
In der Interruptroutine fährt der Roboter erst rückwärts und dreht sich
dann - dauert ca 1s.
Das Problem ist, dass die Interruptroutine immer 2x ausgeführt wird.
(Der Taster hängt über einen Pullup an 5V und ich warte auf eine
fallende Flanke).
Am Anfang der Interruptroutine habe ich den INT0 schon deaktiviert
und am Ende INTF0 im GIFR gelöscht, hilft aber nichts.
Kann es sein, das der Controller während er die Interruptroutine aus-
führt, eine weitere fallende Flanke speichert?

Gruß

triple2448

von Hubert.G (Gast)


Lesenswert?

Ist die Taste entprellt?

von Bastian K. (triple2448)


Lesenswert?

Ja, die Abarbeitung des Interrupts(zurückfahren und drehen)dauert
ca 1s , danach sollte nichts mehr prellen.

von mike (Gast)


Lesenswert?

mit dem entprellen ist das so eine sache. Hatte ein ähnliches problem.
Wie ist er bei dir entprtellt?...

von Hubert.G (Gast)


Lesenswert?

So wie du es beschieben hast wird der Interrupt zweimal ausgeführt da er
zweimal angestossen wird und das warscheinlich durch Tastenprellen. Wie
schaut den das Tastenentprellen bei dir aus?

von Bastian K. (triple2448)


Lesenswert?

Wie oben gesagt:
Wenn eine fallende Flane auftritt springt der in die
Interruptroutine, deren "Abarbeitung" wegen Warteschleifen ca 1s
dauert, alle weiteren Flanken sollten dabei unter den Tisch fallen.
Zur Sicherheit lösche ich das INTF0-Flag.
Wenn die routine verlassen wird ist der Roboter schon längst weg von
der Wand und deswegen prellt da auch nichts mehr

von thkais (Gast)


Lesenswert?

Wie löschst Du das INTF0-Flag? Nur sicherheitshalber: Um es zu löschen,
musst Du eine "1" schreiben, es also setzen.

von Hubert.G (Gast)


Lesenswert?

Muss ein tolles Programm sein das in der Interruptroutine eine
Warteschleife hat, aber du wirst schon wissen was du machst. Ich würde
statt Interrupt vergewaltigen und unterdrücken lieber den Taster
entprellen.

von thkais (Gast)


Lesenswert?

Ich habe noch nie Taster entprellt und meine Programme funktionieren
trotzdem. Was mache ich falsch?

Über den Sinn und Zweck eines 1-sekündigen Interrupts läßt sich
sicherlich streiten, aber vielleicht läßt sich auf diese Weise relativ
einfach die Funktion eines Interrupts erklären?
Kooperatives Multitasking kommt dann ein Jahr später.

von Hannes L. (hannes)


Lesenswert?

Ich habe anfangs auch keine Taster entprellt, habe sie aber gepollt,
also im Timer-Interrupt abgefragt. Das funktionierte recht gut. Aber
mit der (ressourcenschonenden) Entprellung nach Peter Dannegger
funktioniert es besser...

Dass man an einer FH mechanische Taster an einen Interrupt-Eingang
hängt, kann ich irgendwie nicht verstehen. Sowas Unsinniges macht man
ja nichtmal als einfacher Bastler. Oder hat das didaktische Gründe, um
zu zeigen, wie man es nicht machen soll?

Gleiches gilt für Warteschleifen in einer ISR. Das ist Gift für jedes
Programm...

...

von Jens D. (Gast)


Lesenswert?

könnte es daran liegen, dass du in der int routine den int zwar sperrst,
aber dass bei erneutem EXT INT das flag gesetzt wird, dass ein weiterer
INT aktiv war?

evtl solltest du mal das EXT INT Flag in deiner INT Routine löschen

gruss

von cerberus (Gast)


Lesenswert?

@Hannes
Warum darf ein Taster nicht an einem externen Interrupteingang hängen?

von Hannes L. (hannes)


Lesenswert?

Das wurde hier im Forum schon zigmal durchgekaut. Einfach mal etwas
herumstöbern und lesen...

...

von thkais (Gast)


Lesenswert?

@Hannes: Das verstehe ich in der Tat auch nicht. Ein mechanischer Taster
am Interrupt-Eingang ist doch gar kein Problem.
Ein 10nF-100nF Kondensator parallel zum Taster ist übrigens weitaus
Ressourcenschonender, da brauchts gar keine Entprellungssoftware.
Und eine Tastaturmatrix frage ich per Timer-Interrupt ab - da entfällt
die Entprellung dann auch.

@Jens D.: Er sperrt nicht den Interrupt, sondern löscht das zugehörige
Flag (INTF0).

von peter dannegger (Gast)


Lesenswert?

Eine universelle Entprellung im Timerinterrupt hat schon erhebliche
Vorteile:

Man fügt sie einmal ein und schon ist sämtliche Entprellung Schnee von
gestern, d.h. man braucht nie wieder darüber nachdenken.


Dagegen ist eine Entprellung über Interrupts und Programmlaufzeiten
immer neu zu überdenken, bei jedem neuen Projekt und bei jeder
Programmänderung.

Prinzipiell ist es aber möglich und ich will niemanden hindern,
jedesmal neu Gehirnschmalz zu investieren oder solche Fragen zu
stellen: "Ich habe beide Interrupts belegt und brauche nun aber noch
eine 3. Taste".



Wie kommt es nun zu der Doppelauslösung ?

Ganz einfach, der erste Preller entert den Interrupt, der löscht das
Interruptflag und die folgenden Preller setzen es wieder.
Sobald also der Interrupt nach 1s wieder freigegeben wird, muß also der
Handler nochmals durchlaufen werden, damit das durch die Preller
gesetzte Flag wieder gelöscht wird.

Es ist vollkommen wurscht, wann die Flanke erkannt und das Flag gesetzt
wurde. Wenn der Interrupt erst nach einem Jahr freigegeben wird, wird
eben erst nach einem Jahr auf den Flankenwechsel reagiert.

Man braucht auch nie den Interrupt freigeben, man kann das Flag auch
pollen und per Software rücksetzen.


Um nun solche uralten Ereignisse zu ignorieren, löscht man das Flag per
Software direkt bevor man den Interrupt wieder freigibt.
1
GIFR = 1<<INTF0; // Flag löschen
2
GICR |= 1<<INT0; // Interrupt freigeben


Peter

von cerberus (Gast)


Lesenswert?

@Hannes
... komische Antwort, naja ...
Die Forensuche gibts ja wohl nicht mehr und das was ich bekomme, wenn
ich die aktuelle Suche benutze, ist nicht wirklich brauchbar.
Also wenn der einzige Grund ist, dass es schon mal gekaut wurde, dann
hänge ich meine wichtigen Kontakte weiterhin scham- und bedenkenlos an
die externen Interrupteingänge, wie ich es mal an der FH gelernt habe.
Bisher hatte ich keine Probleme damit.

von Rahul (Gast)


Lesenswert?

am unteren Ende der Seite steht immer "ältere Beiträge>>>" oder so
ähnlich. das hilft manchmal auch.
Eigentlich schade, dass Andreas die Forensuche abgeschaltet hat, wobei
ich mit Hilfe der google-Suche auch schon Sachen gefunden habe...

von Jens D. (Gast)


Lesenswert?

@thkais

naja im Grunde doch, was ich sagte widerholt peter nun
:D

von Hannes L. (hannes)


Lesenswert?

> ... komische Antwort, naja ...

Stimmt...
Aber aufgrund der deaktivierten Suchfunktion finde ich das auch nicht
mehr. Es war aber nicht nur einmal, sondern ziemlich oft. Leider nicht
am Betreff erkennbar.

Wenn du deine Taster weiter an die externen Interrupt hängst, ist das
nicht meine Sache, ich muss ja deine Geräte nicht kaufen.

Ich mache es aber nur dann so, wenn ich den AVR mit dem Taster aus dem
Power-Down-Mode holen muss. Und dann auch nur zum Wecken aus dem
"Tiefschlaf", die eigentliche Abfrage und Entprellung der Taster
übernimmt dann die Timer-ISR. Damit ist man dann alle Sorgen los.

Hast du dir die Entprellroutine überhaupt man angesehen (und
analysiert)? Oder diskutierst du über (gegen) etwas, was du garnicht
kennst?

...

von cerberus (Gast)


Lesenswert?

@Hannes
Ich wusste gar nicht dass ich überhaupt über die Entprellroutine
diskutiert habe?!
Ich wollte doch gar nichts von der Routine?!
Ich wollte doch bloß wissen warum man Taster nicht an die externen
Interrupts anschließen soll??
Wieso muss ich jetzt dafür angepisst werden?

von Hannes L. (hannes)


Lesenswert?

Sorry, wenn du das als "Anpissen" empfindest...

Aber die einfach erscheinende Frage:

> Warum darf ein Taster nicht an einem externen Interrupteingang
> hängen?

kann man nicht mal schnell mit 12 Zeilen beantworten, dazu ist die
Materie zu komplex. Daher empfand ich deine Frage als (bewusst naiv
formulierte) Provokation.
Da muss du sich also nicht wundern, wenn darauf verwiesen wird, sich
mal im Forum etwas umzusehen. Denn das Thema ist wirklich oftmals bis
zum Abwinken diskutiert worden.

Übrigens: Der Taster "DARF" am Interrupt hängen, er "SOLLTE" es
(meiner Meinung nach) aber nicht ohne zwingenden Grund.

Suche mal in der Artikelsammlung nach "Entprellung" und verfolge mal
die dort aufgelisteten Links, dann verstehst du, was ich meine, ohne
dass ich das alles nochmal "für dich persönlich" aufschreiben muss.

...

von cerberus (Gast)


Lesenswert?

@Hannes
Das ist mir zu hoch.
Erst erklärst Du meine Dozenten zu Trotteln, dann ist Dir meine Frage
zu trival oder naiv für die komplexe, mehr als 12-zeilige Antwort, drum
wirfst Du mir Unkenntnis der Entprellroutine vor, die ich gar nicht in
Abrede gestellt habe, dann machst Du meine Produke madig die Du gar
nicht kennst ...
Da komm ich nicht mit und es ist auch nur Zeitverschwendung. Scheinbar
geht es nur um das Entprellen.

von Rahul (Gast)


Lesenswert?

@Cerberus:
Solange der Controller sowieso läuft, kann man den Taster meistens auch
im Rahmen eines Timer-Interrupt pollen (ms-Bereich). Soviel Zeit hat man
immer.
Wie Hannes schon schrieb, kann man einen Controller per Interrupt
aufwecken. Dafür muß man den Taster dann and den INT-Pin hängen.

Warum fragst du deine Dozenten nicht mal danach, wieso sie Tasten an
einen INT-Pin hängen?
Offensichtlich führt das ja zu Problemen, wie Bastian sie hat.

von Hannes L. (hannes)


Lesenswert?

> ...und es ist auch nur Zeitverschwendung.

Genau...

...

von cerberus (Gast)


Lesenswert?

@Rahul
Es ist nur eine Frage der Betrachtungsweise.

Bastians Problem ist, dass er den Taster nicht entprellt hat.
Ich finde es spielt keine Rolle, ob es ein Interrupt-Eingang ist. Der
Fehler fällt nur schneller und regelmäßiger auf, denn das Problem
besteht auch bei jedem anderen Eingang, sofern ein mechanischer
Schalter im Spiel ist.
Ich halte mich weiterhin an die Grundlagen der digitalen
Schaltungstechnik. Nur weil man in der Software der uCs grobe
Nachlässigkeiten der Hardware "wegschminken" kann, ist das doch kein
Grund sowas zur Maxime zu erheben mit der Einschränkung, das man
externe Interrups nicht an mechanische Schalter anschließt.

von peter dannegger (Gast)


Lesenswert?

@cerberus,

"Nur weil man in der Software der uCs grobe Nachlässigkeiten der
Hardware "wegschminken" kann"


Was ist daran nachlässig, Hardware durch ein paar Zeilen Software zu
ersetzen ?

Die Hardware (Kondensator) muß ich jedesmal einlöten, kostet also bei
jedem Gerät.
Die Software muß ich nur einmal schreiben und kostet dann nix mehr.

Wenn ich also Hardware durch Software einsparen kann, dann tue ich das
auch.


Peter

von cerberus (Gast)


Lesenswert?

@peter

Wenn das so geplant ist, kann das doch ok sein.
Ich habe es mal anders gelernt und das macht für mich mehr Sinn als
die generelle Softwarelösung, womit ich nicht sagen will das die
Softwarelösung schlechter oder besser ist.
Ich möchte niemanden von meiner Methode überzeugen. Das Hühnerfutter
macht die Schaltung nicht wirklich teuer und schützt nicht nur vor den
den Prell-Impulsen.
Ich baue Industrietechnik und was würden meine Kunden wohl sagen, wenn
ich ihnen sage, dass sie die Readkontakte oder Maschinentaster in der
Software entprellen sollen?
Sowas kann ich nicht verkaufen.

von Daniel R. (Gast)


Lesenswert?

@thkais

<<Ein 10nF-100nF Kondensator parallel zum Taster ist übrigens weitaus
Ressourcenschonender, da brauchts gar keine Entprellungssoftware.
Und eine Tastaturmatrix frage ich per Timer-Interrupt ab - da entfällt
die Entprellung dann auch.>>

Falsch...ein Kondensator parallel zum Taster ist für denselben alles
andere als schonend...es sei denn man hängt noch einen Widerstand
dazwischen. Bei jedem Drücken fließt ein ein ziemlich hoher
Entladestrom über den Taster...dieser killt mit der Zeit die Kontakte.

Übrigens: Sinn eines Mikrocontrollers ist es Hardware zu sparen. Mit
einer Entprellroutine kann man sich das ganze o.g. R-C-Gerödel sparen
und spart somit auch Platz auf der Platine und Arbeit(wie Peter schon
sagte).


@cerberus
Du machst mehr Theater ums Prinzip als um das wirkliche Problem:
nämlich dass der Taster prellt.
Zu Deinen Dozenten: Die haben meistens keine Praxiserfahrung..woher
denn auch? Die haben das Zeug von deren Dozenten beigebracht bekommen
und haben es eben so weitergegeben....Schade.

Daniel

von peter dannegger (Gast)


Lesenswert?

@cerberus,

"Ich baue Industrietechnik und was würden meine Kunden wohl sagen,
wenn ich ihnen sage, dass sie die Readkontakte oder Maschinentaster in
der Software entprellen sollen?"


Sie würden sagen:
"Aber das ist doch normal, daß man immer damit rechnen muß, daß alle
Signale von außen gestört sein können".

Anders könnte man doch gar nicht zuverlässige Systeme programmieren.


Einen Industrieprogrammierer, der nicht mal entprellen kann, würde ich
feuern oder nen Besen in die Hand drücken, der hat einfach seine
Hausaufgaben nicht gemacht.


Peter

von thkais (Gast)


Lesenswert?

@Daniel: Für viele Kontakte ist dieser Strom sogar notwendig, um sie
überhaupt funktionsfähig zu halten. Die zwangsläufig entstehende
Oxidschicht wird "weggebrannt", der Kontakt gereinigt. Ist ein
häufiges Problem: Kontakte funktionierten wunderbar in Relais- und
Schützschaltungen, wurden die gleichen Kontakte an eine SPS
angeschlossen, sind sie nach einem vierteljahr nicht mehr
funktionstüchtig (kommt natürlich aufs Kontaktmaterial an).
Zeig mir einen Kontakt, der durch den hohen Entladestrom des
Kondensators zerstört wurde, und ich zeige Dir 100, die durch einen zu
geringen Strom nicht mehr funktionieren (kann Dich totwerfen mit den
Dingern, aus einer Rückrufaktion - da wurde anstelle Gold- eine
Wolframbeschichtung geliefert).
Mit "ressourcenschonend" meinte ich übrigens Softwareaufwand (geht
aus dem Kontext der vorhergehenden Postings hervor).

@Peter (1. Posting): Genau das wirds sein. In diesem Spezialfall würde
also das Rücksetzen des Interrupts am Ende der Wenderoutine das Problem
lösen. Wenn auch nicht sehr sauber. Die Abfrage in einem Timer-Interrupt
ist auf jeden Fall universeller.

von tex (Gast)


Lesenswert?

@Peter
<< Sie würden sagen:
"Aber das ist doch normal, daß man immer damit rechnen muß, daß alle
Signale von außen gestört sein können". >>

Das ist doch nicht wirklich Peter Dannegger, oder?
Und ist Peter nicht registrierter user?

von peter dannegger (Gast)


Lesenswert?

@tex

"Das ist doch nicht wirklich Peter Dannegger, oder?"


Was stört Dich daran ?

Wenn man immer beachtet, daß die Welt draußen nunmal rauh ist, dann
kann man wesentlich zuverlässiger entwickeln.


Ich habs nicht immer so gehalten und wurde dafür mit Tagen vorm
Oszilloskop bestraft, um Störungen auf die Spur zu kommen und dann
nachträglich alle möglichen und unmöglichen Abschirmmaßnahmen
dranzupfrimeln.


Die Debouncerroutine entprellt nicht nur, sondern unterdrückt auch
Spikes.

Auch wenn ich ne prellfreie digitale Quelle habe, die aber über ne
längere Leitung an die Steuerung angeschlossen ist, dann lasse ich das
Signal erstmal durch den Debouncer laufen, damit es frei von Spikes
ist.

Der Kunde findet das nämlich gar nicht so lustig, wenn er z.B. den
Lichtschalter betätigt und die Steuerung spielt durch diesen
Schaltimpuls verrückt.


Halte mal nen Oszilloskoptastspitze in die Luft und gucke Dir mal an,
was da so an Elektrosmog durch die Gegend wabert.

Und wenn überall RFID, Blauzahn, UMTS usw. umherfunken, wirds nur noch
schlimmer.


Peter

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.