LA STRUTTURA DEL MICRO ST6

Diamo ora un'occhiata all'esterno dei microcontrollori, ovvero analizziamo uno ad uno i pin coi quali il micro si collega con il mondo esterno. Sappiamo da informazioni lette da altri articoli le varie famiglie e i loro contenitori; rinfrescandoci la memoria possiamo dire che, per quello che riguarda il numero di pin, esistono due differenti gruppi: i micro: a 20 e 28 pin. Possiamo dire che le differenze tra i due gruppi consistono nel numero di porte che implementano, in dipendenza del tipo di contenitore (numero di pin) e dal tipo di dispositivo (ST621X/22X/26X); ovviamente oltre alle "porte" esistono anche altri pin che necessitano per la gestione del funzionamento, come l'alimentazione, gli ingressi dell'oscillatore, il reset, ecc. Lasciamo in disparte per un momento l'argomento delle porte I/O, che verrà ampiamente preso in esame in un prossimo capitolo, per analizzare il resto dei pin disponibili sui micro ST6, tenendo presente che il significato è identico per tutti i chip pur essendo diversa la posizione esterna. Partiamo con quelli di alimentazione che vengono contraddistinti dalle sigle VDD (positivo di alimentazione) e VSS (massa). A questi pin dovremmo applicare una tensione stabbilizzata, tipicamente 5 volt, ricordando di collegare anche un condensatore di disaccoppiamento con capacità compresa tra 0.1 e 1 microfarad.  Per applicazioni particolari e in dipendenza dal tipo di frequenza utilizzata la tensione di alimentazione può essere di valore diverso dai 5 volt standard; la casa costruttrice, come valori minimi e massimi, pone 3 ÷ 7 volt. La corrente assorbita dal dispositivo è strettamente legata al tipo di utilizzo, come vedremo alcune uscite possono fornire una corrente fino a 20mA, quindi possiamo affermare che al massimo la corrente assorbita può arrivare a 100mA.        

wpeA.jpg (11872 byte)

Proseguiamo con i pin siglati OSCin (oscillator input) e OSCout (oscillator output) che risultano internamente collegati con un'oscillatore che genera un clock di sistema. Quest'ultimo, che altro non è che un segnale ad onda quadra, provvede alla scansione degli eventi all'interno del micro. Per il corretto funzionamento, dovremo collegare ai pin dell'oscillatore un quarzo o un risuonatore ceramico con frequenza di lavoro compresa tra 4 e 8 MHz.                        

wpeA.jpg (14562 byte)

Dovremo anche connettere un condensatore con capacità compresa tra 12 e 22 pF tra il pin OSCin e massa, e un eguale condensatore tra il pin OSCout e massa. Oltre alla configurazione appena descritta, sono possibili altri tipi di collegamento al micro per generare gli impulsi di clock; è dunque possibile fare arrivare direttamente al micro un'onda quadra stabile all'ingresso OSCin, oppure selezionare, tramite il corretto registro, l'oscillatore interno controllato da una resistenza esterna. Le diverse configurazioni possibili sono rappresentate di seguito.                         

wpe9.jpg (12320 byte)

Continuiamo con il pin siglato RESET che se portato allo stato logico 0(coincide con la massa) forza la CPU alla lettura della prima istruzione presenta nella memoria programma. Questo va normalmente collegato tramite una resistenza da 100 Kohm alla tensione positiva Vdd e attraverso un condensatore da 10 microFarad alla Vss (massa). La rete RC così realizzata forza, per qualche istante e solo all'atto della prima accensione, il piedino RESET al valore di 0 volt e conseguentemente permette al micro di partire correttamente andando a leggere l'istruzione numero uno. In realtà, nei microprocessori della famiglia ST6, esistono tre diverse condizioni di reset: la prima è generata da un segnale esterno, nella maniera citata sopra, ed è gestibile dall'utilizzatore in qualsiasi momento, fino a che rimane la condizione di RESET, esterna (0 volt) il micro risulta inattivo; la seconda condizione avviene ad un preciso comando generato da un timer interno dal nome di "Watchdog"; la terza ed ultima condizione è generata dal POR (Power On Reset) che si attiva al momento della prima alimentazione. Per quest'ultima condizione occore premettere che al momento in cui viene fornita tensione sul piedino Vdd, occore un certo periodo di tempo prima che la tensione si stabilizzi, quando l'alimentazione sale ad un livello sufficiente, l'oscillatore parte a funzionare e viene generato un ritardo interno fino a che l'oscillatore non è a regime. La condizione di reset generata dal POR sussiste fino a 2048 cicli dopo l'entrata a regime dell'oscillatore; fino a quel momento le porte del micro sono configurate tutte come ingressi con resistenza di pull-up interna.  

