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