"Вы читаете о роботах и программировании и думаете: «Было бы здорово сделать что-то подобное самому!» Теми, кем эта идея овладевает чуть больше просто мыслей смотрят кто и как делал своего робота. Читают статьи, смотрят видео. На картинках все понятно. В видеороликах тоже обычно показываются уже готовые продукты, а также сжато показываются технологии их изготовления. И вроде бы то же всё понятно: отпилил, прикрутил, припаял, соединил, запрограммировал вон на той программе вот этим кодом."

четверг, 6 февраля 2020 г.

Занятие кружка от 04.02.20

Сегодня мы рассмотрим  способность АЦП генерировать прерывания и выполнять обработку аналоговых сигналов  независимо от работы ядра микроконтроллера то есть паралельно выполнению основной программы (Прерывание это команда процессору по которой он останавливает выполнение основной программы и переходит к выполнению подпрограммы - обработчику прерывания, после выполнения которой снова переходит в точку останова основной программы и продолжает ее выполнение с момента останова). Все дело в том том, что АЦП это отдельный независимый  узел(блок) микроконтроллера, со своими настройками и возможностью автономной работы. Регистр ADSRB микроконтроллера, как раз и отвечает за работу АЦП в различных режимах, в том числе и в автоматическом непрерывном режиме.
Регистр ADCSRB (ADC Control and Status Register B)
У регистра ADCSRB всего одна группа битов — ADTS[2:0] - биты номер 5, 6, 7

Источник автоматического запуска задается битами ADTS[2:0] регистра ADCSRB. Возможны следующие варианты:
2:0]Источник запуска преобразования ADC
000Постоянное преобразование (Free Running mode)
001Аналоговый компаратор
010Внешний запрос на прерывание 0
011Timer/Counter0 Compare Match
100Timer/Counter0 Overflow
101Timer/Counter1 Compare Match B
110Timer/Counter1 Overflow
111Timer/Counter1 Capture Event

АЦП прерыванием информирует МК о завершенном преобразовании. Пока осуществляется преобразование, Arduino занимается своими делами — исполняет заданную программу.
Настройка АЦП сводится к следующим действиям:

  1. Обнуляем ADCSRB
  2. Устанавливаем источник опорного напряжения
  3. Выбираем пин для преобразования
  4. Запускаем преобразования
  5. Устанавливаем пределитель частоты
  6. Включаем автоматическое преобразование
  7. Разрешаем прерывание после окончания преобразования
  8. Включаем АЦП
  9. Запускаем преобразование
Коротко это так:
====
ADCSRB = 0x00;
ADMUX = 0b01100000;//A0
ADCSRA = 0b11101111;//делитель 128
=====
volatile int result;
int main()
{
...
//краткая настройка АЦП
ADCSRB = 0;
ADMUX = 96;//A0
ADCSRA = 239;//делитель 128
...
}
//функция для работы с АЦП по прерыванию
volatile bool trueValue = false; ISR(ADC_vect) { if (trueValue) { result = ADCH;
trueValue = false; } else { trueValue = true; } }