butonul Conectarea la microcontroler, de programare MCU pic

Acum, ia în considerare cazul în care microcontrolerul să îndeplinească în mod continuu orice sarcină, în acest caz, butonul este apăsat așteptați inacceptabilă. Puteți utiliza o întrerupere pentru a schimba nivelul la intrările RB4-RB7 sau de intrare a unui INT întrerupere externă.

Pentru a întrerupe intrările RB4-RB7 a algoritmului este următoarea: atunci când semnalul se schimbă la 1 la 0 de tranziție are loc în rutina de tratare a întreruperii, în cazul în care este necesar să se stabilească mai întâi ce a cauzat întreruperea, atunci când există mai multe surse de întrerupere. Atunci când sursa este definită, este necesar să se afle ce a mers exact la același nivel de semnal de intrare definind-o, efectuați operațiile corespunzătoare din cadrul handler de întrerupere, sau pentru a seta un steag într-un registru care îi este alocată în mod special pentru acest scop. În continuare, să presupunem că înregistrați PORTB, pentru a elimina neconcordanțele valoare cu semnalul de la intrările de port stocate anterior, în caz contrar steagul nu va fi posibilă resetarea întrerupere. După resetarea ieșirea de pavilion de tratare a întreruperii.

Un registru dedicat cu steaguri de control în bucla principală a programului, în cazul în care pavilion set efectuează o subrutină, apoi resetați pavilion.
Din nou, datorită contactului de respingere la acest algoritm poate fi generată de întreruperea în mod repetat, adăugați o pauză de timp debounce în rutina de întrerupere este lipsită de sens, din moment ce a pierdut timpul CPU necesar pentru a efectua alte sarcini.

De asemenea, algoritmul nu este considerat de recurență a anula buton este apăsat, o schimbare de semnal de la 0 la 1, pentru că în RB4-RB7 intrările de întrerupere apar pe frontul crescător și descrescător al semnalului. Dar aici e doar o întrerupere poate fi omisă prin efectuarea operațiunilor corespunzătoare, numai în cazul în care 0 intrare.

Rezolva problema sporovăiala, puteți utiliza cronometrul. La intrarea in rutina de tratare a întreruperii, atunci când schimbă semnalul de 1 - 0, interzice intrări de întrerupere RB4-RB7, definiți intrare, în cazul în care a schimbat semnalul, steagul stabilit într-un registru dedicat, un cronometru este pornit 5-20 ms și de ieșire din rutina de întrerupere. După o anumită perioadă de timp, depășirea timer-ului revenirea la rutina de tratare a întreruperii, opriți cronometrul, resetați steagul preaplin este citit PORTB pentru a elimina neconcordanțele, reseta pavilion și pentru a permite intrări de întrerupere RB4-RB7. Atunci când o întrerupere apare din nou ca rezultat al stoarcere butoanelor, întregul proces se repetă, cu excepția faptului că, sări executarea operațiunilor corespunzătoare ca la semnalul de intrare este egal cu 1. Codul de program este prezentat mai jos:

; Anterior, la setarea inițială de registre cu destinație specială trebuie resetat

; Overflow pavilion TMR1, pavilion de întrerupere a intrărilor RB4-RB7

; Se lasă preaplin de întrerupere TMR1, precum și intrări de întrerupere RB4-RB7

; Înregistrează butoane cu steaguri sunt interogate în corpul programului principal, nu uitați să le resetați

BTFSS plR1, TMR1IF; poll întrerupere de pavilion Overflow TMR1

Goto metka1, pavilion nu este setat: Salt la eticheta metka1 - sondaj

Alte surse de întrerupere;

T1CON BCF, TMR1ON; flag este setat: Stop temporizator TMR1

BCF plR1, TMR1IF; reset pavilion preaplin întrerupere TMR1

MOVF PORTB, W; PORTB citirea valorilor pentru eliminarea incoerențelor

BCF INTCON, RBIF; întrerupere de pavilion reset intrare RB4-RB7

BSF INTCON, RBIE; intrari rezoluție întrerupere RB4-RB7

RETFIE; ieșirea din handler de întrerupere

metka1 BTFSS INCON, RBIF; sondaj de pavilion de întrerupere de intrări RB4-RB7

Goto metka2, pavilion nu este setat: Salt la eticheta metka2 - sondaj

Alte surse de întrerupere;

BCF INTCON, RBIE; flag este setat ban pe intrări de întrerupere RB4-RB7

BTFSS PORTB, 4; anchetă linie RB4

pavilion BSF, 0, 0 pe linia RB4: stabilirea unui steag pentru linia RB4

BTFSS PORTB, 5; 1 RB4 linie: Linie sondaj RB5

flag bsf, 1, 0 la linia RB5: setați pavilion pentru linia RB5

BTFSS PORTB, 6; 1 RB5 linie: Linie sondaj RB6

pavilion BSF, 2, 0 pe linia RB6: stabilirea unui pavilion pentru linia RB6

BTFSS PORTB, 7, liniile 1 la RB6: Linie sondaj RB7

pavilion BSF, 3, 0 pe linia RB7: stabilirea unui pavilion pentru linia RB7

MOVLW 0.224; numărul 45536 de intrare TMR1 temporizator, pauză 20ms,

movwf TMR1L; frecvența ceasului de 4 MHz,

movlw 0.177; prescaler TMR1 preinstalat 1: 1

BSF T1CON, TMR1ON; comutator temporizator TMR1

RETFIE; ieșirea din handler de întrerupere

metka2. ; Sondaj alte surse de întrerupere

RETFIE; ieșirea din handler de întrerupere

Sincer, un astfel de proiect nu am folosit, nu-mi place totul. Închide buton de întrerupere este cel mai bine să se trezească microcontroler din modul sleep.

Este mult mai ușor și mai sigur de a pune butoane cod sondaj în bucla de programul principal, în locul unde vor fi interogați cel puțin o dată la 100 ms, la fel ca și alte sarcini. Pentru a preveni mai multe execuții ale subrutina atunci când o apăsare lungă pe butonul pe care doriți să utilizați un registru suplimentar cu steaguri de butoane de control de stat. Dacă în timpul următorului ciclu de votare la cheia programului principal nu ar deține, apoi setat la 1 registrul de pavilion corespunzător. La detectarea primului pavilion apăsând verifica dacă este 1, și de a efectua rutina de resetare, apoi du-te la al doilea sondaj de buton sau mai multe din bucla principală de program.
Următorul pavilion sondaj este egal cu 0, nu face nimic, așa cum am merge la sondaj al doilea buton, sau de a continua fără oprirea ciclului. Această omisiune va avea loc atâta timp cât apăsați butonul din nou și steagul nu este setat la 1. Codul este după cum urmează:

Cele interne rezistențe pull-up sunt utile pentru depanare. Trebuie să facă mai puțin de instalare. Dar rezistențe externe vor fi mai fiabile în dispozitivul finit)
Cu toate că o astfel de bună filtrare debounce de software, prin utilizarea unei surse de alimentare transformator (sau baterie) și de nutriție Conder, poate evita interferențele inutile și utilizarea podtyag intern. Ce poate ajuta în astfel de dispozitive compacte.

Butoanele sunt foarte diferite, cu un salt de la 10 microsecunde la o fracțiune de secundă.
In plus, ei de vârstă și parametrii de schimbare sări la cel mai rău.
Prin urmare, este mult mai bine de a face un program de întârziere, și a pus cheia în condensator paralel, modificarea valorii nominale a care pot fi aranjate rapid sub orice butoane.