La comunicazione con l esterno
Input / Output
Le porte di I/O I Dati entrano Disp In Disp In Dispositivo di Ingresso Porta In Porta In Porte di Ingresso CPU Bus dati I Dati escono Porta Out Disp Out Porta Out Disp Out Porte di Uscita Dispositivo di Uscita
Sensori e attuatori Energia non elettrica Sensore Energia elettrica Interfaccia Bit P O R T A I N I sensori sono gli occhi di un sistema di controllo Energia non elettrica Attuatore Energia elettrica Interfaccia Bit P O R T A O U T Gli attuatori sono le mani di un sistema di controllo
La porta OUT per un elettronico CPU read control line Address decode line Data Bus from CPU R En Data L A T C H Dati verso il mondo esterno La porta di uscita è un LATCH La CPU la scrive, cioè mette il dato sul bus La CPU abilita la porta specificando il suo indirizzo La porta di uscita deve leggere il dato presente sul bus Il dato viene memorizzato in uscita fino all invio del dato successivo
La porta OUT per un informatico 0 0 Che indirizzo ha? Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 0 0 0 0 0 0 0 0 Bit0 Da quanti bit è? Quali attuatori pilota? 4 7 Che effetto hanno gli 1 e 0? Dove metto il dato da inviare? Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Quale sintassi ha l istruzione? 0 1 0 0 0 1 1 1
Gestione di un led on-off Anodo Catodo Collegato ad un pin di una porta OUT Pilotaggio in LOGICA POSITIVA Valore Bit Effetto O spegne 1 accende Pin 0/1 Energia Energia Interfaccia LED elettrica Luminosa Si/No
Gestione di un led on-off Anodo Catodo Collegato ad un pin di una porta OUT Pilotaggio in LOGICA NEGATA Valore Bit Effetto O accende 1 spegne Pin 0/1 Energia Energia Interfaccia LED elettrica Luminosa Si/No
Pilotiamo 8 led in logica + 1 accende 0 spegne 0 7 3 2 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 0 0 0 0 0 1 1 1 0 0 1 1 0 0 1 0 Inviamo alla Porta il n 7 esadecimale I led collegati ai bit 0 1 2 sono ON I led collegati ai bit 3 4 5 6 7 sono OFF Inviamo alla Porta il n 32 esadecimale I led collegati ai bit 1 4 5 sono ON I led collegati ai bit 0 2 3 6 7 sono OFF
Pilotiamo 8 led in logica - 0 accende 1 spegne 5 6 B 1 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 0 1 0 1 0 1 1 0 1 0 1 1 0 0 0 1 Inviamo alla Porta il n 56 esadecimale I led collegati ai bit 0 3 5 7 sono ON I led collegati ai bit 1 2 4 6 sono OFF Inviamo alla Porta il n B1 esadecimale I led collegati ai bit 1 2 3 6 sono ON I led collegati ai bit 0 4 5 7 sono OFF
Le Porte di I/O dei PIC I PIC hanno uno o più registri chiamati PORT collegati direttamente ai piedini del microcontrollore Ogni PORT ha il suo indirizzo Le porte sono contraddistinte con le lettere dell alfabeto A B C..
I Registri di I/O Per ogni porta di I/O nei PIC18 ci sono tre registri Port Data Register (PORTA PORTB etc.) serve per comunicare con l esterno Port Direction Control Register (TRISA TRISB etc.) decide se i bit della porta sono di ingresso o di uscita Latch Data Register (LATA LATB etc.) serve per memorizzare il dato che si invia ad una porta
Gli indirizzi dei Registri di I/O Dobbiamo ricordarci ogni volta che #define PORTA #define PORTB. #define TRISA. #define TRISB. Le costanti sono nel file del microcontrollore #include <p18f8722.h>
Programmazione Porte I/O Nel registro TRIS.. 1 = Input 0 = Output Il software decide se un pin della PORTA è di input o di output Basta Mettere 0 o 1 nei bit corrispondenti del registro TRIS
All accensione Tutti i bit delle porte sono in ingresso I N SENSORE I N ATTUATORE Non c e collegamento fino a che il bit non viene dichiarato di OUT
Se il default fosse OUT O U T ATTUATORE O U T 1 0 SENSORE Si rischia il CORTOCIRCUITO
Colleghiamo un led al bit0 di PORTD PORTD Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Tutti gli altri bit non servono possono essere programmati Il bit 0 della PORTD deve essere programmato in USCITA in INGRESSO in USCITA
Programmazione PORTD TRISD Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 1 1 1 1 1 1 1 0 TRISD = 0xFE; 8 + 4 + 2 + 1 F 8 + 4 + 2 + 0 E Prima di poter usare il bit 0 di PORTD in uscita Bisogna inviare al registro TRISD l esadecimale FE In C i numeri esadecimali si fanno precedere da 0x 0xFE
Pilotaggio del led in logica + Bit7 Bit6 Bit5 PORTD Bit4 Bit3 Bit2 Bit1 0 0 0 0 0 0 0 1 0 1 Bit0 Cosa inviamo ai bit che non servono? Se li abbiamo programmati in INGRESSO (non ha importanza cosa inviamo) in USCITA (dobbiamo inviare 0) Per accendere il Led possiamo in ogni caso inviare al registro PORTB il numero esadecimale 1 0x1
Uso delle costanti La costante che accende il Led è 1. Definiamola: # define LedOn 0x1 Per inviarla alla PORTB dobbiamo usare il registro LATD LATD = LedOn ; LedOn LATB PORTB 1
Le Costanti del programma // costanti necessarie #define ProgD #define LedOn 0xFE 0x1
La programmazione PORTB void InitHw (void) { TRISD = ProgD ; return ; }
Accensione led void main (void) { InitHw( ) ; LATD = LedOn ; while(1); }
Colleghiamo un led al bit3 di una porta Bit7 Bit6 Bit5 Bit4 PORT Bit3 Bit2 Bit1 0 0 0 0 1 0 0 0 Bit0 Programmiamo il bit 3 della porta in USCITA Programmiamo gli altri bit in INGRESSO Invieremo al registro TRIS Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 1 1 1 1 0 1 1 1 Logica Positiva 8 + 4 + 2 + 1 F 0 + 4 + 2 + 1 7 0 spegne 8 accende la parola di programmazione
A quale porta è collegato il led? PORTB PORTA?!? Come faccio il programma? Chiamiamo l indirizzo della porta PortaLed Definiamo una costante Completeremo il rigo quando l elettronico avrà deciso PORTA # define PortaLed PORTB PORTC
Come la programmo? TRISB TRISA Definiamo un altra costante Completeremo il rigo quando l elettronico avrà deciso TRISA # define TrisLed TRISB TRISC
Le costanti necessarie // costanti necessarie #define PortaLed LATD #define TrisLed TRISD #define Prog #define LedOn 0xF7 0x8
Che vantaggio abbiamo? Se l elettronico decide di cambiare la porta: Invece di cercare tutti i righi in cui abbiamo usato il vero nome della Porta Dobbiamo cambiare solo le due costanti PortaLed e TrisLed Se l elettronico decide di cambiare bit: Dobbiamo cambiare solo la costante LedOn e Prog
Il main void main (void) { InitHw( ) ; PortaLed = LedOn ; while(1); }
La inizializzazione Hw void InitHw (void) { TrisLed = Prog ; return ; }
E se lo vogliamo spegnere? Ci serve un altra costante: # define LedOff 0x0 La dobbiamo inviare alla porta: PortaLed = LedOff ;
Lampeggio Ultraveloce del Led Lampeggio Programmo Porta Accendo Led Spengo Led void main (void) { InitHw( ) ; do { PortaLed = LedOn ; PortaLed = Ledoff ; } while(1); }