wpeB.jpg (13900 byte)

                                                                                                                                                                         Il pin TEST non viene mai utilizzato nel normale funzionamento e deve rimanere sempre collegato con la massa. Questo piedino viene usato esclusivamente dalla scheda di programmazione dello Starter Kit per il trasferimento dei comandi dal PC al micro (programmazione) o dal micro al PC (lettura della memoria). Continuiamo l'analisi con il piedino siglato NMI, "Not Maskable Intrerrupt" o interruzione non mascherabile. Vedremo in seguito che l'utilizzo di questo pin è indispensabili per molte applicazioni, ma prima di procedere alla sua descrizione facciamo una premessa per comprendere il significato di interruzione (interrupt). Con tale termine indichiamo un evento che interrompe il normale flusso di funzionamento del micro per deviarlo in una seconda direzione. Sappiamo che la CPU processa le istruzioni seguendo esattamente il loro ordine cronologico quello cioè con cui sono state "scritte" e memorizzate. Ne deriva che per poter gestire istantaneamente e in qualsiasi punto del programma un evento esterno o interno è necessario interrompere il programma principale per passare ad uno secondario specifico per quel tipo di evento. Il programma secondario viene chiamato subroutine di interrupt seguito dal nome di colui che l'ha causato, ad esempio subroutine di interrupt del timer se l'ha causato il timer, o dell'ADC se la causa è il convertitore analogico dogotale, oppure del pin NMI se appunto  la causa è una variazione dell'ingresso presente su tale pin. La famiglia ST62XX è molto completa da questo punto di vista controllando fino a 5 diversi livelli di interrupt. Ogni periferica interna, compresa quella di interfaccia e qiundi le relative linee di I/O, possono generare una interruzione del tipo mascherabile. Ciò vuol dire che le interruzioni possono essere, in funzione della specifica applicazione, gestite o ignorate (mascherate) dal programma. Al contrario l'interruzione causata dal piedino NMI viene sempre gestita: essa interrompe e devia sempre il programma allo scopo di ottenere una risposta immediata (in tempo reale) all'evento. Concludiamo la descrizione dei pin con quello siglato TIMER che come si intuisce fa capo al temporizzatore interno al micro ST6. Questo piedino, che viene gestito completamente e in maniera semplice tramite software, può essere utilizzato come ingresso per far partire il conteggio della periferica timer, oppure come uscita per attivare un dispositivo esterno allo scadere del tempo impostato nel timer. Con questo si termina l'analisi della parte esterna dei pin disponibili sul micro della famiglia ST6, passiamo ora ad analizzare la parte interna prendendo in esame il nucleo del microcontrollore.

 

LA CPU

