Questa pagina contiene materiale obsoleto - Vai al tutorial relativo all'ambiente
MPLAB X e XC8
In questo breve tutorial vengono mostrati alcuni esempi di codice per collegare una periferica I2C ad un PIC18. La periferica è il MAX520 (un DAC quadruplo a 8 bit) ma con poche modifiche il codice è facilmente adattabile anche ad altri dispositivi.
Non verrà spiegato cosa è e come si usa il bus I2C. Semplicemente verrà illustrato un hardware e un programma minimale che permettono di usare un dispositivo I2C collegato ad un PIC.
Il circuito è stato realizzato su breadboard e per lo sviluppo del software è stato utilizzato il debugger ICD3 con il modulo header visibile nella fotografia, di colore rosso. Evidentemente la scelta non è vincolante.
Il semplice schema è lo stesso descritto alla in Collegare una periferica I2C al bus USB e si limita a due resistenze di pull-up da circa due kΩ connesse tra Vcc e le due linee SDA e SCL.
L'unica nota riguarda l'alimentazione. Il PIC18 è progettato per una alimentazione a 3,3 V, il MAX520 a 5 V. Per fortuna il PIC nella versione non a basso consumo è "5V tolerant" e quindi non ci sono problemi ad alimentare il tutto a questa tensione, anche attraverso l'emulatore. Purtroppo questo componente è l'unico trovato nel cassetto...
Il PIC18 contiene al proprio interno un modulo hardware adatto, tra le altre cose, a funzionare come slave o come master I2C. Il codice completo.
I due segnali del PIC utilizzati per la comunicazione sono i pin 11 e 13 e non possono essere cambiati in quanto gestiti direttamente dall'hardware.
Prima di iniziare ad usare il modulo occorre inizializzarlo ed impostare la frequenza del clock, normalmente a 400 kHz. Da notare che la frequenza effettiva dipende dal clock del processore.
OpenI2C( MASTER, SLEW_ON ); // I2C Master mode,
Slew rate enabled (for 400 kHz)
SSPADD = 9;
// Set 400 kHz clock ( @ 16 MHz )
Il cuore del codice è piuttosto semplice:
StartI2C(); // Start I2C
communication
IdleI2C();
WriteI2C( xx ); // Send data
IdleI2C();
[...]
StopI2C(); // Stop comunication
L'invio di un gruppo di byte, siano essi indirizzi o dati, inizia e termina con le funzioni di StartI2C() e StopI2C().
Inoltre ogni singolo invio di un byte deve essere preceduto e seguito dalla funzione IdleI2C() che permette di verificare che il modulo hardware non sia impegnato in altre operazioni.
Il significato dei codici trasmessi dipende ovviamente dalla specifica periferica utilizzata e possono essere trovati sui fogli tecnici del componente. Per il MAX520 potete inizialmente far riferimento alla a Collegare una periferica I2C al bus USB. Per comodità questi comandi sono stati raccolti nella funzione write_to_DAC().
Il codice nel suo complesso genera una coppia di segnali a denti di sega, utilizzando due dei DAC presenti, come di seguito mostrato.
In un periodo (circa 60 ms) vengono trasmessi 256 + 256 campioni, velocità limitata a qualcosa meno di 10.000 pacchetti al secondo principalmente dalla lentezza del protocollo I2C.
Una funzione delle librerie Microchip permette di trasmettere in blocco una stringa ed è stata utilizzata per scrivere la funzione write_to_DAC_V2(), ovviamente alternativa alla precedente ed identica negli effetti. Una cosa sorprendente: la sua esecuzione è, di poco, più lenta della funzione che scrive un solo byte alla volta.
Le librerie Microchip contengono anche alcune funzioni adatte ad operare senza appoggiarsi ad hardware specifico. In questo caso i pin utilizzati sono 6 e 7 (RC4 e RC3) ma possono, volendo, essere modificati.
L'uso di queste funzioni può rivelarsi utile nel caso in cui sia necessaria una seconda interfaccia di comunicazione oppure nel caso in cui il modulo hardware sia già utilizzato, per esempio per una comunicazione SPI.
Questo gruppo di funzioni sono state utilizzate per scrivere la funzione write_to_DAC_SW(), funzionalmente identica alle precedenti e simile a write_to_DAC() come struttura.
Appunti di elettronica
- PIC18F14 in C - OBSOLETO - Versione 1.0 - Ottobre 2014
Copyright 2010-2012, Vincenzo Villa (https://www.vincenzov.net)
Quest'opera stata rilasciata con licenza Creative Commons | Attribuzione-Condividi allo stesso modo 3.0 Unported.