luni, 25 februarie 2013

Problema L5. Keypad 4x4

Pagina principala curs            

Să se proiecteze un sistem care va detecta tasta apăsată şi va afişa caracterul tastei la un afişor cu 7 segmente.

Pentru rezolvarea problemei se recomandă citirea informaţiei despre programele cu întreruperi.

Tastatura 4x4 reprezintă un set de butoane aranjate în rînduri şi coloane. La fiecare intersecţie vom avea cîte un buton care scurt-circuitează conductoarele pentru linia cu coloana respectivă.


    În starea iniţială pe coloane vor fi conectate la un set de pini orientaţi către ieşire iar conductoarele liniilor vor fi conecate la un set de pini setaţi pentru intrare, cu rezistenţa de pull-up activată.
    Vom considera colecţia de fire a coloanelor ca intrare a tastaturii, iar cele de pe linii ca ieşire. Modul de detectare a tastei apăsate va reprezenta aplicarea de stimuli la intrare, adică la firele coloanelor, şi detectarea propagării acestor stimuli către ieşire.
    Având ca stare iniţială unităţi pe intrare, apăsarea oricărui buton va implica transferul valorii logice 1 de pe coloana respectivă către linia respectivă la care este conectat butonul apăsat, ca urmare însă, starea pinilor de pe linii nu va fi modificată deoarece firele de ieşire la fel vor avea valoarea logică 1 condiţionată de rezistenţele de pull up conectate la aceste fire. Ca concluzie din cele spuse mai spus, vom spune ca aplicând la coloană valoarea logică 1, vom pasiva coloana, adică nu va implica careva schimbări pe linii.
   Altfel va fi situaţia atunci când se va aplica la o coloană 0 logic, şi un buton de pe coloana respectivă este apăsat. În acest caz, valoarea logică 0 va fi propagată către linia respectivă a butonului apăsat, schimbând valoarea logică a pinului menţinută de rezistenţa de pull up conectată. Deci, deoarece aplicarea  valorii 0 logic pe coloană şi apăsarea unui buton de pe această coloană implică schimbare pe linia la care e conectat butonul, vom spune că coloana este activată prin aplicarea valorii 0 logic.
    deci,
    1- coloana este pasivă
    0- coloana este activă

Utilizând cele spuse mai sus, pentru a detecta butonul apăsat vom elabora o metodă de scanare a tastaturii prin activarea consecutivă a coloanelor şi verificarea propagării valorii logice 0 pe linii.
    Codul tastei apăsate îl vom considera valoarea ca o concatenare a tuturor biţilor de pe linii şi de pe coloane. Ca urmare  vom avea:
                    cod_tasta <= < linie : coloana >
    Pentru a evita scanarea continuă a tastaturii, vom optimiza metoda de detecţie activând iniţial toate coloanele, şi verificarea existenii unei valori logice 0 pe oarecare linie.
    O alta optimizare a metodei ar fi utilizarea intreruperii externe în acest scop, ce va permite ca detecţia existenţei unei oarecare apăsări să fie automată de către sistemul de întreruperi, iar în cadrul subrutinei de prelucrare a întreruperii se va detecta care anume tastă a fost apăsată.
    Declanşarea chemării subrutinei de prelucarea a întreruperii EXT_INT va fi condiţionată de căderea de potenţial detectată la pinii de ieşire, de pe linii.
    Deoarece avem tocmai 4 surse de întreruperi de la cele 4 linii, colectarea căderilor de potenţial către un singur semnal îl vom face cu ajutorul unui set de diode a căror terminale Catod vor fi conectate către linii iar terminalele Anod vor fi conectate în comun şi vor servi drept sursă de semnal pentru declanşarea întreruperii  pe front căzător. Diodele deasemenea ne asigură dezlegarea electrică a liniilor necesară evitării propagării căderii nivelului logic de la o linie către alta.

Pentru rezolvarea problemei date vom organiza programul în urmatoarele subrutine:
  - AnyKey() - detectarea apăsării unei oarecare taste(este realizată automat de către sistemul de întreruperi).
  - GetKey(Rx) - pentru detectarea codului tastei
  - KeyTo7seg(Rx) - pentru transformarea codului tastei în cod pe 7 segmente.
  - ShowRes(Rx). - afişarea codului tastei pe afişorul 7 segmente, în cazul nostru aplicarea valorii către un port.GPIO

Schema electrică a sistemului:



Schemele bloc:
1) Partea de iniţializare:
2) Subrutina de prelucrare a întreruperii:
3) Subrutina de detectare a tastei:
4) Subrutina de transformare a codului de la tastă în cod pentru afişorul de 7 segmente
5) Subrutina de afişare a datelor

Pagina principala curs