?

Log in

No account? Create an account
Мам, у меня кончились прерывания! - Cообщество любителей Arduino [entries|archive|friends|userinfo]
Cообщество любителей Arduino

[ website | Официальный сайт Arduino ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Мам, у меня кончились прерывания! [Apr. 9th, 2010|04:09 pm]
Cообщество любителей Arduino

ru_arduino

[freedom_of_sea]
В официальной документации написано как реализовать прерывание при изменении цифровых пинов 0 и 1. Но контроллер умеет генерировать прерывания при изменении любого цифрового пина. При этом функций-прерываний у вас по прежнему две, но "подписать" их можно на изменение любого пина.

Это означает что внутри функции нужно опрашивать все пины, на изменение которых она подписана. Помните, что функция обработки прерывания должна быть как можно короче, а все переменные которые она меняет, должны быть объявлены volatile. Как правило, функция обработки прерывания должна выставлять некоторые переменные как флаги, а обработка их должна выполняться в цикле loop. Так прерывания будут обработаны быстрее и не будут мешать работе системы, передаче по Serial, работе ШИМ и часов.

Вот программа реализующая прерывания по изменению каждго пина:

// Quick example of using pin change interrupts
// This shows how to use Digital Pin 4 (PCINT18/PD2) as an interrupt

#include <avr/interrupt.h>

// we need to remember that the Arduino environment uses different pin numbers
// than the ATMEGA168 itself.

void setup(){
// Make digital 4 (PCINT18/PD2) an input
pinMode(4, INPUT);

// this is ATMEGA168 specific, see page 70 of datasheet

// Pin change interrupt control register - enables interrupt vectors
// Bit 2 = enable PC vector 2 (PCINT23..16)
// Bit 1 = enable PC vector 1 (PCINT14..8)
// Bit 0 = enable PC vector 0 (PCINT7..0)
PCICR |= (1 << PCIE2);

// Pin change mask registers decide which pins are enabled as triggers
PCMSK2 |= (1 << PCINT18);

// enable interrupts
interrupts();
}

void loop(){
// do nothing...
}

// we have to write our own interrupt vector handler..
ISR(PCINT2_vect){
// this code will be called anytime that PCINT18 switches
// (hi to lo, or lo to hi)
}

Подробнее (на англ.)
http://forums.trossenrobotics.com/tutorials/how-to-diy-128/an-introduction-to-interrupts-3248/
LinkReply

Comments:
[User Picture]From: telegamochka
2010-04-09 02:44 pm (UTC)
Пожалуйста, отредактируйте сообщение: угловые скобки в <avr/interrupt.h> надо заменить на комбинации из 4 символов (пробелы, которые я вставила между буквами, надо убрать): & l t ; и & g t ; соответственно.
(Reply) (Thread)
[User Picture]From: freedom_of_sea
2010-04-10 08:32 pm (UTC)

отредактировал

спасибо
(Reply) (Parent) (Thread)
[User Picture]From: hroniki_volkov
2010-04-09 08:09 pm (UTC)
Интересно, спасибо!
Думаю, пригодится.
(Reply) (Thread)