Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Porturile de intrare/iesire
1. Introducere
Pini de intrare/iesire de uz general pot fi considerati ca fiind cele mai simple periferice. Ei permit microcontrolerelor din familia PICmicro sa monitorizeze si sa controleze alte dispozitive. Pentru a adauga flexibilitate si functionalitate unui dispozitiv, o parte dintre pini pot fi multiplexati cu o functie alternativa. Aceste functii depind de ce perifericele integrate in cip. In general, cand un periferic se afla in functionare, acel pin nu poate fi folosit ca o linie de intrare/iesire de uz general.
Pentru cele mai multe porturi, directia pinului (intrare sau iesire) este controlata de registrul de directie a datelor, numit registru TRIS. Tris(x) controleaza directia pentru PORT(x). Un "1" in registrul TRIS comanda pinul sa fie intrare, in timp ce un "0" il comanda sa fie iesire. O modalitate usoara de a tine minte aceste valori este: 1 seamana cu I (Input - intrare), iar 0 seamana cu O (Output - iesire).
Registrul PORT este latch-ul datelor care trebuiesc inscrise la iesire. Cand portul este citit, dispozitivul citeste valorile care se regasesc la pini (si nu latch-ul). Aceasta inseamna ca trebuie atentie cu comenzile de tip citeste-modifica-inscrie asupra porturilor si schimbarea directiei unui pin din intrare in iesire.
Figura urmatoare arata schema tipica a unui port de intrare-iesire. Nu s-a tinut cont de functii ale perifericelor care pot fi multiplexate pe pin. Citirea portului implica citirea starii pinilor, iar scrierea lui implica scrierea in latch-ul asociat. Toate operatiile de scriere (precum instructiunile BSF sau BCF) sunt operatii de tip citire-modificare-inscriere. Prin urmare, o scriere in port implica citirea valorilor direct de la pini, valoarea citita este modificata si apoi inscrisa in latch-ul de date al portului.
Schema tipica a unui port de intrare/iesire
Cand sunt multiplexate functii ale unor periferice pe un pin de intrare/iesire de uz general, functionalitatea pinului poate fi schimbata in conformitate cu necesitatile perifericului. Exemple pentru aceasta situatie sunt convertorul analog-digital (A/D), modulele pentru controlul LCD care forteaza pinul la functia perifericului la resetul dispozitivului. In cazul convertorului A/D, aceasta previne ca microcontrolerul sa consume excesiv de mult curent in cazul in care pe intrarile convertorului se aflau valori analogice de intrare la momentul producerii resetarii.
In cazul unor periferice, bitul din registrul TRIS este suprascris la activarea perifericului. Prin urmare, instructiunile de tipul citire-modificare-scriere (BSF, BCF, XORWF) care au ca destinatie registrul TRIS trebuie evitate. Utilizatorul trebuie sa consulte sectiunile referitoare la periferice din documentatie pentru setarile corecte ale registrului TRIS.
Pinii porturilor pot fi multiplexati cu intrari analogice si intrare Vref analogica. Modul de functionare al acestor pini este selectat, intrare analogica sau intrare/iesire digitala prin resetarea/setarea bitilor de control in registrul ADCON1 (A/D Control Register). Cand sunt setati ca intrari analogice, la citirea lor se va obtine valoarea "0".
Registrele de control a directiei TRIS controleaza directia chiar si atunci cand acesti pini sunt setati ca intrari analogice. Utilizatorul trebuie sa pastreze bitii din TRIS setati cand pinii sunt utilizati ca intrari analogice.
Nota 1: Daca pinii sunt multiplexati cu intrari analogice, la reset la initializare (Power On Reset) acesti pini sunt configurati ca intrari analogice, controlate de registrul ADCON1. Citirea pinilor de port configurati ca intrari analogice va avea drept rezultat valori de "0".
Nota 2: Daca pinii sunt multiplexati cu intrari ale comparatorului, atunci la reset la initializare acesti pin sunt configurati ca intrari analogice, controlate de registrul CMCON. Citirea pinilor de port configurati ca intrari analogice va avea drept rezultat valori de "0".
Nota 3: Daca pinii sunt multiplexati cu iesiri de control LCD, atunci la reset la initializare acesti pini sunt configurati ca iesiri de control LCD, controlate de registrul LCDSE. Pentru a configura pinii respectivi ca pini de port digital, bitii corespunzatori din registrul LCDSE trebuiesc resetati. Orice bit setat in registrul LCDSE este prioritar fata de setarile bitilor corespunzatori din registrul TRIS.
Nota 4: Pinii pot fi multiplexati cu Portul Paralel in mod Slave (PSP). Pentru ca PSP sa functioneze, trebuie ca pinii de intrare/iesire trebuie configurati ca intrari digitale si bitul PSPMODE trebuie setat.
Nota 5: PSP devine activ cand bitul PSPMODE este setat. In acest mod, utilizatorul trebuie sa se asigure ca pinii din registrul TRIS sunt setati si PORT este setat ca intrare/iesire digitala. In acest mod intrarile PORT sunt buffere TTL.
2. Registrii PORTA si TRISA
Pinul RA4 este intrare Trigger Schmitt si iesire de tip colector in gol (open-collector). Toti ceilalti pini RA au nivele de intrare TTL si iesiri de tip CMOS. Toti pinii au biti de configurare a directiei datelor (registru TRIS) care poate configura pinii ca intrare sau iesire.
Setarea unui bit in registrul TRISA pune driverul sau de iesire in impedanta infinita (High-Z). Resetarea unui bit in registrul TRISA depune pe pinul corespunzator continutul latch-ului de iesire.
Un exemplu de initializare il avem mai jos:
Schema bloc a pinilor RA3:RA0 si a RA5
Schema bloc a pinului RA4
3. Registrii PORTB si TRISB
PORTB este un port bidirectional pe 8 biti. Lui ii corespunde registrul de control al directiei datelor TRISB. Setarea unui bit in registrul TRISB pune driverul de iesire al pinului corespunzator in impedanta infinita. Resetarea unui bit in registrul TRISB depune continutul latch+ului de iesire pe pinul/pinii selectati.
Un exemplu de initializare a PORTB:
Fiecare pin al portului RB are un modul de weak pull-up intern. Un singur bit poate activa toate pull-up-urile interne. Aceasta se poate realiza prin resetarea bitului RBPU (OPTION(7)). Rezistenta de pull-up este dezactivata automat cand pinul de port este configurat ca iesire. Pull-up-urile interne sunt dezactivate la o resetare la initializare.
Schema bloc a pinilor RB3:RB0
Patru dintre pinii PORTB, RB7:RB4 au posibilitatea de a genera o intrerupere la modificarea starii lor. Numai pinii configurati ca intrare pot genera intrerupere (de exemplu oricare din pinii RB7:RB4 configurat ca iesire nu participa la comparare pentru a detecta schimbarea starii). Pinii configurati ca intrare (dintre RB7:RB4) sunt comparati cu vechile valori ale lor pastrate in latch-uri. Iesirile care difera intra intr-o poarta SAU pentru a genera intreruperea la modificarea starii PORTB cu flagul RBIF (INTCON(0)).
Aceasta intrerupere poate activa microcontrolerul din starea de SLEEP. Utilizatorul, in rutina de tratare a intreruperilor, poate achita intreruperea in urmatoarele moduri:
a) Orice citire sau scriere a PORTB. Aceasta va incheia neconcordanta dintre valorile de pe pini si cele memorate in latch-uri.
b) Resetarea flagului RBIF.
Neconcordanta va continua sa seteze bitul RBIF. O citire a PORTB va elimina neconcordanta ti va permite resetarea flagului RBIF.
Capacitatea de a genera o intrerupere la modificarea starii pinilor PORTB (RB7:RB4), impreuna cu pull-up-urile configurabile software permit interfatarea facila cu o tastatura si fac posibila revenirea din starea de SLEEP la apasarea sau eliberarea unei taste.
Posibilitatea de a genera intrerupere la modificarea starii pinilor RB7:RB4 este recomandat a fi folosita pentru wake-up (revenire din stare SLEEP) si operatii in care PORTB este folosit doar pentru aceasta capabilitate. Efectuarea de polling asupra PORTB nu este recomandata in timpul folosirii intreruperii la modificarea starii pinilor.
Schema bloc a pinilor RB7:RB4
4. Registrii PORTC si TRISC
PORTC este un port bidirectional pe 8 biti. Fiecare pin poate fi configurat separat ca intrare sau iesire prin intermediul registrului TRISC. Pinii PORTC au buffere de intrare Trigger Schmitt.
La activarea functiei perifericelor, definirea pinilor TRISC pentru fiecare pin al PORTC trebuie facuta cu atentie. Unele periferice nu tin cont de bitii din TRISC pentru a configura pinul ca iesire, in timp ce altele nu iau in considerare bitii din TRISC pentru a configura pinul ca intrare.
Un exemplu de initializare al PORTC:
Schema bloc a PORTC - perifericele nu tin cont de bitii din TRISC
5. Lucruri de luat in considerare cand se lucreaza cu porturile de intrare/iesire
Cand se folosesc porturile ca intrari/iesiri, proiectarea sistemului trebuie realizata cu atentie, pentru a fi siguri ca sistemul va functiona asa cum se doreste.
Porturile de intrare/iesire bidirectionale
Orice instructiune care realizeaza o operatie de scriere realizeaza de fapt o citire urmata de o operatie de scriere. Instructiunile BCF si BSF, de exemplu, citesc registrul, executa operatia pe bit si apoi inscriu rezultatul inapoi in registru. Trebuie atentie in situatiile in care aceste instructiuni sunt aplicate asupra unui port care are atat pini configurati ca intrari, cat si pini configurati ca iesiri. De exemplu, o instructiune BSF asupra bitului 5 din PORTB va conduce la citirea tuturor celor 8 biti. Apoi BSF se executa asupra bitului 5 si PORTB este inscris in latch-ul de iesire. Daca alt bit alt PORTb este folosit ca linie de intrare/iesire bidirectionala si este configurat ca intrare in acel moment, semnalul de intrare prezent pe pin va fi citit si rescris in latch-ul corespunzator, suprascriind precedenta valoare. Atata timp cat acest pin este folosit ca intrare, nu intervine nici o problema. Daca bitul 0 este configurat ca iesire continutul latch-ului este necunoscut.
Citirea registrului asociat portului citeste valorile care se gasesc in acel moment la pini. Scrierea in registrul asociat portului inscrie valorile in latch-ul de iesire asociat. La utilizarea unei instructiuni de tip citire-modificare-scriere (ex.: BCF, BSF, etc.) asupra unui port, valoarea pinilor este citita in registrul portului, aceasta valoare este modificata si apoi este inscrisa in latch-ul portului.
Exemplul urmator arata efectul a doua instructiuni consecutive de tip citire-modificare-inscriere asupra unui port de intrare/iesire:
Un pin configurat ca iesire, care are valoare Low sau High nu trebuie sa aiba conectata tot o iesire care sa incerce sa schimbe nivelul logic (SAU cablat, SI cablat). Curentii mari rezultati ar putea conduce la defectarea dispozitivului.
Operatii succesive asupra unui port de intrare/iesire
Inscrierea propriu-zisa a unui port de intrare/iesire are loc la sfarsitul unui ciclu instructiune, in timp ce la citire, datele trebuie sa fie valide la inceputul ciclului instructiune. Prin urmare, trebuie avuta grija daca o operatie de inscriere se efectueaza asupra unui port, urmata imediat de o citire a aceluiasi port. Secventa de instructiuni trebuie sa permita stabilizarea tensiunii pe pin (in functie de sarcina) inainte de urmatoarea instructiune care cauzeaza citirea in registrul asociat portului. In caz contrar, s-ar putea sa citim starea anterioara a pinului in loc de starea noua. Daca sunt dubii, este mai bine ca cele doua instructiuni sa fie separate de o instructiune NOP sau o alta instructiune care nu acceseaza portul in cauza.
Operatii succesive de intrare/iesire
Figura urmatoare arata o situatie in care se poate produce aceasta situatie. O data cu cresterea capacitatii condensatorului C, timpii de tranzitie din Low in High si din High in Low pentru pinul respectiv cresc. Daca frecventa dispoyitivului creste, sau creste capacitatea C, posibilitatea ca o citire ulterioara a PORTx sa produca rezultate eronate creste. Capacitatea efectiva include si capacitatile parazite ale traseelor de pe placa de test.
Cea mai buna modalitate de a rezolva astfel de situatii este de a inseria un rezistor la iesirea pinului. Acesta permite pinului sa atinga nivelul logic dorit inainte de urmatoarea instructiune.
Inserarea de instructiuni NOP intre instructiunile de tip citire-modificare-inscriere consecutive este o solutie mai eficienta din punct de vedere al costului, dar are dezavantajul ca numarul de instructiuni NOP depinde de capacitatea C si de frecventa dispozitivului.
Probleme legate de conexiunea liniilor de intrare/iesire
6. Initializare
Vezi sectiunea referitoare la initializare din cadrul descrierii fiecarui port pentru exemple.
Nota: se recomanda ca atunci cand se initializeaza un port, latch-ul de date (registrul PORT) sa fie initializat primul, si apoi sa fie stabilita directia datelor (registrul TRIS). Aceasta va elimina variatiile bruste ale tensiunii pe pini, din moment ce latch-urile de date ale PORT iau valori aleatorii la punerea sub tensiune a dispozitivului.
6. Informatii utile pentru dezvoltatorii de sisteme
Intrebarea 1: Nu pot schimba starea vreunui port de intrare/iesire, dar oscilatorul pare sa functioneze. Unde este greseala
Raspunsul 1:
Registrii TRIS au fost initializati corespunzator? Acesti registri pot fi inscrisi direct in al doilea banc (Bancul 1). In cele mai multe cazuri utilizatorul nu selecteaza bancul 1 inainte de inscrierea registrilor TRIS.
Daca ati inscris corect registrii TRIS in bancul 1 (RP1:RP0 01), s-ar putea sa nu fi selectat bancul 0 inainte de inscrierea in porturi (BCF STATUS, RP0).
Exista vreun periferic multiplexat pe acesti pini activat
Este activat Watchdog Timer-ul (la programarea microcontrolerului)? Daca este activat, este el resetat corect prin instructiunea CLRWDT la cel putin 9 ms (sau mai mult daca este folosit prescaler-ul)?
Folositi instructiunile corecte pentru a inscrie in port Multi au incercat sa utilizeze instructiunea MOVF cand de fapt trebuie utilizata instructiunea MOVWF.
Pentru sistemele ce folosesc intreruperi, sunt acestea dezactivate Daca nu, incercati sa le dezactivati pentru a verifica daca nu cumva interfereaza cu functionarea dorita a programului.
Intrebarea 2: Cand citesc prin program un port, obtin o valoare diferita de cea pe care o inscriu in registru. Ce ar putea sa cauzeze asta
Raspunsul 2:
Cand un port este citit, intotdeauna se citesc valorile direct de la pini, indiferent daca sunt configurati ca intrari sau ca iesiri. Prin urmare, daca un pin este configurat ca intrare, veti citi valoarea direct de la pin, indiferent de continutul registrului.
Daca un pin este configurat ca iesire, sa presupunem ca are inscrisa valoarea "1" in latch-ul de date. Daca este scurtcircuitat la masa, veti citi "0" pe pin. Aceasta este de folos la construirea de sisteme tolerante la defecte, sau la tratarea conflictelor pe busul I2C (acesta este fortat la doar "0" logic, pinii sunt trecuti in impedanta infinita pentru "1" logic. Daca pinul are valoarea "0" si aceasta nu este fortata de dispozitiv, inseamna ca alt sistem incearca sa preia controlul busului).
Microcontrolerele de la mijlocul gamei au toate cel putin un pin cu iesirea de tip colector in gol. Acesti pini pot fi controlati de microcontroler doar in "0" sau impedanta infinita. Pentru cele mai multe dispozitive, acesta este RA4. Pinii ce au iesire de tip colector in gol trebuie sa aiba conectata un rezistor de pull-up pentru a trece in valoare logica High.
Intrebarea 3: Daca folosesc RB0 cu functia de intrerupere externa sistemul nu primeste intrerupere. Daca efectuez polling pe acelasi pin, atunci reuseste sa citeasca starea High si functioneaza corect. Care este problema
Raspunsul 3: PORTB accepta nivele TTL la intrari, asa ca daca tensiunea aplicata are valoarea, de exemplu, de 3V (cu VDD 5V), veti citi "1" logic. Insa intrarea in structura care genereaza intreruperea multiplezata pe RB0 este de tip Trigger Schmitt care necesita o tensiune de intrare mai mare decat valoarea minima pentru "1" TTL pentru a considera ca pinul este trecut in High. Prin urmare este posibil sa citim "1", insa sa nu putem genera o intrerupere. S-a ales intrarea de tip Trigger Schmitt pentru a genera intrerupere pentru a elimina problemele de tip zgomot. Generarea unei intreruperi din cauza zgomotului este mult mai daunatoare decat coruperea nivelului logic pe un pin de date, de aceea s-a optat pentru aceasta solutie.
Intrebarea 4: Cand se executa o instructiune BCF, alti pini sunt resetati in port. De ce
Raspunsul 4:
Un alt caz in care o instructiune de tip citire-modificare-scriere pare sa schimbe valorile altor pini este ilustrata in continuare: sa presupunem ca toti pinii PORTC sunt configurati ca iesiri si forteaza nivel Low. La fiecare pin este conectat un LED cu celalalt pin la masa, prin urmare un nivel high pe pinii de port il vor face sa se aprinda. Intre LED-uri exista conectate condensatoare de 0.1 mF. Sa mai presupunem ca microcontrolerul functioneaza la o frecventa mare, 20 Mhz. Daca se executa secventa de instructiuni BSF PORTC,0 apoi BSF PORTC,1 apoi BSF PORTC,2 si asa mai departe, veti observa ca numai ultimul pin a fost setat si numai ultimul LED se aprinde. Aceasta se intampla deoarece condensatoarele au nevoie de o anumita perioada de timp pentru a se incarca. Pe masura ce fiecare pin era setat in program, pinul de dinaintea lui nu era inca incarcat, deci era citit ca "0", valoare ce era scrisa inapoi in latch, ceea ce reseta bitul anterior (pe care l-am setat cu instructiunea precedenta). Aceasta nu se petrece, de obicei, decat la viteze mari si in cazul operatiilor succesive asupra aceluiasi port, dar se poate intampla, asa ca trebuie luat in considerare.
Alta posibilitate este sa nu fie corect configurati pinii in registrul ADCON1. Daca un pin este configurat ca intrare analogica, orice citire a acelui pin va obtine valoarea "0", indiferent de tensiunea aplicata pe acel pin. Aceasta este o exceptie de la regula care spune ca intotdeauna se citeste starea direct de la pin. Se poate configura un pin analogic drept iesire in registrul TRIS, si sa fie fortat Low sau High scriind in latch-ul de date, dar va fi citit tot ca "0". Prin urmare, daca se executa o instructiune de citire-modificare-scriere toti pinii analogici sunt cititi cu valoarea "0", si cei care nu sut modificati de instructiune vor fi inscrisi cu valoarea "0". Insa tensiunea pe un pin analogic poate avea orice valori, care pot sa nu insemne nici High, nici Low pentru o intrare digitala. Astfel de tensiuni conduc la cresterea curentului in bufferul de intrare, asa ca acesta este dezactivat.
Copyright © 2024 - Toate drepturile rezervate