12
13
RETI
Теперь инициализация таймера. Добавь ее в секцию инита локальной
периферии (Internal Hardware Init).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
; Internal Hardware Init ======================================
SETB DDRD,4,R16 ; DDRD.4 = 1
SETB DDRD,5,R16 ; DDRD.5 = 1
SETB DDRD,7,R16 ; DDRD.7 = 1
SETB PORTD,6,R16 ; Вывод PD6 на вход с подтягом
CLRB DDRD,6,R16 ; Чтобы считать кнопку
SETB TIMSK,TOIE0,R16 ; Разрешаем прерывание таймера
OUTI TCCR0,1<<CS00 ; Запускаем таймер. Предделитель=1
; Т.е. тикаем с тактовой частотой.
SEI ; Разрешаем глобальные прерывания
; End Internal Hardware Init ===================================
Осталось переписать наш блок сравнения и пересчитать число. Теперь все
просто, один тик один такт. Без всяких заморочек с разной длиной кода. Для
одной секунды на 8Мгц должно быть сделано 8 миллионов тиков. В хексах
это 7A 12 00 с учетом, что младший байт у нас TCNT0, то на наш счетчик
остается 7А 12 ну и еще старшие два байта 00 00, их можно не проверять.
Маскировать не нужно, таймер мы потом переустановим все равно.
Одна только проблема — младший байт, тот что в таймере. Он тикает
каждый такт и проверить его на соответствие будет почти невозможно. Т.к.
малейшее несовпадение и условие сравнение выпадет в NoMatch, а подгадать
так, чтобы проверка его значения совпала именно с этим тактом… Проще
иголку из стога сена вытащить с первой попытки наугад.
Так что точность и в этом случае ограничена — надо успеть проверить
значение до того как оно уйдет из диапазона. В данном случае диапазон
будет, для простоты, 255 — величина младшего байта, того, что в таймере.