Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.025 c
1-1147427482
tytus
2006-05-12 13:51
2006.06.18
как проверить что файл текстовый?


2-1148988632
Ламот
2006-05-30 15:30
2006.06.18
Открыть "Языки и рег. стандарты" из своей программы


2-1148904390
Alien1769
2006-05-29 16:06
2006.06.18
Конвертация


2-1149234194
Barsky
2006-06-02 11:43
2006.06.18
Автоматическое заполнение веб-форм


1-1147412552
Chaser
2006-05-12 09:42
2006.06.18
Отображение иконок в TreeView