Популярные микроконтроллеры Nuvoton серий М2354 и М251 со склада компании Смарт-ЭК

В Algorithm Builder прерывание Pin_Change

Новичок
 
Регистрация: 13.04.2023
Сообщений: 1
Репутация: 10
 
14.04.2023 11:03 #1
Прошу помощи с Algorithm Builder. Я новичёк в этом. Надо обрабатывать прерывания по изменению входов PCINT0...5
В Algorithm Builder есть прерывание Pin_Change
Даю ATtiny2313 разрешения в PCMSK на один вход, PCIE и глобальному прерыванию, но никакой реакции на изменение состояния входа не происходит.
Есть у кого опыт работы с этими прерываниями?
Оценка
Приглашаем 3 декабря 2024 на вебинар, посвященный силовым модулям ведущего китайского производителя SUNCO - одного из мировых лидеров по производству дискретных полупроводниковых компонентов. На вебинаре вы узнаете о новинках, включая модули 17 класса в корпусе E3, и контроле качества на всех этапах производства. Вы также узнаете о новейших продуктах – IGBT-, SiC-, диодных и тиристорных модулях, погрузитесь в современные топологии, сравните характеристики IGBT-чипов разных поколений.
Специалист
 
Аватар для antonydublin
 
Регистрация: 22.09.2010
Адрес: г. Донецк
Сообщений: 873
Репутация: 381
372 0
3 0
 
14.04.2023 21:25 #2
Цитата:
Сообщение от AlexEst23
Прошу помощи с Algorithm Builder. ... Даю ATtiny2313 разрешения в PCMSK на один вход, PCIE и глобальному прерыванию, но никакой реакции на изменение состояния входа не происходит. ...
C Algorithm Builder не работал, но есть опыт использования внешних прерываний в WinAVR. Вот выдернул код из одного древнего проекта на Atmega48pa. Там был опрос матрицы 4x7 кнопок.
Код:
ISR(PCINT1_vect)
{
     sleep_disable();
     return;
}

ISR(PCINT2_vect, ISR_ALIASOF(PCINT1_vect));

void hardware_init(void)
{
     ...
     // Внешние прерывания
     PCICR |= _BV(PCIE1)|_BV(PCIE2);
     PCMSK1 |= _BV(PCINT8)|_BV(PCINT9)| 
     _BV(PCINT10)|_BV(PCINT11)|_BV(PCINT12);
     PCMSK2 |= _BV(PCINT16)|_BV(PCINT17)| 
     _BV(PCINT18)|_BV(PCINT19)|_BV(PCINT20);
     ...
}

uint8_t get_column_number(void)
{
     columns_1_rows_0();
     if(!(PIND & _BV(PD1))) return 1;
     if(!(PIND & _BV(PD2))) return 2;
     if(!(PIND & _BV(PD3))) return 3;
     if(!(PIND & _BV(PD4))) return 4;
     return 0;
}

uint8_t get_row_number(void)
{
     columns_0_rows_1();
     if(!(PINC & _BV(PC0))) return 1;
     if(!(PINC & _BV(PC1))) return 2;
     if(!(PINC & _BV(PC2))) return 3;
     if(!(PINC & _BV(PC3))) return 4;
     if(!(PINC & _BV(PC4))) return 5;
     if(!(PINC & _BV(PC5))) return 6;
     if(!(PIND & _BV(PD0))) return 7;
     return 0;
}

void columns_0_rows_1(void)
{
     columns_rows_to_Z();

     // Столбцы
     PORTD &= ~(_BV(PD1)|_BV(PD2)|_BV(PD3)|_BV(PD4));
     DDRD |= _BV(PD1)|_BV(PD2)|_BV(PD3)|_BV(PD4);

     // Строки
     PORTC |= _BV(PC0)|_BV(PC1)| 
     _BV(PC2)|_BV(PC3)|_BV(PC4)|_BV(PC5);
     PORTD |= _BV(PD0);
     DDRC &= ~(_BV(PC0)|_BV(PC1)| 
     _BV(PC2)|_BV(PC3)|_BV(PC4)|_BV(PC5));
     DDRD &= ~_BV(PD0);
}

void columns_to1_rows_to0(void)
{
     columns_rows_to_Z();

     // Столбцы
     PORTD |= _BV(PD1)|_BV(PD2)|_BV(PD3)|_BV(PD4);
     DDRD &= ~(_BV(PD1)|_BV(PD2)|_BV(PD3)|_BV(PD4));

     // Строки
     PORTC &= ~(_BV(PC0)|_BV(PC1)| 
     _BV(PC2)|_BV(PC3)|_BV(PC4)|_BV(PC5));
     PORTD &= ~_BV(PD0);
     DDRC |= _BV(PC0)|_BV(PC1)|_BV(PC2)| 
     _BV(PC3)|_BV(PC4)|_BV(PC5);
     DDRD |= _BV(PD0);
}

