Клеммные колодки Keen Side

В 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 и глобальному прерыванию, но никакой реакции на изменение состояния входа не происходит.
Есть у кого опыт работы с этими прерываниями?
Оценка
Приглашаем принять участие 10 сентября в вебинаре о текущей линейке и модельном ряде пленочных конденсаторов Hongfa, включая новые, недавно вышедшие серии. На вебинаре будут приведены конкретные и актуальные примеры применения пленочных конденсаторов Hongfa – источники питания, зарядные станции для электротранспорта, преобразователи частоты, фотоэлектрические преобразователи и ветрогенераторы. Вас также ждет обзор производственных мощностей и возможностей Hongfa, включая используемые технологии.
Специалист
 
Аватар для 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.
Оценка
Компания Hongfa - один из лидеров азиатского рынка пленочных конденсаторов с полным циклом производства. Она выпускает пять серий помехоподавляющих конденсаторов этого типа как для бытовой, так и для трехфазной промышленной сети, а также для автомобильного применения. Продукция компании по ассортименту, параметрам и количеству серий конденсаторов ЭМП не уступает другим крупным производителям этого сегмента и может легко заменить ассортимент ушедших из РФ брендов.
Специалист
 
Аватар для 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 код Выкл.

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