Programmazione degli ADuC via seriale

Una panoramica sul microcontrollore ADuC, della Analog Devices e l’analisi del protocollo utilizzato per la sua programmazione. La famiglia degli ADuC, basata sul core 8052, comprende diverse varianti a seconda del progetto a cui essi sono destinati.  Perciò sono identificati  da un valore numerico, proprio come un normale circuito integrato.

I modelli e loro caratteristiche

Introduzione:

Gli ADuC rappresentano un ottimo condensato di elettronica mixed-signal, in quanto sono dotati al loro interno, oltre ad un core 8052, anche un ADC, DAC e dei banchi di memoria programma e dati (Figura 1).

Figura 1. Immagine di un microcontrollore ADuC

Figura 1. Immagine di un microcontrollore ADuC

La tabella 1 elenca i vari modelli ed i principali parametri che caratterizzano l’architettura interna.

Tabella 1. Elenco di tutti i componenti della famiglia ADuC con core 8051

Tabella 1. Elenco di tutti i componenti della famiglia ADuC con core 8051

Il modello base (che è stato anche il primo di questa serie ad  essere prodotto) è indicato con  la sigla ADuC812 ed il suo schema a blocchi è riportato nella Figura 2, in cui sono indicati con colore blue tutti i blocchi relativi alla parte analogica, in rosa quelli di memoria e in verde le interfacce verso l’esterno. Esso può essere ritenuto lo schema di principio anche dei restanti modelli.

Figura 2. Schema a blocchi dell’ADuC812

Figura 2. Schema a blocchi dell’ADuC812

Si tratta di un microconverter con architettura RISC ad 8 bit. La dimensione della memoria, di tipo Flash/EE, su cui effettuare il download del firmware è di 8KB, ma raggiunge i 62KB a partire dai modelli ADuC83x . La memoria RAM è di 256B, ma si arriva anche oltre i 2KB utilizzando, anche in questo caso, i modelli a partire dall’ADuC831. Comunque, in tutti quei progetti in cui la dimensione della RAM dovesse risultare insufficiente è possibile interfacciare l’ADuC con un banco di memoria esterna; l’indirizzamento massimo consentito è di 16MB. Inoltre, l’intero  sistema è dotato  di una memoria Flash/EE per eventuali dati che bisogna memorizzare permanentemente, perché, per esempio, sono richiesti dal programma ad ogni riavvio dell’unità; le dimensioni di questo banco di memoria è di 640KB, per arrivare fino a 4KB nei modelli superiori. Come qualunque microcontrollore, anche l’ADuC deve essere dotato di un oscillatore che gli permetta di far funzionare l’intero sistema. La frequenza di clock può raggiungere un massimo di 16MHz (nel modello base), ma  generalmente viene utilizzato  un  quarzo  a 11.0592MHz. Questo significa che il periodo del segnale ha una durata pari a 90ns. L’architettura dell’8052 necessita di 12 impulsi dell’oscillatore per realizzare un ciclo macchina. Velocità superiori si possono raggiungere in modelli di ADuC più avanzati, come per esempio l’ADuC841; tali chip hanno un PLL on-board che consente, utilizzando semplicemente  un quarzo a 32KHz, di raggiungere frequenze fino a 20MHz.

Convertitori analogico/digitale e digitale/analogico:

L’ADuC è dotato di ben otto canali analogici, che tramite un multiplexer, entrano nell’unico ADC presente sul chip, come mostrato nello schema a blocchi di Figura 2; La stessa figura mostra la presenza di un Track &  Hold  (T/H) che permette di  migliorare  la qualità della conversione, mantenendo stabile il segnale analogico per la durata del campionamento. L’uscita di tale flusso viene indirizzato in appositi registri della MCU e da qui inviato verso un DAC (Digital/Analog Converter) o una delle interfacce digitali  (es seriale, parallela). L’ADC utilizzato  nel modello  base è di tipo  SAR  (cioè sfrutta il metodo delle approssimazioni successive), con una risoluzione di 12 bit  e consente una velocità di campionamento che varia, in base al modello, tra 200 kSPS e 420 kSPS. Tecniche che garantiscono una risoluzione superiore sono utilizzate nei modelli ADuC845/846/847, dotati tutti di convertitore Σ-∆ che consente di raggiungere una risoluzione di ben 24 bit, sfruttando la tecnica del sovracampionamento.

