Вопрос счастливым пользователям mega48/88/168.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Sl_ 01 сентября 2005 г. 14:02

У меня Studio4.11+SP2+SP3. Работаю в симуляторе.
Не могу загнать T1 в режим - PWM, Phase and Frequency Correct (WGM13: WGM12: WGM11:WGM10 = 8 или 9).
Счетчик в этом режиме должен считать от 0 до значения хранящегося в ICR1(если режим 8) или OCR1A(если режим 9) а затем счет вниз до 0.
Получается:
В режиме 8 счетчик считает от 0 до FF:FF. Как если бы был в режиме 0.
В режиме 9 счетчик считает от 0 до 00:FF а затем счет вниз до 0. Как если бы был в режиме 1

Такое впечатление как будто нет записи в TCCR1B(WGM13). Хотя Studio показывает что в TCCR1B бит WGM13 установлен.

Кстати T1 в режиме 4 правильно работает. Считает от 0 до OCR1A а затем сразу в 0.
В режиме 12 должен считать от 0 до ICR1 а затем сразу в 0. А работает как в режиме 4.
Т.е. запись 1 в TCCR1B(WGM12) работает.

Почему не “работает”. запись 1 в TCCR1B(WGM13) ?
И где же меня клинет?

==============================================================
.include "m48def.inc"

.def WorkR = r31

; For Internal SRAM ATMega48/88/168 - TOP - 0x02FF/0x04FF/0x04FF.(RAMEND)
.equ TopStack_ = RAMEND
.equ TopStackh_ = HIGH(TopStack_)
.equ TopStackl_ = LOW(TopStack_)

.equ CInitT1_PWM = 0x0010

; ===================================================

MAIN:
ldi WorkR, TopStackh_
out SPH, WorkR
ldi WorkR, TopStackl_
out SPL, WorkR

;.equ T1_Mode = 0x08 ; Define PWM mode. WGM13.WGM12.WGM11.WGM10 bits.
.equ T1_Mode = 0x09 ; Define PWM mode. WGM13.WGM12.WGM11.WGM10 bits.

; TIMER/COUNTER1 CONTROL REGISTER B - TCCR1B(0x81(SRAM)). ATmega48/88/168.
; ICNC1 ICES1 - WGM13 є WGM12 CS12 CS11 CS10
ldi WorkR, ((T1_Mode & 0x0C)<<1)
sts TCCR1B, WorkR

; TIMER/COUNTER1 OUTPUT COMPARE REGISTER HIGH. OCR1AH(0x89(SRAM)). ATmega48/88/168.
; TIMER/COUNTER1 OUTPUT COMPARE REGISTER LOW. OCR1AL(0x88(SRAM)). ATmega48/88/168.
ldi WorkR, HIGH(CInitT1_PWM)
ldi r30, LOW(CInitT1_PWM)
sts OCR1AH, WorkR
sts OCR1AL, r30

; TIMER/COUNTER1 CONTROL REGISTER A - TCCR1A(0x80(SRAM)). ATmega48/88/168.
; COM1A1 COM1A0 COM1B1 COM1B0є - - WGM11 WGM10
ldi WorkR, (T1_Mode & 0x03)
sts TCCR1A, WorkR

; TIMER/COUNTER1 CONTROL REGISTER C - TCCR1C(0x82(SRAM)). ATmega48/88/168.
; FOC1A FOC1B - - є - - - -
ldi WorkR, 0x00
sts TCCR1C, WorkR

; TIMER/COUNTER1 INPUT CAPTURE REGISTER HIGH. ICR1H(0x87(SRAM)). ATmega48/88/168.
; TIMER/COUNTER1 INPUT CAPTURE REGISTER LOW. ICR1L(0x86(SRAM)). ATmega48/88/168.
ldi WorkR, HIGH(CInitT1_PWM)
ldi r30, LOW(CInitT1_PWM)
sts ICR1H, WorkR
sts ICR1L, r30

; ---- Init interrupt T1 in M48/88/168 -----
; Timer/Counter Flag Register - TIFR1(0x16(I/O reg) - 0x36(SRAM)). ATmega48/88/168.
; - - ICF1 - є - OCF1B OCF1A TOV1 ATmega48/88/168
; ldi WorkR, InV_TIMSK1 ; Init value - TIMSK1.
; out TIFR1, WorkR

; TIMER/COUNTER INTERRUPT MASK REGISTER - TIMSK1(0x6F(SRAM)). ATmega48/88/168.
; - - ICIE1 - є - OCIE1B OCIE1A TOIE1

.equ InV_TIMSK1 = 0x20
; ICIE1 - TIMER/COUNTER1 Input Capture Interrupt Enable. Enable.
; OCIE1A - TIMER/COUNTER1 Output CompareA Match Interrupt Enable.
; OCIE1B - TIMER/COUNTER1 Output CompareB Match Interrupt Enable.
; TOIE1 - TIMER/COUNTER1 Overflow Interrupt Enable. Enable.
; ldi WorkR, InV_TIMSK1
; sts TIMSK1, WorkR

; General Timer/Counter Control Register GTCCR(0x23(I/O reg) - 0x43(SRAM)) ATmega48/88/168
; TSM - - - є - - PSRASY PSRASYNC
ldi WorkR, 0x03
out GTCCR, WorkR

; ===========================================
lds WorkR, TCCR1B
ori WorkR, 0x01
sts TCCR1B, WorkR

tmp:
rjmp tmp

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru