шаблон

warning: Creating default object from empty value in /var/www/fendercustomsh/data/www/avrlab.com/modules/taxonomy/taxonomy.pages.inc on line 34.

Подпрограмма формирования задержки

Для формирования паузы (задержки) в программах для микроконтроллера полезно применять программы, которые не нагружая ми АЛУ микроконтроллера ни память с высокой точностью справляются с этой задачей.
Как уже думаю стало понятно, микроконтроллер в момент паузы работает, то есть выполняет определенную программу, которая заменяет выполнение основной программы требующей той самой задержки.

Ниже показан пример программы формирования задержки. Основа программы это выполнение паузы размером в один машинный такт микроконтроллера - "nop".

  1. #define nop() {asm("nop");}
  2. unsigned int x,i; //перечисление переменных
  3.  
  4. // function delay
  5. void delay(int t)
  6. {
  7. for (x=t; x>0 ;x--)
  8. nop ();
  9. }

Максимальная пауза генерируемая данной программой ограничена максимальным значением переменной "i".
Если необходимо сформировать довольно длительную задержку советую прибегнуть к небольшой хитрости, использовать данную программу в качестве подпрограммы для программы длительной задержки, объясняю:
описываем данную программу задержки как обычно

  1. #define nop() {asm("nop");}
  2. unsigned int x,i; //перечисление переменных
  3.  
  4. // function delay
  5. void delay(int t)
  6. {
  7. for (x=t; x>0 ;x--)
  8. nop ();
  9. }

После чего ниже пишем следующую программу:

  1. // function long delay
  2. void long_delay(int p)
  3. {
  4. for (j=0; j<p; j++)
  5. {
  6. delay(300);
  7. }
  8. }

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

Скачать программу задержки

Шаблон обработки прерывания от int0 для AtTiny2313

Вот простой и наглядный пример обработки прерывания int0 для микроконтроллера ATtiny2313, на прерывание int0 можно установить кнопку или например датчик с выходным напряжением до 5Вольт. Я в основном использую внешние прерывания int0 и int1 для установки на них кнопок, в основном "вешаю" на них выполнение уникальных и требующих немедленного исполнения программ.

  1. #include <avr/io.h> //библиотека ввода/вывода
  2. #include <avr/interrupt.h> //библиотека прерываний
  3.  
  4. #define nop() {asm("nop");}
  5.  
  6. unsigned int ms,x; //декларирование переменных
  7.  
  8. // функция задержки
  9. void delay_ms(int ms)
  10. {
  11. for (x=ms; x>0; x--)
  12. nop (); //задержка на один такт
  13. }
  14.  
  15. //обработка прерываний
  16. SIGNAL(SIG_INTERRUPT0)
  17. {
  18. //Тут размещается текст программы
  19. //которую надо выполнить
  20. //при срабатывании прерывания INT0
  21. }
  22.  
  23. int main( void ) //главная программа
  24. {
  25. GIMSK=0b01000000; //разрешаем прерывание int0 - кнопка
  26. MCUCR=0x03; // срабатывание по нарастанию фронта - для кнопки
  27.  
  28. sei(); //глобальное разрешение прерываний
  29.  
  30. for(;;) //бесконечный цикл
  31. {
  32. //Тут размещают программу
  33. //которая выполняется/
  34. //в свободное от выполнения
  35. //обработчика прерывания
  36. }
  37. }

Скачать пример обработки прерывания int0 в txt файле

RSS-материал