Consumi e tensione di alimentazione:

La tensione di alimentazione necessaria per far funzionare il chip può variare nel range 3V ÷ 5V. Ovviamente, per applicazioni portatili si preferiranno valori di tensione quanto più bassi possibile, in modo  da ridurre il consumo delle batterie. La corrente richiesta dal chip, ovviamente, dipende oltre che dalla tensione di alimentazione anche dalla frequenza operativa e dal numero di dispositivi utilizzati contemporaneamente. In Tabella 2 sono riassunti i principali valori di corrente assorbita nelle diverse condizioni operative.

Tabella 2. Consumo di corrente dell’ADuC812 (MCLK indica la frequenza del clock)

Tabella 2. Consumo di corrente dell’ADuC812 (MCLK indica la frequenza del clock)

Come si evince dalla Tabella 3, l’utilizzo di un DAC o dell’ADC determina un incremento della corrente (e quindi  della potenza)  assorbita.

Tabella 3. Risposta del Loader v2 all’accensione del chip, quando esso è portato in modalità di download.

Tabella 3. Risposta del Loader v2 all’accensione del chip, quando esso è portato in modalità di download.

Ad esempio, nell’ipotesi di usare un clock pari a 11.0592MHz ed utilizzare sia ADC che entrambi i DAC, si avrebbe un consumo di corrente pari a (tensione di alimentazione = 5V e modalità normal):

(1.6nAs x 11.0592MHz) + 6mA + (250mA x 2) + 1.3mA =
=18mA + 6mA + 0.5mA + 1.3mA = 26mA

ed un  consumo di  potenza pari a 26mA  • 5V = 130mW. L’ipotesi in cui ci si è messi per effettuare il calcolo è abbastanza pessimistica, in quanto prevede un utilizzo di quasi tutti i componenti dell’ADuC.

Interfacce di comunicazione:

Ovviamente,  un  microprocessore  deve  essere in grado di comunicare con le varie periferiche ad esso collegate, che rappresentano i dispositivi di input/output (I/O) del sistema e ciò avviene mediante le seguenti interfacce di cui l’ADuC è dotato:

  • UART;
  • SPI;
  • I2C;
  • Porte di I/O general-purpose.

La velocità tipica per la comunicazione seriale asincrona è di 9600 baud, ma nulla vieta di aumentare tale valore fino a 19200 baud, nel caso dell’ADuC812; per i modelli superiori si possono raggiungere anche velocità di 230400 baud. Ovviamente, l’aumento di velocità comporta una maggiore probabilità di errore nella trasmissione e perciò sarebbe necessario, in tali casi, includere oltre al bit di stop un ulteriore bit come controllo di parità: questo viene realizzato utilizzando la modalità di trasmissione con controllo degli errori. Se si vogliono ottenere velocità superiori, rispetto alla trasmissione  seriale, bisogna ricorrere a porte di tipo parallelo. In particolare, la porta 0 e la porta 2 sono interfacce parallele a 8 bit, che possono  essere sfruttate sia come ingresso che come uscita. Ovviamente, la possibilità di trasmettere in un solo colpo di clock un intero  byte, anziché un solo bit,  velocizza notevolmente la trasmissione.

Pinout e package dell’ADuC812

I chip ADuC8xx (di cui è possibile richiedere campioni gratuiti dal sito della Analog Device www.analog.com) vengono forniti in due differenti package: CSP e PQFP. Quest’ultimo risulta il più semplice per applicazioni hobbistiche, mentre l’altro viene utilizzato in applicazioni professionali dove sono richiesti minor ingombro e maggiori frequenze. La Figura 3 illustra quanto appena descritto, indicando anche il nome standard di ciascun pin, nonché le dimensioni del package PQFP.

Figura 3. Sulla sinistra è riportata la piedinatura ed la funzione delle varie linee, mentre sulla destra sono specificate le dimensioni del package di tipo MQFP

Figura 3. Sulla sinistra è riportata la piedinatura ed la funzione delle varie linee, mentre sulla destra sono specificate le dimensioni del package di tipo MQFP

Interrupt:

