Hallo liebe Gemeinde,
ich habe nur ein bescheidene Frage.
Bei meinem Assembler Programm (auf dem RN-Control) sollen alle LEDs an PORTC im sekunden Takt blinken.
Dies habe ich mit dem Timer1 (16-Bit) umgesetzt. Mein Problem ist nur, dass der Interrupt nur einmal ausgeführt wird. Die LEDs leuchten für eine Sekunde und gehen dann aus.
Meine Vermutung ist, dass das Zählregister nicht zurückgesetzt wird, aber das ist nur eine Vermutung.
Hat vielleicht jemand einen Hinweis was ich vergessen haben könnte oder vielleicht falsch gemacht habe?
Viele Grüße
Helmut
Code:
##########
#PROGRAMM#
##########
; definitions
.def temp = R16
.def temp_1 = R17
; interrupt vectors
.org 0x000 ; reset handler
rjmp main
.org 0x00E ; Timer1 CompareA Handler
rjmp interrupt_compare_A
.org 0x010 ; Timer1 CompareB Handler
rjmp interrupt_compare_B
main: ; main programm
;;; Timer Counter
;; Control Register A
LDI temp, 0x00 ; normal & Clear Timer on Compare Match (CTC) Mode -> own overflow value
OUT TCCR1A, temp ; Control Register A
;; Control Register B
LDI temp, 0b00011101 ; Timer prescaler of 1024 & Clear Timer on Compare Match (CTC) Mode -> self adjust overflow value
OUT TCCR1B, temp ; Control Register B
;; Output Compare Register 1 A for CTC
; write value 15625 -> 15625 * 1024 = 16MHz -> 1 second count
LDI temp, 0b00001001
OUT OCR1AL, temp
LDI temp, 0b00111101
OUT OCR1AH, temp
;; Output Compare Register 1 B for CTC
; write value 31,250 -> 31,250 * 1024 = 32MHz -> 2 seconds count
LDI temp, 0b00010010
OUT OCR1BL, temp
LDI temp, 0b01111010
OUT OCR1BH, temp
;;; PORTC set as output
LDI temp, 0xFF ; Register komplett auf 1 setzen / LDI geht nur von R16 bis R31
OUT DDRC, temp ; durch DDRC wird festgelegt ob die Pins von PORTC als Ausg. (1) oder Eing. (0) definiert werden
; DDRC wird nun mit den Werten aus R16 befüllt
;;; Interrupt handling
;; for timer 1
LDI temp, 0x08 ; Bit 4 – OCIE1A: Timer/Counter1, Output Compare A Match Interrupt Enable
OUT TIMSK, temp ; Timer/Counter Interrupt Mask Register
;; global
sei ; set global interruptenable
loop:
rjmp loop ; endless loop
;-------------------------------------------------------------------------------------------
; interrupts
interrupt_compare_A: ; interrupt routine for compare register 1 B
IN temp_1, SREG ; save status register
LDI temp, 0x00
OUT PORTC, temp ; LEDs on
OUT SREG, temp_1 ; restore status register
reti
interrupt_compare_B: ; interrupt routine for compare register 1 A
IN temp_1, SREG ; save status register
LDI temp, 0xFF
OUT PORTC, temp ; LEDs off
OUT SREG, temp_1 ; restore status register
reti
;-------------------------------------------------------------------------------------------
Lesezeichen