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.

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