Прерывание микроконтроллера AVR - PullRequest
1 голос
/ 09 июля 2020

У меня AVR ATmega32, и я хочу иметь больше контактов прерывания, чем (INT 0, INT 1, INT 2), поэтому могу ли я преобразовать любые контакты в ATmega32 в прерывание, или есть другой метод, чтобы иметь больше прерываний в микроконтроллере ? Или мне купить другой микроконтроллер AVR?

Ответы [ 3 ]

1 голос
/ 10 июля 2020

INT0 / INT1 / INT2 и назначенные им контакты в Atmega32 имеют специальные функции, например, для вывода MCU из режима энергосбережения. Если вам нужно другое прерывание со специальной функцией, но на выводе diffrent , тогда это невозможно, но ... если вы хотите проверить состояние входного контакта, а затем выполнить некоторые действия, есть обходной путь, который я использовал несколько раз .

Итак, как работает внешние прерывания ?

(Упрощенное, псевдоописание) Внутри вашего MCU есть специальный аппаратный контроллер , который обнаруживает подъем вверх / вниз, изменение выбранных контактов и, когда определенное условие выполнено, он сообщает контроллеру прерываний, что произошло, затем, если бит маски этого прерывания установлен на включение, ваш MCU вызывает вектор прерывания (ISR).

Итак, как это обойти?

Краткое объяснение:

  1. Используйте одно из прерываний, выдаваемых таймером, и установите «быстрее», чем может измениться сигнал на входе.
  2. Входные состояния датчика в таймере ISR.
  3. Каждый раз, когда выполняется условие, например высокое состояние на выводе в течение примерно 5 мс, вы можете сохранить этот факт в значении переменной.
  4. Сделать калибровку lback выполнить действие или просто выполнить действие внутри вашей ISR, это зависит от времени выполнения этого действия, ISR должны быть короткими по времени выполнения.

Псевдокод ниже (набран без компиляции, только здесь, в текстовом поле ответа ):

#include <avr/io.h>  
#include <avr/interrupt.h>

volatile int sth_happened = 0;

void ExecuteCallback(void)
{
    // your action goes here
    // reset sth_happened by assgining to 0
}

ISR(TIMER0_COMP_vect) // this ISR should be executed faster than signal on chosen pin can change
{
    // check PIN of your pin here

    // if state/signal on your pin met requirements,
    // save it to variable or execute another code
    // sth_happened = 1 / ExecuteCallback();
}

int main(void)
{
    // Prepare your ISR timer here
    // I would recommend to use CTC mode with desired execution time
    sei(); // enable interrupts
    
    while(1)
    {
        if (sth_happened) ExecuteCallback();
    }
    return 0;
}
0 голосов
/ 09 июля 2020

Вы можете просто сделать основной l oop в вашей программе работать быстрее, чтобы вы могли читать эти выводы в своей программе и реагировать, когда они меняются.

Если вам действительно нужны фактические прерывания, вы можете рассмотреть переключение на более новый AVR, такой как ATmega328P, где каждая линия ввода / вывода может использоваться как вывод прерывания смены вывода (PCINT).

0 голосов
/ 09 июля 2020

прежде всего вам нужно знать, что прерывание - это аппаратное обеспечение ... каждый микроконтроллер имеет схемы прерывания для прерывания процессора при определенных c событиях ( таймер переполнен, сигналы контактов изменены , ... et c) ... так что это аппаратные функции

так что, если вам нужно больше прерываний, как вы спрашиваете? .. наиболее распространенное решение - использовать операционную систему реального времени (RTOS) ... одно из преимуществ RTOS, которое дает вам возможность делать любое количество прерываний ( программное прерывание ) сколько угодно раз

обратите внимание, что RTOS - это немного продвинутая версия c, и вам нужно немного изучить, чтобы понять, как она работает и как ее использовать ... но в качестве краткой информации что делает RTOS .. Сначала вы должны разделить ваше программное обеспечение на небольшие задачи ( например, задача, которая печатает данные на ЖК-дисплее, задача для получения данных от UART, задача для движения, если кнопка нажата или нет, ..et c) и дайте каждой задаче pri ority ... и есть что-то в RTOS, называемое scheduler (просто алгоритм), которое выбирает, какая задача будет выполняться на ЦП сейчас, если задача готова или нет, priorty и Тип расписания algorthim

RTOS обрабатывает задачи как отдельные программы и заставляет их взаимодействовать друг с другом, а RTOS имеет гораздо больше возможностей ... поэтому, когда вы ее изучите, она упростит и повысит эффективность разработки встроенные программы

пример работы RTOS с atmega 32

  1. Free RTOS - это открытая волшебная RTOS и немного сложная и надежная
  2. OSA RTOS это очень простая RTOS, которую вы могли на ней изучить
...