Текущий архив: 2006.06.18;
Скачать: CL | DM;
ВнизПрограммирование микроконтроллеров Atmel - AVR Assembler Найти похожие ветки
← →
Denis © (2006-05-22 10:42) [0]Приветствую всех!
Занялся самообразованием - начал изучать сабж помаленьку... Если есть тут специалисты, прошу помощи.
В одном из примеров программ не могу понять организацию процедуры задержки. Зачем два цикла, два региства-счетчика?
Вот код:
.........
..........
ldi TEMP,0 ;Обнуляем переменную TEMP для
;дальнейшего использования в задержка
cpi speed,1 ;Если скорость = 1 то регистр Z=1
brne GO ;Если Z =0 то перейти на GO минуя изминения
ldi TEMP,127 ;Выполнить изминение для скорости
;меньшей в два раза (0.25 сек)
GO: rcall Delay ;Задержка на 250 мс. или 125 мс.
rcall Delay ;Задержка на 250 мс. или 125 мс.
....................
....................
Delay:
;Инициализация задержки
mov fCOUNTER2,TEMP ;Заносим в Счетчик 2 значение из TEMP
clr fCOUNTER ;Очищаем счетчик 1
D_loop:
;Выполняем задержку
dec fCOUNTER ;Декреминтируем Счетчик 1
brne D_loop ;Z=0 то на начало
dec fCOUNTER2 ;Декреминтируем Счетчик 2
brne D_loop ;Z=0 то в начало
ret ;Возврат из задержки в основную программу
← →
Denis © (2006-05-22 10:46) [1]Подумал и решил вместо этого сделать что-то вроде
delay:
ldi Temp,0b01111101 ;это базовое значение задержки
mul TEMP,Delay ;увеличиваем значение задержки в Delay раз
mov fCOUNTER,TEMP
BD_loop:
dec fCOUNTER
brne BD_loop
ret
вот только непонятно мне какое значение нужно грузить в TEMP если, например, Delay = 1, а нужно выждать 0,5 сек?
← →
Cashmare © (2006-05-22 11:26) [2]Denis © (22.05.06 10:42)
Зачем два цикла, два региства-счетчика?
Цикл по fCOUNTER - внутренний, цикл по fCOUNTER2 - внешний.
Подумал и решил вместо этого сделать что-то вроде
ldi Temp,0b01111101
Это вообще работает???
вот только непонятно мне какое значение нужно грузить в TEMP
Считается по количеству тактов выполнения той или иной операции, входящей в цикл: 0.5сек/((кво тактов dec + кво тактов brne)*длительность такта). Вроде так, если сила понедельника мозг не блокирует.
← →
Denis © (2006-05-22 11:47) [3]>ldi Temp,0b01111101
>Это вообще работает???
нет, не работает:)
итак, dec = 1 такт, brne - 1 такт если условие true и 2 если условие False.
частота - 4 MHz. длит-ть такта - 1/4000000 сек.
0.5 сек = это 0.5/((1+2)*1/4000000) = 666666.667 тактов, так получается?
регистр - 16 бит, значение не помещается. для решения этой проблемы и нужен, похоже, внешний цикл...
← →
Cashmare © (2006-05-22 11:55) [4]Denis © (22.05.06 11:47) [3]
значение не помещается. для решения этой проблемы и нужен, похоже, внешний цикл...
:)))
Еще будут вопросы - мыло в анкете...
← →
Denis © (2006-05-22 12:07) [5]Спасибо :)
Страницы: 1 вся ветка
Текущий архив: 2006.06.18;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.01 c