ATMega8, interruptvektorerna förskjutna?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Greensilver
Inlägg: 1305
Blev medlem: 21 januari 2005, 21:24:57
Ort: Sverige
Kontakt:

ATMega8, interruptvektorerna förskjutna?

Inlägg av Greensilver »

Har nu hållt på hela dagen med att få igång en enkel lysdiodsblinkare och jag kan inte fatta vad jag gör för fel. Problemet är att interruptvektorerna verkar förskjutna med 5 rader. Se mina anmärkningar med "<< >>" nedan.

När jag kör koden hoppar uC alltså till dessa rader. Pekar jag dessa vektorer mot mina overflowrutiner så fungerar det. Tabellen med vektorer kommer från databladet.

Mycket tacksam för tips, börjar känna ett hiskeligt begär att få bjuda min STK på en flygtur och sätta mig i soffan med en öl istället. :lol:

EDIT: Förtydligande; uC'n hoppar alltså till vektor 5 samt vektor 6 när overflow inträffar på timer 1 respektive 0. Det verkar alltså som om hela vektortabellen hamnat några ord för tidigt i minnet. Mycket tacksam för tips!

Kod: Markera allt

1 0x000(1) RESET 2 0x001 INT0 External Interrupt Request 0
3 0x002 INT1 External Interrupt Request 1
4 0x003 TIMER2 COMP Timer/Counter2 Compare Match
5 0x004 TIMER2 OVF Timer/Counter2 Overflow <<TIM1 OVF>>
6 0x005 TIMER1 CAPT Timer/Counter1 Capture Event <<TIM0 1VF>>
7 0x006 TIMER1 COMPA Timer/Counter1 Compare Match A
8 0x007 TIMER1 COMPB Timer/Counter1 Compare Match B  
9 0x008 TIMER1 OVF Timer/Counter1 Overflow  
10 0x009 TIMER0 OVF Timer/Counter0 Overflow
11 0x00A SPI, STC Serial Transfer Complete
12 0x00B USART, RXC USART, Rx Complete
13 0x00C USART, UDRE USART Data Register Empty
14 0x00D USART, TXC USART, Tx Complete
15 0x00E ADC ADC Conversion Complete
16 0x00F EE_RDY EEPROM Ready
17 0x010 ANA_COMP Analog Comparator
18 0x011 TWI Two-wire Serial Interface
19 0x012 SPM_RDY Store Program Memory Ready

Så här ser koden ut, jag har stökat om lite i interruptvektorerna för att få det att fungera.

Kod: Markera allt

.include "m8def.inc"

.org $0000
jmp RESET							; Reset Handler
jmp EXT_INT0 						; IRQ0 Handler
jmp EXT_INT1 						; IRQ1 Handler
jmp TIM2_COMP 						; Timer2 Compare Handler
jmp TIM1_OVF 						; Timer1 Overflow Handler
jmp TIM0_OVF 						; Timer1 Overflow Handler
jmp TIM2_OVF 						; Timer2 Overflow Handler
jmp TIM1_CAPT	 					; Timer1 Capture Handler
jmp TIM1_COMPA 						; Timer1 CompareA Handler
jmp TIM1_COMPB 						; Timer1 CompareB Handler
jmp SPI_STC		 					; SPI Transfer Complete Handler
jmp USART_RXC 						; USART RX Complete Handler
jmp USART_UDRE 						; UDR Empty Handler
jmp USART_TXC 						; USART TX Complete Handler
jmp ADC_CC 							; ADC Conversion Complete Handler
jmp EE_RDY 							; EEPROM Ready Handler
jmp ANA_COMP						; Analog Comparator Handler
jmp TWI 							; Two-wire Serial Interface Handler
jmp SPM_RDY 						; Store Program Memory Ready Handler

; Driver settings.
;.equ _BIOS_      = $0060
;.equ k_BUFFER 	 = _BIOS_+0			; Keyboard buffer adress in RAM.

