[an error occurred while processing this directive]
Спрашивай, не стесняйся
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено =AVR= 16 ноября 2006 г. 00:41
В ответ на: Ответ: отправлено <font color=gray>MicroKot</font> 16 ноября 2006 г. 00:17

Кварц 1 МГЦ - значит, одна микросекунда на такт. А в подпрограмме delay_ms есть ЦИКЛ - сначала вычитаем единицу из младшего байта (zl), потом вычитаем возможный перенос (он будет, когда zl перейдет из 0 в 255) из старшего байта (zh), и пока этот старший байт не станет нулем, возвращаемся к началу цикла. Команд в цикле 3, sbi/sbci выполняются каждая за 1 такт (= 1 микросекунду), brne - за 2 такта (= 2 микросекунды), итого на один цикл тратится 4 такта (= 4 микросекунды).

Этот цикл может повторяться до 2^16 = 65536 раз, если в его начале zl и zh будут содержать FFFF (= 65536). ZL будет уменьшаться на единицу каждый цикл (= 4 микросекунды), и в каждый 256-й цикл его содержимое по очередной команде subi будет переходить из 00 в FF, создавая перенос, благодаря которому содержимое zh по команде sbci наконец-то тоже уменьшится на единицу. 256*4~=1000 микросекунд, или 1 миллисекунда - это и дало возможность грубо и нагло грузить в zh прями значение задержки в миллисекундах, а о zl даже и не париться, т.к. он весь весит всего одну миллисекунду.

Как видишь, программа будет выполняться примерно столько миллисекунд, сколько ты загрузишь в zl при ее вызове. Загрузишь 5 - получишь 5 мс, загрузишь 100 - получишь 100 мс. Меньше двойки не грузи, программа до того примитивна, что не учитывает младший байт (zl) и может дать укороченный цикл - я так сделал намеренно, чтобы не грузить тебя пока не нужными подробностями

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа
Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание