реклама на сайте
подробности

 
 
> Проблемы с 16-ти разрядным таймером Mega8515., Неработает перезапуск при счёте внешних импульсов.
Deka
сообщение Jul 18 2006, 08:05
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 248
Регистрация: 18-07-06
Из: Сочи
Пользователь №: 18 890



Имеется устройство в котором на вход таймера T1 подаются счётные импульсы. Таймер работает в режиме Normal с разрешением прерываний при достижении заданного предела. После сброса импульсы великолепно считаются и всё работает как надо. После окончания счёта таймер останавливается и при повторной инициализации на счёт не считает входные импульсы. Вроде всё правильно сделал, хотя возможно что-то пропустил... После Hard Reset считает нормально... Что-бы это значило? help.gif
Ниже представлена процедура инициализации таймера T1.

Код
...
.equ    Init_TCCR1B  = 0b00000000; Таймер остановлен, режим работы NORMAL
.equ    Wait_TCCR1B = 0b00000100; Таймер с предделителем на 256
.equ    Calc_TCCR1B = 0b00000111; Таймер считает внешний сигнал по фронту
;
.equ    Init_TIMSK  = 0b00000001; Разрешить совпадение для T0
.equ    Wait_TIMSK = 0b10000001; Разрешить совпадение для T0 и переполн. для T1
.equ    Calc_TIMSK = 0b01000001; Разрешить совпадение для T0, совпад.T1A
...

WorkTimer:
    cli            ; Запретить прерывания
;
    ldi    Temp, Init_TCCR1B    ; Остановка таймера T1
    out    TCCR1B, Temp    ; Загрузили
;
    clr    Temp        ; Обнулить рабочий регистр
    out    TCNT1H, Temp    ; Записать старший байт
    out    TCNT1L, Temp    ; Записать младший байт
;
; Установим предел счёта счётчика
;
    lds    XH, DefVolH    ; Заданный объём (целая часть)
    ldi    XL, VodomerTick    ; Число импульсов водомера в литре
    mul    XH, XL        ; Перемножить
    movw    XH:XL, R1:R0    ; Сохранить результат
;
    out    OCR1AH, XH    ; Старший байт
    out    OCR1AL, XL    ; Младший байт
;
; Очистить предделитель
;
    ldi    Temp, (1<<PSR10)    ; Сброс предделителя
    out    SFIOR, Temp    ; Загрузили
;
; Теперь очистим возможные прерывания
;
    in    Temp, TIFR    ; Прочитать регистр флагов прерываний и сбросить лишние
    andi    Temp, ~((1<<OCF1A) | (1<<OCF1B) | (1<<TOV1))
    out    TIFR, Temp    ; Загрузить регистр флагов прерываний
;
; Разрешить необходимые прерывания
;
    ldi    Temp, Calc_TIMSK    ; Режим прерываний таймеров
    out    TIMSK, Temp    ; Загрузить
;
; Запустим таймер для работы с водомером
;
    ldi    Temp, Calc_TCCR1B    ; Режим работы счётчиком импульсов водомера
    out    TCCR1B, Temp    ; Установить
;
    sei            ; Разрешить прерывания
;
    ret            ; Возврат


После выполнения этой подпрограммы в цикле происходит считывание регистров таймера и вывод на экран. Вот такой вот простой контроль.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01262 секунд с 7
ELECTRONIX ©2004-2016