Hallo Leute,
hab mich mal mit "extern Interrupt" beschäftigt. Dazu das Buch zur Hilfe genommen, was eine gut
verständliche Applikation zum Mega8 hatte. Also habe ich versucht dies auf den Tiny2313 zuzuschneiden.
Vieles fiel zu Beginn weg wie SPL/SPH...die include geändert. Habe mich zum Pin "INT1" entschieden, da eine
Taste angelegt (mit Pullup = 10K) und an PB0-PB2 3 Leds.
Neu war für mich INT1 zu initialisieren. In der Liste SFR fand ich das Reg. MCUCR, aber nicht GICR. Es kam nur
GIMSK in Frage und das stimmte auch. Die ganze Sache lief auf Anhieb, was mich aber dabei wunderte, vom Tasten-
prellen war nichts zu merken. Nach jedem Tastendruck leuchteten die Leds binär sauber auf. Zu Beginn wurde
Port DDRD nicht als Eingang deklar. Sind die Ports nach Reset automatisch als Input geschaltet?
Die Anwendung kann ich evtl. für die Readkontakte auf den Schienen verwenden.
Nun hat ja PORTB die 8 PCINTx Pins...wie mag das da nur ablaufen. Brauchte da einen Tipp!
Grüß
Rolf
Hier der Quelltext:
hab mich mal mit "extern Interrupt" beschäftigt. Dazu das Buch zur Hilfe genommen, was eine gut
verständliche Applikation zum Mega8 hatte. Also habe ich versucht dies auf den Tiny2313 zuzuschneiden.
Vieles fiel zu Beginn weg wie SPL/SPH...die include geändert. Habe mich zum Pin "INT1" entschieden, da eine
Taste angelegt (mit Pullup = 10K) und an PB0-PB2 3 Leds.
Neu war für mich INT1 zu initialisieren. In der Liste SFR fand ich das Reg. MCUCR, aber nicht GICR. Es kam nur
GIMSK in Frage und das stimmte auch. Die ganze Sache lief auf Anhieb, was mich aber dabei wunderte, vom Tasten-
prellen war nichts zu merken. Nach jedem Tastendruck leuchteten die Leds binär sauber auf. Zu Beginn wurde
Port DDRD nicht als Eingang deklar. Sind die Ports nach Reset automatisch als Input geschaltet?
Die Anwendung kann ich evtl. für die Readkontakte auf den Schienen verwenden.
Nun hat ja PORTB die 8 PCINTx Pins...wie mag das da nur ablaufen. Brauchte da einen Tipp!
Grüß
Rolf
Hier der Quelltext:
Code:
; Projekt-Name: Projekt01 Datum: 12.12.2012
; Datei: ext-interrupt01.asm
; INT1 Taste PD3 / Pin7
; Port B: Ausgabe PB7 .. PB0 3 x Leuchtdioden
; Port D: Eingabe PD3=INT1 / Pin7 über Taste sw1
; Konfiguration: interner Oszillator 1 MHz, externes RESET-Signal
.INCLUDE "tn2313def.inc" ; Deklarationen für Tiny2313
.DEF akku = r16 ; Arbeitsregister
.CSEG ; Programm-Flash
rjmp start ; Reset-Einsprung
.ORG INT1addr ; Einsprung externer Interrupt INT1
rjmp TIMER0_OVF ; Sprung zur ISR
.ORG $2A ; weitere Interrupteinsprünge übergehen
start:
ldi akku,0xFF ; Bitmuster 1111 1111
out DDRB,akku ; Richtung Port B ist Ausgang
clr akku ; Zähler r16 löschen
out PORTB,akku ; und Anfangswert ausgeben(PORTB=LOW)
; Interrupt INT1 initialisieren
in akku,MCUCR ; Inhalt Steuerreg. nach Reset=0
sbr akku,1 << ISC11 ; setze Bit ISC11
cbr akku,1 << ISC10 ; lösche Bit ISC10
out MCUCR,akku ; ISC1x: 1 0 INT1 fallende Flanke
in akku,GIMSK ; Freigaberegister nach Reset=0
sbr akku,1 << INT1 ; setze Bit INT1:
out GIMSK,akku ; Interrupt INT1 freigegeben
sei ; alle Interrupts global frei
; Hauptprogramm schläft vor sich hin
loop: rjmp loop ; tu nix
;
; Serviceprogramm bedient externen Interrupt INT1 Taste PD3
TIMER0_OVF:
push akku ; Register retten auf Stack -1
in akku,SREG ; Statusreg. nach r16
push akku ; retten auf Stack -1
in akku,PORTB ; PORTB=0 nach r16
inc akku ; um 1 erhöhen
out PORTB,akku ; neuen Zählerstand ausgeben
pop akku ; SP+1, danach vom Stack in r16 laden
out SREG,akku ; Inhalt von r16 ins SREG laden
pop akku ; SP+1, danach vom Stack in r16 laden
reti ; Rücksprung aus Serviceprogramm
.EXIT ; Ende des Quelltextes