Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
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 ISTRUCTION 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 ISTRUCTION SET COMPUTER (CISC):
- Diversi livelli di complessità
- Istruzioni per operazioni molto complesse
- Differenti modalità di indirizzamento
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.
ISTRUZIONI: Ogni istruzione è composta da un'etichetta, un codice operativo,
un operando e un commento. Il codice operativo sipuò 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, ...)
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 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 perindicare 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.
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 leggibile.
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).
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: E' 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).
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 è prelevato da una forma d'onda rettangolare generata all'uscita del trigger di Schmitt. Questo tipo
di circuito può essere interamente implementato on-chip. Ha un costo estremamente ridotto. Produce un segnale di clock molto affidabile. Ovviamente, come resistori, condensatori e alimentazione, la soglia del trigger di Schmitt varia con la temperatura, quindi la frequenza non è molto stabile e questa configurazione non può essere utilizzata quando sono richieste specifiche di timing stringenti.
CRYSTAL OR CERAMIC: Il crystal oscillator (oscillatore al cristallo) dipende dalle proprietà del cristallo piezo-elettrico. Ogni distorsione meccanica del materiale produce una tensione variabile ai suoi capi; allo stesso modo, se si applica una tensione al materiale, si avrà una distorsione meccanica del materiale. Un oscillatore al cristallo è un circuito elettronico che usa la risonanza meccanica di un cristallo piezoelettrico vibrante per ottenere un segnale elettrico caratterizzato da una frequenza molto precisa. Questa frequenza è comunemente usata.
Per mantenere una sincronia (come negli orologi al quarzo), per ottenere un segnale di clock stabile per i circuiti integrati digitali, e per stabilizzare la frequenza dei segnali nei trasmettitori radio.
INTERRUPT:
L'Interrupt è un meccanismo per mezzo del quale la normale sequenza di esecuzione delle istruzioni del processore può essere interrotta dal verificarsi di un evento esterno. Ad una richiesta di Interrupt, il processore avvia automaticamente una Interrupt Service Routine (ISR). Esso può essere generato da un evento hardware oppure un evento asincrono.
STRUTTURA HARDWARE:
L'Interrupt può essere mascherabile se può essere disabilitato oppure non mascherabile se non può essere disabilitato.
SCHEMA LOGICO:
INTERRUPT SERVICE ROUTINE:
Supponiamo che sia avvenuto un interrupt, e che sia i suoi local che global enable siano settati. L'interrupt è prima detectato dalla CPU ed esegue una speciale sezione di programma chiamata
Interrupt Service Routine (ISR).