La CPU (Central Processing Unit) rappresenta per il micro l'unità di elaborazione principale, contiene il "core" del micro che in inglese significa centro, anima o anche, in senso ovviamente figurato, cuore. Il suo compito è di leggere, interpretare ed eseguire le istruzioni presenti nella memoria programma. Per poter svolgere questi compiti la CPU deve essere collegata alle altre periferiche da un bus bidirezionale, deve contenere una unità matematica che chiamiamo ALU (Arithmetic Logic Unit), deve poter disporre di un contatore di programma (Program Counter), di un registro detto di "tasck", di un registro accumulatore, di un controller e, infine, dei "flags". Sicuramente questi termini suonano un pò come una lingua straniera, ma sono le parti principali di una CPU. Bene, possiamo affermare che nei micro della famiglia della SGS-THOMSON tutte queste componenti ci sono e sono anche potenti e completi. Vediamo dunque di approfondire il significato delle unità presenti nella CPU partendo dal Program Counter. Come specificato dal nome che lo identifica, contiene l'indirizzo del byte di memoria programma in cui è scritta l'istruzione da eseguire, esso risulta quindi il componente che tiene il conteggio delle istruzioni che la CPU deve processare una dopo l'altra. La CPU legge il Program Counter per sapere dove si trova la prossima istruzione da eseguire. Il Program Counter viene copiato, o meglio salvato, nello stack quando la CPU abbandona la normale sequenza d'istruzioni, quella cronologica, e si sposta in un altro punto della memoria programma. Per intenderci, questo tipo di salvataggio viene eseguito quando la CPU non processa l'istruzione successiva a quella conclusa. Vedremo, durante l'analisi di applicazioni software, che l'esecuzione di un programma non è sempre cronologico, ma anzi vi sono molti "spostamenti" da una parte all'altra della memoria programma. Alcuni di essi non necessitano del salvataggio del program counter, altri utilizzano invece lo stack. Nel primo caso lo spostamento avviene senza che poi ci sia la necessità di rotornare nella posizione abbandonata, nel secondo caso una particolare istruzione può riportare la CPU all'istruzione successiva a quella che ha causato lo spostamento. Dal numero di program counter che possiamo salvare deriva il numero di spostamenti consecutivi che si possono eseguire. Nel micro della famiglia ST6 esistono sei livelli di stack, ciò significa che possiamo eseguire un numero massimo si spostamenti consecutivi uguale a sei, quantità più che sufficiente anche per le applicazioni più complesse. La CPU viene gestita dal software attraverso cinque diversi registri a cui associamo la sigla di registro accumulatore, registro X, registro Y, registro V, registro W. L'accumulatore è il registro più importante all'interno della CPU e quasi tutti i comandi e le istruzioni software utilizzano per lo svolgimento questo registro. I registri X e Y vengono definiti anche come registri indiretti poichè il loro compito principale è quello di indirizzare in modo indiretto la memoria dati. I registri V e W vengono definiti short register e sono utilizzati per l'indirizzamento diretto della memoria dati. Capiremo meglio la funzione dei registri X,Y,V,W quando si andra ad analizzare i vari metodi di indirizzamento della memoria. Tutte le operazioni matematiche vengono svolta dall'unità ALU alla quale spetta anche l'aggiornamento del Carry flag e dello Zero flag. Questi ultimi sono sostanzialmente dei registri ad un solo bit che vengonoscritti dalla ALU al termine di una operazione matematica e che possono essere letti dal programma software per sapere se due numeri sono uguali o diversi, oppure quale dei due è il maggiore, oppure ancora se un numero è negativo o positivo. All'interno di un microcontrollore la sequenza degli eventi o meglio la velocità con cui questi avvengono è regolata dal clock di sistema, il Controller ne gestisce i segnali e li comunica alla CPU. Un'altro compito del controller è anche quello di ricevere eventuali segnali di reset che, come già visto, possono arrivare da più fonti interrompendo il normale funzionamento della CPU.

wpeB.jpg (28947 byte)

 

LA MEMORIA PROGRAMMA

