Funzioni avanzate di IO digitale sui PIC32. La gestione “atomica” dei bit.

In un precedente articolo abbiamo visto le funzioni avanzate degli IO per i pic a 16 bit. Salendo di categoria le caratteristiche continuano ad aumentare: sebbene il sempre più elevato numero di funzioni a disposizione possa far apparire i processori di fascia alta più complicati da gestire, c’è anche da dire che tutte queste funzioni in più facilitano sicuramente la vita!

Mi soffermo quindi a parlare di questa “nuova” caratteristica presente unicamente sui pic32: l’Atomic Bit Manipulation.

Partiamo innanzitutto col dire che anche sui PIC32 abbiamo tutto il popò di roba già visto sui pic24 (relativamente alla gestione degli IO): PORTx, LATx, TRISx, ODCx, CNCONx, ANSELx e funzionalità PPS. In più abbiamo questa nuova caratteristica che permette di agire sui singoli bit di un registro (da qui la denominazione “atomic”, nel senso che si va ad agire direttamente sul singolo bit) consentendo di eseguire le operazioni di cambio stato dei singoli bit in una sola operazione, con tutti i vantaggi che si possono ben immaginare.

In particolare i registri PORT, LAT e TRIS hanno i corrispondenti registri SET, CLR e INV. Cosa significa? Un registro SET serve per settare (ovvero impostare a 1) i singoli bit, un registro CLR al contrario serve a resettare (porre a zero) i singoli bit e infine un registro INV serve ad invertirne lo stato.

Avremo quindi ulteriori 9 registri: PORTxSET, PORTxCLR, PORTxINV, LATxSET, LATxCLR, LATxINV, TRISxSET, TRISxCLR e TRISxINV.

In realtà ne sono molti di più perchè i registri SET, CLR e INV sono disponibili anche per i registri di altre periferiche.

Il vantaggio è notevole sebbene qualcuno possa non afferrare subito il concetto. Supponiamo, ad esempio, di voler fare il toggle di un singolo IO (ovvero invertirne lo stato). Facciamo l’esempio con RA0. Un sistema potrebbe essere il seguente:

PORTA ^= 0x0001;

Questa operazione, però, prevede parecchi passaggi anche se in realtà noi lo stiamo scrivendo su una sola riga! Il valore di PORTA viene prima letto, trasferito in ram, viene fatta l’operazione di inversione del bit sempre in ram e infine il risultato viene trasferito al registro PORTA. Abbiamo anche visto nel precedente articolo tutti i rischi che questo tipo di operazioni comportano e del perchè è stato introdotto il registro LAT.

Sui PIC32 questa operazione possiamo continuare ad eseguirla così, nessuno ce lo vieta. Ma… Stiamo lavorando con dispositivi che arrivano a lavorare alla bellezza di 80MHz, e aventi un ciclo istruzioni uguale al ciclo di clock (FCY=FOSC), quindi vuol dire che siamo esigenti, e allora perchè non sfruttare le caratteristiche che ci sono state messe a disposizione?

L’inversione di un bit può essere fatta sui PIC32 sfruttando il registro INV che ci interessa:

PORTAINV=0x0001;

Questa istruzione viene eseguita in un sol colpo ed è quindi molto più rapida ed efficiente. L’istruzione non fa altro che dire: inverti il bit 0 del registro PORTA. Allo stesso modo operano i registri CLR e SET:

PORTASET=0x0002; // metti a 1 il bit 1 del registro PORTA
TRISBSET=0x0005; // metti a 1 il bit 4 del registro TRISB
LATCINV=0x9000; // inverti i bit 15 e 12 del registro LATC
PORTBCLR=0x0041; // metti a 0 i bit 0 e 6 del registro PORTB
Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)