Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Quinta parte
n° 257 - Novembre 2006
MikroC
Realizzazione di un timer
digitale programmabile
Sesta parte
n° 258 - Dicembre 2006
Uso delle interfacce seriali
Settima parte
n° 259 - Gennaio 2007
by Example
Interfacce SPI, I2C e 1-Wire
PORTB=0;
tensioni di segnalazione piuttosto alte (circa
TRISB=0xFF; // PORTB[0-7]: ingressi
12V). Nella versione più semplice, l’interfaccia è
costituita da soli tre fili: TX (trasmissione), RX
// Inizializzazione
(ricezione) e massa. I dati sono trasmessi serial-
Usart_Init(2400);
mente in maniera asincrona, cioè senza l’uso di
pb=0;
un clock. Per rendere possibile questo è neces-
mpb=0;
sario che il ricevitore ed il trasmettitore utilizzi-
while(1) {
no lo stesso formato di dati (velocità di trasmis-
pb=PORTB;
sione, numero e tipologia di bit).
if (pb!=mpb)
L’interfaccia RS-232 costituisce un metodo
Uso
dell’interfaccia
seriale di Antonio Di Stefano
85
Teoria
Figura 1 Schema utilizzato negli esempi
connessione, nella finestra sono presenti altre e lo memorizza in un buffer interno). Quando
opzioni, tra cui quella che permette di selezionare è stato ricevuto un carattere la funzione resti-
la modalità di visualizzazione dei dati ricevuti. In tuisce un valore diverso da zero (che equivale
questo caso l’impostazione scelta è Hex, in modo ad una condizione vera). Una volta letto il
da potere leggere il valore binario inviato. Negli carattere (con la funzione Usart_Read), que-
altri esempi sarà utilizzata la modalità ASCII, dal sto viene elaborato secondo l’algoritmo
momento che sarà scambiato del testo. descritto prima (controllando che si tratti
effettivamente di una lettera dell’alfabeto
CIFRATURA REMOTA maiuscola o minuscola, grazie alle funzione
Per mostrare come la comunicazione possa isupper e islower della libreria standard
avvenire anche nell’altra direzione, e si possa istau- ctype.h), ed inviato di nuovo al PC. Il risulta-
rare un primo esempio di colloquio tra il PC ed il to sarà che se inviamo la parola “Ciao”, otter-
PIC, è riportato nel listato 2 il codice di un pro- remo come risposta “Pvnb”. Se re-inviamo
gramma che riceve un testo dal PC e lo cifra secon- quest’ultima otterremo di nuovo la versione
do il codice ROT13, utilizzato spesso su Internet in chiaro. Come si può notare già da questo
come semplice forma di cifratura del testo. Il codi- esempio, la comunicazione tramite RS-232 è
86
ce consiste in pratica nel ruotare l’alfabeto anglo- orientata e ordinata a singoli byte. Per scambia-
sassone (26 lettere) di 13 posti, in questo modo A
Teoria
// Invio risultato
Usart_Write(i);
}
}
}
Teoria
}
PORTB=0;
TRISB=0; // Elaborazione stringa
if (stringa) {
Usart_Init(2400); switch(buf[0]) {
Scheda easyPIC4
La rivoluzionaria scheda
di sviluppo per PICmicro
✔ Programmatore USB2.0 on-board con ICD
✔ Tastiera a 32 tasti
✔ 32 LED per il monitoraggio degli I/O
✔ 4 cifre LED a 7 segmenti
✔ Predisposizione per moduli LCD alfanumerici
✔ Predisposizione per moduli LCD grafici
✔ Predisposizione per comunicazione RS232
FARE ELETTRONICA - DICEMBRE 2006
Lcd_Cmd(LCD_CURSOR_OFF);
if (buf[2]==’1’) valido viene inviato un “?!?”. Per inviare queste
Lcd_Cmd(LCD_UNDERLINE_ON); stringhe è stata scritta una funzione apposita che
if (buf[2]==’2’) non fa altro che inviare sequenzialmente tutti i
Lcd_Cmd(LCD_BLINK_CURSOR_ON); byte che compongono la stringa, con la funzione
SendString(“Ok\r\n”); Usart_Write(). Notare che la scansione della strin-
break; ga si arresta in corrispondenza del terminatore,
cioè il valore binario 0x00.
default:
SendString(“?!?\r\n”); RICEZIONE CON INTERRUZIONI
} In molti casi può essere utile rendere la ricezione
delle stringhe seriali asincrona ed indipendente
for(j=0; j<32; j++) dal flusso principale del programma. Questo
buf[0]; soprattutto perché la comunicazione via RS-
stringa=0; 232 è per sua natura asincrona ed imprevedi-
i=0; bile, ed una gestione non immediata potrebbe
} portare alla perdita di dati. Si può ottenere
} quanto detto utilizzando le funzioni di libreria
} del MikroC, con qualche piccolo accorgimento.
Nel listato 4 è mostrato come svolgere la fun-
void SendString(char *str) zione di ricezione delle stringhe nella routine
{ d’interruzione.
int n;
FARE ELETTRONICA - DICEMBRE 2006
Listato 4
n=0; /* Controllo seriale remoto
while(str[n]) { UART HW con int. */
Usart_Write(str[n]); #define MAX_LEN 32
n++;
} char stringa, bpnt;
} char buf[MAX_LEN];
Dopo una prima inizializzazione della UART, del void SendString(char *);
display e delle variabili, inizia il loop principale. Al char Hex2Dec(char *);
void Dec2Hex(char, char *); funzioni disponibili sono quasi le stesse, anche
... il loro uso richiede una più accurata pianifica-
void main() { zione dei tempi del programma (che deve fer-
… marsi ad attendere l’arrivo dei caratteri, e non
Usart_Init(2400); può gestire la comunicazione in full duplex).
// Set RCIE Nel listato 5 è mostrato un esempio imple-
PIE1|=0x20; mentato in versione “software”:
// Set GIE e PEIE
INTCON|=0xC0; Listato 5
… /* ROT13 remoto con
while(1) { UART software */
void main() {
if (stringa) { unsigned short ro = 0, *recOK, i;
Teoria
} while(1) {
… do {
} i = Soft_Uart_Read(recOK);
} while (*recOK);
interrupt()
{ if (isupper(i))
if (!stringa) { i=((i-’A’)+13)%26+’A’;
buf[bpnt] = Usart_Read(); if (islower(i))
if ((buf[bpnt]==’\n’)|| i=((i-’a’)+13)%26+’a’;
(bpnt==MAX_LEN-1)) { Soft_Uart_Write(i);
stringa=1; }
} }
bpnt++;
} Notare che i piedini di comunicazione specifi-
} cati sono RA0 ed RA1 invece di RC6 ed RC7,
questo rende possibile riscrivere i programmi
In pratica il codice è rimasto quasi invariato, presentati prima anche per PIC privi di UART,
tranne per il fatto che sono state attivate le quale il 16F84.
interruzioni associate alla ricezione dei singoli
caratteri, e la funzione di ricezione stringhe è CONCLUSIONI
stata confinata nella routine d’interruzione. Si Va ricordato che le routine mostrate possono
può notare anche che la comunicazione tra le essere provate anche su PC privi di porta seria-
due routine avviene ancora tramite la variabile le, utilizzando un adattatore USB-RS232
FARE ELETTRONICA - DICEMBRE 2006
“stringa”, che questa volta però è stata dichia- (ricordarsi di settare il numero corretto di
rata come globale. porta COM). Nella prossima puntata si conti-
nuerà a parlare di protocolli seriali, in partico-
SOFTWARE UART lare di SPI, I2C e 1-Wire, utilizzati per comuni-
Se il PIC utilizzato non dispone di una UART care con dispositivi quali memorie EEPROM,
integrata è comunque possibile implementare timer, sensori di temperatura, e tanto altro.
una comunicazione seriale. Questo grazie alle Verrà mostrato come usare le routine di libre-
routine della libreria Software_Uart del ria e come comunicare con questi dispositivi.
MikroC, che emulano il dispositivo via softwa-
re utilizzando due qualsiasi piedini di I/O. Le Codice MIP 258084