Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Насчитать 60сек с помощью 16-ричного таймера
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
password
Все подсчеты приведены на вскидку, главное помогите подправить код!
Частота кварца - 4МГц.
Делитель по таймеру - 1024 (~4кГц)
То есть для подсчета 60сек необходимо насчитать таймером 240 000 (=4кГц*60), но т.к. таймер считает до 65535, то будем считать до 24000 10 раз (в моем случае до 23808).
Код
    ldi       marker,93          ; задали начально значение маркера
    ldi       counter,10        ; начальное значение счетчика
    clr        temp            ;
    sts        TCNT1H,temp        ; обнуляем таймер
    sts        TCNT1L,temp        ; обнуляем таймер
    start1:
    lds        temp,TCNT1H        ; загружаем содержимое таймера
    cp        temp,marker        ; таймер насчитал 23808?
    brne      start1         ; если нет, то остаемся в цикле
    subi      marker,-105        ; входим на след. круг подсчета
    dec      counter           ; уменьшаем счетчик на 1
    cpi       counter,0          ; досчитали до 60сек?
    brne      start1         ; если нет, то остаемся в цикле
Но в AVR Studio счетчик переваливает за 3мин и не останавливается (ждал правда несколько часов))
Где ошибка? Заранее благодарю.
mempfis_
Цитата(password @ Sep 11 2010, 09:37) *
Все подсчеты приведены на вскидку, главное помогите подправить код!
Частота кварца - 4МГц.
Делитель по таймеру - 1024 (~4кГц)
То есть для подсчета 60сек необходимо насчитать таймером 240 000 (=4кГц*60), но т.к. таймер считает до 65535, то будем считать до 24000 10 раз (в моем случае до 23808).
Код
    ldi       marker,93         ; задали начально значение маркера
    ldi       counter,10    ; начальное значение счетчика
    clr        temp        ;
    sts        TCNT1H,temp    ; обнуляем таймер
    sts        TCNT1L,temp    ; обнуляем таймер
    start1:
    lds        temp,TCNT1H    ; загружаем содержимое таймера
    cp        temp,marker    ; таймер насчитал 23808?
    brne      start1        ; если нет, то остаемся в цикле
    subi      marker,-105    ; входим на след. круг подсчета
    dec      counter          ; уменьшаем счетчик на 1
    cpi       counter,0         ; досчитали до 60сек?
    brne      start1        ; если нет, то остаемся в цикле
Но в AVR Studio счетчик переваливает за 3мин и не останавливается (ждал правда несколько часов))
Где ошибка? Заранее благодарю.


А Вы учили ассемблер AVR?
1. lds temp,TCNT1H - позволяет загрузить только старший байт TCNT1H. А младший кто будет загружать?
2. Смотрите по документации нужно ли соблюдать порядок загрузки байтов - старший-младший
3. cp temp,marker ; таймер насчитал 23808? - тут интересно как это Вы сравните число 23808 с 8битным регистром?
Как минимум нужно комбинация cp-cpc (сравнение - сравнение с учётом переноса)

Вобщем алгоритм такой:
1. сбрасываем счётчик кол-ва раз по 24000 - точнее устанавливаем его значение = 10
2. сбрасываем TCNT1H-TCNT1L
3. Входим в бесконечный цикл в котором постоянно загружаем TCNT1H-TCNT1L
4. Если значение стало >= 24000 (проверка с помощью команд cp-cpc) то декремент счётчика кол-ва раз по 24000
5. Проверяем этот счётчик - если он равен 0 то посчитали нужное кол-во раз по 24000
6. Если не равен то переход на п 2

Самый правильный вариант - настроить прерывание по CTC с необходимым делителем таймера на период 1 секунда и просто завести секундный таймер.

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.