Come qualsiasi processore, anche l’ADuC dispone di propri interrupt, ossia di eventi, esterni o interni che sono in grado di alterare il normale flusso del programma. Ogni ADuC è dotato di almeno 9 sorgenti di interrupt, le quali sono di seguito riassunte:

  1. Interrupt esterno 0 (EX0);
  2. Interrupt esterno 1 (EX1);
  3. Interrupt del Timer 0 (ET0);
  4. Interrupt del Timer 1 (ET1);
  5. Interrupt del Timer 2 (ET2);
  6. Interrupt della porta seriale (ES);
  7. Interrupt dell’ADC (EADC);
  8. Interrupt per il monitoraggio della tensione di alimentazione (EPSMI);
  9. Interrupt per l’interfaccia SPI/I2C (ISPI).

Il protocollo seriale per il download del firmware

Introduzione:

Tutti i micro della famiglia ADuC8xx del Analog Device possono essere  configurati  per il download seriale tramite uno specifico pin. Si tratta del pin di input  PSEN che deve essere messo a massa tramite un resistenza di pull-down di 1KΩ. Se tale condizione viene rilevata all’accensione, il chip entra automaticamente in modalità di download. A questo punto una routine precaricata nella ROM del micro viene attivata e tramite essa è possibile effettuare il download del codice tramite l’interfaccia UART.  É importante notare che la fase di programmazione avviene utilizzando gli  stessi valori della tensione di  alimentazione del micro, mentre per altri tipi di microcontrollori è necessario utilizzare  tensioni  di  programmazione superiori  a  quelle  normali  di  funzionamento. La Figura 4 mostra uno schema a blocchi delle due parti che intervengono durante la programmazione: l’host, rappresentato nella Figura 4 con un notebook ed il loader, rappresentato dalla scheda finale (ma che in realtà è il firmware precaricato sul chip). Esistono due differenti versioni del protocollo seriale, indicate con il termine di Loader v1 e Loader v2.

Figura 4. Parti che intervengono nella programmazione seriale.

Figura 4. Parti che intervengono nella programmazione seriale.

La seconda rappresenta una evoluzione della prima, in quanto supporta un protocollo più completo che permette la programmazione oltre che della memoria programma  (program  Flash/EE) anche di quella dati (data Flash/EE). Attualmente, il Loader v1 è presente solo sui modelli ADuC812 con codice minore di 9933 (con tale codice si indicano tutti i chip venduti prima dell’agosto 1999), mentre tutti gli altri modelli presentano il protocollo  più  evoluto.  Per questo motivo  la trattazione sarà focalizzata sul Loader v2, evidenziando le principali differenze che lo distinguono dalla prima versione.

Il Loader v2:

Dopo aver portato a massa il pin PSEN tramite la resistenza di pull-down e aver “riacceso” il chip, il Loader invia  una  sequenza di  25  byte,  che  servono per l’identificazione dello stesso. La Tabella 3 mostra il significato di questo gruppo di bytes. I primi 10 bytes di identificazione prodotto  vengono inviati secondo la seguente sintassi:

‘ADI<spazio>8xx<spazio><spazio><spazio>’

Ad  esempio, nel  caso in  cui  si utilizzi  il  modello ADuC812 (nuova versione) sarà visualizzata la stringa:

‘ADI 812   ‘

Invece i 4 bytes della versione del firmware sono forniti come:

‘V2xx’

dove V2 rappresenta il Loader v2, mentre xx indica la versione del firmware. Appena attivato, il Loader trasmette dati ad una velocità pari a 9600 baud, 8 bit dati e nessuna parità. Per i modelli ADuC812, ADuC831 e ADuC841 il baud rate è ricavato direttamente dal clock principale del chip. Se il cristallo utilizzato ha una frequenza di risonanza pari a 11.0592MHz allora il baud rate sarà esattamente 9600.  Diversamente, la velocità aumenterà o diminuirà proporzionalmente al clock, secondo la formula seguente:

Baud rate =
=9600baud • (Frequenza Cristallo) / 11.0592MHz

Ad esempio, se il quarzo utilizzato è 1MHz allora la velocità sarà di 868 baud. É  importante  far notare che per l’ADuC841 bisogna evitare di utilizzare clock compresi tra 16MHz e 20MHz in quanto il download seriale potrebbe essere effettuato con errori. Prima di iniziare qualsiasi trasferimento di codice è consigliabile che l’host interroghi il Loader per verificare che esso risponde correttamente e non ci siano quindi  problemi  di  comunicazione.  Per effettuare l’interrogazione è sufficiente inviare la sequenza di caratteri riportata in Tabella 4.

