Cum îl “îngrijim” şi ce-i dăm să “mănânce” microcontrolerului PIC16C74 şi perifericelor sale

10 MAI 2001

PIC 16C74 este un microcontroler din gama de mijloc de la Microchip Technology Inc. În acest articol ne vom referi la unele periferice introduse la acest model şi anume la convertorul A/N (analog-numeric), la interfaţa SCI (interfaţa de comunicaţie serială) şi la PWM (impulsuri modulate în lăţime). Intenţia noastră este de a vă da un mic program care iniţializează aceste periferice şi care le pune la lucru. Este dată şi o schemă. Pe această placă nu există al doilea potenţiometru semireglabil, aşa că valoarea canalului al doilea al convertorului analog-numeric poate fi fluctuantă. Al doilea semireglabil este folosit numai pentru a arăta o metodă de a schimba pinii de intrare pentru convertorul A/N. Când programul rulează, terminalul conectat la portul RS-232 va afişa două valori pentru convertorul A/N. Luminozitatea ledului este reglată folosind modulaţia impulsurilor în lăţime. Factorul de umplere este determinat de poziţia semireglabilului.

Ipoteze
Deşi pot fi periculoase, uneori este necesar să facem anumite presupuneri. Pentru această discuţie să presupunem că pinii RA0 şi RA1 sunt conectaţi prin câte un rezistor în serie la cursoarele celor două potenţiometre, celelalte capete ale potenţiometrelor fiind conectate la Vdd, respectiv la masă (vezi schema). Frecvenţa oscilatorului va fi de 4MHz. Prima dată vom citi o mărime de pe o intrare A/N, vom trimite rezultatul prin portul serial (pentru a fi afişat de un program de tip terminal rulând pe un PC) apoi vom comuta pe următorul canal A/N. Vom modifica lăţimea impulsurilor de la ieşirea PWM pentru a corespunde poziţiei primului potenţiometru. De fiecare dată când suntem gata să începem un nou ciclu vom trimite mai întâi doi octeţi de sincronizare pentru a semnala acest lucru procesorului care recepţionează. Pentru a simplifica discuţia nu vom folosi întreruperile, ci vom utiliza metoda interogărilor periodice (polling). Watch dog-ul este dezactivat pentru acest program. Pentru a ne asigura că nu vom avea surprize, este o idee bună să iniţializăm cu o valoare cunoscută toate registrele speciale (SFR) şi registrele de date înainte de utilizare.

Misterele convertorului A/N
Convertorul A/N şi cele opt canale de intrare ale sale vor fi primul nostru subiect de discuţie. Punerea în stare de funcţionare a convertorului A/N implică două registre speciale:
• ADCON0
• ADCON1
În programul care se găseşte la redacţie (sau pe e-mail) referitor la acest articol există o secvenţă initad care pregăteşte convertorul A/N. Registrul ADCON0 este calul de bătaie pentru acest periferic. Acest registru este folosit pentru a selecta frecvenţa de tact pentru conversie şi canal. Tot acest registru este folosit pentru a comanda începerea conversiei şi a detecta sfârşitul ei. ADCON1 are doar un singur scop în viaţă pentru acest microcontroler şi acesta este de a configura portul A/N. Când este folosit ADCON1 acesta nu se substituie registrulului TRISA. Registrul TRISA trebuie să fie configurat corespunzător. Odată ce aceste registre au fost configurate, tot ce mai are de făcut programul este să selecteze pinul de intrare A/N dorit şi să seteze bitul GO/DONE în ADCON0. Programul aşteaptă apoi ca bitul care semnalează terminarea conversiei, acelaşi GO/DONE, să fie resetat de către hardware. Apoi este citit registrul ADRES în care se găseşte rezultatul conversiei A/N. Valoarea de la primul potenţiometru este folosită pentru a regla lăţimea impulsurilor PWM, modificând astfel luminozitatea ledului.

Modulaţia impulsurilor în lăţime (PWM)

Pinul 1 al portului C este configurat ca ieşire. Registrele care trebuie configurate pentru această funcţie PWM sunt:
TRISC
T2CON
CCPR2L
PR2
CCP2CON
Secvenţa de program initpwm este un exemplu de ce se poate face pentru a iniţializa modulul PWM. TRISC a fost resetat mai înainte aşa că biţii portului C sunt configuraţi ca ieşiri. Scriind “4” în registrul T2CON, vom face factorul de prescalare 0 şi vom selecta TIMER2. Scriind 0Fh în registrul CCP2CON vom selecta modul PWM şi rezoluţia standard. Valoarea 0Fh scrisă în registrul CCPR2L va seta perioada lungă la o valoare iniţială mică. Setarea registrulului PR2 la valoarea FFh va permite ca valoarea din CCPR2L (de la rezultatul conversiei A/N) să se apropie de factorul de umplere de 100%.
Acum putem să controlăm luminozitatea LED-ului conectat la pinul RC1 prin reglarea potenţiometrului de la pinul RA0, scriind rezultatul conversiei A/N în registrul CCPR2L descris mai înainte. è
SCI
Modulul nostru de interfaţă pentru comunicaţia serială este canalul de comunicaţie RS-232. Vom configura SCI ca un port serial asincron full duplex (comunicaţie simultană în ambele sensuri). Acest lucru este realizat de către rutina initsci din programul care însoţeşte articolul de faţă. Sunt câteva lucruri referitoare la acest periferic pe care trebuie să le avem în minte. Rata de transmisie (baud rate) este determinată de către un generator special pe opt biţi cu ajutorul căruia pot fi generate frecvenţe de transmisie standard pornind de la frecvenţa oscilatorului. Din moment ce nu folosim întreruperile, vom lucra doar cu cinci registre:
RSCTA – starea receptorului
TXSTA – starea transmiţătorului
TXREG – buffer-ul transmiţătorului
RCREG – buffer-ul receptorului
SPBRG – pentru setarea ratei de transmisie
Prima dată dezactivăm întreruperile. Secvenţa initsci setează portul serial, iar sendat asigură transmiterea propriu-zisă a datelor.
Setarea SCI este pentru 2400baud, 8 biţi de date şi 1 bit de stop, fără paritate. Un program de terminal, cum ar fi TERMINAL din Windows, setat pentru aceleaşi valori, poate fi utilizat pentru a vizualiza ieşirea portului nostru serial. Dacă folosiţi programul de terminal din Windows, setaţi parametrii de comunicaţie pentru 2400baud, 8biţi de date, 1 bit de stop, fără paritate şi hardware handshake.

Punând piesele la un loc
Bucla principală în care procesul este parcurs de fiecare dată este mloop. Rutina adcnvrt se ocupă de selectarea pinilor de intrare şi de controlul conversiei proriu-zise. Rutina dopwm reactualizează registrul pentru factorul de umplere al PWM, CCPR2L. Rutina sendat verifică dacă transmiţătorul este gata de transmisie şi încarcă buffer-ul de transmisie când acest lucru este adevărat. Veţi remarca că nu există nici o rutină pentru tratarea erorilor. Este responsabilitatea utilizatorului să ia o decizie în această situaţie.

Iată ce va face programul:
Odată ce perifericele vor fi iniţializate, sunt trimişi doi octeţi de sincronizare “<>” către terminal. Rezultatele conversiei A/N sunt trimise şi ele, iar luminozitatea LED-ului este modificată astfel încât să corespundă poziţiei potenţiometrului conectat la pinul RA0. Pentru a simplifica afişarea valorilor conversiei A/D este folosit numai semioctetul superior la care se adună 30h pentru a fi convertit într-o cifră ASCII.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *

  • Folosim datele dumneavoastră cu caracter personal NUMAI pentru a răspunde comentariilor/solicitărilor dumneavoastră.
  • Pentru a primi raspunsuri adecvate solicitărilor dumneavoastră, este posibil să transferăm adresa de email și numele dumneavoastră către autorul articolului.
  • Pentru mai multe informații privind politica noastră de confidențialitate și de prelucrare a datelor cu caracter personal, accesați link-ul Politica de prelucrare a datelor (GDPR) si Cookie-uri.
  • Dacă aveți întrebări sau nelămuriri cu privire la modul în care noi prelucrăm datele dumneavoastră cu caracter personal, puteți contacta responsabilul nostru cu protecția datelor la adresa de email: gdpr@esp2000.ro
  • Abonați-vă la newsletter-ul revistei noastre