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

среда, 19 февраля 2020 г.

Прерывания в Arduino


Параметры функции обработки прерываний ISR() в C

Для обработки прерываний в C мы используем функцию ISR(). В ней необходимо указать с каким прерыванием мы будем иметь дело. Далее перечислены все варианты параметра функции ISR() для микроконтроллеров ATmega328P:
  • INT0_vect - внешнее прерывание 0
  • INT1_vect - внешнее прерывание 1
  • PCINT0_vect - прерывание по изменению состояния нулевой группы выводов
  • PCINT1_vect - прерывание по изменению состояния первой группы выводов
  • PCINT2_vect - прерывание по изменению состояния второй группы выводов
  • WDT_vect - прерывание от сторожевого таймера
  • TIMER2_COMPA_vect - прерывание от таймера/счетчика T2 при совпадении с A
  • TIMER2_COMPB_vect - прерывание от таймера/счетчика T2 при совпадении с B
  • TIMER2_OVF_vect - прерывание по переполнению таймера/счетчика T2
  • TIMER1_CAPT_vect - прерывание от таймера/счетчика T1 по записи
  • TIMER1_COMPA_vect - прерывание от таймера/счетчика T1 при совпадении с A
  • TIMER1_COMPB_vect - прерывание от таймера/счетчика T1 при совпадении с B
  • TIMER1_OVF_vect - прерывание по переполнению таймера/счетчика T1
  • TIMER0_COMPA_vect - прерывание от таймера/счетчика T0 при совпадении с A
  • TIMER0_COMPB_vect - прерывание от таймера/счетчика T0 при совпадении с B
  • TIMER0_OVF_vect - прерывание по переполнению таймера/счетчика T0
  • SPI_STC_vect - прерывание по окончанию передачи модуля SPI
  • USART_RX_vect - прерыванию по окончанию приема модуля USART
  • USART_UDRE_vect - прерывание по опустошению регистра данных модуля USART
  • USART_TX_vect - прерывание по окончанию приема модуля USART
  • ADC_vect - прерывание по завершению преобразования АЦП
  • EE_READY_vect - прерывание по готовности памяти EEPROM
  • ANALOG_COMP_vect - прерывание от аналогового компаратора
  • TWI_vect - прерывание от модуля I2C (TWI)
  • SPM_READY_vect - прерывание по готовности flash памяти

Описание функции attachInterrupt для управления прерываниями в Arduino

Прерывание (англ. interrupt) -- сигнал, сообщающий процессору о наступлении какого-либо события. Основные методы:

void attachInterrupt(uint8_t, void (*)(void), int mode);


attachInterrupt(interrupt, function, mode); -- определяет, какую функцию вызывать, когда происходит внешнее прерывание.
Здесь
interrupt -- номер прерывания (int). Большинство плат Arduino/Freeduino имеют два внешних прерывания с номерами 0 (на digital pin 2) и 1 (на digital pin 3).
function -- функция, которая должны вызываться при прерывании. Функция не должна принимать параметров и не должна ничего возвращать.
mode -- определяет, когда должно сработать прерывание. Определены следующие константы:
LOW - вызов прерывания всякий раз, когда на порту низкий уровень напряжения;
CHANGE - прерывание вызывается при изменении значения на входе;
RISING - вызов прерывания при изменении уровня напряжения с низкого (LOW) на высокое(HIGH)
FALLING - вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкое (LOW)

void detachInterrupt(uint8_t);


detachInterrupt(interrupt); -- отключает указанное прерывание.
Подробнее здесь