Applicazioni dei microcontrollori PIC In questa unità vengono esposte le modalità di realizzazione di un circuito hardware con il microcontroller PIC16C84 (o PIC16F84), per la prova dei programmi presentati nel Modulo 11, unità 3. La scheda presenta caratteristiche tali da risultare particolarmente versatile, permettendo ampie possibilità di configurazione delle linee di I/O. In questo modo è possibile realizzare numerose esperienze oltre quelle proposte. Nell unità verranno forniti tutti gli elementi necessari per procedere alla realizzazione della scheda. Per facilitare l inserimento sul circuito del microcontrollore, è previsto uno zoccolo di tipo ZIF a 20 pin con levetta. Il circuito presentato offre al lettore un esempio di interfacciamento del microcontroller con periferiche di I/O. 1 Presentazione della scheda Il circuito elettrico Nella figura 1 è raffigurato lo schema elettrico del sistema. Le 8 linee RB0 RB7 del 16C84 sono portate verso l esterno, con in serie un resistore di protezione da 100 Ω. Le linee RA0 RA4 possono essere invece, per mezzo dei ponticelli J2 J5, o portate verso l esterno (con in serie i resistori da 100 Ω) o collegate a 4 LED (D1 D4) e contemporaneamente al display TIL311 (con decodifica interna BCD 7 segmenti). Per generare il clock del sistema è possibile utilizzare un oscillatore al quarzo (con frequenza di 4 MHz o inferiore) o una semplice rete RC. In questo caso nel circuito non deve essere montato il quarzo ed il condensatore C3, ma solo il condensatore C4 e il resistore R12 1, e deve essere chiuso il ponticello JP1. Con la rete RC il valore di C4 non deve essere inferiore a 20 pf e R12 deve essere compreso tra 3 kω e 100 kω; in questo caso, per alcuni valori di C4 e R12 si hanno approssimativamente le seguenti frequenze: [pf] R12 [kω] f [MHz] C4 [pf] R12 [kω] f [MHz] 20 5,1 3,94 20 10 2,34 100 5,1 1,49 100 10 1,12 In fase di programmazione del dispositivo si deve poi selezionare la modalità di funzionamento dell oscillatore scegliendo, nell apposita finestra Oscillator RC o XT a seconda del circuito utilizzato ( unità 4, Modulo 11). La linea di reset MCLR (Master Clear) è portata anche essa verso l esterno ed è dotata di un resistore di pull-up che la mantiene in condizioni di funzionamento normale a livello alto. Il reset del sistema viene fatto portando la linea RST a livello basso (con un pulsante normalmente aperto). Con i ponticelli J2 J5 in posizione 1 le linee sono portate verso l esterno e possono essere programmate come linee di input o output indipendenti. Si ricorda che la linea 1 Il resistore R12 non deve essere montato se è utilizzato l oscillatore al quarzo.
RA4, quando svolge la funzione di output, è open drain e pertanto necessita di un resistore di pull-up esterno collegato a V DD. Con i ponticelli J2 J5 in posizione 2 le linee sono collegate con i LED e con il display TIL 311 e quindi debbono essere programmate esclusivamente come output. È comunque sempre possibile utilizzare ciascuna linea, indipendentemente dalle altre, come ingresso o uscita, spostando in modo opportuno il ponticello ad essa collegato. Fig. 1 Fig. 2 Il layout Come è possibile osservare dalla figura 3, le linee di I/O sono portate all esterno su due lati distinti, da una parte le linee RB0 RB7 suddivise in due gruppi, e dall altro RA0 RA4. Ogni gruppo di linee è dotato di connettori di alimentazione V CC (V DD ) e GND indipendenti, per facilitare il collegamento di periferiche esterne che necessitano di alimenta-
zione. Sono presenti, inoltre, i due connettori per l alimentazione della scheda che deve essere fatta con tensione stabilizzata a 5 V. Per il montaggio del PIC16C84 (18 pin) è prevista la possibilità di montare un semplice zoccolo a 18 pin oppure uno zoccolo del tipo Textool a 20 pin con levetta (due pin rimangono non utilizzati). È consigliabile utilizzare per il collegamento delle linee di I/O e di alimentazione verso l esterno dei connettori per circuito stampato a due pezzi del tipo con base fissa (collegata permanentemente alla basetta) e morsettiera estraibile su cui effettuare i collegamenti. Sulla basetta i piedini sono disposti con passo 5,08 mm. Il circuito stampato Nella figura 3 è riprodotto il layout della scheda (vista dall alto) con la disposizione dei componenti e le piste che sono poste sul lato opposto. La scheda è monofaccia. Bisogna effettuare, sul lato componenti, alcuni ponticelli di filo rappresentati in nero sul disegno. Il TIL311 (U2) è montato su normale zoccolo a 14 pin. Tutti i LED hanno il catodo (lato smussato) collegato a GND. Nella figura 3 i resistori R8 R11 da 820 Ω, sono colorati in grigio per non confonderli con gli altri da 100 Ω. Nella figura 4 è riportato il master del circuito in scala 1:1. Fig. 3 Fig. 4
2 Applicazioni software A complemento degli esempi proposti nel Modulo 5, unità 3, ne vengono presentati altri con alcuni programmi applicativi che fanno uso della scheda presentata. Programma 1 Alla scheda è collegata una tastiera a matrice come in figura 5. Per semplicità sono usati solamente 4 tasti. Ma l applicazione può essere estesa anche a tastierini 4 4. Agli ingressi collegati con le linee RB4 e RB5 devono essere connessi due resistori di pull-up collegati av CC di 4,7 kω. Fig. 5 Il programma legge in continuazione la tastiera e visualizza sul dispaly il valore numerico (1 4) del tasto premuto. Il programma per controllare se è stato premuto un tasto, pone a livello basso la prima riga (RB0) e a livello alto la seconda (RB1). Legge poi la colonna RB4 e se la trova a livello basso significa che è stato premuto il tasto 1, e quindi salta a visualizzare il corrispondente numero. Se la colonna fornisce livello alto viene letta la colonna RB5. Se la trova a livello basso significa che è stato premuto il tasto 2, e quindi salta a visualizzare il corrispondente numero. Se la colonna fornisce livello alto inverte lo stato di RB0 e RB1 e prosegue come il caso precedente potendo in questo caso localizzare i tasti 3 e 4. La routine di ritardo serve per minimizzare l effetto dei rimbalzi dei pulsanti. Prog. 1 ;TAST1A.ASM LIST P=16C84, F=INHX8M ;RB0 -> R0 RB1 -> R1 RB4 -> C0 RB5 -> C1 ;RESISTORI DI PULL-UP SU C0 E C1 ;TASTO PREMUTO PORTA BASSA LA COLONNA port_a EQU 5 port_b EQU 6 conta1 EQU 2Eh ;indirizzo di un registro per il 1 contatore conta2 EQU 2Fh ;indirizzo di un registro per il 2 contatore ORG 0 inizio: MOVLW 0F0h TRIS port_b ;RB7-RB4 input RB3-RB0 output MOVLW 00h TRIS port_a ;pin porta A tutti d'uscita ancora: BCF port_b,0 ;RB0 = 0 BSF port_b,1 ;RB1 = 1 GOTO num1
BTFSS port_b,5 ;salta istruzione seguente se RB5 = 1; GOTO num2 BSF port_b,0 ;RB0 = 1 BCF port_b,1 ;RB1 = 0 GOTO num3 BTFSS port_b,5 ;salta istruzione seguente se RB5 = 1; GOTO num4 num1: MOVLW 01 ;01 in accumulatore num2: MOVLW 02 ;02 in accumulatore num3: MOVLW 03 ;03 in accumulatore num4: MOVLW 04 ;04 in accumulatore delay: MOVLW 0FFh MOVWF conta1 loop1: DECFSZ conta1,1 ;decr. reg. conta1 e salta istruz. seguente se zero GOTO loop3 GOTO fine loop3: MOVWF conta2 loop2: DECFSZ conta2,1 ;decr. reg. conta2 e salta istruz. seguente se zero GOTO loop2 GOTO loop1 fine: RETURN END Programma 2 Un miglioramento del programma precedente che permette una più facile applicazione a tastierini a matrice con un numero maggiore di tasti è fornita dal programma 2. Il rilevamento del tasto premuto segue sempre il procedimento già esposto, quindi per aumentare le righe bisogna utilizzare anche le linee RB2 e RB4 (come output) e per le colonne le linee RB6 e RB7 (come input). La visualizzazione del tasto premuto questa volta è effettuata sempre dallo stesso pezzo di programma. Si usa infatti un contatore che tiene conto, man mano che si procede nella scansione delle colonne, della posizione raggiunta. Prog. 2 ;TAST2.ASM LIST P=16C84, F=INHX8M ;RB0 -> R0 RB1 -> R1 RB4 -> C0 RB5 -> C1 ;RESISTORI DI PULL-UP SU C0 E C1 ;TASTO PREMUTO PORTA BASSA LA COLONNA port_a EQU 5 port_b EQU 6
conta1 EQU 2Eh ;indirizzo di un registro per il 1 contatore conta2 EQU 2Fh ;indirizzo di un registro per il 2 contatore tasto EQU 2Dh ;indirizzo di un reg. per numero tasto premuto ORG 0 inizio: MOVLW 0F0h TRIS port_b ;RB7-RB4 input RB3-RB0 output MOVLW 00h TRIS port_a ;pin porta A tutti d'uscita ancora: MOVLW 0 MOVWF tasto ;IL REGISTRO TASTO CONTIENE 0 BCF port_b,0 ;RB0 = 0 BSF port_b,1 ;RB1 = 1 INCF tasto,1 ;il registro tasto contiene 1 INCF tasto,1 ;il registro tasto contiene 2 BTFSS port_b,5 ;salta istruzione seguente se RB5 = 1; BSF port_b,0 ;RB0 = 1 BCF port_b,1 ;RB1 = 0 INCF tasto,1 ;il registro tasto contiene 3 INCF tasto,1 ;il registro tasto contiene 4 BTFSS port_b,5 ;salta istruzione seguente se RB5 = 1; numero: MOVF tasto,0 ;il valore del registro tasto in accumulatore delay: MOVLW 0FFh MOVWF conta1 loop1: DECFSZ conta1,1 ;decr. reg. conta1 e salta istruz. seguente se zero GOTO loop3 GOTO fine loop3: MOVWF conta2 loop2: DECFSZ conta2,1 ;decr. reg. conta2 e salta istruz. seguente se zero GOTO loop2 GOTO loop1 fine: RETURN END