Перейти к содержанию

Задержки В Avr


photon62

Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Можно таймером, там все четко. Запустил, и в нужный момент получил прерывание.

А можно просто циклом, подсчитать вполне реально но стоит задаться вопросом, нужна ли такая точность? Потом, если все-таки нужно то можно подсчитать количество тактов прогоняя алгоритм задержки в симуляторе - он точно подскажет количество тактов.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Пауза в милисек

delay_ms(переменная или константа склько милисек нужно);

Пауза в мкрСек

delay_us(константа склько милисек нужно);

Это в CodeVisionAVR - компиляторе удобном для начинающих - http://www.google.ru/search?hl=ru&lr=&newwindow=1&q=%D0%9A%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%82%D0%BE%D1%80+CVAVR+-+CodeVisionAVR+&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&aq=f&aqi=&aql=&oq=&gs_rfai=

В других компиляторах есть аналогичные фуункции.

В листинге компилятора можно увидеть как паузы реализуются на ассемблере - языке профессионалов.

Изменено пользователем Borisov_E
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Можно таймером, там все четко. Запустил, и в нужный момент получил прерывание.

А можно просто циклом, подсчитать вполне реально но стоит задаться вопросом, нужна ли такая точность? Потом, если все-таки нужно то можно подсчитать количество тактов прогоняя алгоритм задержки в симуляторе - он точно подскажет количество тактов.

а можно примерчик какой нибудь

Ссылка на комментарий
Поделиться на другие сайты

На Асме.

         .....

         ldi r16,100     :загружаем кол-во циклов задержки в R16

delay:

         dec r16           ;уменьшаем содержимое R16 на 1

         tst r16            ; проверяем достигло ли содержимое R16 нуля

         brne delay      ; если нет возвращаемся на метку delay

         .....

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

Стёртая цитата!!! Wowa.

спасибо очень понятный пример. А как время этой задержки подсчитать и что если придется выходить за границу 255

Ссылка на комментарий
Поделиться на другие сайты

Ну наверное увеличить разрядность вдвое, упаковав предложенный кусок кода во внешний точно такой же цикл. Только нужно сменить регистр у внешнего цикла.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

пропускать цмклы плохой пример так как "убивает" контроллер, а вдруг прерывание возникнет?имхо легче взять расквантовать время и делать свой цикл.

Ссылка на комментарий
Поделиться на другие сайты

Прерывание в любом случае "убивает" точность таких задержек.

Но можно пойти другим путем - оставить цикл как есть, но проверять не счетчик цикла - а признак, можно взять для удобства признак переполнения таймера.

В таком случае, алгоритм задержки несколько усложняется - настраиваем таймер(значение его равно $00-<выдержка, тактов>), запускаем и ждем переполнения таймера - таким образом у нас имеется независимая от обработчиков прерывания задержка. Если надо больше чем обеспечивает таймер - вызываем это все в цикле как выше был приведен.

Недостаток такого метода - существует минимальная длительность которую можно выставить... и для указания точного значения выдержки нужно учитывать количество тактов потраченное на настройку таймера и его запуск. Впрочем, и его останов... но это уже не обязательно.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

При условии, что есть в наличие свободные таймеры. Бывает, что их не хватает.  :) И в то же время, если задержка большая, то приходится даже считать кол-во переполнений таймера. В таком случае "завешивать" МК на секунды в цикле нецелесообразно. Все зависит от типа задержки и ее продолжительности (интервала). 

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

А если просто ввести переменную,тикать таймером и в переменную писать 1,2,3.... и допустим 255,в зависимости от типа.255*255=65025.

С точностью проблемы будут?

Ссылка на комментарий
Поделиться на другие сайты

Возможно.

Я вам рекомендую использовать для программирования AVR компилятор CodeVisionAVR - станет граздо проще разбираться и работа будет продуктивнее.

Ссылка на комментарий
Поделиться на другие сайты

пропускать цмклы плохой пример так как "убивает" контроллер, а вдруг прерывание возникнет?имхо легче взять расквантовать время и делать свой цикл.

Фи, какой мутный жаргон...

-"убивает" контроллер, расквантовать время...

