Не могу понять в чем ошибка. Установил фьюзы на мега8 на внешний кварц 8МГц. Написал програмку на ассемблере, в которой реализована максимальная задержка времени = 1 сек. А реально получаю около 10 сек. Где я ошибся?
Раздел: Алгоритмы
; ***********************************************
; Автор:
; Дата:
; Для AVR: atmega8 *
; Тактовая частота: 8МГц *
;************************************************
.device atmega8
.nolist
.include "m8def.inc"
.list
; =======================
; Обьявления
.def temp=r16
.def Run=r17 ; текущее значение битов порта D
.def Count=r18 ; задержка времени
.def Mark=r19 ; задержка времени
.def Delay=r20 ; регулируемая задержка времени
.def Speed=r21 ; декрементируемое значение задержки времени
; =======================
; Начало программы
rjmp Init;
; =======================
Init:
; Инициализация порта В
ldi temp, 0b11111100
out DDRB, temp
ldi temp, 0b00000011
out PortB, temp
; Инициализация порта D
ser temp
out DDRD, temp
ldi Run, 0b00000001
out PortD, Run
; Определение параметров таймера
ldi Count, 25
ldi Mark, 125
ldi Delay, 10
ldi temp, 0b00000100
out TCCR0, temp ; делим тактовую частоту на 256. Получаем 31250 тактов/сек
; =======================
; Основное тело программы
Start:
; проверка нажатия на одну из кнопок и изменение скорости бегущей строки
cpi Delay, 10 ; если число равно 10,
breq PC+3 ; значит перепрыгиваем блок инкрементации
sbis PinB, 0 ; если нажата кнопка увеличения скорости,
subi Delay, -1 ; значит увеличиваем скорость на 1
cpi Delay, 1 ; если число равно 1,
breq PC+3 ; значит перепрыгиваем блок декрементации
sbis PinB, 1 ; если нажата кнопка уменьшения скорости,
subi Delay, 1 ; значит уменьшаем скорость на 1
; задержка времени
; тройной цикл должен обеспечивать задержку времени:
; - максимум: Count*Mark*Speed=25*125*10=31250 тактов (или 1 секунда)
; - минимум: Count*Mark*Speed=25*125*1=3125 тактов (или 0.1 секунда)
mov Speed, Delay
TimeLoop:
in temp, TCNT0
cp temp, Mark
brne TimeLoop
subi Mark, -125
dec Count
brne TimeLoop
subi Speed, 1
brne TimeLoop
; Реализация бегущей строки (поочередное подсвечивание светодиодов)
bclr 0
lsl Run
brcc PC+2
ldi Run, 0b00000001
out PortD, Run
rjmp Start
Раздел: Алгоритмы