Vous êtes sur la page 1sur 9

Arhitecturi cu microprocesor

Curs 5
5.1. Timere si circuite de ceas Microcontrolerul PIC16F887 microcontroller are trei timere/numaratoare notate cu TMR0, TMR1 si TMR2 described in only one sentence. Le descriem pe scurt in cele ce urmeaza. Timer TMR0 Timerul TM0 are o aplicatie foarte frecventa in practica. Foarte putine programe nu folosesc aces Timer. Se pot scrie foarte usor programe sau subroutine care geneeraza pulsuri de o durata arbitrara, subroutine care masoara timpul (generator timp sau timpul intre doua interval prestabilite), sau numara pulsuri externe (evenimente) cu aplicatii multiple. Modulul TMR0 este un timere/numarator pe 8 biti cu urmatoarele caracteristici: timere/numarator pe 8 biti; prescalare 8-biti (partajata cu timer Watchdog); sursa interna programabila sau sursa ceas extern; intrerupere pe depasire (overflow) ceas extern pe selectie front programbil.

Schematica TMR0 cu semnificatia bitilor care determina toate operatiile este aratat in figura de mai jos. Toti bitii sunt memorati in registrul OPTION_REG, accesibil prin program. Notam ca semnificatia notatiilor este: R/W biti care pot fi scrisi sau cititi, (1) dupa resetare bitii sunt pusi pe 1, (0) dupa resetare bitii sunt stersi, adica iau valoarea 0, R bit care poate fi numai citit.

Fig. 5-1 Timer TMR0

O rezistenta pull-up (trage in sus) este rezistenta ce asigura un curent de polarizare. O rezistenta de pull-up de exemplu este legata la VDD (+5V)in serie cu un comutator(care poate fi un contact mecanic, un releu, un tranzistor sau iesirea unui circuit digital). Iesirea se afla intre contact si rezistenta de pull-up. Atunci cand contactul este deschis, tensiunea in gol la iesire va fi VDD de aceea se numeste pull-up. Daca acea rezistenta ar lipsi, atunci la iesire tensiunea ar fi relativ nedeterminata, deci impedanta foarte mare Hi-Z, caz in care daca se conecteaza o sarcina la iesire si un alt potential, atunci iesirea va avea potentialul respectiv(GND sau VDD pt circuite digitale). Atunci cand contactul se inchide, la iesire vor fi 0V. Rezistenta de pull-up este suficient de mica (10 K) astfel incat daca la iesire se pune intrarea unor alte circuite digitale, acelea sa nu schimbe starea logica cand comutatorul este deschis. La pull-down e exact invers, rezistenta este conectata intre iesire si GND (masa). Atunci cand comutatorul este deschis, atunci iesirea va avea potentialul 0.

RBPU - PORTB Pull-up validare bit o 1 - PORTB rezistentele pull-up sunt dezactivate; o 0 - PORTB pinii pot fi conectati rezistentele pull-up. INTEDG Bit selectie Intrerupere la front o 1 Intrerupere front crescator al INT pinii (0-1); o 0 - Intrerupere front descrescator al INT pinii (1-0). T0CS - TMR0 Bit selectie Ceas o 1 Pulsurile sunt aduse la intrare timer/numarator TMR0 timer/counter prin pinul RA4; o 0 Ciclu ceas intern (Fosc/4). T0SE - TMR0 bit Selectie sursa frontSource o 1 Incrementare tranzitie high-to-low pe pinul TMR0; o 0 - Incrementare tranzitie low-to-high pe pinul TMR0. PSA Asignare bit Prescalare o 1 - Prescalare asignata la TMR0 timer/numarator; o 0 - Prescalare asignata la WDT. PS2, PS1, PS0 Bit Selector Raport Preascalare

Raportul de prescalare este adaptat prin combinarea acestor biti. In tabelul de mai jos, sunt date diferite rapoarte de prescalare pentru timer/numerator si respective timer watch-dog.
PS2 0 0 0 0 1 1 1 1 PS1 0 0 1 1 0 0 1 1 PS0 0 1 0 1 0 1 0 1 TMR0 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256 WDT 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128