Методы построения задержек определяются свободными ресурсами и временной диаграммой.

Можно сделать программную задержку, если она к месту и точность с учетом возможных прерываний устраивает.

Прежде чем обсуждать методы, необходимо определиться с алгоритмом в котором она потребна.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

>>Я вам рекомендую использовать для программирования AVR компилятор CodeVisionAVR

ИМХО: Если кроме AVR ни чего больше изучать не будете, CodeVisionAVR Ваш выбор. Если планируете изучать и другие МК, возьмите GCC или IAR. Сложность на начальном этапе изучения, компенсируется в дальнейшим, при переходе на другие МК. К тому-же легче изучать что то новое чем переучиваться.

Прежде чем обсуждать методы, необходимо определиться с алгоритмом в котором она потребна.

+1000

Изменено пользователем rtfcnf

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

за материальный, либо моральный ущерб причиненный данным сообщением напрямую или косвенно.

Ссылка на комментарий
Поделиться на другие сайты

Я для расчёта задержек применяю удобную программу AVRdelayloop

post-46208-1277970396,82_thumb.png

Просто вводим частоту микроконтроллера и желаемую задержку. и всё.

Скачать можно тут

Ссылка на комментарий
Поделиться на другие сайты

  • 2 года спустя...

Всем добрый день. Может ли кто-нибудь подсказать алгоритм создания программной задержки для AVR, например- ATMega32? Только ASM для меня- слишком сложно, пишу на Си. Достаточно будет устного объяснения алгоритма, ну или где можно ( саму суть) почерпнуть знаний, а если и пример на Си... Вообще здорово!

Ссылка на комментарий
Поделиться на другие сайты

Спасибо за отклик, только я с стандартной библиотекой работать умею)), и вот она занимает не значительную, но все же часть flash памяти контроллера. Соглашусь, что процессор с большим объемом памяти при желании приобрести не проблема да и не настолько это трагично. Это спортивный интерес)), написана библиотека работы с LCD дисплеем от Nokia6610 и вот в ней хочу задействовать задержки которые будут зависеть от частоты работы контроллера. Где-то в сети видел пример, но не сохранил.. Было следующее (могу ошибаться)- в шапке программы указываем частоту на которой работает контроллер, создаем функцию нашей задержки и в цикле ?! считаем количество тактов, которые и формируют нашу задержку. Надеюсь объяснил не слишком туманно. Видел примеры задержек с помощью таймеров, но для меня они пока не изучены, вот думаю попробовать в деле свою функцию без использования оных.

Ссылка на комментарий
Поделиться на другие сайты

На Асме.

         .....

         ldi r16,100     :загружаем кол-во циклов задержки в R16

delay:

         dec r16           ;уменьшаем содержимое R16 на 1

         tst r16            ; проверяем достигло ли содержимое R16 нуля

         brne delay      ; если нет возвращаемся на метку delay

         .....

эта команда совершенно лишняя, т.к. флаг Z также =1 при нулевом результате операции DEC R16

в репу каждому, кто отсылает в гугл !!

Ссылка на комментарий
Поделиться на другие сайты

На Си сделать задержку "вживую" попросту невозможно - она будет зависеть от такого количества факторов, что все не сможешь учесть. Компилятор может посчитать такую задержку лишней тратой ресурсов и соптимизировать её до пустоты.

Поэтому хочешь не хочешь, а задержку писать на ассемблере. Вот как-то так:

delay_step: // задержка для одного шага
 ; рассчитаем примерное количество тактов на 10мс -
 ; N = 0.01c*4800000Гц = 48000
.EQU ds_inner_cycles = 256*4
.EQU ds_lpsc = (one_step_delay_ms * CPU_freq) / ds_inner_cycles

LDI loopscount, ds_lpsc ; внешний цикл. 46*1024
l_loop1:
LDI loopscount2, $00 ; 256 итераций. 1024 такта
l_loop2:
NOP	 ; 1*N
DEC loopscount2 ; 1*N
BRNE l_loop2	 ; 2*N
DEC loopscount
BRNE l_loop1
RET

Изменено пользователем Alexeyslav

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...