Documente Academic
Documente Profesional
Documente Cultură
5 PDF
5 PDF
Seciuni lucrare:
Modaliti de conectare a unui buton
Modaliti de manipulare software a intrrilor digitale
Exemplu de activare direct a ntreruperilor externe
Proiect numrtor pe dou caractere i trei butoane
Proiect cronometru pe dou caractere i trei
butoane
Referine online
49
51
if (digitalRead(buton3) == LOW) {
a3++;
Serial.print("Butonul 3 s-a apasat butonul de ");
Serial.print(a3,DEC);
Serial.print(" ori.");
Serial.println();
//debouncing software
delay(200);
}
}
Se observ c citirea celor trei butoane presupune o bucl infinit care verific continuu
starea pinilor la care sunt conectate cele trei butoane i afieaz pe serial numrul de
apsri al fiecrui buton n parte. Se mai observ c programul introduce i un
debouncing software (o mic ntrziere dup declanarea fiecrei apsri de buton)
pentru a nu prinde evenimentul n mod eronat de mai multe ori. Se poate experimenta i
observa efectul nlturrii debouncing-ului software.
O alt modalitate de a prinde un eveniment de tip nchidere circuit / apsare buton se
poate face i prin utilizarea ntreruperilor externe. Mediul Arduino IDE pune la dispoziia
programatorului funcia attachInterrupt(ntrerupere, isr_asociat, mod)
care permite manipularea celor dou ntreruperi externe INT0 i INT1 ale
microcontrolerului. Din pcate acestea sunt singurele ntreruperi care sunt accesibile
prin intermediul limbajului de baz al mediului Arduino IDE. Butoanele trebuie s fie
conectate la pinii 2 (INT0) i 3 (INT1) ai plcii Arduino. Parametrii funciei sunt:
ntrerupere - 0 pentru INT0 i 1 pentru INT1, isr_asociat numele unei proceduri care
s trateze apariia ntreruperii i mod specific evenimentul extern la care s se
declaneze ntreruperea LOW (pinul devine 0 logic), FALLING (pinul trece din 1 n
0), RISING (pinul trece din 0 n 1) sau CHANGE (orice tip de tranziie la buton
acest mod va conduce la declanare dubl la fiecare apsare). Funcia pereche
detachInterrupt(ntrerupere) permite dezactivarea ntreruperii activate cu
ajutorul funciei precedente. Pentru testarea celor dou funcii se poate rula programul
urmtor utiliznd aceiai schem electric efectul programului este identic cu cel
precedent.
const int buton3 = 4;
volatile int a1 = 0;
volatile int a2 = 0;
int a3 = 0;
void setup() {
attachInterrupt(0,ISR_b1,FALLING);
53
Sistemul de ntreruperi este folosit doar pentru butonul 1 (pin2 INT0) i butonul
2 (pin3 INT1) deoarece funcia attachInterrupt nu permite definirea de
ntreruperi externe pe ali pini. Citirea butonului 3 se face n continuare n bucla
infinit principal.
Pentru activarea ntreruperilor INT0 i INT1 se seteaz biii INT0 i INT1 din registrul
intern EIMSK, de exemplu: EIMSK |= (1 << INT0).
Pentru activarea ntreruperii externe PCINT2 cu referire la pinul PCINT20 trebuie setai
biii PCIE2 i PCINT20 din registrele PCICR i PCMSK2. Datorit faptului c ntreruperile
de tip PCINT nu au dect modul de funcionare echivalent cu CHANGE fiecare apsare
de buton 3 va fi prins de dou ori (FALLING i RISING).
Funciile ISR pentru cele trei ntreruperi trebuie declarate de forma ISR(INT_vect)
unde INT_vect va fi INT0_vect, INT1_vect, PCINT2_vect. [2]
n cazul ISR-urilor reale (nu generate de mediul Arduino) sistemul de ntreruperi este
dezactivat pe durata execuiei ISR-ului (pentru ca un ISR s nu ntrerup un alt ISR).
Pentru a preveni blocarea programului (n ISR) nu trebuie folosite n cadrul unui ISR
funciile puse la dispoziie de mediul Arduino. De exemplu, utilizarea funciei delay n
cadrul unui ISR (pentru debouncing-ul software) va conduce la o execuie eronat a
programului deoarece aceast funcie utilizeaz ntreruperea asociat timer-ului 0
apelat ntr-un context de dezactivare a sistemului de ntreruperi va conduce la un
comportament incert a execuiei programului. Aceast funcie poate fi nlocuit cu
macro-ul _delay_ms(nr_ms) prezent n biblioteca util/delay.h .
56
int
int
int
int
int
int
latchPin1 = 7;
clockPin1 = 8;
dataPin1 = 9;
latchPin2 = 10;
clockPin2 = 11;
dataPin2 = 12;
57
58
ISR(PCINT2_vect) {
digit1 = 0;
digit2 = 0;
_delay_ms(400); }
int
int
int
int
int
int
latchPin1 = 7;
clockPin1 = 8;
dataPin1 = 9;
latchPin2 = 10;
clockPin2 = 11;
dataPin2 = 12;
60
Referine online
[1] <avr/interrupt.h>: Interrupts
http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
[2] We interrupt this program to bring you a tutorial on Arduino interrupts
http://www.engblaze.com/we-interrupt-this-program-to-bring-you-a-tutorial-on-arduinointerrupts/
62