Starea logica a bitului PSA determina daca prescalatorul este asignat timer/numerator sau timer watch-dog (WDT). Pentru utilizare corecta TMR0 trebuie sa respectam urmatoarele: In modul select: Modul este setat de bitul T0CS din registrul OPTION_REG ((T0CS: 0=timer, 1=counter); Prescalerul trebuie asignat la timer/counter prin stergerea bitului PSA din registrul OPTION_REG. Rata prescalerului este setata folosind bitii PS2-PS0 din acelasi registru; Cind se folosesc intreruperile, trebuie setatati bitii GIE si TMR0IE din registrul INTCON. Pentru masurare timp: Reset registru TMR0 sau scrim in el o valoare cunoscuta; Timpul scurs (in microsecunde pentru cazul cuartz 4MHz) este masurat de registrul TMR0; Bitul flag TMR0IF din registrul INTCON este automat setat ori de cite ori este depasire la registrul TMR0.

Pentru masurare pulsuri: Polaritatea pulsurilor este masurata pe pinul RA4 selectat de bitul TOSE din registrul OPTION (T0SE: 0=positive, 1=negative pulses); Numarul de pulsuri trebuie citi din registrul TMR01. Prescalerul si intreruperile se utilizeaza in acelasi mod.

Timer TMR1 Timer TMR1 este un numerator/timer pe 16 biti deci este reprezentat pe doi registry (TMR1L and TMR1H). El poate numara 65.535 pulsuri intr-un singur ciclu, dupa care numaratoarea se reia de la 0. Timerul TMR1 poate fi citit in orice moment. In caz de depasire se genereaza o intrerupere. Parti din registrul T1CON sunt utilizate in opratiuni de control. Spre deosebire de timerul TMR0, TMR1 are functii suplimentare. TMR1 are un prescaler separate de 1, 2, 4 sau 8 diviziuni ceas de intrare. Pinii RC0/T1OSO si RC1/T1OSI sunt folositi pentru a inregistra pulsuri de la dispositive periferice electronice, si pot opera cu ceas de cuartz suplimentar la frecventa joasa.

Oscilator Frecventa C1 32 kHz 100 kHz 200 kHz 33 pF 15 pF 15 pF

C2 33 pF 15 pF 15 pF

LP

Timer TMR1 ca Oscilator, se poate folosi in modul Sleep. Timer TMR2 Timer TMR2 este un modul timer pe 8 biti cu un mod de operare foarte specific. TMR2 este control de citiva biti din registrul T2CON. Exemplu utilizare TMR0 Intrarea numaratorului este conectata la buton, orice apasare a butonului provoaca un puls la TMR pentru numarare. Cind numarul de pulsuri se potriveste cu cel stocat in registrul TEST (in exemplul nostrum este 5), apare o valoare logica (5V) la pinul PORTD.3. Aceasta valoare activeaza un releu electromecanic (numit RELAY in program).

/*Header******************************************************/ void main() { char TEST = 5; // Constant TEST = 5 enum outputs {RELAY = 3}; // Constant RELAY = 3 ANSEL = 0; ANSELH = 0; PORTA = 0; TRISA = 0xFF; PORTD = 0; TRISD = 0b11110111; OPTION_REG.F5 = 1; OPTION_REG.F3 = 1; TMR0 = 0; do { if (TMR0 == TEST) (PORTD.RELAY = 1); } while (1); } // Test Number in timer cu constant TEST? // Numbere egale. Set the RD3 bit (iesire RELAY) // Bucla continua // Toti pini I/O pins configurati ca digitali // // // // // // Reset port A Toti pinii port A configurati ca intrari Reset port D Pin RD3 configurat ca iesire, restul intrari Numaratorul TMR0 primeste pulsuri prin pinul RA4 Rata Prescaler 1:1 // Reset timer/counter TMR0

Alocarile se fac folosind enum. enum outputs {RELAY = 3}; // Constant RELAY = 3 Daca sunt conectati citiva pini D, atunci aceasta expresie devine:
enum outputs {RELE = 3, HEATER, MOTOR = 6, PUMP};

5.2. Portul serial. Programarea portului serial. Enhanced Universal Asynchronous Receiver Transmiter sincrone (EUSART) este un modul de comunicaie periferic te tip serial I / O. Acest modul este, de asemenea, cunoscut sub denumirea de Serial Communications Interface (SCI). Aceasta conine toate generatoarele de ceas, buffere de de date i registre de deplasare necesare pentru a efectua transfer de date de intrare sau de ieire de transfer de date independent de executia programului pe dispozitiv. Dup cum spune numele su, n afar de utilizare a ceasului de sincronizare, acest modul se poate stabili, de asemenea conexiune asincron ceea ce o face nenlocuit n unele aplicaii. EUSART din microcontrolerul PIC16F887 are urmtoarele caracteristici: Transmisie i recepie Full-duplex asincron; Lungime caractere programabil pe 8 sau 9 bii; Detecie adres n mod 9 bii; Detecie eroare supra-rulare (overrun error detection); Comunicare n mod sincron semi-suplex, half-duplex (master sau slave);

EUSART n mod asincron EUSART transmite i primete date folosind standardul non-return-to-zero (NRZ), fr utilizare ceas.

Fig. 5-2 Emitorul asincron EUSART

Pentru a valida emiterea de date prin modulul EUSART este necesar sa se configureze ca emitor, adic s fie setai urmtorii bii: TXEN = 1 - EUSART validate transmitere setnd bitul din registrul TXSTA; SYNC = 0 - EUSART mod asincron, stergere bit din registrul TXSTA; SPEN = 1 - bit din registrul RCSTA register, EUSART este validat enabled i pinul TX/CK este configurat automat ca ieire. Dac acest pin este utilizat simultan cu funcii analogice, acest bit trebuie dezactivat, tergnd bitul corespondent din registrul ANSEL.

Fig. 5.-3 Receptorul asincron EUSART

Similar, pentru a valida recepia de date prin modulul EUSART este necesar sa se configureze ca receptor, adic s fie setai urmtorii bii: CREN = 1 - EUSART validate transmitere setnd bitul din registrul RCSTA; SYNC = 0 - EUSART mod asincron, stergere bit din registrul RCSTA; SPEN = 1 - bit din registrul RCSTA register, EUSART este validat enabled i pinul RX/DT este configurat automat ca ieire. Dac acest pin este utilizat simultan cu funcii analogice, acest bit trebuie dezactivat, tergnd bitul corespondent din registrul ANSEL. Detecia Erorilor Sunt dou tipuri de erori pe care controlerul le poate detecta automat. Primul este numit eroare de cadru (Framing error) i poate avea loc cnd receptorul nu detecteaz bitul de stop n timpul corespunztor i este indicat de bitul FERR din registrul RCSTA. Al doile tip de eroare este numit eroare de suprascriere (Overrun Error). Stiva FIFO poate pstra dou caractere. Eraoare de suprascrie apare atunci cnd este recepionat al treilea caracter fr ca cele dou caractere s fie transferate catre microprocesor. Bitul OERR din registrul RCSTA este setat n acest caz. Generator de vitez de transmisie EUSART (BRG) Din diagrama de recepie EUSART asincron, este utilizat semnalul de ceas BRG pentru sincronizare. Acelai ceas este utilizat de asemeni pentru modul sincron. Temporizatorul este format din doi regitri de 8 bii, reunii ntr-un registru de 16 bii.

Formula utilizat pentru rata de transfer este dat n tabelul de mai jos. Bii SYNC 0 0 0 0 1 BRG1G BRGH 0 0 0 1 1 0 1 0 1 X Mod BRG / EUSART 8-bii / asincron 8-bii / asincron 16-bii / asincron 16-bii / asincron 8-bii / asincron Baud Rate Formula Fosc / [64 (n + 1)] Fosc / [16 (n + 1)] Fosc / [16 (n + 1)] Fosc / [4 (n + 1)] Fosc / [4 (n + 1)] Fosc / [4 (n + 1)]

1 1 X 16-bii / asincron n = valoarea perechilor de regitri SPBRGH, SPBRG

Formulele utilizate pentru rata de transfer sunt:


Rata _ Dorita = Fosc , 64( SPBRGH : SPBRG + 1)

Fosc Rata _ Dorita 1 SPBRGH : SPBRG = 64

Eroare[%] =

Rata _ Calculata Rata _ Dorita Rata _ Dorita

Exemplu: Pentru un dispozitiv ci Fosc = 16MHz, rata de transmisie dorit de 9600 bauds, mod asincron, BRG pe 8 bii, calculul este urmtorul.
Fosc 16000000 Rata _ Dorita SPBRGH : SPBRG = 1 = 9600 1 = 25,042 25 64 64 Rata _ Calculata = Fosc 16000000 = = 9615 64( SPBRGH : SPBRG + 1) 64(25 + 1) Rata _ Calculata Rata _ Dorita 9615 9600 Eroare[%] = = = 0,16% Rata _ Dorita 9600

Modulul MSSP (Master Synchronous Serial Port) Modulul MSSP este foarte util, dar n acelai timp unul din cele mai complexe circuite din microcontroler. El este practic o interfa serial care valideaz o vitez nalt de comunicaie ntre microcontroler i alte periferice sau alte microcontrolere utiliznd numai cteva linii de intrare/ieire (max 2 sau 3). Aceste periferice pot fi EPROM serial, registre de deplasare, drivere de afiare, convertoare A/D, etc. Modulul MSSP poate opera n dou moduri: SPI (Serial Peripheral Interface) I2C (Inter-Integrated Circuit)

Interfa I2C are trei moduri de operare: Mod Master Mod Multi-Master Mod Slave

Modul SPI are permite transmisie pe 8 bii i poate fi tramsie i recepie simultan folosind 3 linii de intrare/ieire: SDO (Serial Data Out), linie de transmisie SDI (Serial Data In), linie de recepie SCK (Serial Clock), linie de sincronizare

Fig. 5.-4. Configurare Master i Slave

5.3. Exemple.
/* In acest eexemplu, modulul intern USAR este initializat si se transmite un mesaj indata ce se primeste un mesaj. Baude rate este setata la 9600 bps. Programul utilizeaza rutinele din biblioteca UART: UART1_init(), UART1_Write_Text(), UART1_Data_Ready(), UART1_Write() and UART1_Read().*/ char uart_rd; void main() { ANSEL = ANSELH = 0; C1ON_bit = C2ON_bit = 0; UART1_Init(9600); Delay_ms(100); UART1_Write_Text("Start"); while (1) { if (UART1_Data_Ready()) { uart_rd = UART1_Read(); UART1_Write(uart_rd); }` } }

// // // //

Configureaza pinii AN digitali Invalideaza comparatoare Initializeza modul UART la 9600 bps Wait UART sa ndevina stabil

// // // //

Bucla continua Daca se primesc date, Citire date, Trimite date inapoi via UART

Vous aimerez peut-être aussi