OEP
18.04.2007, 17:07
Hallo liebe Assembler-Gemeinde,
ich habe da ein Problem mit dem INT0 des Attiny13. Wenn ich folgendes Programm im Simulator durchlaufen lasse:
.include "tn13def.inc"
.def temp = r16
;Reset- und Interruptvektoren
;
.CSEG ;Assembliere in den Programm-Flash-Speicher
.org $0000 ;beginne mit Adresse 0
;
;Sprungvektoren fuer Reset und Interrupt
;
rjmp main ;Reset vector
rjmp intpc0 ;int0 interrupt vector
reti; intpcint ;PCINT0 vector
reti ;TC0 overflow vector
reti ;Eeprom ready vector
reti ;Anaog comperator int vector
reti ;TC0 CompA vector
reti ;TC0 CompB vector
reti ;WDT vector
reti ;ADC conversion complete vector
;Programmbeginn
;internen Prozessortakt durch 32 teilen
;Takt = 9,6MHz / 32 = 300kHz
ldi temp,(1<<CLKPCE)
out CLKPR,temp
ldi temp, (1<<CLKPS2)|(1<<CLKPS0)
out CLKPR,temp
main:
;
; Stapelzeiger setzen fuer Rueckkehr-Adressen vom Interrupt
;
ldi temp,LOW(RAMEND) ;Stapelzeiger am Ende vom SRAM
out SPL,temp
ldi temp,(1<<PB1)
out DDRB,temp
ldi temp,(0<<PB1)|(1<<PB4)
out PORTB,temp ;LED ausschalten und internen Pull UP von PB4 ein
ldi temp, 0b00000010 ; INT0 konfigurieren
out MCUCR, temp
ldi temp, 0b01000000 ; INT0 aktivieren
out GIMSK, temp
sei
loop: nop rjmp loop ; eine leere Endlosschleife
intpc0:
sbis PORTB, 1
rjmp intpc1
cbi PORTB,1
reti
intpc1:
sbi PORTB, 1
reti
und ich einen Interrupt auslöse läuft das Prog ohne Probleme durch und setzt mir die Bits von Portb4. Löse ich dann noch einmal einen Interrupt aus läuft die Interrupt-Anweisung wieder durch und die Bits von Portb4 werden auch wieder gelöscht. Nur wenn jetzt die Interrupt-Anweisung wieder verlassen wird wird sofort wieder zum Interrupt-Handler gesprungen und wieder ein Interrupt ausgelöst, so dass die Bits wieder gesetzt werden. Kann mir das einer erklären?
Mfg André
ich habe da ein Problem mit dem INT0 des Attiny13. Wenn ich folgendes Programm im Simulator durchlaufen lasse:
.include "tn13def.inc"
.def temp = r16
;Reset- und Interruptvektoren
;
.CSEG ;Assembliere in den Programm-Flash-Speicher
.org $0000 ;beginne mit Adresse 0
;
;Sprungvektoren fuer Reset und Interrupt
;
rjmp main ;Reset vector
rjmp intpc0 ;int0 interrupt vector
reti; intpcint ;PCINT0 vector
reti ;TC0 overflow vector
reti ;Eeprom ready vector
reti ;Anaog comperator int vector
reti ;TC0 CompA vector
reti ;TC0 CompB vector
reti ;WDT vector
reti ;ADC conversion complete vector
;Programmbeginn
;internen Prozessortakt durch 32 teilen
;Takt = 9,6MHz / 32 = 300kHz
ldi temp,(1<<CLKPCE)
out CLKPR,temp
ldi temp, (1<<CLKPS2)|(1<<CLKPS0)
out CLKPR,temp
main:
;
; Stapelzeiger setzen fuer Rueckkehr-Adressen vom Interrupt
;
ldi temp,LOW(RAMEND) ;Stapelzeiger am Ende vom SRAM
out SPL,temp
ldi temp,(1<<PB1)
out DDRB,temp
ldi temp,(0<<PB1)|(1<<PB4)
out PORTB,temp ;LED ausschalten und internen Pull UP von PB4 ein
ldi temp, 0b00000010 ; INT0 konfigurieren
out MCUCR, temp
ldi temp, 0b01000000 ; INT0 aktivieren
out GIMSK, temp
sei
loop: nop rjmp loop ; eine leere Endlosschleife
intpc0:
sbis PORTB, 1
rjmp intpc1
cbi PORTB,1
reti
intpc1:
sbi PORTB, 1
reti
und ich einen Interrupt auslöse läuft das Prog ohne Probleme durch und setzt mir die Bits von Portb4. Löse ich dann noch einmal einen Interrupt aus läuft die Interrupt-Anweisung wieder durch und die Bits von Portb4 werden auch wieder gelöscht. Nur wenn jetzt die Interrupt-Anweisung wieder verlassen wird wird sofort wieder zum Interrupt-Handler gesprungen und wieder ein Interrupt ausgelöst, so dass die Bits wieder gesetzt werden. Kann mir das einer erklären?
Mfg André