La memoria programma viene gestita dal program counter, possiamo dividere la famiglia dei micro ST6 in due gruppi principali i quali sono diversi per la quantità di memoria disponibile: i micro appartenenti al gruppo ST621X dispongono di una memoria programma di 2 Kbyte, mentre i dispositivi del secondo gruppo ST622X e ST626X presentano una memoria programma di 4 Kbyte. Possiamo immaginare questa memoria come un'insieme di celle della capacità di un byte; ad ogni cella viene associato un numero che ne identifica la posizione e tale numero viene denominato indirizzo o locazione. A prescindere dal tipo di dispositivo, la memoria programma è a sua volta suddivisibile in tre parti: una prima parte riservata alla sola CPU, una seconda parte contenente il programma, ed una terza contenente i vettori di interruzione: le celle di memoria programma vanno dalla locazione 0000 Hex alla 0FFF Hex; l'area di memoria compresa tra gli indirizzi 0000 Hex e 007F Hex è dedicata al "core" del micro e non può essere nè letta nè scritta (per i micro ST621X è da 0000 Hex a 087F Hex); lo spazio di memoria programma compreso tra le locazioni 0080 Hex e 0F9F Hex, per complessivi 3872 byte, contiene il programma vero e proprio (0880 Hex a 0F9F Hex per i micro ST621X con un totale di 1828 Bytes). Quest'ultima area viene letta dal Program Counter della CPU e scritta dalla scheda di programmazione dello Starter Kit. Durante la fase di sviluppo del software attribuiremo alla prima istruzione la locazione 0080 Hex mentre l'ultima istruzione possibile sarà allocata alla 0F9F Hex. L'area di memoria compresa tra gli indirizzi 0FF0 Hex e 0FFF Hex contiene i vettori di interruzione, termine con cui indichiamo uno spazio di memoria il cui contenuto viene letto dalla CPU solo durante una interruzione o interrupt: per essere più chiari, mentre le normali istruzioni vengono processate una dopo l'altra, le istruzioni contenute nei vettori vengono eseguite in tempo reale dalla CPU quando avviene una precisa richiesta hardware. I vettori disponibili nei micro ST626X, sono sei e ognuno di essi occupa uno spazio di due byte, mentre quelli disponibili per i micro ST621X e ST622X sono sette e anch'essi occupano due byte ciascuno. Analizziamo subito le precise locazioni e le i8nterruzioni associate, tenendo presente che ogni vettore viene indicato con "#0, #1, #2 ecc.

- Iniziamo con il vettore RESET che viene letto dalla CPU all'atto della prima accensione o quando viene rilevato uno 0 logico sul piedino di Reset; la locazione di tale vettore è la 0FFE Hex e la 0FFF Hex.

- Le istruzioni contenute nel vettore #0 vengono eseguite quando la causa dell'interruzione è un segnale presente sul pin d'ingresso NMI; si tratta delle locazioni FFC Hex e FFD Hex.

- Il vettore #1, solamente per il micro ST626X, è associato alle periferiche di ingresso/uscita Port A e Port B e occupa gli indirizzi FF6 Hex e FF7 Hex. Per i micro ST621X e ST622X, il vettore #1 corrisponde alle periferiche I/O della Port A.

- Il vettore #2, per i micro ST626X, viene letto quando la causa dell'interruzione è la periferica Port C di I/O oppure la periferica seriale; le locazioni sono la FF4 Hex e la FF5 Hex. Per i micro ST621X e ST622X, il vettore #2 corrisponde alle periferiche di I/O della sola Port C.

- Il vettore #3 viene processato allo scadere del tempo imposta nel Timer autoricaricabile e i relativi indirizzi sono: FF2 Hex e FF3 Hex.

- Infine, il contenuto del vettore #4 viene letto quando scade il tempo impostato nel Timer 1, oppure al termine della conversione analogica/digitale (ADC): gli indirizzi occupati sono FF0 Hex e FF1 Hex.

MAPPA DEI VETTORI DI INTERRUPT PER ST621X E ST622X

SORGENTE DI INTERRUPT VETTORE ASSOCIATO INDIRIZZO DEL VETTORE
pin NMI vettore di interruzione #0 FFCh - FFDh
pins Port A vettore di interruzione #1 FF6h - FF7h
pins Port B e C vettore di interruzione #2 FF4h - FF5h
periferica Timer vettore di interruzione #3 FF2h - FF3h
periferica ADC vettore di interruzione #4 FF0h - FF1h
pin Reset vettore di reset FFEh - FFFh

 

MAPPA DEI VETTORI PER ST626X

