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 ?
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")
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.
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.
Ich glaube bei dem Problem hilft nur der Originalquelltext den du compiliert hast :)
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.
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
Das Problem ist zwar nicht von mir, aber auch hier zu finden... http://www.mikrocontroller.net/forum/read-1-70970.html#new
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.