External interrupt i AVR Studio?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

External interrupt i AVR Studio?

Inlägg av Glattnos »

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?

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

Glattnos
Inlägg: 3106
Blev medlem: 29 oktober 2009, 20:01:18

Re: External interrupt i AVR Studio?

Inlägg av Glattnos »

Aha! Jag kom på det, men det tog ett tag :D

EIMSK ligger på 0x3D i minnet och då ska man ju använda "OUT" när man skriver till den
EICRA ligger på 0x69 i minnet och då är det "STS" som gäller

Jag hade skrivit "STS" på båda och fick varken varning eller error så jag trodde att värdet skrevs till minnesplatsen som det skulle, men så var inte fallet.
Skriv svar