Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.11.2014, 10:43   #1
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Вектора прерываний ATMega328

Вектора прерываний ATMega328

Код:
Вектор	Прерывание	Обработчик	Описание
1	RESET	         RESET_vect	External Pin, Power-on Reset, Brown-out Reset and Watchdog System Reset
2	INT0	         INT0_vect	Внешнее прерывание 0
3	INT1	         INT1_vect	Внешнее прерывание 1
4	PCINT0	         PCINT0_vect	Прерывание 0 по изменению состояния вывода
5	PCINT1	         PCINT1_vect	Прерывание 1 по изменению состояния вывода
6	PCINT2	         PCINT2_vect	Прерывание 2 по изменению состояния вывода
7	WDT	         WDT_vect	Сторожевой таймер (если используется в качестве источника прерывания)
8	TIMER2_COMPA	TIMER2_COMPA_vect	Прерывание по сравнению, канал A таймера/счетчика 2
9	TIMER2_COMPB	TIMER2_COMPB_vect	Прерывание по сравнению, канал B таймера/счетчика 2
10	TIMER2_OVF	TIMER2_OVF_vect	Прерывание по переполнению таймера/счетчика 2
11	TIMER1_CAPT	TIMER1_CAPT_vect	Прерывание таймера/счетчика 1 по захвату
12	TIMER1_COMPA	TIMER1_COMPA_vect	Прерывание по сравнению, канал A таймера/счетчика 1
13	TIMER1_COMPB	TIMER1_COMPB_vect	Прерывание по сравнению, канал B таймера/счетчика 1
14	TIMER1_OVF	TIMER1_OVF_vect	Прерывание по переполнению таймера/счетчика 1
15	TIMER0_COMPA	TIMER0_COMPA_vect	Прерывание по сравнению, канал A таймера/счетчика 0
16	TIMER0_COMPB	TIMER0_COMPB_vect	Прерывание по сравнению, канал B таймера/счетчика 0
17	TIMER0_OVF	TIMER0_OVF_vect	Прерывание по переполнению таймера/счетчика 0
18	SPI	         SPI_STC_vect	Завершение передачи по последовательному каналу SPI
19	USART_RX	USART_RX_vect	Завершение приема по каналу USART
20	USART_UDRE	USART_UDRE_vect	Регистр данных USART пуст
21	USART_TX	USART_TX_vect	Завершение передачи по каналу USART
22	ADC	         ADC_vect	Преобразование АЦП завершено
23	EE_READY	EE_READY_vect	EEPROM готова
24	ANALOG_COMP	ANALOG_COMP_vect	Аналоговый компаратор переключился
25	TWI	         TWI_vect	Событие двухпроводного интерфейса (I2C)
26	SPM_READY	SPM_READY_vect	Готовность SPM
Admin вне форума   Ответить с цитированием
Старый 02.06.2016, 22:47   #2
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1031
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию Re: Вектора прерываний ATMega328

Раз была такая тема...
Как включить и обработать прерывание D8-D9 = PCINT 0-1 = PCIR0 = PB = PCIE0 = pcmsk0?

Из того что я нагуглил - в голове каша. на которой кормятся тараканы.
Как мне показалось надо подключить библиотеку:
#include <avr/interrupt.h>

Дальше, если я правильно прочитал даташит, нужно в регистре PCICR установить соответствующий бит:
PCICR = 0b00000001;

Можно ли писать PCIE0=1; ?
Регистр SREG Bit 7 – I: Global Interrupt Enable нужно трогать? Через sei()?

Дальше настраиваем вход на пинах 8-9 дуины (PinB0 и PinB1)
DDRB = 0b00111100;

А дальше вроде бы уже само прерывание?
Код:
ISR(PCINT0_vect){
 //что-то тут делаем
 _delay_ms(10000); //ждем немножко, чтобы дрябезг не вызвал повторное срабатывание. А можно ли вообще delay внутри прерывания использовать?
}

main {
//обрабатываем полученное в прерывании результаты, через глобальные переменные..
}

На просторах интернета встречал еще записи SIGNAL(PCINT0_vect) {}. так тоже можно? Нагуглил... На досуге почитаю, если кто-то готов сделать краткий пересказ - будет супер

Последний раз редактировалось Tohin; 02.06.2016 в 22:55.
Tohin вне форума   Ответить с цитированием
Старый 03.06.2016, 07:41   #3
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Вектора прерываний ATMega328

Цитата:
Можно ли писать PCIE0=1; ?
Это один бит, такого типа в компиляторе нет

Цитата:
А дальше вроде бы уже само прерывание?
В прерывании не рекомендуется использовать delay
Admin вне форума   Ответить с цитированием
Старый 03.06.2016, 10:08   #4
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1031
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию Re: Вектора прерываний ATMega328

Ничего больше устанавливать не надо? Например PCMSK0, если на остальных пирах будет выход? Или при срабатывании выхода Pcint не сработает?
Больше никаких регистров дергать не надо?

И про delay: а как правильно притормозить срабатывания pcint (для подавления дрябезга) и при этом не мешать работе int0, int1?

UPD:
Что-то написал, работает как я ожидал. Есть ли косяки?
Код:
/* 
* к выводам 8 и 9 ардуины (PortB0 и 1) подключены через кнопки к +5, со стороны пинов подтянуты резисторами к земле
* к выводу 10 (PortB2) подключен светодиод. с другой стороны диода резистор и за ним земля...
*/
#include <avr/interrupt.h>



void setup() {
  // put your setup code here, to run once:
PCICR = 0b00000001;
DDRB = 0b00111100;
PORTB = 0x00; 
PCMSK0 = 0b00000011;
 PORTB |= (1 << PB2); // тестовое включение диода на 10м пине дуины
 _delay_ms(1000); //ждем, чтоб видно было
 PORTB &= ~(1 << PB2); // и гасим его в
 sei();
}

void loop() {
  // put your main code here, to run repeatedly:

}

ISR(PCINT0_vect){
 PORTB |= (1 << PB2); // если что-то появилось прерывание, зажигаем диод
 _delay_ms(1000); //ждем немножко, чтобы дрябезг не вызвал повторное срабатывание. А можно ли вообще delay внутри прерывания использовать?
 PORTB &= ~(1 << PB2); // и гасим его в
}
при нажатии и отпускании любой кнопки на 1 сек зажигается диод.
Странно, но delay не блокирует новые прерывания. Если "теребить" кнопку светодиод горит постоянно. Гаснет через 1 сек после последнего события. Непонятно... Мне казалось при входе в прерывание SREG обнуляется, и восстанавливается при выходе.
Ну да ладно, это можно и ручками сделать.

Последний раз редактировалось Tohin; 03.06.2016 в 18:10.
Tohin вне форума   Ответить с цитированием
Старый 03.06.2016, 13:22   #5
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Вектора прерываний ATMega328

Цитата:
Ничего больше устанавливать не надо? Например PCMSK0, если на остальных пирах будет выход? Или при срабатывании выхода Pcint не сработает?
Больше никаких регистров дергать не надо?
Я сейчас в разъездах, на память не помню, нужно Datashet смотреть

Цитата:
И про delay: а как правильно притормозить срабатывания pcint (для подавления дрябезга) и при этом не мешать работе int0, int1?
Лучший способ это конденсаторы на входе
Admin вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

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

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

Быстрый переход


Текущее время: 01:45. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика