TITOLO - xoomer.virgilio.itxoomer.virgilio.it/giorgio.bonanni/DISPENSE/6DISPENSA PIC.doc · Web...
Click here to load reader
Transcript of TITOLO - xoomer.virgilio.itxoomer.virgilio.it/giorgio.bonanni/DISPENSE/6DISPENSA PIC.doc · Web...
IL MICROCONTROLLORI PIC 16F84 DESCRIZIONE DELLA STRUTTURA INTERNA
Indice degli argomenti:
- Confronto tra logica cablata e logica programmata
- Schema a blocchi e piedinatura del microcontrollore PIC16F84
- Funzionamento di un circuito in logica programmata
- Differenze tra microprocessore e microcontrollore
- Caratteristiche generali di un microcontrollore della famiglia PIC con particolare
riferimento al PIC16F84
- Analisi della memoria contenuta nel chip
- La ALU ed il registro accumulatore nel PIC 16F84
- Le Porte A e B
- Il TMR0 (timer 0)
- Il Prescaler
- Il Watchdog timer
- Il Registro STATUS
- Il Registro OPTION
- La tecnica di colloquio con i dispositivi esterni tramite polling ed interrupt.
- Il set delle istruzioni
- Come creare un programma per il microcontrollore PIC usando MPLAB
1
CONFRONTO TRA LOGICA CABLATA E LOGICA PROGRAMMATA
I circuiti logici sono quelli in cui i segnali possono assumere solamente due valori: livello
alto e livello basso.
Generalmente il livello basso assume la tensione di 0 volt, mentre quello alto assume la
tensione di 5 volt (sono i livelli TTL).
I circuiti in logica cablata sono realizzati collegando in maniera opportuna porte logiche e
flip-flop.
Esempi di circuiti in logica cablata sono: decodificatori, multiplexer, contatori etc…i quali
possono assolvere ad una sola funzione: quella per la quale sono stati progettati.
Ad esempio, un contatore di modulo 8 non può effettuare un conteggio con modulo
differente, se non si modifica il circuito, ossia il cablaggio.
I circuiti in logica programmata contengono, oltre alle porte logiche e flip-flop, anche uno o
più microprocessori o microcontrollori, che eseguono dei comandi memorizzati.
Un circuito in logica programmata possiede, pertanto, caratteristiche migliori in quanto può
assolvere funzioni differenti cambiando solamente il programma, ma non il cablaggio.
Generalmente un circuito in logica cablata è più semplice da progettare e realizzare, più
economico e più veloce; viceversa, quello in logica programmata è più complesso da
realizzare, più costoso e meno spedito nelle sue funzioni.
Oggi, questi svantaggi sono stati ridotti o eliminati, in quanto la velocità di esecuzione di
una singola istruzione del programma è scesa sotto il microsecondo ed il costo dei
microcontrollori si aggira intorno a pochi euro.
2
SCHEMA A BLOCCHI E PIEDINATURA DEL MICROCONTROLLORE PIC 16F84
La struttura interna di un microcontrollore PIC16F84 è la seguente
I blocchi principali che lo costituiscono sono:
- Una unità centrale di controllo che coordina i vari blocchi
- Una memoria riservata ai programmi o PROGRAM MEMORY (di tipo EEPROM)
- Una memoria riservata ai dati variabili o REGISTER FILE (di tipo RAM)
- Una memoria riservata ai dati fissi o DATA MEMORY (di tipo EEPROM)
- Una memoria STACK per gestire i sottoprogrammi
- Una unità aritmetico-logica ALU
- Un registro di lavoro W (Work)
- Il Program counter PC
- Un generatore ad onda quadra per il clock
- Due tipi di TIMER: il TIMER0 ed il WATCHDOG
- Due porte d’ingresso e uscita PORT A e PORT B.
Questi blocchi verranno spiegati meglio in seguito.
3
Il PIC16F84A è dotato di un totale di 18 PIN disposti su due file parallele da 9 PIN
ciascuna. I PIN RA ed RB rappresentano le 13 linee di I/O disponibili per le nostre
applicazioni, i PIN Vss e Vdd sono quelli di alimentazione, gli altri sono riservati al
funzionamento del PICmicro (ad esempio MCLR per il reset e OSC1-2 per il clock).
La piedinatura dell’integrato è la seguente:
4
FUNZIONAMENTO DI UN CIRCUITO IN LOGICA PROGRAMMATA
In un circuito in logica programmata sono sempre presenti:
- uno o più banchi di memoria,
- una unità centrale di controllo (CPU),
- una unità aritmetico logica (ALU) .
Parliamo inizialmente delle memorie.
Ogni cella di memoria è individuata da un numero che costituisce il suo indirizzo. Esse
sono raggruppate in banchi. Ogni cella di memoria può essere paragonata ad un cassetto
con un certo numero di scompartimenti (i singoli bit) ed un banco di memoria, invece, ad
una cassettiera.
Nel disegno seguente abbiamo un banco di memoria contenente 8 registri, ciascuno dei
quali formato da 8 bit.
Le operazioni che si possono fare sui registri sono semplici, ad esempio porre nel registro
di indirizzo 110 tutti i bit a zero (azzerare il registro 110) oppure spostare il contenuto da
un registro ad un altro.
I contenuti delle celle di memoria sono sempre i bit, ma questi possono rappresentare o un
numero in codifica binaria oppure un comando codificato (OPCODE di una istruzione).
5
Il numero dei bit di una cella è limitato, per cui possono contenere numeri codificati in
binario fino ad una quantità definita, oppure solo un certo numero di opcode diversi.
Parliamo ora dell’unità centrale di controllo.
L’unità centrale di controllo provvede ad eseguire ciclicamente le seguenti operazioni:
1) Prelevamento dalla memoria di una istruzione scritta in codice binario; l’istruzione
attraversa un insieme di fili (il bus dati) e raggiunge un registro della CPU.
2) Il dato prelevato, cioè l’istruzione, viene decodificato dall’unità centrale di controllo
che capisce di quale tipo di comando si tratti (trasferimento di dati tra registri,
operazioni logiche o aritmetiche, operazioni di controllo di flusso del programma
ecc).
3) Il comando viene eseguito, coinvolgendo eventualmente anche la ALU, e vengono
trovati i risultati.
Le tre fasi precedenti vengono chiamate in inglese: FETCH, DECODE ed EXECUTE.
L’indirizzo dell’istruzione da prelevare è contenuto in un registro chiamato PROGRAM
COUNTER (PC). Il codice della istruzione arriva alla memoria della CPU attraversando un
insieme di fili chiamato “bus degli indirizzi”.
Il PROGRAM COUNTER assume il valore 0 all’inizio e si incrementa automaticamente
durante l’esecuzione delle istruzioni.
Le istruzioni sono scritte in un opportuno codice binario chiamato “codice macchina” e ogni
processore capisce solamente il proprio. Per evitare che i programmatori debbano
conoscere tutti i codici macchina di tutti i processori in commercio, è stato inventato un
linguaggio chiamato ASSEMBLER, più vicino al linguaggio dell’uomo, e sono stati
realizzati dei programmi specifici, chiamati PROGRAMMI ASSEMBLATORI, a cui si è
affidato il compito di tradurre il linguaggio ASSEMBLER nel codice macchina del
processore utilizzato.
DIFFERENZA TRA MICROCONTROLLORE E MICROPROCESSORE
La differenza più evidente tra un microcontrollore ed un microprocessore è la seguente: in
un microprocessore la memoria che contiene dati e le istruzioni è unica ed esterna
all’integrato, mentre in un microcontrollore la memoria dati e la memoria programma sono
separate, ma entrambe contenute all’interno del CHIP dove si trova anche la CPU.
In un microprocessore la velocità di esecuzione delle istruzioni è molto elevata, ma un
microcontrollore ha il vantaggio di integrare al suo interno alcuni periferici d’ingresso e
6
uscita come: porte seriali e/o parallele, contatori e/o timer, convertitori analogico/digitali,
generatori di onde quadre ecc.
Con queste caratteristiche i microcontrollori si prestano ad essere utilizzati in
elettrodomestici, telecomandi, antifurti, strumenti di laboratorio, macchine a controllo
numerico etc…, nonchè sono facilmente utilizzabili in applicazioni in cui il programma,
una volta messo a punto, verrà raramente modificato.
CARATTERISTICHE GENERALI DI UN MICROCONTROLLORE DELLA FAMIGLIA PIC CON PARTICOLARE RIFERIMENTO AL PIC16F84
Vengono elencate di seguito le caratteristiche principali del PIC16F84:
1) Set ridotto di istruzioni (35), codificate su parole di 14 bit, eseguite tutte in un solo ciclo
macchina (4 colpi di clock), tranne le istruzioni di salto che richiedono 2 cicli macchina.
2) Dati a 8 bit .
3) Frequenza di clock che va dalla continua fino a 10 Mhz (tipica 4 Mhz), ottenibile o con
un quarzo o con un gruppo RC.
4) Memoria di programma non volatile di tipo EEPROM di 1024 x 14 bit
5) Un banco di memoria RAM diviso in due pagine organizzata in registri. Alcuni registri
hanno funzioni speciali mentre gli altri possono essere utilizzati liberamente (per
vedere numero ed utilizzo vedi disegno più avanti).
6) 64 byte di memoria dati non volatile EEPROM
7) 13 linee di ingresso/uscita organizzate in 2 porti PORT A di 5 bit e PORT B di 8 bit, con
controllo individuale della direzione, TTL compatibili e con alta corrente in uscita
(20mA) ed in ingresso (25mA). Alcune di queste linee possono essere utilizzate per
altri scopi quali richieste di interruzione conteggi ecc.
Un microcontrollore possiede poi delle caratteristiche, assenti nei microprocessori, ma utili
nelle applicazione di automazione e controllo.
Queste caratteristiche sono:
- l’autoreset all’accensione (ad ogni accensione il programma riparte dall’inizio da solo);
- la possibilità di porre da programma il microcontrollore in sleep, cioè in uno stato di
attesa, in cui l’esecuzione del programma si interrompe. In tale stato il consumo del chip
diventa minimo
7
- la presenza di watchdog timer attivabile da programma. Questo dispositivo genera un
reset se il contatore non viene opportunamente ricaricato. Questa ripartenza è utile per
sbloccare il microcontrollore da eventuali situazioni di malfunzionamento. Il watchdog
timer può comunque essere escluso quando non è necessario.
ANALISI DELLA MEMORIA CONTENUTA NEL CHIP
Come già elencato in precedenza il PIC16F84 contiene quattro tipi di memoria:
- Il program memory;
- Data memory;
- Il register file;
- Lo stack.
Il PROGRAM MEMORY è una memoria di tipo flash, non volatile ma cancellabile e
riscrivibile elettricamente, utilizzata per contenere il programma da eseguire. La sua
capacità è di 1024 locazioni, ciascuna formata da 14 bit. Ogni cella contiene un upcode
cioè il codice di una sola istruzione. Il programma quindi non potrà essere più lungo di
1024 istruzioni. Gli indirizzi vanno da 000h a 3FFh.
Il DATA MEMORY è una memoria non volatile di tipo EEPROM. La sua capacità è di 64
locazioni, ognuna formata da 8 bit. Essa contiene i dati fissi, è una memoria di tipo flash,
non volatile, ma cancellabile e riscrivibile elettricamente
Il REGISTER FILE è un insieme di locazioni di memoria RAM, ovvero una memoria
volatile in cui è possibile leggere e modificare il contenuto direttamente dal programma in
esecuzione. Il register file perde il suo contenuto quando il micro viene spento.
Le prime 12 locazioni della pagina 0 (da 00h a 0Bh) e le prime 12 locazioni della pagina 1
sono riservate alle funzioni speciali per il funzionamento del PIC e non devono essere
utilizzate per altri scopi
Le rimanenti 48 locazioni in pagina 0 indirizzate da 0Ch a 3Fh possono essere utilizzate
liberamente dai nostri programmi per memorizzare variabili, contatori, etc…
Attenzione! Molte celle sono duplicate nelle due pagine, cioè 2 indirizzi diversi possono
portare allo stesso contenuto. Il registro 03h ed il registro 83h infatti portano allo stesso
registro chiamato STATUS.
I registri specializzati del PIC vengono utilizzati molto di frequente nei programmi. Essi
riportano, ad esempio, lo stato di funzionamento dei dispositivi interni al PIC o il risultato di
operazioni aritmetiche e logiche.
8
E' necessario conoscere esattamente quale funzione svolge ciascun registro specializzato
e quali effetti si ottengono nel manipolarne il contenuto.
Per facilitare le operazioni sui registri specializzati, la Microchip ha inserito una lista di
nomi che identificano univocamente ciascun registro specializzato e a cui sono associati
gli indirizzi corrispondenti nell'area dei REGISTER FILE. Per utilizzare i nomi e non gli
indirizzi è sufficiente inserire nel source del programma una direttiva, chiamata INCLUDE.
Essa è la direttiva “P16F84.INC”.
Vediamo di seguito la mappa del REGISTER FILE
Parliamo ora di un banco di memoria molto particolare chiamato STACK.
Esiste una particolare operazione denominata “CHIAMATA A SUBROUTINE”, ovvero
un’interruzione momentanea del normale flusso di programma per "chiamare" in
esecuzione una serie di istruzioni, per poi ritornare al normale flusso di esecuzione.
Queste interruzioni vengono eseguite usando la memoria stack: questa parola in inglese
significa "catasta" ed infatti su questa catasta è possibile depositare, uno sull'altro,
più indirizzi e dati, per recuperarli, quando servono, durante una gestione di una
9
interruzione. Questo tipo di memorizzazione viene anche denominata LIFO dall'inglese
Last In First Out, in cui l'ultimo elemento inserito (last in) deve necessariamente essere il
primo ad uscire (first out). Grazie a questa caratteristica è possibile effettuare più CALL
annidate, ovvero l'una nell'altra e mantenere sempre traccia del punto in cui riprendere il
flusso al momento che si incontra una istruzione RETURN.
LA ALU ED IL REGISTRO ACCUMULATORE DI UN PIC 16F84L’unità aritmetico - logica è quella parte interna del microcontrollore dedicata
all’esecuzione delle operazioni aritmetico e logiche richieste dal programma.
Essa ha 2 ingressi ed 1 uscita.
Un ingresso è sempre un registro particolare esterno al file register che si chiama “registro
di lavoro” (W).
Il risultato dell’operazione può andare sia sul registro di lavoro stesso (W) che su un
registro del file register. Questo registro deve essere però lo stesso che è stato usato in
ingresso. La ALU del PIC lavora quindi sempre su non più di 2 registri.
LE PORTE A e B
Il PIC 16F84 possiede un totale di 13 linee dedicate alle operazioni di ingresso e uscita.
Esse sono distinte in 2 gruppi: Porta A (5 linee) Porta B (8 linee).
Ciascuna linea può essere settata individualmente come ingresso o come uscita. Per
stabilire quali delle linee saranno utilizzate come ingressi e quali come uscite, si deve
agire sui singoli bit di due registri che si trovano all’indirizzo 05h e 06h del banco 1 del file
register.
Questi 2 registri prendono il nome di TRIS A e TRIS B. Ogni bit del TRIS B è legato ad
una linea della porta B, i primi 5 bit del TRIS A sono legati alle 5 linee della porta A.
Se un bit del registro TRIS vale 0, allora la corrispondente linea è settata come uscita,
mentre se vale 1, la corrispondente linea è settata come ingresso.
Supponiamo ora che una linea sia settata come uscita. Da programma posso porre tale
linea ad una tensione 0 Volt oppure 5 Volt agendo su un registro di indirizzo 05h o 06h nel
banco 0 del file register; questo registro prende il nome di PORT A o PORT B.
Se la linea invece è settata come ingresso sarà l’esterno a scrivere un opportuno valore
nel registro PORT A o PORT B.
La relazione tra il valore binario all’interno del registro e la tensione sulla linea è la
seguente: Bit = “0” logico se la tensione è 0V, bit = “1” logico se la tensione è 5V.
10
IL TIMER0 (timer zero)
All’interno del PIC è presente anche un timer a 8 bit utile per eseguire delle
temporizzazioni.
Il segnale ad onda quadra che pilota questo timer può essere o un segnale esterno, in
ingresso al pin RA4, oppure un segnale interno legato al clock di sistema. È possibile
selezionare l’ingresso al TIMER tramite un’istruzione del programma ed è possibile ridurre
la frequenza di conteggio utilizzando un divisore di frequenza chiamato prescaler.
Il fattore di divisione è uguale a 2ⁿ-1, con n che va da 1 a 8.
Il valore di divisione del prescaler è modificabile via software ed è possibile incrementare il
conteggio sui fronti di salita o di discesa dell’onda quadra. Il Timer può generare una
interruzione ogni volta che il contatore passa da 255 a 0.
IL PRESCALER
Il Prescaler, come detto sopra, è un divisore di frequenza selezionabile via software.
Il valore di tale divisione va da un minimo di 2 ad un massimo di 256. Il valore della
divisione viene impostato tramite 3 Bit del registro OPTION (vedi più avanti). Il prescaler
può essere assegnato oltre che al TIMER 0 ad un altro timer chiamato WATCHDOG.
IL WATCHDOG TIMER
Il registro watchdog timer è un registro a 8 Bit che si incrementa con il clock di sistema.
Quando il valore passa da 255 a 0 si genera un reset e quindi una ripartenza del
programma dall’inizio. Il programmatore deve provvedere a ricaricare il watchdog timer in
maniera software, prima che il contatore arrivi a 0, tramite delle istruzioni di ricarica.
In condizioni di malfunzionamento, cioè nei blocchi del programma, queste istruzioni di
ricarica non vengono eseguite e quindi il watchdog timer, dopo un tempo abbastanza
breve, resetta il sistema e sblocca il programma.
11
IL REGISTRO STATUS
Il registro STATUS si trova nella zona riservata del file register duplicato in pagina 0 e in
pagina 1. L’indirizzo vale 03h. Ogni Bit del registro status è un flag (bandierina) che
segnala alcuni eventi avvenuti all’interno della CPU. Vediamo ora uno ad uno tutti gli 8 bit.
Bit 0 - viene chiamato CARRY, segnala la presenza di un riporto in un operazione fatta
dalla ALU.
Bit 1 - DIGIT-CARRY, segnala la presenza di un riporto a metà registro (dopo 4 Bit)
all’interno della ALU.
Bit 2 - viene chiamato ZERO, e segnala che l’operazione fatta dalla ALU ha dato come
risultato zero.
Bit 3 - viene chiamato Power-Down, e segnala che il controllore si trova in una situazione
di sleep.
Bit 4 - viene chiamato TIME OUT, e segnala se il watchdog ha raggiunto il valore zero ed
ha resettato il sistema
Bit 5 - viene chiamato Registro di Pagina, e segnala quale delle due pagine è attiva.
Bit 6 - e BIT 7 vengono chiamati IRP e RP1 ma non sono utilizzati nel PIC16F84 e nel
PIC 16C84.
bit nome significato0 C È posto a 1 quando c’è riporto dal bit più significativo (MSB)
1 DC È posto a 1 quando c’è riporto dal bit più significativo del primo semi-byte
2 Z È posto a 1 quando il risultato di un operazione logica o aritmetica è 0
3 PD\ È posto a 0 quando il controllore è in sleep
4 TO\ È posto a 0 quando il watchdog va in time-out
5 RP0 Seleziona il banco; se vale 0 agisco sul banco 0 e viceversa
6 e 7 IRP e IRP1 Non Utilizzati nel PIC16F84 e 16C84
12
IL REGISTRO OPTION
Il registro OPTION viene utilizzato per configurare il sistema. Esso si trova in pagina 1
all’indirizzo 01h. Il significato dei Bit viene espresso dalla seguente tabelle:
bit nome significato0 PS0 Primo bit del fattore di divisione per il prescaler
1 PS1 Secondo bit del fattore di divisione per il prescaler
2 PS2 Terzo bit del fattore di divisione per il prescaler
3 PSA Se vale 0 il prescaler è assegnato al TMR0 altrimenti è assegnato al watchdog
4 T0SE se vale 0 il conteggio viene fatto sul fronte di discesa altrimenti su quello di salita
5 T0CS Se vale 0 il TMR0 conta il segnale di clock interno altrimenti conta quello esterno
6 INTEDG Se vale 0 l’interruzione si genera sul fronte di discesa del segnale in RB0
7 RBPU\ Se vale 0 i resistori interi di pull-up sono disabilitati
TECNICA DI COLLOQUIO CON I DISPOSITIVI ESTERNI TRAMITE POLLING E INTERRUPT
Il microcontrollore viene spesso usato nella seguente maniera:
1) controlla gli ingressi;
2) esegue l’elaborazione;
3) modifica le uscite.
Il controllo degli ingressi può essere fatto testando ciclicamente tutti gli ingressi per
leggerne lo stato. Questa tecnica viene chiamata polling. Essa è abbastanza semplice da
realizzare, ma ha il difetto di essere lenta, in quanto il microcontrollore deve testare, ad
ogni ciclo, tutti gli ingressi, anche se questi non sono variati e questo può impegnare
anche in maniera pesante il controllore. Molto più efficiente è la tecnica chiamata interrupt.
In base a questa tecnica il microtrollore non testa ciclicamente gli ingressi, ma si accorge
che un ingresso ha modificato il suo stato, quando questo evento avviene. La modifica di
un ingresso, lancia al microcontrollore una richiesta di interruzione e questo provvede a
lanciare il sottoprogramma di gestione di questa interruzione. La gestione delle
interruzioni è abbastanza complessa da programmare ma rende il microcontrollore libero
13
di fare altre cose invece di testare se gli ingressi sono variati, come deve fare nella
gestione degli ingressi con la tecnica del polling.
Il PIC 16F84 ha quattro possibili sorgenti d’interruzione:
1) interrupt per cambiamento di stato della linea RB0
2) interrupt per overflow del TIMER0
3) interrupt per fine scrittura sulla EEPROM dati
4) interrupt per cambiamento di livello delle linee RB4, RB5, RB6, RB7.
Ciascuno dei quattro tipi di interruzione può essere comunque mascherato, ovvero inibito.
Questo è quello che faremo nei nostri programmi.
SET DELLE ISTRUZIONI
SINTASSI DESCRIZIONE OPERAZIONEADDLW k Add literal and W W=k+W
ADDWF f,d Add W and f d = W + f
ANDLW k AND literal, W W = W AND k
ANDWF f,d AND W, f d = W AND f
BCF f,b Bit Clear f F(b)=0
BSF f,b Bit Set f F(b)=1
BTFSC f,b Bit Test f, Skip if Clear F(b)=0? Se si salta 1 istr.
BTFSS f,b Bit Test f, Skip if Set F(b)=1? Se si salta 1 istr.
CALL k Subrutine Call Chiama il sottoprogramma k
CLRF f Clear f f = 0
CLRW Clear W W=0
CLRWDT Clear Watchdog Timer WDT=0
COMF f,d Complement f d = not f
DECF f,d Decrement f d = f-1
DECFSZ f,d Decrementa f, salta se 0 d = f-1, se d=0 salta una istr.
GOTO k Go to address k Salta all’istruzione k
INCF f,d Increment f d = f+1
INCFSZ f,d Increment f, skip if 0 d = f+1, se d=0 salta una istr.
IORLW Inclusive OR, literal with W W = W OR K
IORWF f,d Inclusive OR W with F d = f OR W
MOVLW k Move literal to W W = k
14
MOVF f,d Move f d = f
MOVWF f Move W to f f = W
NOP No operation Nessuna
OPTION Load Option Register Option = W
RETFIE Return from Interrupt Ritorna da un interruzione
RETLW k Return literal to W Ritorna da un sottop.Con W = k
RETURN Return from Subroutine Ritorna da un sottopro.
RLF f,d Rotate Left f through Carry Sposta a sx i bit di f usando C.
RRF f,d Rotate Rigth f through Carry Sposta a dx i bit di f usando C.
SLEEP Go into Standby mode Mette in Stanby il PIC
SUBLW k Subtract W from Literal W = k - W
SUBWF f,d Subtract W from f d = f - W
SWAPF f Subtract W from f d = f - W
TRIS f Load TRIS register Carica il TRIS con W
XORLW k Exclusive OR Literal with W W = W XOR k
XORWF f,d Exclusive OR W with f d = XOR W
- d è file di destinazione e può essere il registro di lavoro W o il file f
- b è il bit di un registro e può valere da 0 a 7
- k è un dato numerico o una etichetta (label).
COME CREARE UN PROGRAMMA PER IL MICROCONTROLLORE PIC USANDO MPLAB
Per creare un programma che può essere caricato nella memoria del PIC (Program
Memory) occorre effettuare i seguenti passaggi:
1) Creare un file testo con estensione ASM
2) Creare un file progetto estensione PJT
3) Compilare il progetto PJT per avere automaticamente, se non si hanno errori di sintassi,
un file HEX
La creazione del file ASM può essere fatto con qualunque editor di testo settato in modo
che non inserisca caratteri di controllo (l'editor di MPLAB, word pad o word) Il file deve
essere salvato come nomefile.ASM
15
La fase di creazione del file ASM viene fatta con MPLAB nella seguente maniera:
1) si apre MPLAB
2) si clicca sul menu "file" e poi "new"
3) si risponde "yes" alla domanda di voler creare un nuovo file
4) si chiude la finestra successiva
Abbiamo così la possibilità di scrivere in un file vuoto che per default si chiamerà
"untitled". Possiamo scrivere in questo file o salvarlo con il nome che vogliamo, usando
come estensione ASM (ad esempio "paperino.ASM"). Sia che abbiamo salvato il file vuoto
o meno con il nome "paperino.ASM", possiamo ora aprirlo e scrivere il programma
all'interno. Ricordarsi di salvare spesso il file per sicurezza. Finita la fase di editazione
del file "paperino.ASM" possiamo passare alla compilazione per creare il file esadecimale
che può essere caricato nel PIC. E' consigliabile chiamare questo file esadecimale con lo
stesso nome del file sorgente cioè "paperino.HEX" e per far questo occorre:
1) creare il file progetto cioè il file "paperino.PJT". Questo si ottiene aprendo il menù projet,
new e nella finestra che appare nominare "paperino.PJT" il file progetto che voglio
creare.
2) aggiungere al file "paperino.PJT" che voglio creare (add nella finestra che appare) il file
"paperino.ASM". Premere OK avremo un file "paperino.PJT"
3) Per creare il file esadecimale nel menù projet cercare "make proget" ed avremo la
compilazione. Se non ci sono errori avremo anche un file "paperino.HEX".
4) Se ci sono errori occorre rientrare nella fase di editazione e correggeli.
16