PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [gelöst]Problem mit Interrupt Attiny13



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é

wkrug
18.04.2007, 20:09
Ich hab jetzt zwar mal nur kurz das Datenblatt des Tiny 13 überflogen, ich würd aber sagen, das stimmt so.
Du löst nämlich durch das Umschalten des Port B,1 im Interrupt bereits wieder einen neuen Interrupt aus (=Software Interrupt).
der dann natürlich beim Beenden der Interruptroutine sofort wieder aufgerufen wird.
Ich würd Dir empfehlen einen anderen Port für die Umschaltung zu benutzen.

OEP
19.04.2007, 09:47
Hallo,
also der Hinweis mit dem Software-Interrupt hatte mich dazu gebracht noch mal etwas kritisch meinen Code zu betrachten und siehe da, der konnte so nicht funktionieren und das Datenblatt hätte ich mir auch mal richtig ansehen können/sollen. Der Fehler war, dass ja der Int0 Eingang an PB1 ist und da kann dann natürlich auch kein Ausgang mehr sein. War also doppelt belegt und hat somit den zweiten Interrupt ausgelöst. Code abgeändert und siehe da es funktioniert.
Danke wkrug!

Mfg André