www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik externer Interrpt INT1 löst immer aus


Autor: jaja...derHenne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe da ein seltsames Problem.
Ich weis nicht warum, aber der externe Interrupt löst bei mir immer
aus, auch wenn garnichts am Eingang passiert.
Ich habe die Register wie im Tutorial gesetzt:

ldi temp, 0b00001010  ;INT0 und INT1 konfigurieren
out MCUCR, temp

ldi temp, 0b11000000  ;INT0 und INT1 aktivieren
out GIMSK, temp

und als event-Handler erfolgt eigentlich nur die Inkrementierung eines
Registers:

int0_handler:
         inc myreg
         reti

Angeschlossen ist ein Windsensor mit Reed-Kontakt.
Wenn ich eine Simulation starte, so erfolgt nach jeder Zeile Main-Code
ein Sprung in den Interrupt.

Hat jemand eine Erklärung dafür ?

Autor: Simon Küppers (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Hast du denn einen Pullup oder einen Pulldown Widerstand
angeschlossen, damit bei geöffnetem Reedkontakt ein eindeutiger Pegel
vorliegt?
2. Ein Reedkontakt ist ein mechanischer Schalter. Wenn dieser schließt,
entsteht ein "Prellen". Das heißt, der Kontakt schließt nicht sofort,
sondern öffnet und schließt ganz schnell hintereinander, bevor er
sicheren Kontakt hat. Dieses prellen merkt der Microcontroller. Dagegen
gibts Schaltungen. In der Wiki ist das recht gut beschrieben (such mal
nach "Snubber")

Autor: Theodor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi

das prellen kann man wegbekommen, in dem man den kontakt mehrmals
abfragt, mit einem gewissen zeitabstand selbstverständlich. dazu
braucht man keine elektronische hilfsmittel.

Autor: jaja...derHenne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das Prellen scheint nicht das Problem zu sein.
Auf dem Controller selbst funktionierte das ganz nicht, also habe ich
es im AVR-Studio simuliert, wobei sich zeigte, das nach der
Initialisierung
und Aktivierung der Interrupts (Timer1 und INT0) nach jeder
abgearbeiteten Zeile der Hauptschleife, in die INT0-Routine gesprungen
wird-------das kommt mir doch komisch vor, da dies ja nur bei
Signaländerung, egal ob prellend oder nicht, passieren sollte.
(Der Timer-Interrupt löst ja auch nur aus, wenn ein Compar-Match
aufgetreten ist und nicht bei jedem Takt).

Den original Code habe ich gerade nicht zur Hand, da ich nicht zuhause
bin, aber ich habe die Initialisierung 1:1 vom Tutorial übernommen.
Mit dem anderen Interrupt gibt`s ja keine Probleme.

Autor: Christian B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube bei dem Problem hilft nur der Originalquelltext den du
compiliert hast :)

Autor: jaja...derHenne (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So,
anbei mal der Quellcode.
Der Reed-Kontakt ist mit einem 10k Pullup-Widerstand angeschlossen.
Wenn ich ne Simulation starte (AVR-Studio) springt nach erfolgreicher
Initialisierung, das Programm nach jeder Zeile des hauptprog in den
Interrupt windcount.

Autor: Stefan Pfister (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So wie ich das verstehe, hat das gar nichts mit der Hardware zu tun,
sondern nur mit dem Simulator aus AVRstudio?! Das Problem kenne ich,
nach der Initialisierung wird nach jedem Schritt der Interrupt
ausgelöst. Benutz mal die Suchfunktion, ich glaube, dass ich dieses
Problem auch hier gepostet hatte, weiss nicht mehr obs eine Lösung
gab...

Gruss

Autor: Stefan Pfister (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem ist zwar nicht von mir, aber auch hier zu finden...

http://www.mikrocontroller.net/forum/read-1-70970.html#new

Autor: jaja...derHenne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das Problem besteht auch bei der Hardware. Ich war so verzweifelt das
ich Windows gestartet habe um es im AVR-Studio zu simulieren.
Dabei ist mir das dann aufgefallen.
An welcher Stelle muss ich denn das Interrupt Flag manuell löschen,
damit nicht immer die Routine aufgerufen wird.
Am Ende der Routine selbst--da verändert sich nichts am Verhalten

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein paar Hinweise:

1. Den INT0 hast Du zwar aktiviert, aber keine Service-Routine dafür
geschrieben. So was gehört sich nicht.

2. Was denkst Du platziert der Assembler an die Adresse 0001, wenn Du
mit ORG die Adresse auf zwei setzt? Es gibt zwei Möglichkeiten:
entweder er lässt das Wort unprogrammiert, dann steht da FFFF. Ich weiß
gerade nicht, was das für ein Befehl ist, aber schön ist das nicht. Oder
er fügt eine Null ein, dann wird wenigstens ein NOP ausgeführt und der
Interrupt INT0 rennt in die INT1-Serviceroutine rein. Fazit: ORG im
Interrupt-Sprungbereich gehört schlicht verboten. Wie wäre es mit
RETI?

3. Den Pullup-Widerstand hast Du nur für INT1 eingeschaltet, für INT0
ist er aus. Eingänge ohne Pullups machen nette Sachen: manchmal
klappern sie, manchmal nicht. Kommt drauf an, was in der Nähe so vor
sich geht.

mfg
gerd

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.