Riassunto sistemi elettronici
1. Definizioni
Sistema embedded: Con questo termine si identificano genericamente tutti quei sistemi elettronici di elaborazione digitale a microprocessore progettati appositamente per una determinata applicazione (special purpose) ovvero non riprogrammabili dall'utente per altri scopi, spesso con una piattaforma hardware ad hoc, integrati nel sistema che controllano ed in grado di gestirne tutte o parte delle funzionalità richieste.
Firmware: È un tipo di software che, ad esempio, è possibile trovare nei chip delle memorie ROM o Flash. I sistemi embedded spesso richiedono di essere attivi continuamente per anni senza errori, pertanto il software ed il firmware sono progettati e testati con molta più attenzione rispetto al software dei personal computer.
Architettura Von Neumann: Il computer ha un solo bus indirizzi e un solo bus dati, ed entrambi i bus servono sia Data che Program Memory (bus condivisi => accesso sequenziale).
Architettura Harvard: Ogni area di memoria ha il proprio bus indirizzi ed il proprio bus dati (bus separati => accesso parallelo).
Microprocessore: Il microprocessore è una tipologia particolare di circuito elettronico che si contraddistingue per essere interamente costituita da uno o più circuiti integrati e per questo è di dimensioni molto ridotte. Questa tecnologia è usata per la realizzazione della CPU.
Microcontrollore: Il microcontrollore si differenzia rispetto al microprocessore in quanto al proprio interno contiene normalmente anche una certa quantità di memoria RAM e di EPROM e vari dispositivi periferici integrati, come timer, convertitori AD etc. Si tratta dunque di un vero e proprio computer completo di tutto ciò che occorre per il suo funzionamento.
ROM: La ROM (Read Only Memory) è solitamente utilizzata per la memorizzazione delle istruzioni del programma.
RAM: Nella RAM (Random Access Memory) vengono custoditi i dati prodotti e impiegati durante l'esecuzione del programma. Rappresenta la Data Memory, composta da parole di 8 bit, con uno spazio di indirizzamento di 7 bit.
EEPROM: La EEPROM (Electrical Erasable Programmable Read Only Memory) serve per memorizzare i dati che devono essere conservati anche al termine del programma.
CPU: La CPU (Central Processing Unit) è l’unità che, comunicando con le varie periferiche interne attraverso i BUS, si fa carico di eseguire il programma ed elaborare i dati. Per esempio, l'esecuzione di un programma consiste nella lettura sequenziale da parte della CPU delle istruzioni memorizzate nella memoria di programma.
SRAM: La SRAM (Static Random Access Memory) è un tipo di RAM volatile che non necessita di refresh. I banchi di memorie SRAM consentono di mantenere le informazioni per un tempo teoricamente infinito, hanno bassi tempi di lettura e bassi consumi, specialmente in condizioni statiche. La necessità di usare molti componenti per cella le rende però più costose delle DRAM. Le celle di una SRAM sono costituite da un circuito retro-azionato formato da due invertitori logici le cui uscite sono collegate alle due estremità alle linee dei dati tramite due transistor detti porte di trasmissione. Le singole coppie di porte di trasmissione vengono abilitate a seconda della cella su cui deve essere effettuata la lettura o scrittura. Vengono rese disponibili sia il bit memorizzato che la sua negazione per un migliore controllo dei margini di rumore. Sono solitamente usate per le memorie cache, dove elevate velocità e ridotti consumi sono caratteristiche fondamentali.
DRAM: La DRAM (Dynamic Random Access Memory) è un tipo di RAM che immagazzina ogni bit in un diverso condensatore. Il numero di elettroni presenti nel condensatore determina se il bit è 1 o 0. Se il condensatore perde la carica, l'informazione è perduta: nel funzionamento la ricarica avviene periodicamente. Da qui la definizione di memoria dinamica, opposta alle memorie statiche come la SRAM. Per la caratteristica di perdere le informazioni in mancanza di energia, la DRAM viene definita anche volatile; è detta anche memoria solida.
2. Descrizione generale PIC16F887
Program Memory (PM): Anche detta FLASH, è la memoria in cui risiede il programma di controllo ed è composta da parole (word) di 14 bit, con uno spazio di indirizzamento di 13 bit (pari alla dimensione del program counter). La locazione 0000 contiene il reset vector. La locazione 0004 contiene l'interrupt vector.
Program Counter (PC): In cui viene memorizzato l'indirizzo della successiva istruzione da eseguire. Ha dimensione 13 bit, pari alla dimensione dello spazio di indirizzamento della ROM. PC è anche mappato in RAM.
Stack: Registro LIFO (Last Input First Output) temporaneo. Contiene 8 posizioni per il PC, in cui quest'ultimo viene salvato automaticamente alla chiamata di una sub-routine o all'esecuzione di un interrupt, e ripristinato al termine. Non accessibile da codice utente. Prima che il micro inizia ad eseguire la subroutine CALL o quando si verifica un interrupt, allora l'indirizzo della prima istruzione successiva a quella attualmente in esecuzione, è inserito nello stack; in questo modo, al return il micro sa da dove riprendere la normale esecuzione del programma.
Istruction Register (IR) e Decoder: Contiene l'istruzione da eseguire. Non accessibile da codice utente.
Working Register (W): È un registro per lo scambio dati tra le varie unità, quando queste non sono accessibili direttamente. Accumulatore per le operazioni aritmetiche ed il trasferimento dei dati da e verso la memoria.
Status Register (STATUS): Stato delle operazioni aritmetiche (Carry, Digit Carry, Zero), selezione banco RAM, informazioni su ultimo reset. Il registro STATUS è anche mappato in RAM.
ALU: Rete combinatoria che esegue operazioni aritmetiche e logiche. Agisce su due operandi di cui uno è W.
Port Registers: L'INPUT e l'OUTPUT del PIC avvengono tramite la lettura o scrittura dei Port Registers. La direzione del dato è definita tramite un bit di controllo nel Data Direction Register (DDR).
Special Function Registers (SFR): Sono registri mappati in RAM, ma la loro lettura o scrittura esegue determinate operazioni legate all'hardware. Scrivendo in queste locazioni si istruisce il micro ad eseguire determinate operazioni.
General Purpose Registers (GPR): Locazioni di memoria vere e proprie. Memoria di uso generale, tipicamente per contenere le variabili del nostro programma.
3. Linguaggio assembly
L’Assembly è un linguaggio di programmazione a basso livello ed è tra tutti i linguaggi quello più vicino al linguaggio macchina vero e proprio. Esso costituisce il cosiddetto ISA (Instruction Set Architecture) di un processore. I diversi ISA possono essere divisi in due grandi gruppi:
- Reduced Instruction Set Computer (RISC):
- Operazioni semplici e veloci;
- Grande abbondanza di registri per memorizzare i risultati intermedi;
- L'istruzione contiene sia il codice operativo che i dati o l'indirizzo ai dati;
- Complex Instruction Set Computer (CISC):
- Diversi livelli di complessità;
- Istruzioni per operazioni molto complesse;
- Differenti modalità di indirizzamento;
4. Schema di montaggio (building) di un programma
Compilatore: È un programma che traduce una serie di istruzioni scritte in un determinato linguaggio di programmazione (codice sorgente), in istruzioni di un altro linguaggio (codice oggetto).
Assembler: È un programma che trasforma le istruzioni mnemoniche dell'assembly in linguaggio macchina. Si tratta dunque di un compilatore per un particolare linguaggio assembly. Il termine assembler deriva dal fatto che le istruzioni vengono convertite e montate una accanto all'altra come se fossero in fila.
File oggetto: La compilazione e l'assemblaggio non si limitano solo a generare il codice macchina, ma un codice oggetto. Possiamo dire che il codice oggetto contiene all'interno il codice macchina, ovvero codice eseguibile, più una serie di informazioni che permettono al linker di unirlo, se richiesto, con altri codici oggetto per generare un programma eseguibile.
Linker: È un programma che effettua il collegamento tra il programma oggetto, cioè la traduzione del codice sorgente in linguaggio macchina, e le librerie del linguaggio necessarie per l'esecuzione del programma.
5. Istruzioni
Ogni istruzione è composta da un’etichetta, un codice operativo, un operando e un commento. Il codice operativo si può suddividere in:
- Byte Oriented: 'f' rappresenta il file register a cui è applicata l’istruzione, 'd' specifica la destinazione del risultato dell’operazione che rappresenta l’istruzione. (Es. ANDWF, CLRF, MOVF, MOVWF, DECF, SUBWF, …)
- Bit Oriented: 'f' specifica il file register a cui appartengono i bit, 'b' seleziona i bit coinvolti nell’operazione. (Es. BCF, BSF, BTFSC, BTFSS)
- Literal & Control: 'k' rappresenta il valore in bit su cui agisce. (Es. ANDLW, CALL, GOTO, MOVLW, RETURN, RETFIE, SLEEP, …)
6. Direttive
- UDATA: La direttiva UDATA indica l’inizio di una sezione dati, in cui è possibile riservare locazioni di memoria RAM da utilizzare come variabili. Se specificato un indirizzo, la sezione inizia a tale indirizzo (codice non rilocabile), altrimenti la sezione viene allocata automaticamente dal linker (codice rilocabile).
- RES: La direttiva RES riserva dimension byte nella zona UDATA.
- UDATA_SHR: Come la direttiva UDATA, ma il linker alloca la sezione dati in una porzione di RAM condivisa tra tutti i banchi. In questo modo le variabili definite possono essere indirizzate senza dover commutare il banco RAM.
- BANKSEL: La direttiva BANKSEL genera automaticamente il codice necessario per commutare il banco di RAM a quello in cui si trova l’indirizzo associato alla label indicata.
- PAGESEL: La direttiva PAGESEL genera automaticamente il codice necessario per commutare la pagina di ROM a quella in cui si trova l’indirizzo associato alla label indicata. Da utilizzare con le istruzioni CALL e GOTO.
- LIST: Direttiva che definisce il tipo di processore ed il set di radix.
- #INCLUDE: La direttiva #include permette di includere un file sorgente aggiuntivo.
- __CONFIG: Serve per settare correttamente i bit della Configuration Word. I PIC dispongono di un registro di configurazione hardware, che viene scritto una sola volta al momento della programmazione, e che stabilisce il funzionamento di alcuni circuiti interni, come il watch dog timer (wdt) e l’oscillatore di clock. Ogni programma per PIC inizia con una intestazione in cui si dichiara, oltre al tipo di micro usato e al formato di default dei numeri (decimale, esadecimale ecc...), anche la configuration word che ne determinerà il funzionamento (specificata con CONFIG).
- CODE: La direttiva CODE indica l’inizio di una sezione di codice (istruzioni assembly). Se specificato un indirizzo, la sezione inizia a tale indirizzo (codice non rilocabile), altrimenti la sezione viene allocata automaticamente dal linker in una zona di ROM disponibile (codice rilocabile).
- ORG: La direttiva di compilazione ORG (origine) serve per indicare all’assemblatore l’indirizzo fisico nella memoria EEPROM dove dovranno essere caricate le istruzioni successive. Generalmente un programma inizia sempre con ORG 0 per indicare che la prima istruzione dovrà essere caricata in memoria all’indirizzo zero.
- EQU: La direttiva EQU permette di definire un valore costante (noto a compile time).
- END: La direttiva END segnala all’assemblatore la fine del programma.
7. Sviluppo di codice per PIC
- Flow Chart
- Scrittura del programma in Assembly: Programma: Microchip MPLAB X IDE Editor.
- Compilazione: Compilazione del codice che può essere:
- Codice assoluto: Tutti gli indirizzi usati devono essere specificati nel programma e corrispondono agli indirizzi effettivi nella memoria RAM del PIC.
- Codice rilocabile: Possibile lasciare parte del lavoro di assegnazione degli indirizzi al Linker (un modulo che viene eseguito quando scegliamo Build All). Per programmi semplici le due scelte sono sostanzialmente equivalenti. Tuttavia per lavori più complessi la modalità Relocatable è generalmente preferibile, in quanto produce codice più pulito e più facilmente portabile da un PIC a un altro.
- Debugging: L'eliminazione degli errori di programmazione.
- Programmazione: Scrittura dell'eseguibile della memoria FLASH del PIC (Microchip AN1310 Serial Bootloader).
8. Lavoro con blocchi di dati
Le due tecniche utilizzate per lavorare con blocchi di dati sono:
- Indirizzamento indiretto e il File Select Register: Utilizzando il registro File Select Register (FSR), invece di embeddare un indirizzo nella instruction word, il valore immagazzinato nel FSR può essere utilizzato come un indirizzo per la data memory. Parliamo di indirizzamento indiretto. Il registro FSR viene invocato quando la locazione INDF è indirizzata: in realtà INDF non è un registro reale, semplicemente forza la CPU ad implementare una modalità di indirizzamento indiretto. Il vantaggio di questo metodo è che è possibile manipolare FSR come una normale locazione di memoria, per puntare la locazione desiderata nella data memory. Quando INDF viene invocato, l’istruzione usata allora agisce sulla locazione di memoria puntata da FSR.
- Look-up table: È un blocco di dati che viene tenuto in memoria, accessibile ed usato dal programma, in forma di subroutine. Ogni dato è associato ad una istruzione retlw (return from subroutine). Il valore di W agisce come pointer all’interno della sub-routine. La prima istruzione è sempre addwf pcl: il contenuto del registro W è aggiunto a pcl (lower byte del Program Counter). Una volta che il valore è stato sommato al PC, l’esecuzione del programma salta alla posizione corrispondente al numero, esegue la retlw e ritorna al main program (con il dato prelevato dalla look-up table). Ad ogni accesso alla look-up table vengono eseguite sempre solo due istruzioni addwf pcl + retlw (ovviamente prima della call alla look-up table. L’utente deve assicurarsi di avere pre-caricato W con il valore di offset necessario per il jump).
9. Clock oscillator
La scelta della sorgente di clock determina alcune delle caratteristiche di funzionamento fondamentali del microcontrollore. "Più veloce è meglio" in termini di operating speed e programming execution, ma non in termini di consumo di potenza e di interferenza magnetica. Due tipologie sono comunemente usate nei microcontrollori:
- Resistor Capacitor: Nel resistor-capacitor (RC) circuit, la capacità è caricata attraverso un resistore dalla linea di alimentazione. La tensione sul capacitore pilota l’ingresso di Schmitt trigger buffer. Quando la soglia del trigger di Schmitt viene superata, la sua uscita va alta ed il MOSFET connesso conduce. La capacità allora si scarica velocemente e l’uscita del trigger di Schmitt va bassa, il MOSFET è spento ed il processo di carica ricomincia di nuovo. Il segnale di clock è generato da questo ciclo di carica e scarica.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Appunti Sistemi Elettronici
-
Sistemi energetici - esame svolto
-
Sistemi energetici - esame svolto
-
Appunti Progettazione Sistemi Meccanici