Forum: Compiler & IDEs Interrupts machen mich irre... HILFEEEE!!! :-)


von Iller (Gast)


Angehängte Dateien:

Lesenswert?

Erstmal zum verständniss :-)
Das Projekt soll für eine Speditition sein in der ich arbeite :-)
(Ich bekomme dafür auch kein geld ist nur für die lageristen gedacht )

Hintergrund:
Es dürfen max 2 Autos in die Halle einfahren.
Sind 2 Autos in der Halle soll eine nachgeschaltete Ampel auf Rot
springen (PC5)

Es sollen 2 lichtschranken abgefragt werden (L1_INT und L2_INT)
Dazu kommt noch ein Taster der die ampel generell auf rot schaltet
(int1)

Jetzt zu meinem Problem :-)

Die einfahrt der Autos wird wunderbar erkannt :-)
Nur das Ausfagren der Auto´s wird nicht sauber erkannt :-(

Sprich:
2 Auto´s fahren ein ok somit ist die variable "car auf 2"
fährt jetzt ein auto raus wird das komischerweiße teilweiße
schon durch L2_INT erkannt was nicht sein soll

Wenn dann das nächste Auto rausfährt (also INT3 aktiv wird)
wird statt 1- ein auto + gezählt also die ampel geht wieder auf rot
:-(

Hoffe ihr könnt mir helfen denn ich verzweifle langsam !

P.S.
Es ist kein komerzielles Produkt
Ich will das nur für mich und meine kolegen haben :-)
Geld bekomm ich keines dafür

von Peter Dannegger (Gast)


Lesenswert?

"Interrupts machen mich irre"

Kein Wunder, mich machen die vielen Delays in Deinen Interrupts irre.

Wenn man mehrere Millionen Zyklen in Interrupts nutzlos verbrät,
fürchte ich, bleibt keine Rechenleistung für das eigentliche Programm
mehr übrig.

Wenn Interrupts Feuer sind, dann sind Delays das Benzin, welches Du
reinschüttest.

Schau mal in die Codesammlung, da ist eine prima Entprellroutine
(bulletproof) für 1 bis 8 Eingänge ganz ohne die geringste
Rechenzeitvernichtung und sogar mit Flankenerkennung.


Peter

von Iller (Gast)


Lesenswert?

du meinst sicherlich diese Routine hier :
http://www.mikrocontroller.net/forum/read-4-20549.html

wenn ich das richtig sehe wird da nur ein interrupt verwendet oder?
ich habe 3 verwendet (ich weiß unwissenheit schütz vor strafe nicht
g)


Liege ich richtig das ich bei deiner routine alle drei tasten (bzw. 2
lichtschranken und eine taste) an einen int per diode führen sollte?

oder bin ich jetzt vollkommen auf dem holzweg?

von Peter Dannegger (Gast)


Lesenswert?

"oder bin ich jetzt vollkommen auf dem holzweg?"

Ja.

Die Routine entprellt immer alle 8 Eingänge eines Ports.
D.h. es ist sinnvoll, wenn alle 3 Eingänge (Taste, Lichtschranke) auf
einem Port liegen.
Die 5 restlichen Portpins kannst Du verwenden, wie Du willst.


Ich will jetzt auch nicht beschwören, daß Deine Probleme an den Delays
liegen. Aber in der Regel machen derart große Delays in Interrupts
große Probleme.


Man muß immer daran denken, daß eine CPU sequentiell arbeitet, d.h.
nichts gleichtzeitig tun kann. Es erscheint nur so (bei entsprechender
Porgrammierung), daß sie vieles quasi gleichzeitig macht.


Peter

von A.K. (Gast)


Lesenswert?

Eine komplette LCD-Ausgabe im Interrupt so wie hier ist tödlich.

Erstens wegen der von Peter angesprochenen Delays, die in einen
Interrupt einfach nicht reingehören.

Zweitens aber weil jede Form einer Portausgabe in Interrupts
erhebliche Gefahren enthält, wenn der gleiche Port auch im
Hauptprogramm verwendet wird. Stell dir bloss einmal vor, die
LCD-Ausgabe im Hauptprogramm wird mittendrin von einem Interrupt
unterbrochen, der wiederum auf LCD ausgibt. Das geht garantiert in die
Hose.

Allgemeine Regel: Komplexere Aufgaben wie hier die LCD-Ausgabe sollten
nicht in den Interrupts erledigt weden sondern im Hauptprogramm. Der
Interrupt stösst das allenfalls an, z.B. mit einer Statusvariablen die
vom Interrupt gesetzt und vom Hautprogramm abgefragt wird.

Achtung Gefahr: Jeder Port und jede Variable, die sowohl vom Interrupt
als auch vom Hauptprogramm verwendet werden, sind potentielle
Gefahrenquellen. Beispielsweise besteht eine 16bit Variable meist aus 2
separat verarbeiteten Byte. Verändert zwischendrin der Interrupt den
Wert, kriegt das Hauptprogramm ein Byte vom alten und ein Byte von
neuen Wert. Nicht gut. Ähnliche Effekte können auch bei Portbits zu
nicht repoduzierbaren Überraschungen führen.

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.