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 ;-------------------------------------------------------------------------------------------







Zitieren

Lesezeichen