;.equ p_STACKBASE = $0100			; Base adress for data stack (incrementing).

.def WH          = r25
.def WL          = r24
.def CTRL        = r23              ; !!! Dedicated register for flow control. !!!
.def PWM0        = r22              ; Current PWM value.

; Include needed drivers.
;.include "D:\Elektronik\Assembler\Drivers\driver_m_maths.asm"
;.include "D:\Elektronik\Assembler\Drivers\driver_p_program.asm"


RESET:
;	ldi r16,$01		
;	out GICR, r16
;	ldi r16,$03		
;	out GICR, r16

	ldi r16,high(RAMEND) 			; Main program start
	out SPH,r16 					; Set Stack Pointer to top of RAM
	ldi r16,low(RAMEND)
	out SPL,r16

	; Set up ports.
	ldi r16,0b00000010
	out DDRB,r16					; PORTB as input, pin 15 output.


	ldi r16,$00		
	out DDRC,r16					; PORTC as input.	   		


	ldi r16,$00
	out DDRD,r16					; PORTD as input.

	; Set up the ADC.
	ldi r16,0b01100000				; Use VCC as ref.,Left adjust, ADC0.
	out ADMUX, r16

	; Set up Timer 0.
	ldi r16,0b00000001
	out TCCR0,r16					; Timer/Counter0 Control Register - prescaler.

	; Set up Timer 1.
	ldi r16,0b00000000
	out TCCR1A,r16					; Timer/Counter1 Control Register - prescaler.
	ldi r16,0b00000101
	out TCCR1B,r16					; Timer/Counter1 Control Register - prescaler.

	; Init.
;	rcall p_INIT					; Initialise data stack.
	
	; Start Timers 0 and 1.

	ldi r16,0b00000101
	out TIMSK,r16					; Timer/Counter Interrupt Mask Register - activate it.

	; Activate interrupts.
	sei
		
LOOP:								; Suspend the CPU to save power while waiting for interrupt.
	; Read ADC if the ADC_Read flag is set..
	sbrc CTRL,0
	rcall READ_ADC

	; Set output pin to low if timer is above PWM value.
	in r16,TCNT0
	cp r16,PWM0
	brlo ExitLoop
	
	ldi r16,$00
	out PORTB,r18

	ExitLoop:
jmp LOOP

.MACRO p_INITINT
	cli
	; Save SREG to the stack.
	ldi  r16,SREG
	push r16						; Save a copy of SREG on the stack during interrupt.
.ENDMACRO

.MACRO p_EXITINT
	pop r16						; Get from stack.
	out SREG,r16					; Store in SREG.
	sei
.ENDMACRO


READ_ADC:
	cli
	; Start ADC.
	ldi r16, 0b11000010
	out ADCSR,r16
	sbi ADCSR,ADSC
 
	; Wait for conversion to finish.
	waitADC:
	sbic ADCSR,ADSC
	rjmp waitADC

	; Store data to buffer.
	in PWM0,ADCH
	;in r16,ADCH
	;sts PV_H,r16
	cbr CTRL,$01
	sei
ret

TIM0_OVF: 							; Timer0 Overflow Handler
	p_INITINT
	ldi r16,$02
	out PORTB,r16
	p_EXITINT
reti

TIM1_OVF: 							; Timer1 Overflow Handler
	p_INITINT
	; Set ADC_Read flag.
	sbr CTRL,$01
	p_EXITINT
reti

Case_1:
ret

Case_2:
ret

Case_3:
ret

;d_PRINT:							; Print a string of text.
; Fetch current readposition from RAM location 61:60.
;lds ZL,$0060
;lds ZH,$0061

; Reset lengthcheck.
;ldi r16,$00

