marți, 18 septembrie 2012

Module Periferice. Modulul periferic GPIO - Port Generic de Intrare/Ieşire.


      Module Periferice

    Un microcontroller, privit în ansamblu, reprezintă o structură formată dintr-un microprocesor şi un set de module periferice.  Un microcontroller poate avea o combinaţie variată de module periferice în dependenţă de serie. Un modul periferic ca regulă este un circuit specializat care poate îndeplini o anumită funcţie. De exemplu:

  • GPIO permite setarea sau colectarea nivelului logic de pe un pin al Microcontrollerului
  • EEPROM permite stocare pe timp îndelungat a datelor
  • ADC permite conversia semnalelor analogice
  • UART permite comunicarea serială
  • TIMER ne dă posibilitatea sa generm intervale de timp, să masurăm timpul între două evenimente, să generăm semnale digitale de o anumită formă.

     Într-o măsură oarecare am putea spune ca perifericile reprezintă interfaţa Microcontrollerului cu lumea externă.
Interacţiunea microprocesorului (CPU) cu perifericile are loc prin intermediul regiştrilor periferici. În arhitectura AVR există 64 asemenea regiştri, numiţi regiştri periferici sau I/O regiştri.
     Fiecare modul periferic işi are rezervat un set de regiştri în spaţiul regiştrilor periferici. De exemplu fiecare modul GPIO are rezervat un set de 3 regiştri numiţi PORT, PIN şi DDR prin itermediul cărora microprocesorul are posibilitatea de a lucra cu nivelele logice pe pini. Am putea face o clasificare a regiştrilor periferici în dependenţă de destinaţia lor după cum urmează:
  • Regiştri de Stare (Status Register) - permit vizualizarea stării curente a perifericului (flags). Ca regulă regiştri de stare accesibile sunt doar pentru citire. 
  • Regiştri de Control (Control Register) - permit configurarea modului periferic. Sunt disponibili pentru scriere şi pentru citire.
  • Regiştri de Date (Data Register)- permit schimbul de date între modulul periferic şi nucleu.
  • Regiştri de Selecţie  - permit selectarea unor resurse/configuraţii în cadrul unui modul periferic.
    


    În multe cazuri regiştrii periferici nu au o destinaţie bine definită, adică un registru ar putea conţine o colecţie de biţi de stare, control sau selecţie. Destinaţia regiştrilor periferici poate fi recunoscută prin numele lor şi de multe ori având o terminaţie de tip:  _SR, _CR, _DR, _AR. Însă aceasta nu este o regulă.
    Microprocesorul (CPU) nu face distincţie între modulele periferice. El "vede" modulele periferice prin prisma regiştrilor periferici. iar lucrul cu perifericile are loc prin transferul de date cu o adresa din spaţiul regiştrilor periferici. Accesul la regiştrii periferici se va executa print-run set specializat de comenzi.

    Comenzi de transfer. aceste comenzi presupun transferuri pe 8 biţi:
    in  R, P - transferul conţinutului unui registru periferic către un registru de uz general.
    out P, R  - transferul conţinutului unui registru de uz general către un registru periferic.

    Comenzi de setare/resetare a bitilor unici în cadrul unui registru periferic, aceste comenzi vor afecta doar bitul specificat prin n, restul biţilor vor păstra valoarea de până la operaţie:
    cbi P, n  - atribuirea valorii logice "0", resetarea, bitului n din portul P   n = 0 .. 7 
    sbi P, n  - atribuirea valorii logice "1", setarea, bitului n din portul P   n = 0 .. 7 
     
    Comenzi de verificare/testare a stării biţilor din cadrul unui registru periferic, ignorare a operaţiei imediat urmatoare în cazul când verificarea este adevarată:
    sbic P, n - ignorarea urmatoarei comenzi în cazul când bitul n din portul P este "0", resetat.
    sbis P, n - ignorarea urmatoarei comenzi în cazul când bitul n din portul P este "1", setat.

    Înainte de a începe lucrul cu un anumit periferic de cele mai deseori va fi nevoie de o configurare/ iniţializare a acestuia, iniţializarea realizandu-se prin atribuirea anumitor regiştri periferici de control a anumitor configuraţii. În unele cazuri ne-am putea mulţumi cu configuraţia iniţială după resetare, însă se recomandă ca fiecare modul periferic să fie iniţializat pe intregul set de biţi de configurare. Modul de configurare a fiecarui modul periferic se poate găsi în documentaţia tehnică a modului respectiv.
    Ca concluzie vom spune ca modulele periferice sunt dispozitive electrice atasate la procesor cu accesare prin regiştrii periferici.
    Pentru a inţelege mai uşor ce e un modul periferic, am putea să ne imaginăm un panou complex, de exemplu din interiorul unei nave de zbor. Ceea ce putem vedea pe acest panou este o mulţime de beculeţe, întrerupătoare, indicatoare, etc. Fiecare beculeţ poate fi asociat cu un bit de stare, un comutator cu un bit de configuraţie, un indicator alfanumeric - date de ieşire etc.
    Modulele periferice pot genera întreruperi la apariţia unor situaţii speciale detectate de periferie cum ar fi schimbarea nivelului logic pe un pin, terminarea transferului de date, terminarea conversiei etc, însă despre întreruperi vom vorbi ceva mai târziu.


