KEEN SIDE успешно заменяет аналогичные продукты таких известных брендов, как Phoenix Contact, Weidmueller, Degson, Winstar, Hsuan Mao, KLS, G-NOR, Mean Well и др.

В 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 и глобальному прерыванию, но никакой реакции на изменение состояния входа не происходит.
Есть у кого опыт работы с этими прерываниями?
Оценка
Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель.
Специалист
 
Аватар для antonydublin
 
Регистрация: 22.09.2010
Адрес: г. Донецк
Сообщений: 868
Репутация: 380
371 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.
Оценка
Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW. Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного.
Специалист
 
Аватар для antonydublin
 
Регистрация: 22.09.2010
Адрес: г. Донецк
Сообщений: 868
Репутация: 380
371 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
Сообщений: 82
Репутация: 24
16 6
4 0
 
17.04.2023 15:51 #4
Цитата:
Сообщение от AlexEst23
Даю ATtiny2313 разрешения в PCMSK на один вход, PCIE и глобальному прерыванию, но никакой реакции на изменение состояния входа не происходит.
Есть у кого опыт работы с этими прерываниями?
У 2313 нет PCINT нужен более новый камень. Мега из ардуины.
Оценка
Специалист
 
Аватар для antonydublin
 
Регистрация: 22.09.2010
Адрес: г. Донецк
Сообщений: 868
Репутация: 380
371 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
Сообщений: 82
Репутация: 24
16 6
4 0
 
19.04.2023 18:17 #6
Цитата:
Сообщение от antonydublin
Вы ошибаетесь, .
Точно. У 2313 не было а у тини2313 уже есть.
Оценка
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Оценка этой теме
Оценка этой теме:
Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

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

Быстрый переход
Электронные компоненты. Бесплатная доставка по России
Часовой пояс GMT +3, время: 15:55.
Обратная связь РадиоЛоцман Вверх