Hallo zusammen,
ich versuche mich mal mit den Grundlagen der ASM-Programmierung und bin auf ein Problem gestoßen. In Anlehnung an ein Video-Tutorial für ein atmega8 versuche ich mit einem atmega32 nun per Timer0-Overflow-Int eine LED auf dem RNControl 1.4 zu schalten. Der Code ist eigentlich copy&paste. Dennoch tut es nicht - weder im AVRstudio-Debugger, noch in Hardware. Im Debugger wird TOV0 trotz Overflow von TCNT0 nicht gesetzt (AVRstudio-Einstellung: Mask Interrupts While Stepping=false).
Ich bin für jede Hilfe dankbar!
Grüß
NRicola
Code:
.include "m32def.inc"
.org 0x000
begin:
;--------------------------------------------------
rjmp main ; RESET External Pin, Power-on Reset, Brown-out Reset, Watchdog Reset, and JTAG AVR Reset
reti ; INT0 External Interrupt Request 0
reti ; INT1 External Interrupt Request 1
reti ; INT2 External Interrupt Request 2
reti ; TIMER2 COMP Timer/Counter2 Compare Match
reti ; TIMER2 OVF Timer/Counter2 Overflow
reti ; TIMER1 CAPT Timer/Counter1 Capture Event
reti ; TIMER1 COMPA Timer/Counter1 Compare Match A
reti ; TIMER1 COMPB Timer/Counter1 Compare Match B
reti ; TIMER1 OVF Timer/Counter1 Overflow
reti ; TIMER0 COMP Timer/Counter0 Compare Match
rjmp timer_int ; TIMER0 OVF Timer/Counter0 Overflow
reti ; SPI, STC Serial Transfer Complete
reti ; USART, RXC USART, Rx Complete
reti ; USART, UDRE USART Data Register Empty
reti ; USART, TXC USART, Tx Complete
reti ; ADC ADC Conversion Complete
reti ; EE_RDY EEPROM Ready
reti ; ANA_COMP Analog Comparator
reti ; TWI Two-wire Serial Interface
reti ; SPM_RDY Store Program Memory Ready
;--------------------------------------------------
main:
ldi r16, high(RAMEND)
out SPH, r16
ldi r16, low(RAMEND)
out SPL, r16
ldi r16, 0b11111111 ; Ausgänge=1 Eingänge=0
out DDRC, r16 ; Ausgeben
ldi r16, 0x00
out PortC, r16
; Timer und Interrupt konfigurieren
ldi r16, 6 ; 8bit-Timer-Register vorladen
out TCNT0, r16 ; so sind nur 256-6 / (16MHz/64) = 1ms zu zählen
ldi r16, 0b00000011 ; CS00 & CS01 setzen: Clock/64
out TCCR0, r16
ldi r16, 0b00000001 ; TOIE0 (Timer0-Overflow-Int) setzen
out TIMSK, r16
sei ; Interrupts aktivieren
mainloop:
nop
rjmp mainloop
timer_int:
rcall LEDswitch
ldi r16, 6
out TCNT0, r16
reti
LEDswitch:
in r16, PortC
ldi r17, 0b10000000 ; Bit 7 (LED)
eor r16, r17 ; invertieren
out PortC, r16
ret
Lesezeichen