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

 
 
 
Reply to this topicStart new topic
password
сообщение Sep 11 2010, 06:37
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 15-07-10
Пользователь №: 58 458



Все подсчеты приведены на вскидку, главное помогите подправить код!
Частота кварца - 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мин и не останавливается (ждал правда несколько часов))
Где ошибка? Заранее благодарю.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Sep 11 2010, 07:04
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(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 секунда и просто завести секундный таймер.

Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 13th July 2025 - 06:43
Рейтинг@Mail.ru


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