MICRO-GT MINI INTERFACCIA DI CONTROLLO DIRETTO DELL'I/O |
capitolo 11
Controllo seriale del PORTB della Micro-GT mini tramite interfaccia .net
In questo undicesimo capitolo si metterà a
disposizione degli utenti una semplice interfaccia in versione demo
sviluppata in .net a cura del team di sviluppatori software della
G-Tronic Robotic. Versioni più complete e potenti potranno essere
sviluppate a richiesta. Viene invece sviscerato completamente il
firmware del PIC con particolare riferimento alla comunicazione seriale.
Il funzionamento richiede un PC con installato il sistema operativo XP con qualsiasi service pack, oppure windows Vista 32 o 64 bit, oppure win7 a 32 o 64 bit purché sia istallato il framework 2.0 scaricabile gratuitamente dal link sottostante:
http://www.microsoft.com/downloads/it-it/confirmation.aspx?FamilyID=0A391ABD-25C1-4FC0-919F-B21F31AB88B7
Il file ha un peso di circa 45 megabyte e consente l'esecuzione dei programmi sviluppati in .net, in mancanza di questa installazione il lancio dell'interfaccia restituisce una segnalazione di errore del tipo "framework mancante".
Per l'esecuzione su un netbook o notebook è necessario essere attrezzati con un comune adattatore USB->RS232, a tal proposito segnalo che i test sono stati eseguiti con un modello "Manhattan" serial to USB converter visibile al link:
http://www.manhattan-products.com/en-US/products/708-usb-to-serial-converter
mentre su un desktop munita di una normale porta COM sarà sufficiente collegarsi con il cavo seriale con piedinatura sottoindicata:
Il medesimo cavo sarà utilizzato come prolunga nel caso di utilizzo del convertitore sopracitato abbinato al netbook/notebook.
Parte
fondamentale del sistema è una Micro-GT mini, munita o no di bootloader a
seconda del tipo di caricamento che si vuole effettuare oppure La
sorella maggiore Micro-GT PIC versatile I.D.E. nella quale sia
alloggiato il PIC 16F876A oppure 16F877A.
Nei due casi (876 o 877) e relativamente alla Micro-GT PIC versatile IDE
(ovvero la scheda grande) si può entrare direttamente all'UART dei
controllori agendo sui due connetori SV11 e SV12, trasformando la scheda
nella medesima modalità di funzionamento della mini Micro-GT, ovvero in
grado di essere programmata o controllata via covertitore
USB->RS232.
Approfondiamo questo argomento di sicuro interesse a tutti i possessori della Micro-GT completa.
Configurazione Micro-GT PIC versatile IDE per funzionamento con USB->RS232
Osserviamo innanzitutto le piedinature dei due microcontrollori a 28 e a 40 pin nelle immagini sottoriportate:
Contiamo i
pin a partire dall'ultimo, di entrambi i PIC, che ovviamente è quello
in alto a destra che sarà il 28 per 876 e il 40 per 877. Si osserva
che il pin di ricezione seriale è il numero 11 per il pic 876 e la
trasmissione seriale è il successivo, ovvero il 12, mentre relativamente
al pic a 40 pin , ovvero 877, troviamo la ricezione seriale al pin 15 e
la trasmissione al successivo numero 16.
Osserviamo ora la parte di schema elettrico interessata alla configurazione della Micro-GT completa:
Come si può notare entrambe le possibilità 876 e 877 sono previste dall'hardware, basterà infatti ponticellare SV11 e SV12 nei pin 2-3, per collegare in modalità supervisione (caricamento diretto dei programmi via ICSP in modalità LVP, ovvero tramite bootloader) il PIC 876, mentre ponticellando i medesimi tra 1-2 si configura per la comunicazione in programmazione/supervisione il PIC 877.
Questo semplifica notevolmente la vita a tutti i possesori della Micro-GT che intendono programmarla usando un PC portatile che come sappiamo è privo di porta seriale standard.
Inoltre non è più necessario il cavetto pentapolare ICSP, e il circuito integrato CD4049 si trova automaticamente bypassato.
Per evitare interferenze durante la programmazione in questa modalità è bene rimuovere completamentamente questo cavetto, lasciando liberi i pin dei connettori ICSP1 e ICSP2, e in alcuni casi anche agire in sezionamento (apertura) del dip S13 canale 1 e il canale 2, ovvero disabilitate momentaneamente i LED relativi al PORTC e al PORTD, anche se al massimo potranno visualizzare il lampeggio dovuto al classico transito dei dati sul filo di programmazione seriale.
Rimane necessario il cavetto ICSP nella sola fase preliminare, ovvero quella in cui nel chip di cui siamo in possesso ineriamo per la prima volta il bootloader che sarà carica come un normale file .hex, anche se andrà ad allocarsi in una particolare area della memoria che non verrà poi interessata dalla scrittura del programma.
Il bootloader, in sostanza, funge da sistema operativo del nostro PIC operando in questa maniera:
Benché la piedinatura e le periferiche
integrate siano maggiori nel modello 877 che nel 876 l'architettura
interna è la medesima, quindi potranno funzionare (a meno di tentare di
allocare/pilotare punti di I/O inesistenti) con lo stesso firmware.
Il firmware si prefigge di leggere una stringa in arrivo all'UART e
accendere il corrispondente LED sull'I/O onboard in entrambi i modelli
di piattaforma, sia la Micro-GT mini che la Micro-GT completa. in questo
caso si tratterà della fila di LED visibile nella riga centrale della
foto sottostante.
Mentre l'abilitazione dell'accensione dei LED nella Micro-GT mini avviene solamente collegando l'apposito cavetto, nella Micro-GT completa è anche necessario abilitare il canale agendo sul DIP S13, la cui serigrafia indica chiaramente "out enable" canale 1, ovvero quello più a sinistra.
Si ricorda che avendo molte funzionalità abbinate ad ogni singolo pin dello zoccolo textool e relativamente al modello completo, sarà sempre necessario lavorare con gli schemi alla mano, ad esempio a due pin del PORTB concidono le conessione del secondo quarzo (4 Mhz) predisposto per i PIC di modello inferiore, bisogna quindi deviare con gli appositi jumper le conessioni (vedi schema) al fine di permettere l'accensione del byte completo di LED RB.
Questo problema non esiste nel modello mini che richiede solamente la conessione del cavetto flat a 8 conduttori.
Prima di essere realizzata in forma professionale, su supporto laminato FR4 dual layer, la Micro-GT mini è stata a lungo testata su prototipi sviluppati in FidoCad. Nell'immagine sottostante il layout del prototipo.
Benché il concetto base rimane lo stesso, nel prototipo risultava mancate la compatibilità diretta con il programmer PicKit2 e PicKit3, e non vi è alcun LED di utilità come demoboard. La versione Eagle è più compatta e comprende queste utilità.
Il bootloader, azione preliminare.
Come accennato nel precedente episodio di "Let's GO PIC !!!" per poter caricare i firmware nella memorie del PIC in modalità LVP (a bassa tensione, ovvero usando solo i 5 volt dell'alimentazione) è necessario caricare preliminarmente il BOOTLOADER. Si tratta di un piccolo programma che funge da sistema operativo, che si mette in ascolto nella porta seriale per circa 200 ms dopo la pressione del tasto di RESET presente nella scheda. Passato questo tempo viene ignorato il tentativo di scrittura e il programma va semplicemente in esecuzione. Esistino vari tipi di BOOTLOADER, alcuni ufficiali distribuiti dalla stessa MicroChip, altri customizzati programmati dai vari utenti. In genere sono specifici per il tipo di microcontrollore impiegato e per la velocità di quarzo e di caratteri al secondo lungo la linea seriale impiegata. Anche l'accupazione e l'allocazione in memoria non è identica per tutti. In genere si ha, come segnalato in precedenti post, l'occupazione delle prime 4 parole e delle ultime 213 della medesima memoria in cui è allocato il programma, ovvero da 0x0000 a 0x0003 e da 0x1F2A a 0x1FFF, ma come detto potrebbe variare da PIC a PIC e da bootloader ad un altro.
Attenzione, alcuni bootloader potrebbero avere degli effetti collaterali, come ad esempio tenere impegnato un pin di I/O anche durante il normale funzionamento, ad esempio il pin PGM concidente nel caso del 16F876 con RB3, ovvero il quarto LED della Micro-GT mini.
Dal link è possibile scaricare il bootloader testato -> bootloader 16F876A 4Mhz 9600(6).zip.
La comunicazione seriale PC->Micro-GT.
Per questioni pratiche e anche di standardizzazione, cerchero' di usare, per quanto possibile, in tutti i progetti G-Tronic la medesima stringa di comunicazione.
L'esperienza ha portato a fare cadere la scelta nella stringa di sei caratteri:
@,C1,C2,C3,C4,->
Dove la freccetta finila indica il "line feed" ovvero l'invio o "Enter".
Potenzialmente ognino dei caratteri indicati da C1 a C4 possono rappresentare sia un valore numerico espresso come posizione all'interno della tabella ASCII che il carattere vero e proprio ovvero il calore "char" espresso in chiaro nella stringa stessa.
In questo modo la stringa risulta essere molto versatile ed adatta a tutte le applicazioni didattiche nonche' a molte professionali.
Associamo ai caratteri della stringa un significato per l'applicazione qui proposta.
Data la semplicita' dell'evento richiesto che comporta la sola accensione e spegnimento di un'uscita digitale collegata al PORTB, decidiamo di impegnare il solo primo carattere, "C1", con significato di "canale interessato dal comando", e che il firmware abbinera' tale evento a una particolare reazione che e' un settaggio nello specifico pin del PORT.
Tale settaggio potra' essere di "ON" o di "OFF", quindi si decide di abbinare due stringhe a ogni pin RBx.
Il formato prescelto e':
Per fare un esempio concreto, la stringa "@I000->" viene deciso che sara' abbinata all'evento di accensione del pin RB0 del PORTB.
Per definire i valori ASCII da usare nel firmware, allo scopo di decoficare le stringhe ASCII (american standard code for information interchange), ci si riferisce a delle tabelle di conversione standardizzate, esistono nel web una moltitudine di convertitori online di facile ed intuitivo utilizzo.
Personalmente ho usato questo -> http://www.mikezilla.com/exp0012.html
Tale tabella di calcolo e' necessaria per fare coincidere il significato "ASCII text" inviato dall'interfaccia .not (e in questo formato la vede il programmatore lato PC) con quella interpretata dal firmware ovvero come la interpreta e vede il programmatore lato microcontrollore.
Ecco che si ha la corrispondenza: @I000-> corrisponde a 0x49
Se non si ha ben compreso questo aspetto allora il firmware che segue ha poco significato.
chi non lo avesse ancora fatto nei precedenti capitoli di "Let's GO PIC" scarichi adesso il manuale del microcontrollore interessato 16F876/877, presi come riferimento per i corsi e per le piattaforme Micro-GT.
scarica databook -> manuale16F87x(6).pdf
Andate a
pagina 7 del databook, potrete vedere l'architettura interna dei
microcontrollori, e osservate l'architettura interna, questa e'
pressoche' uguale per i due modelli a 28 e a 40 pin a meno del fatto che
877 ha delle periferiche in più connesse allo stesso bus.
Nell'immagine ho evidenziato in giallo le due periferiche di comunicazione seriali disponibili, la Master Synchronous serial port, il cui acronimo e' MSSP, pensata allo scopo principale di interconnettere altri microcontrollori oppure delle periferiche specifiche quali delle memorie EEPROM, dei Display, dei convertitori analogici digitali e simili.
Questo modulo e' pensato per funzionare secondo due modalita':
Vi e' poi il modulo ADDRESSABLE UNIVERSAL SYNCHRONOUS RECEIVER TRANSMITTER indicato nei manuali come USART, a volte abbreviato semplicemente nel termine generico SCI che sta a indicare SERIAL COMMUNICATIONS INTERFACE. Questo modulo può essere configurato per eseguire una comunicazione di tipo FULL DUPLEX asincrona in modo da poter comunicare con periferiche come vecchi display a raggi catodici oppure porte seriali di comunicazione di computer basate sullo standart EIA-RS232C, oppure può essere configurato per eseguire una comunicazione di tipo half duplex allo scopo di interfacciarsi con dispositivi periferici quali i convertitori analogici digitali o digitali analogici, nonche' le memorie EEPROM allo scopo di memorizzare dati o comandi da impartire successivamente ai PORT (configurazioni memorizzate delle uscite come ad esempio nella realizzazione di un sequencer programmabile).
Le configurazione vengono impartite operando sui bit dei due appositi registri ad 8 bit denominati TXSTA e RCSTA.
Le due immagini seguenti mostrano la disposizione dei bit di configurazione all'interno di questi registri:
Sopra ad ogni bit possiamo notare le diciture R oppure R/W con significato:
Vediamo ora il significato di questi partendo da sinistra del primo registro, ovvero dal bit meno significativo del registro TXSTA.
(bit 0) TX9D = E' usato per effettuare il controllo della parità dei bit trasmessi. Ma chiediamoci, "Che cosa significa parità?". Si tratta di una tecnica abbastanza efficace, ma non infallibile che permette di controllare se il pacchetto di bit trasmessi in seriale, arrivato al ricevente, è uguale a quello spedito dal trasmittente. La tecnica consiste nell'aggiungere o non aggiungere al treno di impulsi il bit di controllo in modo che il numero totale di bit alti (1 logico) nel pacchetto sia sempre e comunque pari. Si verifica quindi che se nel pacchetto sono presenti all'arrivo un numero dispari di bit a 1 sicuramente vi è stato un errore di trasmissione, d'altro canto se nel pacchetto ci sono come ci si aspetta un numero pari, non è detto che questa trasmissione sia corretta dato che potrebbe essersi verificato il cambio falsato di livello ben due o più bit. Benché non infallibbile la tecnica è comunque molto usata perche molto semplice da realizzare, difatto si tratta di eseguire gli Ex-Or dei bit prima che questi siano inviati inviati, e aggiungere il risultato al pacchetto. Una volta raggiunto il destinatario si esegue di nuovo Ex-Or di tutti i bit compreso quello di parità con essi inviati. Se si ottiene il medesimo risultato 1 o 0 ottenuto prima dell'invio allora la trasmissione è andata a buon fine.
Bisogna tenere presente che questo tipo di tecnica è in grado di effettuare solo un controllo e non una correzione pertanto, una volta ritenuto non valido il pacchetto ricevuto e richiesto di nuovo l'invio, si può entrare in loop infinito dato che il pacchetto corretto potrebbe non arrivare mai a causa della persistenza del disturbo che ha causato l'errore.
Nota aggiuntiva in merito è che il controllo di parità può essere fatto in maniera concettualmente analogo sul dispari anziché sul pari.
E' importante conoscere una terminologia basilare delle trasmissioni, DTE = data terminal equipment, DCE = data comunication equipment.
Nell'applicazione che stiamo andando a sviluppare la Micro-Gt sarà, con limitazione, delegata a fare il DTE, mentre il PC sarà il DCE.
Normalmente nel DCE, viene montato il maschio del connettore DB9, mentre nel DTE viene montata la femmina, come si può facilmente osservare osservando la porta seriale nel lato posteriore di un PC e il connettore di un vecchio modem a 56k.
Osserviamo nella foto che il connettore della Micro-GT è femmina assegnandoli il ruolo di DTE, come avverrà quando verrà posta in supervisione di un processo con invio di dati al PC in cui si potrà sviluppare un sinottico in .net o altri linguaggi.
(bit 1) TRMT = stato del registro di scorrimento che carica in bit nel cavo TX di trasmissione 1= TSR vuoto, mentre 0 = TSR pieno.
(bit 2) BRGH =selettore di trasmissione ad alta velocità. La velocità di trasmissione di una linea seriale è misurato in baud rate, ovvero simboli ASCII trasmessi al secondo, spesso erroneamente confusi con bit al secondo. impostato a 1 questo bit commuta la porta o il canale di trasmissione ad alta velocità, mentre posto a 0 lo commuta a bassa velocità. Nelle trasmissioni seriali esiste un segnale di clock che serve a sincronizzare le informazioni inviate lungo l'unico conduttore con il ricevente che può quindi ricostruirne il significato.
(bit 3) = non usato.
(bit 4) SYNC = Questo bit segnala al modulo USART di commutarsi in trasmissione sincorna se posto a 1 oppure asincrona se posto 0, in pratica dice al sistema di agganciarsi o meno a un segnale di clock.
(bit 5) TXEN = abilitazione alla trasmissione, quando è posto a 1 la trasmissione è abiltitata.
(bit 6) TX9 = consente al nono bit, quello di parità di essere trasmesso oppure no. Quando questo bit è a 1 la trasmissione è di nove bit compresa la parità, quando è a 0 la trasmissione è a 8 bit e non c'è quindi il controllo sulla parità dato che il bit non verrà inviato.
(bit 7) CSRC = Bit di selezione della sorgente di clock per la trasmissione, in modalità asincrona pede significato mentre in modalità sincrona quando posto a 1 dice che il dispositivo è master per la trasmissione e tiene quindi conto del clock interno, tale clock è generato da una fonte hardware interna denominata BRG, quando è posto a 0 il dispositivo trasmette in slave mode, ovvero aggancia la velocità e la sincronia a una fonte esterna di clock.
Procediamo con l'analisi del secondo registro, RCSTA abbinato alla ricezione dei dati nel lato Micro-GT.
(bit 0) RX9D = ha il medesimo significato del bit 0 del registro precedente, ma il suo contenuto va calcolato dal programmatore nel lato firmware. Il calcolo si esegue, come già spiegato, valutando gli Ex-Or dei singoli bit ricevuti.
(bit 1) OERR = bit di segnalazione di errore che nella manialustica è indicato con "Overrun error", questo potrà essere resettato agendo nel bit4 del medesimo registro indicato con CREN il cui significato è chiarito tra qualche riga. Se il bit in questione vale 0 allora non vi sono stati errori durante la trasmissione.
(bit 2) FERR = questo bit può essere utlizzato in caso di errore per richiedere l'invio del medesimo byte ma privo di errori, quando è a 0 la ricezione è stata valida e non c'è richiesta di un nuovo invio del byte.
(bit 3) ADDEN = address detect enable bit, quando è a 1 nella modalità di ricezione asincrona , e con il bit RX9 alto, abilita gli interrupt di ricezione dal buffer quando carico. Quando è a zero vengono ricevuti tutti i byte in arrivo e l'ultimo bit di ogni pacchetto è considerato bit di parità.
(bit 4) CREN = Abilita la ricezione continua di informazioni quindi è concettualmente legato alla modalità asincrona di trasmissione in cui posto a 1 abilita la ricezioen continua dei dati, se posto a 0 non è ailitata la ricezione continua dei dati.
(bit 5) SREN = questo bit abilita la ricezione singola di un dato e può funzionare diversamente in maniera sincrona o asincrona. Nella modalità di trasmissione sincrona si distingue ulteriormente tra il modo master e il modo slave. Riassumendo si ha "modo sincrono Master" bit alto = abilitazione della ricezione del singolo dato, bit a zero disabilitazione della trasmissione del singolo dato. Va tenuto presente che ad ogni trasmissione riuscit di un dato singolo vine resettato automaticamente ed è proprio grazie a questo evento che possimo stabilire un "handle" del flusso di informazione.
(bit 6) RX9 = consente la ricezione del nono bit quando necessario o richiesto, quando è alto consente, quando è basso disabilita.
(bit 7) SPEN = Bit che abilita la porta seriale e consente l'uso della trasmissione seriale (Serial port enable bit). Se si omette la configurazione di questo bit i corrispondenti pin del processore non hanno significato di RX e TX ma semplicemente di PORT C rispettivamente RC7 per il pin di ricezione RX e RB6 per il pin di trasmissione RC6. La configurazione è: SPEN=1 -> porta seriale abilitata, mentre con SPEN=0 -> RC6 e7 sono porte digitali.
Settaggi per l'uso della comunicazione seriale nel firmware.
I registri predetti vanno citati e configurati nel firmware, quindi nel software lato PIC.
//Inizializzazione UART
TXSTA= 0x20; // TX abilitato
RCSTA= 0X90; // Registro RX USART
BRGH = 1; // USART alta velocità
SPBRG= 25; // Generatore di Baud Rate (25=9600 baud)
scarica il progetto MpLab di connessione all'interfaccia software -> bistabili direct IO-MicroGT-mini(1).zip
Firmware del controllo diretto I/O.
Nella tabella iniziale, tipica dello stile di programmazione del corso online "Let's GO PIC!!!" sono chiaramente indicate le stringhe preassegnate dal firmware (software lato pic) ai vari eventi. A commento è riportato l'evento causato dal riconoscimento della stringa.
L'analsi del software evidenzia che la ricezione e la decodifica della stringa avviene in funzioni diverse, la prima (ricezione) avviene a cura della funzione di interrupt "SerChar" definita di tipo void che definisce per ogni singolo carattere ricevuto la sua posizione ordinata assegnandoli segnificato di C1,C2,C3,C4 all'interno della formattazione predetta. Si cura dell'avanzamento alla lettura del carattere successivo e del rilevamento dei caratteri "line feed" e carrige return", ovvero l'invio, che chiude la stringa stessa. L'apertura di una nuova stringa avverrà alla ricezione del carattere chiocciola "@", qualsiasi cosa non faccia parte di questo formato viene semplicemente ignorato.
La decodifica della stringa, ovvero l'assegnazione di un significato ad ogni singolo carattere ricevuto e l'abbinamento di questo ad uno specifico evento avviene a cura della funzione "Par_ser" anch'essa di tipo void, il cui nome ricorda nella teoria delle stringhe il parsing, ovvero la scansione e riconoscimento. L'effettivo evento hardware, abbinato al segnale software avviene proprio in questa funziona a cura di un if multiplo noto come switch, la cui molteplicità è implementata nei vari "case". Leggendo il sorgente ci si accorge facilmente che ad ogni punto di I/O sono abbinati due eventi che sono l'accensione e lo spegnimento.
Al fine di impedire blocchi in codinzione di acceso è stato implementato l'evento di uscita che comporta sul reset del PORTB, ovvero forza a zero tutte le uscite, analoga funzione avrà il tasto "reset" presente sull'interfaccia software lato PC, ma senza la necessità di uscita dal software di controllo.
/**************************************************************
* Micro-GT mini Direct Control I/O *
* G-Tronic Robotics
*
*
beta 1
(17/07/2011)
*
* Questo programma è sviluppato per PIC16F876A *
*
piattaforma Micro-GT
mini
*
*
*
* Scopo del programma:
*
* Controllare via seriale 8 comandi di ON/OFF da inviare *
* alla
Micro-GT mini con la seguente
legenda
*
* Nota: Firmware utilizzabile con Micro-GT versatile IDE *
*
*
* Comandi di accensione:
*
* LED0
@I000inv RB0
->ON
*
* LED1
@L000inv RB1
->ON
*
* LED2
@M000inv RB2
->ON
*
* LED3
@N000inv RB3
->ON
*
* LED4
@O000inv RB4
->ON
*
* LED5
@P000inv RB5
->ON
*
* LED6
@Q000inv RB6
->ON
*
*
LED7 @R000inv RB7
->ON
*
*
*
* Comandi di spegnimento:
*
* LED0
@S000inv RB0
->OFF
*
* LED1
@T000inv RB1
->OFF
*
* LED2
@U000inv RB2
->OFF
*
* LED3
@V000inv RB3
->OFF
*
* LED4
@Z000inv RB4
->OFF
*
* LED5
@X000inv RB5
->OFF
*
* LED6
@Y000inv RB6
->OFF
*
* LED7
@J000inv RB7
->OFF
*
*
*
* RESET
@A000inv resetta tutte le
uscite
*
* quit
@B000inv
PORTB=0
*
*
*
* Importante: Le stringhe inviate sono di tipo impulsivo da *
* parte
dell'interfaccia .net che genera
il
*
* comando
di
OFF
*
*************************************************************/
#include <pic.h> //libreria standard di riconoscimento hardware
#include "delay.h" //libreria potenziata versione 2010 di MicroChip per creare ritardi
#define LED0 RB0
#define LED1 RB1
#define LED2 RB2
#define LED3 RB3
#define LED4 RB4
#define LED5 RB5
#define LED6 RB6
#define LED7 RB7
#define RESET 0
extern void Par_ser(void); //predichiarazione funzione scansione contenuto stringhe
extern void Var_Init(void); //predichiarazione funzione inizializzazione variabili
unsigned char C1,C2,C3,C4,RxPos,Flags; //dichiarazione variabili contenute in stringa e di riconoscimento stringa
main(void) //inizia la funzione principale
{
TRISA = 0x00; // tutte uscite per evitare interferenze
TRISB = 0x00; // uscite comandi
TRISC = 0xf8; // bit 6-7 Seriale
PORTA = 0x00; // azzera le porte
PORTB = 0x00; // azzera il PORT B
PORTC = 0x00;
Var_Init(); //inizializza le variabili di trasmissione seriale
ADCON1= 0x87; // PORTA all digital mode
//Inizializzazione uart
TXSTA= 0x20; // TX abilitato
RCSTA= 0X90; // Registro RX USART
BRGH = 1; // USART alta velocità
SPBRG= 25; // Generatore di Baud Rate (25=9600 baud)
//Inizializzazione TIMER1
T1CON = 0; // TIMER 1 resettato
T1CKPS1 = 0,T1CKPS0=0; // TIMER1 prescaler = 1
T1OSCEN = 0; // TIMER1 external oscillator disable
TMR1CS = 0; // TIMER1 internal clock (fosc/4)
TMR1ON = 0; // TIMER1 in STOP
//Inizializzazione interrupt
INTCON = 0; // Interrupt disabilitato
PIE1 = 0; // Interrupt di periferica disabilitati
GIE = 1; // Global Interrupt Enable
PEIE = 1; // Periferal Interrupt Enable
RCIE = 1; // USART Receive Interrupt Enable
for (;;){
if (Flags==1) Par_ser();
DelayMs(2); // Delay aggiuntivo
}
} //fine del main
void interrupt SerChar(void) //prototipo ricezione
{
if (RCREG==0x40 | RxPos > 6) //se arriva la chiocciola dimensiona la stringa
{
C1=0,C2=0,C3=0,C4=0; //azzero la stringa
RxPos=0,Flags=0;
}
if (RxPos==1) C1=RCREG; //ricezione della stringa comandi
if (RxPos==2) C2=RCREG;
if (RxPos==3) C3=RCREG;
if (RxPos==4) C4=RCREG;
if ((RxPos==5) && (RCREG==0x0d)) Flags=1; // <CR> terminator
RxPos++;
}
void Var_Init(void){
RxPos=0;
Flags=0;
}
void Par_ser(void) // Analisi comandi
{
Flags=0;
switch (C1){
case 0x49: //carattere I Accensione LED 0
LED0 = 1;
break;
case 0x53: //carattere S Spegnimento LED 0
LED0 = 0;
break;
case 0x4C: //carattere L Accensione LED 1 LED1 = 1; break; case 0x54: //carattere T Spegnimento del LED 1 LED1 = 0; break; case 0x4D: //carattere M Accensione LED 2 LED2 = 1; break; case 0x55: //carattere U Spegnimento LED 2 LED2 = 0; break; case 0x4E: //carattere N Accensione LED 3 LED3 = 1; break; case 0x56: //carattere V Spegnimento LED 3 LED3 = 0; break; case 0x4F: //carattere O Accensione LED 4 LED4 = 1; break; case 0x5A: //carattere Z Spegnimento LED 4 LED4 = 0; break; case 0x50: //carattere P Accensione LED 5 LED5 = 1; break; case 0x58: //carattere X Spegnimento LED 5 LED5 = 0; break; case 0x51: //carattere Q Accensione LED 6 LED6 = 1; break; case 0x59: //carattere Y Spegnimento LED 6 LED6 = 0; break; case 0x52: //carattere R Accensione LED 7 LED7 = 1; break; case 0x4A: //carattere J Spegnimento LED 7 LED7=0; break; case 0x41: //carattere A resetta il PORT B PORTB=RESET; break; case 0x42: //carattere B inviato prima di uscire dall'interfaccia PORTB=RESET; break; } }
.
Anteprima interfaccia VB.net
This opera is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 Italy License