;READCHAR:
;	sts $0062,r16
;
;	rcall e_Read
;	cpi r16,$00
;	breq DONEPRINT
;
;	d_OUT r16
;	adiw ZH:ZL,$01 ; Add 1 to the Z-pointer(r31:r30)
;
;	lds r16,$0062
;	inc r16
;	cpi r16,$10
;	breq DONEPRINT
;
;	jmp READCHAR
;
;	DONEPRINT:
;ret





;* in	r16,PORTB		;read PORTB latch
;* sbr	r16,(1<<PB6)+(1<<PB5)	;set PB6 and PB5 (use masks, not bit#)
;* out  PORTB,r16		;output to PORTB
;*
;* in	r16,TIFR		;read the Timer Interrupt r17 Register
;* sbrc	r16,TOV0		;test the overflow r17 (use bit#)
;* rjmp	TOV0_is_set		;jump if set
;* ...				;otherwise do something else

;clr r27 ; Clear X high byte
;ldi r26,$60 ; Set X low byte to $60
;ldi r16,$00 ;H
;st X+,r16 ; Store r0 in data space loc. $60(X post inc)
;ldi r16,$14 ;L
;st X+,r16 ; Store r0 in data space loc. $60(X post inc)


	
;lds r16,$FF00 ; Load r2 with the contents of data space location $FF00
;add r2,r1 ; add r1 to r2
;sts $FF00,r2 ; Write back
;			case '\n' :
;				d_LOCATE(0x40);
;				break;
;			default :
;					d_OUT(s[i]);
;					break;	
;		}
;		i++;


	;ldi r16,$14 ;L
	;sts $0060,r16 ; Write back
	;ldi r16,$00 ;H
	;sts $0061,r16 ; Write back
	;rcall d_PRINT ; print any text stored in memory pointed by location 61:60


	;ldi r16,$25 ;L
	;sts $0060,r16 ; Write back
	;ldi r16,$00 ;H
	;sts $0061,r16 ; Write back


	; Configure I/O-ports.
	;ldi r16,0b11111111			; $FF
	;out PORTB,r16				; Turn on pull-ups PortB.
	;out PORTD,r16				; Turn on pull-ups PortD.



;adiw QH:QL, 63  	
	;ldi16 high(Q),low(q), 2400
;	ldi r17,6

;	rcall m_DIV8U


EXT_INT0: 					; IRQ0 Handler
EXT_INT1:					; IRQ1 Handler
TIM2_COMP: 					; Timer2 Compare Handler
TIM2_OVF: 					; Timer2 Overflow Handler
TIM1_CAPT: 					; Timer1 Capture Handler
TIM1_COMPA: 				; Timer1 CompareA Handler
TIM1_COMPB: 				; Timer1 CompareB Handler
SPI_STC: 					; SPI Transfer Complete Handler
USART_RXC:					; USART RX Complete Handler
USART_UDRE: 				; UDR Empty Handler
USART_TXC: 					; USART TX Complete Handler
ADC_CC: 					; ADC Conversion Complete Handler
EE_RDY: 					; EEPROM Ready Handler
ANA_COMP:					; Analog Comparator Handler
TWI: 						; Two-wire Serial Interface Handler
SPM_RDY: 					; Store Program Memory Ready Handler
reti
GalFisk
Inlägg: 314
Blev medlem: 11 mars 2006, 23:53:11
Ort: Horndal

Inlägg av GalFisk »

Hjälper detta något? (googlat från någon atmega8.h)

IVCE - Interrupt Vector Change Enable

#define IVCE 0

The IVCE bit must be written to logic one to enable change of the IVSELbit.IVCE is cleared by hardware four cycles after it is written or when IVSEL is written.Setting the IVCE bit will disable interrupts,as explained in the IVSELdescription above.

IVSEL - Interrupt Vector Select

#define IVSEL 1

When the IVSELbit is cleared (zero),the interrupt vectors are placed at the start of the Flash memory.When this bit is set (one),the interrupt vectors are moved to the beginning of the Boot Loader section of the flash.The actual address to the start of the boot flash section is determined by the BOOTSZ fuses.
Skriv svar