External interrupt i AVR Studio?
Postat: 8 januari 2010, 11:02:49
Detta kör jag i AVR Studio och får det inte att fungera.
Jag försöker få ett interrupt med hjälp av INT1. Jag tänkte att temp ska öka med 1 varje varv i Main och när man INT1-pinnen blir låg(genom att klicka ur rutan PD1 i AVR Studio)så ska programmet hoppa till H_Heat och öka temp2 med 1.
Dels rullar det bara runt i Main oavsett hur jag klickar i rutorna på PortD
Dels skulle jag vilja att temp2 ökar med 1 och att programmet sedan hoppar tillbaka till Main(INT1 ska senare bli en knapp när jag kör detta i prossessorn), men det kanske blir så när man har antingen falling eller rising edge, bara ett interrupt per knapptryck?
Men, vad har jag gjort galet?
Går det att simulera INT1 i AVR Studio, gör jag på fel sätt?
Jag försöker få ett interrupt med hjälp av INT1. Jag tänkte att temp ska öka med 1 varje varv i Main och när man INT1-pinnen blir låg(genom att klicka ur rutan PD1 i AVR Studio)så ska programmet hoppa till H_Heat och öka temp2 med 1.
Dels rullar det bara runt i Main oavsett hur jag klickar i rutorna på PortD
Dels skulle jag vilja att temp2 ökar med 1 och att programmet sedan hoppar tillbaka till Main(INT1 ska senare bli en knapp när jag kör detta i prossessorn), men det kanske blir så när man har antingen falling eller rising edge, bara ett interrupt per knapptryck?
Men, vad har jag gjort galet?
Går det att simulera INT1 i AVR Studio, gör jag på fel sätt?
Kod: Markera allt
.NOLIST
.INCLUDE "m168def.inc"
.LIST
.DEF temp = r16 ;Temporärt register
.DEF temp2 = r17
;-------------------------------------------------------------------------------
; Macron
;-----------------------------------------------------------------------------------------------
.MACRO INTERRUPT ;Macro i början av en avbrottsrutin
push temp ;Lägg temp(1) på stacken
in temp,SREG ;
push temp ;Lägg SREG(2) på stacken
.ENDMACRO ;Slut macro
.MACRO INTERRUPT_END ;Macro i slutet av en avbrottsrutin
pop temp ;Hämta SREG(2) från stacken
out SREG,temp ;
pop temp ;Hämta temp(1) från stacken
reti ;Returnerar från avbrottet
.ENDMACRO ;Slut macro
;===============================================================================================
; AVBROTTS-VEKTORER
;===============================================================================================
.CSEG ;Följande placeras i PM
.ORG 0000 ;Avbrottsvektor för Reset
rjmp Reset
.ORG INT1addr
rjmp H_Heat
;-----------------------------------------------------------------------------------------------
; Reset - Initieringskod för att förbereda systemet
;-----------------------------------------------------------------------------------------------
.ORG 0x0100 ;Startadress i PM för Reset
Reset:
ldi temp, LOW(RAMEND) ;Initiera stackpekare
out SPL, temp ;
ldi temp, HIGH(RAMEND) ;
out SPH, temp ;
ldi temp, 0x00 ;Sätt PortD som in
out DDRD, temp ;
ldi temp, 0b00001000 ;Aktivera Pull-up på INT1
out PORTD, temp
;-----------------------------------------------------------------------------------------------
; EXT INT - Initiering
;-----------------------------------------------------------------------------------------------
;EXT INT - EICRA, Falling edge INT1
ldi temp, (1<<ISC11)+(0<<ISC10)+(0<<ISC01)+(0<<ISC00)
sts EICRA, temp
;EXT INT - EIMSK, INT1 Enable
ldi temp, (1<<INT1)
sts EIMSK, temp
sei ;Sätt I-biten i SREG för att tilllåta avbrott
;========================================================================
; Main - Huvudloop
;========================================================================
Main:
inc temp
rjmp Main ;Börja om på Main
;===============================================================================================
; AVBROTTSRUTIN - Avbrottsrutinen INT1
;===============================================================================================
H_Heat: INTERRUPT ;Börja avbrottsrutinen med MACRO INTERRUPT
inc temp2
INTERRUPT_END ;Avsluta avbrottsrutinen med MACRO INTERRUPT_END