void columns_rows_to_Z(void)
{
     // Столбцы
     PORTD &= ~(_BV(PD1)|_BV(PD2)|_BV(PD3)|_BV(PD4));
     DDRD &= ~(_BV(PD1)|_BV(PD2)|_BV(PD3)|_BV(PD4));

     // Строки
     PORTC &= ~(_BV(PC0)|_BV(PC1)| 
     _BV(PC2)|_BV(PC3)|_BV(PC4)|_BV(PC5));
     PORTD &= ~_BV(PD0);
     DDRC &= ~(_BV(PC0)|_BV(PC1)| 
     _BV(PC2)|_BV(PC3)|_BV(PC4)|_BV(PC5));
     DDRD &= ~(_BV(PD0));
}

uint8_t get_button_number(void)
{
     uint8_t column = 0;
     uint8_t row = 0;

     column = get_column_number();
     row = get_row_number();
	
     // Если действительно кнопка нажата
     if(column!=0 && row!=0) 
     {
          _delay_ms(10);     // Антидребезг
          if(column == get_column_number())
          if(row == get_row_number())
          // Приведение к нулевому индексу в buttons_codes_mas[]
          return 7*(column-1)+row;
     }
     return 0;	
}
__________________
Atmel, STM32, ESP32, RTOS, OS-less, C, C++, C#, Visual Studio, IAR, Altium, Micro-Cap, Maple, MatLab, etc.
Оценка
Всплески перенапряжения являются серьезной угрозой надежности работы радиоэлектронных устройств. Причины их появления различны, это могут быть коммутационные переходные процессы в системе электропитания устройств, разряды молний, электростатические разряды. Для создания эффективной и современной системы защиты от ЭСР компания SUNCO разработала надежные и качественные супрессоры, представляющие собой TVS- и ESD-диоды, а также сборки на их основе. Компоненты SUNCO не только не уступают, но часто превосходят по характеристикам аналогичную продукцию других брендов.
Специалист
 
Аватар для antonydublin
 
Регистрация: 22.09.2010
Адрес: г. Донецк
Сообщений: 873
Репутация: 381
372 0
3 0
 
14.04.2023 22:03 #3
А вот более короткий пример из другого проекта, где на три входа подаются импульсы с датчиков перехода 3х фаз сети через 0.

Код:
inline void hardware_init(void)
{
     ...
     PCICR |= _BV(PCIE0);
     PCMSK0 |= _BV(PCINT0);
     DDRD &= ~(_BV(PD0)|_BV(PD1)|_BV(PD2));
     ...
}

ISR(PCINT2_vect)
{
     if(PIND & _BV(PD2))
     {
          ....
     }

     if(PIND & _BV(PD1))
     {
          ...
     }

     if(PIND & _BV(PD0))
     {
          ...
     }
          ...
}
В общем, разрешаются прерывания, настраиваются входы и всё работает.
__________________
Atmel, STM32, ESP32, RTOS, OS-less, C, C++, C#, Visual Studio, IAR, Altium, Micro-Cap, Maple, MatLab, etc.
Оценка
Новичок
 
Регистрация: 21.11.2008
Сообщений: 88
Репутация: 27
19 6
4 0
 
17.04.2023 15:51 #4
Цитата:
Сообщение от AlexEst23
Даю ATtiny2313 разрешения в PCMSK на один вход, PCIE и глобальному прерыванию, но никакой реакции на изменение состояния входа не происходит.
Есть у кого опыт работы с этими прерываниями?
У 2313 нет PCINT нужен более новый камень. Мега из ардуины.
Оценка
Специалист
 
Аватар для antonydublin
 
Регистрация: 22.09.2010
Адрес: г. Донецк
Сообщений: 873
Репутация: 381
372 0
3 0
 
17.04.2023 20:44 #5
Цитата:
Сообщение от dedivan
У 2313 нет PCINT нужен более новый камень. Мега из ардуины.
Вы ошибаетесь, посмотрите даташит на ATtiny2313, страница 58.

Впрочем, ТС уже решил задачу на другом форуме. Судя по всему ему не хватало общего понимания работы External Interrupts на AVR.
__________________
Atmel, STM32, ESP32, RTOS, OS-less, C, C++, C#, Visual Studio, IAR, Altium, Micro-Cap, Maple, MatLab, etc.
Оценка
Новичок
 
Регистрация: 21.11.2008
Сообщений: 88
Репутация: 27
19 6
4 0
 
19.04.2023 18:17 #6
Цитата:
Сообщение от antonydublin
Вы ошибаетесь, .
Точно. У 2313 не было а у тини2313 уже есть.
Оценка
Ответ
Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход
Электронные компоненты. Скидки, кэшбэк и бесплатная доставка от ТМ Электроникс
Часовой пояс GMT +3, время: 00:39.
Обратная связь РадиоЛоцман Вверх