Продолжаю дальше изучать AVR и BASCOM. Теперь возник вопрос по таймеру. По сравнению с классическими контроллерами архитектуры MCS-51, в AVR таймеры имеют больше режимов работы . Но с этой гибкостью гибкостью необходимо разобраться.
Допустим, стоит задача сделать секундомер, который будет измерять время с точностью до сотых долей секунды. Тактируем контроллер от кристалла 4 МГц.
Моя логика работы в этом случае. Выбираем режим сравнения с очисткой регистров таймера, делитель тактовой частоты =1. Загружаем в регистр OCR1A значение 40000 и ждем прерывания. Получился вот такой код
$regfile = "m8def.dat" 'настройки $crystal = 4000000 $hwstack = 40 $swstack = 16 $framesize = 32 Config Portd.6 = Input 'конфигурирование портов Config Timer1 = Timer , Prescale = 1 , Compare A = Set , Clear Timer = 1 'конфигурирование таймера 'обЪявление переменных Dim Endtime As Word Dim Counttime As Word On Oc1a Compa 'подпрограмма обраб. прерываний Endtime = 40000 Compare A = Endtime 'задание предела счёта таймера Counttime = 0 'очистим переменную Enable Interrupts 'разрешение прерываний Enable Oc1a Do ' ждем нажатия кнопки Loop Until Portd.6 = 0 '"старт" счета времени Start Timer1 Do ' ждем нажатия кнопки Loop Until Portd.6 = 0 '"СТОП" счета Stop Timer1 'вывод значения Counttime на индикатор 'дальше какой-то код ' ' Compa: 'обработка препрывания Counttime = Counttime + 1 Return End
В итоге, после компиляции в строке
Compare A = Endtime
ошибка 46 : Assigment error [COMPARE A:0 ENDTIME:6]
Не понятно из-за чего такой косяк вылазит? Что не так?
Отредактировано spin (2012-11-04 10:40:37)
), но мне хочется разобраться более детально.
Хорошо сочетается с динамической индикацией по таймеру (если кнопок не больше чем разрядов индикатора). 


