PICmicro. PICMICRO advanced 2

Il Program Counter (PC)
Il program counter è un registro/contatore interno al PIC, di 13 bit, e contiene l'indirizzo attuale della memoria programma, ovvero punta all'istruzione che deve essere eseguita, poi si incrementa di uno per puntare all'istruzione successiva.
Se pero l'istruzione è un salto, questo registro viene modificato per puntare all'indirizzo
desiderato.
Per potervi accedere, si fa uso di due registri: PCL (8 bit) che rappresenta la parte bassa, e PCLATH (5 bit);
vedremo meglio in seguito come utilizzare questi registri.

Programmatori
Per trasferire il programma realizzato dal pc al PIC, è indispensabile disporre di un programmatore.
Possono essere auto-costruiti, o acquistati; di quest'ultimi ne esiste una varietà infinita sia di ufficiali della MicroChip, sia realizzati da altre aziende.
I programmatori "fatti in casa" sono anch'essi vari, ma prenderà in esame soltanto i due tipi più diffusi: il JDM (o LudiPipo, o Multipipo) ed il ProPic2.

LudiPipo
E' semplicissimo da realizzare e si interfaccia tramite porta seriale, purtroppo non supporta tutti i PIC, in particolare quelli con la "A" finale nella sigla (es: PIC16F84A) che necessitano di una tensione e una corrente che spesso il pc non è in grado di erogare. Purtroppo non disponendo di un' alimentazione esterna, si otterrà un programmatore non-standard, che qualche volta potrebbe non funzionare correttamente.


Programmatore JDM

ProPic2 Clone
Il ProPic2 Clone (una versione semplificata del ProPic2) è invece in grado di programmare moltissimi PIC, e vale sicuramente la pena costruirlo; richiede due alimentazioni (12-14V e 5V), ma la seconda può essere ricavata dalla prima utilizzando, ad esempio, un LM7805.


Programmatore ProPic2 Clone

Componenti:
7x Resistenze da 4.7K, 1/4W
2x Transistor PNP BC327 o simile
1x Integrato 7407
1x Connettore DB-25 Maschio
1x LM7805

Sono facoltativi due LED sulle linee Vcc e Vdd, per assicurarsi che tutto funzioni, con resistenze rispettivamente di 330 e 1k ohm, mentre è consigliato l'uso di una resistenza da 10k per collegare il PIC alla tensione di programmazione Vpp.
Le linee Clock e Data corrispondono solitamente ai pin RB6 e RB7, comunque è sufficiente consultare i datasheet del PIC per accertarsene.

LM7805
L'LM7805 è un limitatore di tensione: applicando tra IN e GND una tensione di 8-30V, si ottiene tra i morsetti OUT e GND una tensione di 5V

Il programmatore in pratica
Personalmente uso con successo il ProPic2, realizzato in un pomeriggio su una basetta millefori, ma chi è più attrezzato può anche realizzare il PCB; in ogni caso consiglio di utilizzare uno zoccolo ZIF per estrarre più agevolmente i PIC.
Inoltre, inserendo nella basetta altri zoccoli (ad esempio da 28 e 40 pin), collegati opportunamente alle cinque linee (Vcc, Vdd, massa, Data e Clock), potranno essere programmati anche altri modelli come il PIC16F876 e 16F874, nonché le memorie seriali da 8 pin.

Alcuni programmatori hanno la caratteristica di utilizzare un unico zoccolo per programmare moltissimi modelli, nel nostro caso è assolutamente vietato usare lo stesso zoccolo per modelli aventi diverse pedinature, si rischia infatti di rovinare irreparabilmente il chip.

Un po' di e-shopping
Per chi non avesse tempo o le attrezzature (o la voglia) di realizzare il programmatore, è sempre possibile acquistarlo online, ad esempio:
- Yapp 4 Lite
- PicBasic
- Programmatore PIC 16F84
Qualunque sia l'acquisto, l'importante è che il programmatore disponga di alimentazione esterna per evitare spiacevoli sorprese.

Il Software
Una volta realizzato il programmatore, vediamo come si procede per trasferire il programma dal computer al PIC.
Si possono usare diversi programmi, il più diffuso è IC-Prog, ma consiglio anche WinPIC800 e WinPIC. Questi programmi offrono la possibilità di programmare moltissimi dispositivi con diversi programmatori, utilizzando un'interfaccia utente molto semplice e completa.
Prima di tutto dobbiamo configurare il programma a seconda del programmatore che abbiamo realizzato:
- Selezionare come programmatore "JDM Programmer" oppure "ProPic2 Programmer";
- Se si utilizza il ProPic selezionare le caselle "Invert MCLR" e "Invert Vcc".
- Selezionare la Porta utilizzata;
- Infine con Windows NT/2000/XP selezionare la casella "Enable NT/2000 Drivers" in
Settings->Options->Misc;

L'interfaccia grafica è molto semplice: in alto sono presenti le icone che ci serviranno, nelle due grandi aree vi sono la memoria-programma e la memoria-dati (EEPROM), sulla destra la configurazione del chip.
Si notano in particolare i Fuses, ovvero alcuni bit necessari alla configurazione del PIC; per i nostri scopi saranno
tutti disattivati, tranne PWRT che introduce un piccolo delay prima dell'accensione del chip in modo tale da permettere
all'alimentatore di stabilizzarsi.

Infine, ecco la procedura da seguire per programmare un chip:
1) Selezionare nell'apposita casella il modello del chip;
2) Aprire il file .hex generato dal compilatore;
3) Modificare il tipo di oscillatore;
4) Selezionare i config-fuses;
5) Iniziare la programmazione attraverso il tasto "Programma tutto";

MPLab
Per scrivere, compilare e testare i programmi realizzati faremo uso di MPLab, un completo ambiente di sviluppo per i PIC creato dalla Microchip: può essere scaricato gratuitamente qui.
Non mi dilungherà molto sulla descrizione di questo programma, ma ne descriverà le principali caratteristiche.
L'IDE è completamente integrato con il compilatore, perciò attraverso il menu Project si potrà iniziare la compilazione ed osservare il risultato nell'apposita finestra nella quale compariranno gli eventuali errori.
Selezionando l'MPLab SIM in Debugger->Select Tool, sarà possibile effettuare il debug passo-passo dell'applicazione
sviluppata, e sotto la voce View sono disponibili diverse finestre che contengono ad esempio i Registri e l'intera RAM, indispensabili per monitorare il corretto funzionamento del software.
Infine con lo Stimulus Controller si può interagire con i piedini dell'integrato, simulando i segnali esterni al PIC.

Le istruzioni
Le istruzioni comuni a tutte le famiglie di PIC sono 35 e sono
rappresentate da codici mnemonici spesso seguiti da uno o due
operandi.
E' bene tenere a mente che, nel codice mnemonico, compaiono
spesso 3 lettere che hanno un preciso significato:
- l = literal: una costante numerica;
- w = working register: il registro accumulatore;
- f = file register: un registro qualsiasi della RAM.

Possiamo classificare le istruzioni in:
- istruzioni per spostamento dati;
- istruzioni logico-aritmetiche;
- istruzioni di salto;
- istruzioni generali;

Istruzioni generiche

CLR clrf f Svuota il registro f f = 0
clrw Svuota l'accumulatore w = 0
BCF bcf f,b Mette a zero il bit b del
registro f
bit clear f
BSF bsf f,d Mette a uno il bit b del registro f bit set f
NOP nop Non fa proprio nulla no operation

Esistono anche altre funzioni che vedremo in seguito ed altre,
invece, obsolete.

	movlw	B'01100010'	; w = 01100010b
	movwf	0x0C		; il registro 0x0C = w
	bsf	0x0C,4		; f = 01110010b, è stato settato il bit 4 del registro 0x0C
Non bisogna dimenticarsi che i bit sono da 0 a 7, perciò il bit 4, non è
il quarto, bensì il quinto.

Spostiamo i dati

MOV movlw k Sposta una costante k in W W = k
movwf f Sposta il contenuto di W in un registro
f
f = W
movf f,d Se d=0 sposta il contenuto del registro
f in W, altrimenti copia f in se stesso (sembra inutile
ma non lo è!)
[d] = f
SWAP swapf f,d scambia tra loro i due nibble di un
registro; come prima la destinazione cambia con d
Esempio 0110 0011 => 0011 0110

