29.11.2014, 10:43 | #1 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Вектора прерываний 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 |
02.06.2016, 22:47 | #2 |
Moderator
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1031 |
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. |
03.06.2016, 07:41 | #3 | ||
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Re: Вектора прерываний ATMega328
Цитата:
Цитата:
|
||
03.06.2016, 10:08 | #4 |
Moderator
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1031 |
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); // и гасим его в } Странно, но delay не блокирует новые прерывания. Если "теребить" кнопку светодиод горит постоянно. Гаснет через 1 сек после последнего события. Непонятно... Мне казалось при входе в прерывание SREG обнуляется, и восстанавливается при выходе. Ну да ладно, это можно и ручками сделать. Последний раз редактировалось Tohin; 03.06.2016 в 18:10. |
03.06.2016, 13:22 | #5 | ||
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823 |
Re: Вектора прерываний ATMega328
Цитата:
Цитата:
|
||
Здесь присутствуют: 2 (пользователей: 0 , гостей: 2) | |
|
|