Next revision | Previous revision |
ru:avr:external_interrupts [2013/08/14 16:22] – создано eduardtlmk | ru:avr:external_interrupts [2020/07/20 09:00] (current) – external edit 127.0.0.1 |
---|
Исходя из принципов работы, существуют два вида внешних прерываний: синхронизированный с тактом контроллера и асинхронный. Синхронизированные прерывания работают, запоминая значение выводов, что означает, что логические изменения находятся путём сравнения значений, полученных от двух разных тактов. Если логические изменения внешнего сигнала происходят быстрее, чем идёт рабочий такт, то прерывания либо создаются неверно, либо вовсе пропускаются. Асинхронные прерывания не зависят от такта контроллера и позволяют определить быстро меняющийся внешний сигнал – логический нуль должен удерживаться сигналом как минимум в 50 ns. У ATmega128 4 синхронизированных и 4 асинхронных внешних прерывания. | Исходя из принципов работы, существуют два вида внешних прерываний: синхронизированный с тактом контроллера и асинхронный. Синхронизированные прерывания работают, запоминая значение выводов, что означает, что логические изменения находятся путём сравнения значений, полученных от двух разных тактов. Если логические изменения внешнего сигнала происходят быстрее, чем идёт рабочий такт, то прерывания либо создаются неверно, либо вовсе пропускаются. Асинхронные прерывания не зависят от такта контроллера и позволяют определить быстро меняющийся внешний сигнал – логический нуль должен удерживаться сигналом как минимум в 50 ns. У ATmega128 4 синхронизированных и 4 асинхронных внешних прерывания. |
| |
~~PB~~ | <pagebreak> |
| |
<box 100% round #EEEEEE|Näide> | <box 100% round #EEEEEE|Пример> |
| |
Vaja on panna ATmega128 viik number 9 ehk siini E viik 7 tekitama katkestust, kui selle väärtus muutub. Sellele viigule vastab väline katkestus INT7, mis on sünkroonne. | Требуется заставить вывод ATmega128 номер 9 (вывод 7 шины Е) создать прерывание, если его значение изменится. Этому выводу соответствует внешнее прерывание INT7, которое синхронно. |
| |
<code c> | <code c> |
#include <avr/interrupt.h> | #include <avr/interrupt.h> |
| |
// Välise katkestuse programm | // Программа внешнего прерывания |
ISR(INT7_vect) | ISR(INT7_vect) |
{ | { |
// Tee midagi | // Сделай что-нибудь |
} | } |
| |
int main() | int main() |
{ | { |
// Siini E viigu 7 muutmine sisendiks biti 7 nullimise teel | // Изменение вывода 7 шины Е входом путём обнуления бита 7 |
DDRE &= ~(1 << PIN7); | DDRE &= ~(1 << PIN7); |
| |
// Siini E viigule 7 pull-up takisti määramine sisendi ujumise vastu | // Установление pull-up резистора в вывод 7 шины Е от плавания |
PORTE |= (1 << PIN7); | PORTE |= (1 << PIN7); |
| |
// Väliste katkestuste seaderegistris katkestuse 7 | // Установление прерывания 7 в логическое изменение |
// tekitajaks loogilise muutuse määramine | // в регистре конфигурации внешних прерываний |
EICRB = (1 << ISC70); | EICRB = (1 << ISC70); |
| |
// Välise katkestuse 7 lubamine | // Разрешение внешнего прерывания 7 |
EIMSK |= (1 << INT7); | EIMSK |= (1 << INT7); |
| |
// Globaalne katkestuste lubamine | // Разрешение глобального прерывания |
sei(); | sei(); |
| |
// Lõputu programmitsükkel | // Бесконечный цикл программы |
while (1) continue; | while (1) continue; |
} | } |
</box> | </box> |
| |
Lisaks üksikute viikude tekitatavatele katkestustele on suurematel AVR-idel võimalik kasutada ka tervete gruppide viikude loogiliste väärtuste muutuste katkestusi. Neid katkestusi nimetatakse lihtsalt viigu muutuse katkestusteks (inglise keeles //pin change interrupt//). Need rakenduvad siis, kui vähemalt ühe viigu väärtus grupis muutub. | В дополнение к прерываниям, созданным одиночными выводами, в крупных AVR можно использовать прерывания изменений логических значений целых групп выводов. Такие прерывания называют просто прерыванием изменения вывода (англ. //pin change interrupt//). Они запускаются тогда, когда изменяется значение хотя бы одного вывода в группе. |