Hallo liebe Assembler-Gemeinde,
ich habe da ein Problem mit dem INT0 des Attiny13. Wenn ich folgendes Programm im Simulator durchlaufen lasse:
Code:
.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é
Lesezeichen