Modulul periferic GPIO - Port Generic de Intrare/Ieşire.

  Orice Microcontroller are un set de pini, majoritatea dintre care care pot fi configuraţi ca pini generici de intrare sau ieşire (GPIO), astfel încât să i se poată atribui o valoare logică către terminalul pinului sau sa fie citită aceasta valoare logică de pe el, în cazul când pinul este configurat către intrare.
 
  Pinii de intrare/ieşire sunt grupaţi în porturi a câte opt. Lucrul cu portul se execută ca cu un tot întreg, respectiv, dintr-o singură operaţie de transfer către port putem modifica configuraţia la toţi opt pini deodată. Deci operaţiile de transfer către port va afecta toţi pinii ce îl constitiue.
    Deoarece modulul GPIO este un modul periferic al microcontrollerului, respectiv are rezervaţi un set de regiştri în spaţiul de adrese a regiştrilor periferici.


    Fiecare modul GPIO a microcontrollerului cu arhitectura AVR va avea la dispoziţie trei registri de periferici PINx, DDRx si PORTx.

  Pentru a explica modul de funcţionare a modulului GPIO vom prezenta următoarea figură:


  • PINx     -  serveşte pentru citirea valorii logice de pe terminalul fizic, acest registru este accesibil doar pentru citire. Operaţia de scriere către acest registru nu va afecta valoarea fizică a terminalului fizic.
  • PORTx - registru de setare a valorii portului pentru cazul când este setat catre ieşire şi activarea rezistentei de pull-up în cazul când este setat către intrare. 
  • DDRx   - Registrul de setare a direcţiei portului, intrare sau ieşire.
    În cazul când o locaţie a DDRx va conţine "1", pinul respectiv va fi setat către ieşire, iar valoarea logică din PORTx de la aceeaşi locaţie va fi tranferată către terminalul fizic.
    În cazul în care o locaţie a DDRx va conţine "0" , terminalul fizic respectiv va fi setat către intrare. În acest caz valoarea din registrul PORTx va conecta rezistenţa de pull-up cu valoarea logică "1", valoarea logică "0" va seta pinul în starea de impedanţă înaltă - "HiZ". Se recomandă de a evita starea de HiZ pe terminal, fapt ce are loc când terminalul nu este conectat la o sursa de semnal, pentru a evita introducerea de zgomote în interiorul cipului microcontrollerului, ce ar putea în cazurile critice duce până la defectarea circuitului.
    În aşa mod recomandarea pentru pinii neutilizaţi este de a seta configuraţia lor ca intrare cu rezistenţa de pull-up activată, ceea ce va evita scurt-circuituri întâmplătoare atunci când este setat spre ieşire, şi pentru cazul când este pe intrare, evitarea zgomotelor pe intrare nedorite.