Con f=0 viene utilizzato l'indirizzamento indiretto, infatti
il registro INDF, posto all'indirizzo zero, in realtà non esiste
ma permette di accedere ad un altro registro; quest'ultimo si
decide modificando il registro FSR.
Ad esempio se scrivo in FSR l'indirizzo della porta B (06h),
leggendo o scrivendo in INDF, in realtà sto interagendo con il
registro PORTB.

	movlw	0x05	; w = 5
	movwf	0x0C	; il registro all'indirizzo 0x0C ora vale 5 (00000101b)

	swapf	0x0C,1	; il registro 0x0C viene swappato, quindi vale 01010000b
	movf	0x0C,0	; w = f = 01010000b

Istruzioni Logico-Aritmetiche

ADD addwf f,d Aggiunge ad un registro f, il contenuto
di W
[d] = f + W
addlw k Aggiunge a W una costante k W = W + k
SUB subwf f,d Sottrae W ad f [d] = f - W
sublw k Sottrae W da una costante k W = k - W
INC incf f,d Incrementa di uno il registro f [d] = f + 1
DEC decf f,d Decrementa di uno il registro f [d] = f -1
AND andwf f,d Esegue l'AND bit a bit tra W ed f [d] = W AND f
andlw k Esegue l'AND bit a bit tra W ed una costante k W = W AND k
IOR iorwf f,d Esegue l'OR inclusivo tra W ed f [d] = W OR f
iorlw k Esegue l'OR inclusivo tra W ed una costante k W = W OR k
XOR xorwf f,d Esegue l'OR esclusivo tra W ed f [d] = W XOR f
xorlw k Esegue l'OR esclusivo tra W ed una costante k W = W XOR k
COM comf f,d Esegue il complemento a uno di f [d] = not f
RLF rlf f,d Ruota il byte in f verso sinistra [d] = f
RRF rrf f,d Ruota il byte in f verso destra [d] = f >> 1

Nelle istruzioni di rotazione (rlf e rrf) il byte viene fatto
passare per il carry, ciò significa che durante una rotazione
verso sinistra, l'ultimo bit non diventa il primo, ma l'ultimo
bit va nel carry ed il carry prende il posto del primo bit:

	; w = not (f + 10)
	movlw	10	; w = 10
	addwf	0x0C,1	; f = f + 10
	comf	0x0C,0	; w = not f

Istruzioni di salto

GOTO goto k Salta all'indirizzo k
CALL call k Come goto ma permette attraverso
l'istruzione return di tornare all'indirizzo
della call
BTF btfss f,b Controlla il bit b de registro
f, se è 0 esegue l'istruzione successiva, altrimenti la
salta
bit test f
skip if set
btfsc f,b Controlla il bit b de registro f, se è 1
esegue l'istruzione successiva, altrimenti la salta
bit test f
skip if clear
DEC decfsz f,d Decrementa f, se risulta zero salta l'istruzione
successiva, altrimenti la esegue
dec f skip
if zero
INC incfsz f,d Incrementa f, se risulta zero salta l'istruzione
successiva, altrimenti la esegue
inc f skip
if zero

Ogni salto richiede due cicli macchina (8 colpi di clock) per
essere eseguiti; istruzioni come btfss e decfsz vengono
detti "salti condizionati", mentre altre come call
e goto vengono dette "salti
incondizionati" perché non dipendono da altri fattori.

Istruzioni come decfsz e btfss, che vengono definite come

istruzioni di salto,
in realtà  non modificano il PC, perché se viene effettuato il salto, l'istruzione che segue

viene semplicemente
sostituita con un NOP.
	btfss	STATUS,C 		; salta se il carry è 1
	goto	Label1		; va all'indirizzo indicato da "Label1"
	....
	goto	End		; salta a "End"
Label1
	....
End
	....
MPLab
Come si può notare dagli esempi, per scrivere il codice assembly è necessario

rispettare alcune regole.
I numeri possono essere espressi secondo le tre notazioni più importanti:
- decimale: il numero va scritto così com'è (es: 10), se in testa al programma inseriamo la

direttiva RADIX DEC,
  altrimenti si usa la notazione D'10';
- esadecimale: il numero deve essere preceduto da 0x oppure seguito da h (es: 0x0A o 0Ah);
- binario: il numero deve essere preceduto da B e compreso tra apici (es:B'00001010' o B'1010');

Il codice è diviso in tre colonne: label, istruzioni e operandi; per definirle consiglio di usare il tasto TAB della
tastiera.
Le label (etichette) sono parole che sostituiscono un indirizzo della memoria
programma, vengono usate per eseguire i salti.

Tutto ciò che segue un ";" è un commento e viene ignorato dal compilatore.
Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend