Ich verusche jetzt schon einige Zeit den Interrupt bei einem AT90S1200 auszuschalten. Nur leider kann ich den nicht ausschalten. Er bleibt nach dem er eingeschaltet wurde immer an.
Ich möchte folgendes erreichen:
Nach drücken und loslassen eines Tasters wird die Schleife aktiv. Nun möchte ich aus der Schleife verzweigen wenn ich den Taster drücke (Interrupt wird ausgelöst beim Übergang von 5V -> Masse). Das klappt soweit. Danach geht es wieder an den Anfang des ganzen Programmes und es wird auf den nächsten Tastendruck gewartet um die Schleife wieder starten zu können. Alles muss mit einem Taster gemacht werden. Wenn nach dem verlassen der Schleife wieder mit dem Taster starten will springt das Programm immer zur Interruptroutine und nicht zur Schleife.
Im Anhang habe ich mal meinen Programmcode. Ich habe einige Sachen weggelassen um es lesbarer zu machen.
Vielen Dank schonmal
Marcus
BID = 54449
lynx
Gerade angekommen
Beiträge: 10
wenn mich jetzt nicht alles täuscht, werden die interrupts durch das hineinschreiben einer "1" deaktiviert
korrigiert mich wenn ich falsch lieg, aber ich glaub da war mal was :D
BID = 54455
Marc10k
Stammposter
Beiträge: 273 Wohnort: Erkelenz
Hallo
Im Datasheet steht drin man kann die Interrupts mit "CLI" ausschalten. Im GIMSK wird Bit 6 gesetzt um den Externen Interrupt zu aktivieren. Aslo "0" zum deaktivieren.
Marcus
BID = 54483
tixiv
Schreibmaschine
Beiträge: 1492 Wohnort: Gelsenkirchen
Pass auf Deinen Stackpointer auf!
Hast Du den überhaupt initialisiert? Wenn nicht ist nämlich jedes Return und jeder call eine potentielle Fehlerquelle.
AUs einem Interrupt steigt man grundsätzlich mit iret (oder wars reti??) aus, da sonst der Stack auch einen Overflow bekommt.
normalerweise würde ich im Interrupt eine Variable setzen, wenn der Taster gedrückt wurde. Im Hauptprogramm kannst Du die dann abfragen. Warum überhaupt die Taste im Interrupt abfragen??
BID = 54495
Jornbyte
Moderator
Beiträge: 7178
Der 1200'er hat keinen Ram, deshalb geht der nicht zu Initialisieren. Aber das DATENBLATT (tixiv liest sowas nicht gern) gibt Auskunft:
During interrupts and subroutine calls, the return address program counter (PC) is stored on the stack. The stack is a 3-level-deep hardware stack dedicated for subroutines
and interrupts.
Eingeschaltet wird der Interrupt mit sei und aus mit cli.
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
BID = 54498
Marc10k
Stammposter
Beiträge: 273 Wohnort: Erkelenz
Hallo
Ich habe den Fehler gefunden. Nach dem ich mir das Programm mal ganz genau mit dem AVR Studio Simulator angeschaut habe konnte ich auch keine Fehler feststellen. Jetzt habe ich aber mal einige Zeilen herausgenommen die doppelt waren oder keine Änderung machten und siehe da es klappte. Warum das im Simulator klappte und im Chip nicht ist mir unklar.
Den Stack braucht man beim AT90S1200 nicht (bei den anderen schon) initialisieren weil er nur ein 3 Level Hardware Stack hat und ich bin mir sicher da keinen Overflow zu gemacht haben. Das Programm läuft jetzt ganz gut. Wenn ich noch mehr Lust habe werde ich das wohl mit dem Biut setzen machen und dann in der Schleifer auswerten.
Vielen Dank für die Hilfe
Marcus
BID = 54523
tixiv
Schreibmaschine
Beiträge: 1492 Wohnort: Gelsenkirchen
uuups! Ich dachte das Ding würde so ähnlich funktionieren wie der AT90S2313 - naja... man lernt nie aus.
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!