Tabella 4. I quattro caratteri da inviare per interrogare il Loader v2.

Tabella 4. I quattro caratteri da inviare per interrogare il Loader v2.

A questo punto il micro risponde inviando i 25 bytes descritti in precedenza.  Per quanto riguarda il calcolo del checksum, esso permette di evitare eventuali errori di trasmissione.

Descrizione del protocollo v2:

Verificata la presenza del loader, l’host può iniziare la trasmissione vera e proprio del file intel hex, precedentemente creato tramite l’assemblatore ASM51. Il formato  generale del  pacchetto  di  trasmissione è riportato in Tabella 5.

Tabella 5. Formato del pacchetto per il trasporto dei dati

Tabella 5. Formato del pacchetto per il trasporto dei dati

Il  campo  Inizio Pacchetto contiene  due  caratteri fissi (07h e 0Eh) che servono al loader per rilevare l’inizio del pacchetto. Il campo successivo, #DataBytes è il numero totale dei byte di dati (incluso il byte per impartire il comando)  da trasferire; il numero massimo consentito è 25, ma ovviamente sono permessi anche valori inferiori. Il campo Data 1 rappresenta il comando che il loader deve eseguire; la lista completa, con la relativa descrizione, dei comandi  è riportata in Tabella 6.

Tabella 6. Descrizione dei possibili comandi che si possono impartire al loader.

Tabella 6. Descrizione dei possibili comandi che si possono impartire al loader.

L’informazione vera e propria da trasferire sulla Flash/EE del chip è contenuta all’interno del campo Data x. In entrambi i comandi di cancellazione tale campo non esiste, in quanto essi cancellano indistintamente tutti  i bytes della memoria sia programma che dati. Infine, un’attenzione particolare merita il campo del checksum che permette di garantire l’integrità dei dati scritti. Il checksum viene calcolato effettuando  il complemento a 2 della somma tra il campo #DataBytes e la sommatoria di ogni singolo Data x, compreso anche il comando. Esprimendo il tutto  in formula si può affermare che:

