www.mikrocontroller.net

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


Autor: Iller (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Iller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.