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


von jaja...derHenne (Gast)


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 ?

von Simon Küppers (Gast)


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")

von Theodor (Gast)


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.

von jaja...derHenne (Gast)


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.

von Christian B. (Gast)


Lesenswert?

Ich glaube bei dem Problem hilft nur der Originalquelltext den du
compiliert hast :)

von jaja...derHenne (Gast)


Angehängte Dateien:

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.

von Stefan Pfister (Gast)


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

von Stefan Pfister (Gast)


Lesenswert?

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

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

von jaja...derHenne (Gast)


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

von gerd (Gast)


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

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.