Come passare un programma
Assembly scritto per 16F84 al 16F628 - II
|
Note
-
Una possibilità ulteriore è data dal fatto che F628 può lavorare a 4MHz senza
quarzo, utilizzando un circuito interno. Questo non è preciso come il cristallo
esterno, ma per applicazioni in cui il tempo di clock non è determinante,
permette di risparmiare componenti. Basterà scegliere l' opzione __INTRC nel
__CONFIG ed eliminare quarzo e condensatori relativi.
-
Last but not least, 16F628 si può programmare con lo stesso hardware di 16F84,
ma è necessario che il software del programmatore sia aggiornato a comprendere
anche il 628
- Però, anche 16F628 non è la scelta ottimale, in quanto non dispone della
possibilità di debug attraverso ISCP/ICD.
Variazioni sul tema
1 - Non usare il quarzo
Una possibilità ulteriore è data dal fatto che F628
può lavorare a 4MHz senza quarzo, utilizzando un circuito
oscillatore interno.
Questa opzione raramente è compresa a fondo: sostanzialmente è
possibile far funzionare gran parte dei progetti basati sul 16F84 SENZA usare
nè quarzo, nè condensatori.
Questa configurazione non origina temporizzazioni precise come può essere il
cristallo esterno, ma per applicazioni in cui il tempo di clock non è
determinante, permette di risparmiare componenti. Ad esempio, il classico
"blink-a-LED" o i LED Chaser o termometri e simili non hanno bisogno
del quarzo.
Basterà aggiungere l' opzione:
& _INTRC
nel __CONFIG. Entrando nei dettagli,
il registro PCON contiene il bit di controllo dell' oscillatore interno:
PCON |
bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
nome |
- |
- |
- |
- |
OSCF |
- |
POR |
BOR |
funzione |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
default |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
Quello che ci interessa è il bit 3, OSCF.
bit 3 OSCF
: Oscillator Frequency
1 =
oscillatore interno a 4 MHz (default al RESET)
0 =
oscillatore interno a 32 kHz
Per cui, non volendo utilizzare il quarzo, basteranno questa
modifiche:
; 16F628 @ 4 MHz con
oscillatore interno
#ifdef 16F628
LIST p = 16F628
#INCLUDE "P16F628.INC"
__config _BODEN_OFF & _CP_OFF & _LVP_OFF &
_MCLRE_OFF & _HS_OSC & _WDT_OFF & _PWRTE_ON &
_INTRC
#endif |
Al RESET il PIC parte con oscillatore interno a 4 MHz.
Ed ecco due macro per commutare l' oscillatore :
; internal clock macro
per 16F628
MHz MACRO
bsf STATUS,RP0
; banco 1
bsf PCON, OSCF
; 4 MHz
bcf STATUS,RP0
; banco 0
ENDM
kMHz MACRO
bsf STATUS,RP0
; banco 1
bcf PCON, OSCF
; 32 kHz
bcf STATUS,RP0
; banco 0
ENDM |
2 - Usare più RAM
Se si utilizza l' area aggiuntiva di memoria, va ricordato che essa è
suddivisa in più banchi, accessibili con i bit RP
dello STATUS, che sono 2 e non 1, come
detto prima.
Se ci si limita al Bank0 e 1, basta toccare solo RP0,
lasciando RP1=0. In questo caso si può
risparmiare linee usando una macro o un #define
e non BANKSEL.
Se si devono usare tutti i banchi, occorre agire su entrambi gli RP.
BANKSEL è di aiuto.
Però, soprattutto in nuove applicazioni, come per altri
processori della famiglia, per comodità e funzionalità, 16 bytes della RAM
sono accessibili in modo comune a tutti i banchi, dovunque ci si trovi nell'
esecuzione del programma, senza ricorrere ai bit RP1:0.
Questi bytes si trovano tra 70H e7FH. Sono particolarmente utili per
condividere dati durante le routines di interrupt (save e restore dei registri
principali).
Se si usa tutta la RAM, va tassativamente ricordato di aggiungere le linee di
programma necessarie per commutare i banchi.
3 - Se si usa la EEPROM
Se la EEPROM non è usata, dato che anche in F628 i TRIS sono
in banco 1, non ci sono problemi nella conversione da un processore all'
altro.
Se, invece, viene utilizzata la EEPROM, occorre maggiore lavoro.
Nel 628, i 4
banchi hanno in comune 16 bytes di RAM,
indirizzabile da 70H-7FH.
Questo significa che , che vuol dire che
in qualunque banco ci si trovi,
questi GPR sono sempre accessibili (sia allo stesso indirizzo che ai
suoi "multipli").
Se si utilizza la EEPROM è opportuno usare
questi 16 byte per le routine di interrupt e di lettura/scrittura della EEPROM
in modo da non dover aggiungere un gran numero di istruzioni per lo
scambio dei banchi.Poiche’
tutte le operazioni inerenti alla EEPROM e ai registri EEDATA
e EEADR
si fanno nel banco 1 settando RP0, e' consigliabile utilizzare per la RAM di
appoggio a queste operazioni, registri GPR appartenete ai 16 byte condivisi e
definiti nell'intervallo di indirizzo (70H-7FH), che
possono essere utilizzati da qualsiasi banco. Cosi facendo le routine della
EEPROM possono essere eseguite senza cambiare banco ovvero rimanendo l banco
1.
4 - Se si usano altri registri
Occorre verificare il listato sorgente per individuare dove si trovino
eventuali chiamate a registri non accessibili dal banco 0.
Però, soprattutto in nuove applicazioni, come per altri processori della
famiglia, per comodità e funzionalità, 16 bytes della RAM sono accessibili
in modo comune a tutti i banchi, dovunque ci si trovi nell' esecuzione del
programma, senza ricorrere ai bit RP1:0.
Questi bytes si trovano tra 70H e7FH. Sono particolarmente utili per
condividere dati durante le routines di interrupt (save e restore dei registri
principali).
Se si usa tutta la RAM, va tassativamente ricordato di aggiungere le linee di
programma necessarie per commutare i banchi.
5 - Usare le maggiori risorse di
PIC16F628
Per poter utilizzare le funzioni addizionali che 628 offre in
più rispetto a 84 (ad esempio i comparatori di tensione, i pin dell'
oscillatore come GPIO, il pin MCLR come
ingresso, l'UART, ecc.) occorre consultare il foglio dati e trovare un
tutorial adeguato. L' oggetto del presente tutorial è solo quello di
dimostare la fattibilità della sostituzione del PIC16F84 con il PIC16F628
6 - Programmare il chip
PIC16F628 si può programmare con lo stesso hardware di 16F84,
ma è necessario che il software del programmatore sia aggiornato a
comprendere anche il 628.
Nota finale
Per ultimo va considerato con attenzione un sorgente da
convertire in cui non siano state usate label, ma sia stato scritto con
la pessima abitudine di usare richiami diretti agli indirizzi dei vari
registri.
Con porcherie del tipo: :
btfs
03,1
goto $-4
incf 12,1 |
Purtroppo il WEB è piene di queste schifezze!
Si dovrebbe prevedere per chi scrive roba del genere il ritrovarsi in mano il
proprio listato a mesi di distanza con la necessità di capire come diavolo
faceva a funzionare e l' obbligo di convertire il medesimo per un altro
processore che abbia risorse poste ad indirizzi diversi !
Ovvero, scrivendo un sorgente, è del tutto ragionevole
utilizzare le regole, la sintassi, la forma e le label previste, pena la
necessità di riscrivere il tutto nel caso di una qualsiasi modifica.
Ora, dato che le label relative ai vari registri sono uguali per tutti i PIC,
o comunque stanno negli .inc relativi, ma gli indirizzi assoluti possono
essere diversi, di fronte ad un sorgente scritto in modo barbaro, occorre
verificare riga per riga che i richiami ai registri siano corretti ed
eventualmente modificarli per il nuovo processore.
L' ideale, comunque è non avere a che fare con simili sorgenti-immondizia
oppure riscriverle in modo più ragionevole, sostituendo label agli assoluti.
Note addizionali
Fino a qui si è parlato di PIC16F dotati della possibilità di
programmazione attraverso ICSP e di periferiche limitate. Questo è tipico dei
PICche il Costruttore vuole mantenere ad un costo competitivo, adatti per la
produzione di numerosi dispositivi uguali, dove anche pochi centesimi di
differenza sono fatto sensibile.
Ma si può avere di meglio !
Sono da tempo disponibili PIC16F che includono anche la funzione di
In-Circuit-Debugger (ICD), oltre a un set di periferiche più ampio.
Questo li rende ideali per lo sviluppo di programmi che poi potranno essere
passati ai processori più "piccoli" per la produzione.
Inoltre, la possibilità di seguire lo svolgersi del programma attraverso la
finestra di debug e gli economici, ma potenti tools di Microchip, ad esempio i Pickit, è indispensabile per chi voglia fare esperienza su questi componenti
così interessanti e, in generale, per l' auto apprendimento, per la didattica,
per la scuola.
Una scelta di gran lunga migliore, almeno per quello che riguarda questa possibilità,
rispetto a F84 e F628 è costituita da PIC16F88.e dal più recente PIC16F1827, sempre in package a 18 pin, che,
oltre alla possibilità di debug in-circuit, offre un impressionante numero
di periferiche e prestazioni addizionali, simili a quelle degli enhanced.
Il piccolo costo in più rispetto a F628 non è nemmeno da valutare in
relazione alle possibilità che questi chip offrono rispetto ai precedenti.
|