SORGENTE DI INTERRUPT VETTORE ASSOCIATO INDIRIZZO DEL VETTORE
pin NMI vettore di interruzione #0 FFCh - FFDh
pins Port A e Port B vettore di interruzione #1 FF6h - FF7h
pins Port C vettore di interruzione #2 FF4h - FF5h
periferica Timer vettore di interruzione #3 FF2h - FF3h
periferica ADC vettore di interruzione #4 FF0h - FF1h
pin Reset vettore di reset FFEh - FFFh

 

 

LA MEMORIA DATI

Analizzando lo schema a blocchi dei micro della SGS-THOMSON osserviamo la presenza di due distinte aree di memoria, quella programma, che abbiamo già analizzato, e quella dati. Quest'ultima è di tipo RAM e può essere fisicamente rappresentata come l'insieme di 255 celle, ognuna capace di contenere un byte di dato e contraddistinta da un preciso indirizzo o locazione. La memoria dati può essere suddivisa in quattro aree distinte:

- La prima, denominata DATA RAM, è composta da 128 byte che vengono utilizzati dalla CPU per la memorizzazione temporanea di dati e di variabili. Lo spazio occupato dalla DATA RAM va dalla locazione 84 Hex alla BF Hex.

- La seconda area contiene invece i REGISTRI, termine con cui indichiamo delle celle di memoria dati fisicamente collegati a specifiche sezioni hardware.

- La terza area è riservata alla CPU la quale non può essere ne letta ne scritta e quindi non è gestibile dall'utente.

- La quarta parte è denominata DATA RAM WINDOWS e serve per prelevare alcune istruzioni depositate nella memoria programma in caso di particolari operazioni da far svolgere al micro.

wpeC.jpg (29057 byte)

 

I REGISTRI PER ST626X

I registri presenti all'interno dei micro ST626X sono parzialmente diversi da quelli contenuti nei micro dell'altra famiglia, poichè sono diverse le risorse disponibili. Al contrario, i registri del micro ST6260 risultano uguali a quelli dell'ST6265. I registri disponibili in questi micro sono ben 35 ed ognuno è contraddistinto da un numero esadecimale che ne identifica la precisa locazione all'interno della memoria e da una sigla mnemonica. Anche in questo caso è necessario imparare le sigle di tali registri poichè durante la stesura del programma dovremo frequentemente comunicare sia con la CPU che con le diverse periferiche. Elenchiamo ora brevemente i registri disponibili, la loro locazione e la loro sigla mnemonica. Iniziamo con quelli gestiti dalla CPU che sono 5 e vengono contraddistinti dalle lettere A, X, Y, V, W; essi occupano rispettivemente gli indirizzi FF Hex, 80 Hex, 82 Hex, 83 Hex.  I registri delle tre periferiche di ingresso/uscita sono 9, tre per ogni periferica, e vengono contraddistinti dalle seguenti sigle: DRA, DRB e DRC, posizionali nelle locazioni C4 Hex, C1 Hex e C2 Hex; DDRA, DDRB e DDRC, indirizzati nelle locazioni C4 Hex, C5 Hex e C6 Hex; infine, ORA, ORB e ORC, nelle locazioni CC Hex, CD Hex e CE Hex. I due registri del convertitore AD sono contraddistinti dalle sigle ADCR ( registro di controllo) con indirizzo D1 Hex e ADR (registro dati) con indirizzo D0 Hex. I registri del Timer 1 sono tre: TSCR 1 (registro stato, D4 Hex), TCR 1 (registro di controllo modo, D5 Hex)ePSC1(registro)prescalare. Il timer autoricaricabile viene gestito da ben 6 registri: ARMC (registro di controllo modo, D5 Hex), ARSC0 (registro stato 0, D6 Hex), ARSC1 (registro stato 1, D7 Hex), ARLR (registro load, DB Hex), RELCAP (registro cattura, D9 Hex), ARCP (registro compara, DA Hex). La periferica seriale comunica con il software tramite 4 registri ognuno caratterizzato da una funzione dedicata: DWR (registro di controllo dell'area programma, C9 Hex), IOR (registro opzioni di interruzione, C8 Hex), OSCR (registro di controllo dell'oscillatore, DC Hex), DWDR (registro del watchdog, D8 Hex).

TABELLA RIASSUNTIVA DEI REGISTRI CON LE ABBREVIAZIONI E GLI INDIRIZZI
REGISTRO ABBREVIA. LOCAZIONE ST622X LOCAZIONE ST626X REGISTRO ABBREV. LOCAZIONE ST622X LOCAZIONE ST626X
Accumulator A 0FFh 0FFh Timer TSCR Register TSCR 0D4 /
X register X 080h 080h Timer Data Register TCR 0D3 /
Y register Y 081h 081h Timer PSC Register PSC 0D2 /
V register V 082h 082h AR Timer Mode Control Register ARMC / 0D5h
W register W 083h 083h AR Timer Status/Control Register1 ARSC0 / 0D6h
Port A Data Register DRA 0C0h 0C0h AR Timer Status/Control Register2 ARSC1 / 0D7h
Port B Data Register DRB 0C1h 0C1h AR Timer Load Register ARLR / 0DBh
Port C Data Register DRC 0C2h 0C2h AR Timer Reload/Capture Register RELCAP / 0D9h
Port a Directio Register DDRA 0C4h 0C4h AR Timer Compare Register ARCP / 0DAh
Port B Direction Register DDRB 0C5h 0C5h SPI Mode Register SPIMOD / 0E2h
Port C Direction Register DDRC 0C6h 0C6h SPI Divider Register SPIDIV / 0E1h
Port A Option Register ORA 0CCh 0CCh SPI Data Register SPIDSR / 0E0h
Port B Option Register ORB 0CDh 0CDh Miscellaneous MISC / 0DDh
Port C Option Register ORC 0CEh 0CEh Data RAM/EEPROM Register DRBR / 0E8h
A/D Control Regiuster ADCR 0D1h 0D1h EEPROM Control Register EECTL / 0EAh
A/D Data Register ADR 0D0h 0D0h Data ROM Windows Register DWR 0C9h 0C9h
Timer 1 Status Control Register TSCR1 / 0D4h Interrupt Option Register IOR 0C8h 0C8h
Timer 1 Counter Register TCR1 / 0D3h Oscillator Control Register OSCR / 0DCh
Timer 1 Prescaler Register PSC1 / 0D2h Digital Watchdog Register DWDR 0D8h 0D8h

 

LE CELLE DI DATA RAM

All'interno della memoria dati oltre ai numerosi registri di controllo, notiamo la presenza, dalla locazione 084 hex alla locazione 0BF hex, di uno spazio di 60 byte denominato "DATA RAM". Questi byte di memoria RAM che possiamo chiamare anche con il termine "celle" rappresentano lo spazio dove il programma andrà a memorizzare i dati e le variabili; possiamo immaginare questo spazio di byte come una periferica di memorizzazione temporanea. Con particolari istruzioni di software possiamo scrivere in queste celle dati, variabili ed altre informazioni. La memoria RAM presente all'interno del micro ST6 risulta più che sufficiente per soddisfare la maggior parte delle esigenze; all'atto pratico gestiamo queste celle attraverso un nome associato: ad esempio se intendiamo realizzare un programma che conti il trascorrere di 10 secondi, utilizzeremo una cella di RAM in cui di volta in volta andremo a scrivere il numero dei secondi trascorsi. Il fatto interessante è che potremo chiamare questa cella TEMPO, oppure SECONDI, ovvero nel modo che più ci aggrada. La memoria RAM è di tipo "volatile" o temporanea, i dati rimangono registrati all'interno di questo tipo di memoria, solo fino a quando permane la tensione di alimentazione del micro; l'applicazione specifica della RAM è quindi la memorizzazione di variabili, utilizzeremo invece la memoria ROM o di programma per memorizzare le costanti. Queste ultime vengono definite in fase di programmazione attraverso delle particolari istruzioni denominate "equate" e contraddistinte dalla sigla "EQU".

Introduzione