Checksum = 100h – (#DataBytes + Σ DataBytesx)
(Dove x = 1÷25)

Dopo aver inviato il pacchetto così come descritto sopra, la routine del loader calcolerà il checksum e lo confronterà con quello ricevuto. Risponderà con un ACK (06h)  nel caso di trasmissione andata a buon fine, mentre invierà un NAK (07h) qualora si sia verificata una delle seguenti condizioni:

  1. Formato del pacchetto dati incorretto dovuto ad una differenza tra il checksum calcolato e quello ricevuto.
  2. Il loader non riesce a verificare che i dati scritti siano corretti.
  3. É stata richiesta la scrittura di una locazione di memoria che non era stata precedentemente cancellata.

La Figura 5 illustra un esempio di trasmissione seriale, in cui si fa uso del comando ‘B’, ossia il comando che permette di modificare il baud rate della trasmissione.

Figura 5. Schematizzazione di una trasmissione seriale in cui si utilizza il comando di modifica del baud rate

Figura 5. Schematizzazione di una trasmissione seriale in cui si utilizza il comando di modifica del baud rate

Comando di cancellazione:

Esistono due differenti  comandi  di cancellazione, di cui uno permette di cancellare sia la memoria programma che quella dati (‘A’), mentre l’altro effettua la cancellazione della sola memoria programma (‘C’). L’operazione di cancellazione non è opzionale ma necessaria per effettuare la programmazione del chip. Se si tenta, infatti, di scrivere la memoria prima di cancellarla si ottiene un messaggio di errore (NAK). Tale comando non richiede nessun campo dati addizionale, solamente l’indicazione dell’istruzione da eseguire. La Tabella 7 mostra un esempio di comando ‘A’, mentre la Tabella 8 mostra il comando ‘C’.

Tabella 7. Comando di cancellazione memoria programma e dati

Tabella 7. Comando di cancellazione memoria programma e dati

Tabella 8. Comando di cancellazione della sola memoria programma

Tabella 8. Comando di cancellazione della sola memoria programma

Comando di programmazione:

Tutti i pacchetti per il download del codice necessitano l’indicazione di un indirizzo iniziale, dal quale iniziare la scrittura. Tale valore è contenuto nei 3 bytes immediatamente   successivi il  comando.  Il  primo databyte verrà scritto all’indirizzo specificato, mentre per i successivi il loader incrementerà l’indirizzo e scriverà il successivo byte; tale processo continua fino all’ultimo databyte. La Tabella 9 mostra un esempio di pacchetto dati che scrive 8 locazioni della memoria programma, iniziando dalla posizione 0000h.

Tabella 9. Pacchetto dati per la programmazione della memoria programma

Tabella 9. Pacchetto dati per la programmazione della memoria programma

Per quanto  concerne  la  memoria  dati  flash/EE il discorso è leggermente differente, in quanto tale banco di memoria deve necessariamente  essere programmato a blocchi di 4 byte. Il pacchetto che effettuata la programmazione del secondo blocco della flash/EE è mostrato in Tabella 10.

Tabella 10. Pacchetto dati per la programmazione della memoria dati

Tabella 10. Pacchetto dati per la programmazione della memoria dati

Impostazione delle modalità di sicurezza:

Queste impostazioni di sicurezza sono configurabili per tutti i modelli di ADuC8xx eccetto per l’812. Per ciascun chip esiste una particolare modalità di sicurezza (per maggiori dettagli fare riferimento al datasheet di ciascun chip). Ciascuna delle operazioni di cancellazione imposta tale modalità su NO SECURITY. Il pacchetto dati necessario per configurare una di queste modalità è mostrato in Tabella 11.

Tabella 11. Pacchetto dati per impostare la modalità di sicurezza

Tabella 11. Pacchetto dati per impostare la modalità di sicurezza

Tutte le possibili modalità di sicurezza sono elencate nella Tabella 12. É importante notare che settando la modalità SERIAL viene disabilitato il donwload seriale. L’unico modo per riabilitarlo è quello di inviare un comando di cancellazione tramite la modalità parallela di trasferimento (non descritta in questo articolo).

Tabella 12. Modalità di sicurezza impostabili tramite il loader

Tabella 12. Modalità di sicurezza impostabili tramite il loader

Comando per iniziare l’esecuzione del codice (esecuzione remota):

Quando  l’host  ha trasmesso tutti  i pacchetti  del codice programma al loader, è possibile inviare un pacchetto finale, il quale forza il PC (Program Counter) ad un determinato indirizzo e quindi ad eseguire il relativo codice. Un esempio di tale pacchetto,  che imposta il PC all’indirizzo 0000h è mostrato in Tabella 13.

Tabella 13. Pacchetto per l’esecuzione remota

Tabella 13. Pacchetto per l’esecuzione remota

Impostazione dei registri ETIM:

Per quanto riguarda il micro ADuC812, la temporizzazione di tutte  le operazione di cancellazione e programmazione  è ricavata dal master clock. Quando si utilizza un quarzo pari a 11.0592MHz non è necessaria la scrittura dei registri ETIM. Diversamente da tale condizione bisogna cambiare i valori di tali registri al fine di evitare problemi di  data retention  della flash/EE.  Tali registri formano un word  a 16 bit,  in cui ETIM1 è la parte alta, mentre ETIM2 la parte bassa. É  importante  notare che il comando descritto di seguito configura il valore di questi registri solo per la durata del download seriale, mentre al successivo riavvio vengono re-impostati al loro valore di default.

La formula da utilizzare per ricavare il valore dei registri è la seguente:

ETIM2, ETIM1 = 100µs • fmaster clock[MHz]

In realtà, esiste un terzo registro: ETIM3.
Il  valore da  utilizzare in  questo caso è quello  di default e cioè C9h.  Nel caso, per esempio, in cui si utilizzi un clock a   12MHz,   si  ha   12MHz   ·    100µs=1200d=04B0h e quindi ETIM2=04h e ETIM1=B0h. Il  relativo  pacchetto  che l’host  deve inviare al loader è riportato in Tabella 14.

Tabella 14. Pacchetto per la configurazione dei registri ETIM

Tabella 14. Pacchetto per la configurazione dei registri ETIM

Il discorso fatto vale solo per l’ADuC812, mentre per tutti gli altri modelli il valore dei registri ETIM viene impostato automaticamente. Quindi il comando descritto non ha alcuna funzione.

Diagramma di flusso della sequenza di download:

Quanto descritto in precedenza può  essere riassunto nel flowchart riportato in Figura 6.

Figura 6. Flowchart di una tipica sequenza di download dei dati

Figura 6. Flowchart di una tipica sequenza di download dei dati

Questi  sono  gli  step  fondamentali da seguire qualora si voglia realizzare un interfaccia software che gestisca il download di un file Intel Hex da un host (che nella maggior parte dei casi è un PC) sull’ADuC.

Il Loader v1:

Tale versione del loader è presente solo sui primi modelli  dell’ADuC812. Anche in questo caso è necessario porre il chip in modalità di download tramite il pin PSEN e la resistenza di pull-down. Resettando il componente, il loader risponderà con 11 bytes, il cui significato è descritto nella Tabella 15.

Tabella 15. Risposta del Loader v1 all’accensione del chip

Tabella 15. Risposta del Loader v1 all’accensione del chip

I primi 8 bytes indicano il tipo di prodotto,  in questo caso si avrebbe:

‘ADuC812<space>’

I 3 bytes successivi indicano il numero di versione del firmware precaricato. Quando il loader viene avviato, esso configura l’ADuC812 con un baud rate di 9600, 8 bit  dati  e nessuna parità  se il  clock utilizzato è 11.0592MHz. Se si utilizza un clock differente è necessario far riferimento alla formula:

Baud rate =
=9600baud • (Frequenza Cristallo) / 11.0592MHz

Anche con la versione 1 del loader è consigliabile verificarne la sua presenza per evitare errori di trasmissione. Per interrogare  il  loader è sufficiente inviare il carattere <21h> (carattere ‘!’ in   ASCII). Quindi l’ADuC812 risponderà con la sequenza di identificazione. Tale versione permette la programmazione solo della memoria programma.  L’host in questo caso deve trasmettere il file hex senza alcun protocollo. Anche per il Loader v1 è necessaria la cancellazione  della memoria  prima  della programmazione, ma questa procedura viene eseguita automaticamente all’avvio. Alla fine di ogni riga del file hex il loader invia all’host un ACK (06h) se tutta la procedura di trasferimento  è  andata  a  buon  fine  oppure  un  NAK (07h) se vi sono stati problemi. Terminata la trasmissione del file, l’host può forzare l’esecuzione del programma inviando un indirizzo di  partenza costituito  dal carattere ‘;’  e da 4 byte per l’indirizzo iniziale.

Interfaccia a linea di comando:

Sarebbe interessante esaminare il programma,  in linguaggio C, fornito direttamente dalla Analog Devices che implementa una interfaccia di comunicazione con  il  loader:  download.exe. Tale programma  può  essere usato da linea di  comando, con la seguente sintassi:

donwload.exe /opzione

dove le opzioni possono essere scelte tra quelle riportate di seguito:

/C:n – selezione della porta COM da utilizzare (di default è utilizzata la COM1);
/D –     trasferimento  codice  sulla Flash/EE di  programma;
/R –     inizia l’esecuzione a partire dall’indirizzo 0000h;
/R:xxxx - inizia l’esecuzione a partire dall’indirizzo xxxxh;
/V –      verifica il download  del codice (da utilizzare solo sui modelli ADuC83x e ADuC84x);
/X:freq – imposta la frequenza del cristallo utilizzato (solo sui modelli ADuC812, ADuC831 e ADuC841);
/B –       opzione  di  bootload  a partire  dall’indirizzo E000h;
/M:n –  Modalità di download;
- 0 =       Download sulla memoria codice e dati (Data file must be second file name specified);
- 1 =        Download Code Only;
- 2 =       Download Data Only;
/S:n –   Modalità  di sicurezza (tutti  i modelli  tranne ADuC812);
- 0 =       Lock Mode;
- 1 =       Secure Mode;
- 2 =      Serial Safe Mode;
- 3 =      Tutti i bit di sicurezza selezionati.

Scarica subito una copia gratis

Una risposta

  1. Maurizio Di Paolo Emilio Maurizio 26 Aprile 2016

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend