Запустить Timer1 в ATmega2560 со сборкой

У меня возникла небольшая проблема с Timer1 в Arduino (ATmega2560) при кодировании его на ассемблере. Я пытаюсь запустить Timer1 в режиме CTC - на мой взгляд, все настроено хорошо, но TCNT1 просто не увеличивает каждый такт, как следовало бы. Проверил регистры в Atmel Studio, вроде все нормально, но может я о чем-то забыл?

Вот код

.ORG 0
jmp start

.ORG 0x22
call isr_toggle_PA0

.ORG 0x400
start:
LDI R16, HIGH(RAMEND)
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16 ; initialize stack pointer
clr r16

ldi r16, 0xff
out DDRA, r16 ; port A output
ldi r16, 0x00
out DDRD, r16 ; port D input
clr r16

ldi r20, 1<<OCIE1A
sts TIMSK1, r20 ; enable Timer1 A comapre match interrupt
sei

ldi r20, HIGH(25000)
sts OCR1AH, r20
ldi r20, LOW(25000)
sts OCR1AL, r20

ldi r20, 0b00000010 ; CTC mode, int clk;
sts TCCR1A, r20     
ldi r20, 0b000000101 ; prescaler /1024
sts TCCR1B, r20
ldi r20, 0
sts TCCR1C, r20

; --- start main
main:


inc r16
rjmp main
; --- end main

isr_toggle_PA0: // бит переключения PA0
    ldi r16,0x00000001
    in r17, PORTA
    eor r17,r16
    out PORTA, r17
    reti

Спасибо и хорошего дня :)

, 👍2


1 ответ


Лучший ответ:

3

Здесь:

ldi r20, 0b00000010 ; CTC mode, int clk;
sts TCCR1A, r20     
ldi r20, 0b000000101 ; prescaler /1024
sts TCCR1B, r20

вы устанавливаете бит WGM11 в TCCR1A. Затем таймер работает в режиме 2 (ШИМ, коррекция фазы, 9 бит), а не в режиме 4 (CTC).

,

Удивительный!! Мне нужно, чтобы это была ошибка. Для тех, кому интересно, правильная версия ldi r20, 0b00000000 ; Режим CTC, int clk; стс TCCR1A, р20 лди r20, 0b000001101 ; прескалер /1024 стс TCCR1B, 20р, @skorejen