Come passare un programma scritto per
Mid-range 16Fx agli Enhanced Mid-range (PIC16F1827).
|
Questa pagina NON intende fornire un tutorial per l' uso
del PIC16F1827, ma piuttosto una serie di informazioni rapide per sostituire pin-to-pin
un PIC16F, genere PIC16F628, con un Enahced Mid-range, tipo PIC16F1827,
16F1826, 16F1847, ecc.
1. - Pin to Pin
Innanzitutto, va detto che PIC 16F1827 è perfettamente pin
compatibile con tutti i PIC16 a 18 pin, quindi 16F84, 16F627, 16F628, 16F88,
ecc. per cui, non volendo utilizzare nessuna delle nuove
funzioni hardware, 16F1827 può essere installato sullo stesso zoccolo del
16F84A senza cambiare alcuna parte esterna o cablaggio.
Questa regola vale, in generale, per tutti i packages dei vari PIC.
|
Le funzioni di base dei pin nei vari package pin sono del
tutto identiche, così anche nel 18 pin.
Quello che cambia tra le varie famiglie sono le funzioni aggiuntive
che ogni pin può svolgere. Per cui, ad esempio:
pin |
Funzione base |
Funzioni addizionali |
16F84 |
16F628 |
16F1827 |
15 |
OSC2/CLKIN |
- |
RA6 |
RA6/P1D/P2B/SDO1/CLKR |
4 |
MCLR/Vpp |
- |
RA5 |
RA5/ SS1 |
12 |
RB6 |
- |
T1CKI/T1OSO |
AN5/CPS5/T1CKI/T1OSO/P1C
/CCP2/P2A/IOC/ICSP-ICDCLK |
|
Quindi:
La compatibilità pin to pin assicura una
equivalenza tra le funzioni basi nei PIC con uguale piedinatura.
I
diversi chip possono essere installati sullo stesso zoccolo senza
problemi di alimentazione o ICSP_ICD.
Quello che cambia è la disponibilità delle
funzioni addizionali. |
Per un dettaglio delle varie funzioni addizionali disponibili
occorrerà consultare il foglio dati di ciascun componente, in quanto è
possibile che:
-
Alcune periferiche sono presenti in un chip, ma non in
un' altro.
-
Le condizioni al POR possono abilitare o meno alcune
periferiche.
-
Alcuni chip dispongano di weak pull-up su vari pin e/o
configurabili secondo diverse regole
-
Inoltre, i chip più recenti possono implementare l'APFCON
- Alternate Pin Function Control, che permette di programmare per
diverse funzioni uno stesso pin
-
I chip più datati possono non disporre della funzione
ICSP-ICD oppure della programmazione LVP
Sarà tuttavia possibile, anche con una minima modifica al
__CONFIG, implementare una configurazione di funzioni base del tutto identica
tra i vari chip.
In conclusione. non ci sono problemi per una sostituzione
hardware diretta.
Azione 1: non occorre alcuna
modifica all' hardware
2. - Dichiarazione del processore
Per prima cosa, ovviamente, in testa al listato Assembly, la direttiva PROCESSOR
deve contenere il nome del nuovo processore.
Ad esempio:
Listato originario 16F84 |
Modifica per 16F16F1827 |
; Definizione del processore
LIST P=16F84
#INCLUDE "P16F84.INC"
|
; Definizione
del processore
LIST P=16F1827
#INCLUDE "P16F1827.INC"
|
Azione 2: sostituire la definizione e il file .inc con quello del processore
scelto
3. - Oscillatore
Non si tratta di una vera differenza, in quanto vari
PIC16F hanno la possibilità di funzionare con lo stesso sistema di
oscillatore esterno a cristallo o con oscillatore ceramico a capacità
integrate (3 pin) o con RC. Quindi, il classico hardware di base costituito
dal quarzo e due condensatori, collegati ai pin OSC1/OSC2 va bene in
qualsiasi caso.
Va però notato che i PIC meno datati possono operare senza quarzo
o latri componenti esterni, con un oscillatore interno. In particolare
PIC16F1827 può essere configurato per operare in una gamma
molto ampia di frequenze, da 31 kHz a 32 MHz con il solo oscillatore interno.
Questo fa si che valga proprio la pena di utilizzare questo modo, che è più che adeguato per gran parte delle applicazioni; si
risparmia materiale e si snellisce il lavoro, dato che le varie frequenze sono
programmabili e non occorre quindi un set di quarzi per verificare l'
applicazione a vari clock.
Ovviamente, se utilizziamo il classico oscillatore
esterno con cristallo e condensatori, l' hardware non richiede variazioni; però, eliminare quarzo e
condensatori relativi per un funzionamento da 31 kHz fino a ben 32 MH
programmabili, è una possibilità di cui tenere conto..
Come sempre, l' impostazione del modo oscillatore avviene nella dichiarazione
del __CONFIG. Occorre quindi assimilare questa parte del foglio dati per poter
padroneggiare la funzione:
-
I PIC16Fxxx solitamente hanno un ristretto
numero di modalità dell' oscillatore interno, spesso ridotto ad
un solo valore. Gli Enhanced 16F1xxx hanno invece un' ampia gamma
programmabile.
-
Non tutti i PIC con la modalità di oscillatore
interno a più valori partono per default con la stessa
frequenza. Quindi, volendo utilizzare l' interessantissimo
oscillatore interno, occorre verificare dal foglio dati quale sia
il default e, nel caso si voglia utilizzare un diverso clock,
programmare opportunamente il registro OSCCON.
|
Se si utilizza il classico quarzo a 4 MHz o
più:
Modifica per 16F1827
|
;
Configurazione per oscillatore esterno HS
__CONFIG _CONFIG1, _FOSC_HS
|
Ovviamente sarà necessario installare quarzo e
condensatori, in modo del tutto analogo a quanto fatto in precedenza.
La modalità di oscillatore interno è
selezionabile da CONFIG con l' opzione:
Modifica per 16F1827
|
;
Configurazione per oscillatore interno
__CONFIG _CONFIG1, _FOSC_INTOSC
|
In questo caso, la frequenza di avvio è 500 kHz e, se
desiderato un diverso valore, occorre agire sui bit IRCF<3:0> del
registro OSCCON all' inizio del programma:
Modifica per 16F1827
|
;
Passare il clock a 4 MHz dai 500 kHz del default al POR
; OSCCON - Oscillatpr control reg.
; ---------------------------------
; SPLLEN b7 --------:
abilitazione PLL x4
;
|
1=enabled 0=disabled
; IRCF |b6-3 -----: selezione
frequenza
;
||
1111=16 MHz HF
;
||
1110=8 or 32 MHz HF
;
||
1101=4 MHz HF
;
||
1100=2 MHz HF
;
||
1011=1 MHz HF
;
||
1010=500 kHz HF
;
||
1001=250 kHz HF
;
||
1000=125 kHz HF
;
||
0111=500 kHz MF (default)
;
||
0110=250 kHz MF
;
||
0101=125 kHz MF
;
||
0100=62.5 kHz MF
;
||
0011=31.25 kHz HF
;
||
0010=31.25 kHz MF
;
||
000x=31.25 kHz LF
; reserved || b2 ---:
reserved, 0
; SCS ||
|b1:0-: 1x=int. osc.
; || || 01=Timer1 oscillator
; || ||
00=determinato da FOSC<2:0> in Config
OSCCONVAL EQU
B'01101000'
; POR default 00111-00
banksel OSCCON
; seleziona il banco di OSCCON
movlw OSCCONVAL
; carica il valore voluto
movw OSCCON
; scrivi il registro
|
E' opportuno ricordare che nel PIC16F827 il clock interno
è programmabile a 32 MHz con il PLL 4x (16 MHz x4).
La lista completa delle modalità dell'
oscillatore si rileva dal foglio dati del componente. Nel caso di 16F1827
comprende le seguenti opzioni:
Modifica per 16F1827
|
;
Opzioni di configurazione per l' oscillatore
_FOSC_LP ; LP Low-power
crystal
_FOSC_XT ; XT
_FOSC_HS ; HS High-speed
_FOSC_EXTRC ; External RC circuit connected to CLKIN pin
_FOSC_INTOSC ; INTOSC oscillator: I/O function on CLKIN pin
_FOSC_ECL ; External Clock (0-0.5 MHz) to CLKIN pin
_FOSC_ECM ; External Clock (0.5-4 MHz) to CLKIN pin
_FOSC_ECH ; External Clock (4-32 MHz) to CLKIN pin
|
L' uso di un template adeguato è di notevole aiuto,
sopratutto le prime volte in cui si affronta il nuovo componente.
La sezione del foglio dati relativa all' oscillatore è
molto ricca e complessa, però, inizialmente, e per compatibilità all'
indietro, le varie funzioni
ausiliarie del modulo oscillatore (fail safe, dual source, ecc) possono essere
ignorate, dato che per utilizzarle occorre attivarle.
Azione 3: aggiornare il __CONFIG per la modalità di clock scelta ed eventualmente modificare nel programma il default dell'
oscillatore
4. - __CONFIG
La più complessa struttura hardware del' Enhanced Mid-range una
stringa __CONFIG più lunga.
Essa dovrà comprendere:
- il comando _LVP_OFF, che rende RB4 un I/O
- il comando _BODEN_OFF, se occorre disabilitare il BrownOut
detector, rendendo il generatore del reset compatibile con quello del 16F84.
- il comando _MCLRE_OFF per disabilitare la funzione di GPIO sul pin
di MCLR e lo rende compatibile con il 16F84.
Listato originario 16F84 |
; configuratore
__CONFIG _CP_OFF & _HS_OSC & _WDT_OFF &
_PWRTE_ON |
Modifica per
16F1827 |
; configuratore
__CONFIG _CONFIG1,
_FOSC_HS & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_ON
& _IESO_OFF & _FCMEN_OFF
__CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19
& _LVP_OFF |
Il CONFIG indicato NON sfrutta le possibilità di 16F1827, ma
semplicemente lo porta ad essere compatibile all' indietro con altri
PIC16F più anzianotti.
Va sempre osservato con energia che occorre insistere decisamente sulla critica alla
pessima abitudine di utilizzare valori assoluti e non label. Ovvero, la
formulazione:
Listato originario
16F84 |
Modifica per 16F628 |
; configuratore
__CONFIG 0x3FF1
|
; configuratore
__CONFIG 0x3D21 |
è totalmente insensata: sarebbe interessante conoscere chi, dal valore esadecimale
impostato, sa risalire alle condizioni di configurazione senza
consultare il foglio dati !!!
Chi usa questo sistema o non è a conoscenza di altri modi più intelligenti
o semplicemente copia da lavori altrui senza porsi minimamente il problema
del significato di quanto scrive.
Se utilizziamo una riga di CONFIG che abbia come oggetto un numero
esadecimale (o binario):
- il suo significato è criptico: occorre andare a scartabellare il foglio
dati e combinare i bit per capire in quale modo lo sciocco autore del
programma intendeva configurare il processore
- il valore cambia tra PIC e PIC e quindi la riga NON E' PORTABILE e deve
essere modificata
Invece, utilizzando la corretta modalità che fa uso dei simbolici:
- si comprende a prima vista cosa si vuole ottenere
- il passaggio ad un altro micro consiste solo in aggiunte (o eliminazioni)
di queste label
Sarà l' Assembler a combinare le label e a generare il corretto settaggio
dei bit dei registri di CONFIG.
Quindi, abolite, evitate, rifuggite, condannate quanto possibile la perfida
abitudine di esprimere il valore di configurazione attraverso un numero
esadecimale ed utilizzate esclusivamente la modalità corretta.
Azione 4: modificare la riga di CONFIG con quella adatta
al processore
5. - RAM
La memoria RAM utente è divisa in più banchi.
Il Banco 0 parte da parte da 20H.
Pertanto l' assegnazione della RAM dovrà tenerne conto. Ad esempio:
Listato originario 16F84 |
Modifica per
16F1827 |
; RAM start
Inizioram equ 0CH
|
; RAM start
Inizioram equ 20H
|
Fortunatamente un Assembler come MPASM consente di utilizzare statemente
condizionali per generare liste assemblate dipendenti dall' ambiente voluto,
attraverso comandi come:
- #define
- #ifdef / #ifndef
- #if / #else / #endif
Quindi è una buona idea per scrivere una fase di inizio adatta per entrambi
o più
processori:
; processor switch -
processore selezionabile
; porre come commento la linea che definisce il processore non usato
; (in questo esempio è definito 16F628)
;#define 16F84
#define 16F1827
; definizione del processore
#ifdef 16F1827
list p =
16F1827
#INCLUDE "P16F1827.INC"
__CONFIG _CONFIG1,
_FOSC_HS & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_ON
& _IESO_OFF & _FCMEN_OFF
__CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19
& _LVP_OFF
#endif
#ifdef 16F84
list p=16F84
#INCLUDE "P16F84A.INC"
__config _CP_OFF & _HS_OSC & _WDT_OFF & _PWRTE_ON
#endif
; RAM start
#ifdef 16F1827
StartRAM EQU 0x20 ; inizio area RAM per
16F628
#endif
#ifdef 16F84
StartRAM EQU 0x0C ; inizio area RAM per
16F84
#endif
......
; riserva memoria RAM
CBLOCK StartRAM
; inizio RAM dipendente dal processore scelto
; qui le label di assegnazione della RAM
ENDC
|
Azione 5:
modificare l' indirizzo di inizio RAM
ed inizialmente utilizzare un template adeguato
6. - I Banchi
Va ricordato che PIC16F1827 non si esime
dalla perfida situazione della memoria RAM divisa su più banchi:
RAM |
Bank |
|
20h - 6Fh |
Bank 0 |
80 bytes |
70h - 7Fh |
accessibile da ogni banco |
16 bytes |
A0h - EFh |
Bank 1 |
80 bytes |
120h - 16Fh |
Bank 2 |
80 bytes |
1A0h - 1EFh |
Bank 3 |
80 bytes |
220h - 24Fh |
Bank 4 |
48 bytes |
In compenso, però, oltre ad istruzioni addizionali per gestire meglio i
banchi, 16F1827 dispone di un sistema detto Linear Data Memory, che semplifica
ulteriormente l' accesso alla RAM.
Comunque, volendo mantenere la compatibilità all' indietro con quanto già
scritto, come per la gran parte dei
mid-range, si deve sguazzare in questi banchi (che nel caso di 16F1827 sono
ben 32)i alla ricerca del registro
desiderato e si debba tenere sempre sott' occhio la situazione, modificando il
banco di lavoro quando è necessario.
Questo non accadeva in F84 che, pur avendo due banchi, replicava pari pari i
registri in entrambi. Quindi, in qualsiasi banco di RAM si stesse lavorando,
l' accesso agli SFR era sempre assicurato senza necessità di azioni
speciali.
Se per questo processore la scrittura è:
Listato originario 16F84
|
; RB0 = 1
movlw 0x00, W
; Set PORTB come uscita
movwf TRISB
movlw b'00000001' ; RB0 = 1
movwf PORTB
|
per 16F1827 basta ricorrere allo pseudo opcode banksel,
in dipendenza del quale l' Assembler si aggiusta da se a trovare il banco
corretto del registro indicato:
Modifica per 16F1827
|
; Set PORTB come uscita
banksel TRISB
; banco 1
movf 0x00, W
; Set PORTB come uscita
movwf TRISB
banksel PORTB
; banco 0
movlw b'00000001' ; RB0 = 1
movwf PORTB
|
Un aiuto viene da MPASM che genera un warning, il [302]
che avvisa il programmatore ogni volta il sorgente richiama un registro non
in Bank 0, consentendo di tenere sotto controllo la situazione.
Va osservato che negli Enhanced Mid-range lo
STATUS Register NON contiene più i bit RP di passaggio tra i banchi,
passaggio che è implementato in modo diverso con il registro BSR -
Bank Select Register, in modo analogo ai PIC18F.
|
Quindi, le linee non sense tipo:
che fa riferimento a valori assoluti, non è nè portabile, nè tanto meno
applicabile agli Enhanced Mid range.
Peraltro anche la versione più sensata:
;
passa in banco 1
bsf
STATUS, RP0
|
non è applicabile. Di conseguenza, in attesa di apprendere l' impiego di BSR
o della Linear Memory, il classico
banksel è la soluzione ideale.
Per contro, si nota che in 16F1827, come in altri PIC16F, per comodità e funzionalità, 16 bytes sono
stati resi accessibili in modo
comune a tutti i banchi (access), dovunque ci si trovi nell' esecuzione del
programma, senza ricorrere allo switch dei banchi.
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.Il problema ovviamente non si
pone con i compilatori di linguaggi evoluti, a patto che abbiano il supporto per
gli Enhanced Mid range.
Se si trasla solamente il programma F84 senza alcun uso della
memoria addizionale, ovvero si usa solo la memoria in BANK 0, non occorrono
modifiche al listato per quanto riguarda la RAM.
Azione
6:
utilizzare banksel o comunque prestare attenzione alla posizione dei registri
nei banchi
7. - EEPROM
Particolare attenzione si dovrà usare nel caso in cui il programma da
convertire faccia uso della EEPROM, in quanto qui la questione può essere più
complessa nel caso in cui non èp stato utilizzato alcun sistema standard
per indirizzare i registri, usando stoltamente valori assoluti oppure in
riferimento al solo 16F84, dove, ad esempio, EEADR,
EEDATA non si trovano più nel BANK0 , ma in altro banco e quindi sarà
necessario agire sulla commutazione dei banchi.
Informazioni ed esempi di scrittura e lettura della EEPROM sono riportati sul
data sheet del componente.
Quindi la conversione di un sorgente che utilizza la EEPROM dovrà
tenere presente la necessità di modificare i riferimenti ai registri indicati e
di inserire le linee di
controllo per lo switch dei banchi. Il solito uso massiccio di banksel
è la via più semplice.
Azione 7:
occorre una azione di verifica
del giusto indirizzamento dei registri
8. - Gli I/O
Come abbiamo detto prima, i pin di 16F1827 possono assumere una gran
quantità di funzioni che chip precedenti non prevedono.
Questo è considerato un punto critico, ma in pratica non lo è.
O meglio, agendo con un poco di attenzione, la questione è del tutto
irrilevante.
In particolare se non si utilizza nessuna delle funzioni addizionali;
infatti il microcontroller prevede di aver disabilitate tutte le funzioni
extra sugli I/O, a parte quelle di general purpose.
Di conseguenza, se non si
effettuata alcuna attivazione di queste funzioni, è come se esse non
fossero presenti !
Restano comunque fissi i punti di default comuni ai i PIC dotati di
funzione ADC, ovvero:
- tutti i pin su cui è possibile una funzione di ingresso del modulo
ADC sono, al default del POR, configurati come ingressi analogici.
- tutti i pin su cui è possibile impostare un wake pull-up, lo
trovano abilitato al default del POR
|
Queste condizioni, apparentemente opinabili, sono invece giustificate dalla
scelta di imporre al Reset il minimo di consumo da parte del microcontroller,
mantenendo disabiliti quanti più moduli periferici possibile e assegnando ai
porta la situazione di minor assorbimento di corrente.
Ne risulta che occorrerà agire sugli opportuni registri per modificare
questi default quando non sono richiesti:
Quindi è una buona idea per scrivere una fase di inizio adatta:
; configura tutti
gli I/O come digitali
banksel
ANSELA
clrf ANSELA
clrf ANSELB
;
disabilta tutti i wakeup
pull-up
banksel WPUA
clrf WPUA
clrf WPUB
|
Va da sè che, come per ogni altro PIC16 gli I/O sono configurati al
default come ingressi. Quindi occorre agire sui registri TRIS se è
necessario utilizzarli come uscite.
Azione 8:
occorre una azione per
disabilitare la funzione di ingresso analogico e i pull-up se essi non sono
necessari
9. - MCLR
Un particolare presente anche in molti altri PIC oltre al 16F1827 è quello
del pin di MCLR/Vpp che, attraverso una linea del __CONFIG può essere
programmato come un ingresso digitale.
La funzione di MCLR esterna può non essere richiesta dall' applicazione,
mentre un GPIO in più è sempre gradito, sopratutto in PIC con package a pochi
pin:
#ifdef reset_active
; MCLR come MCLR
__CONFIG _CONFIG1, _MCLRE_ON
#else
; MCLR come RA5
__CONFIG _CONFIG1,
_MCLRE_OFF
#endif
|
Va compreso che nei PIC attuali un
circuito esterno di reset non è obbligatorio: se le condizioni dell'
applicazione non richiedono un segnale esterno di reset, il pin MCLR può
essere programmato come ingresso digitale per uso generico, attraverso il bit
MCLRE del registro di configurazione, diventando RA5. In queste condizioni, il
pin MCLR viene escluso dalla funzione di reset e il POR è generato
internamente in modo del tutto adeguato per la più ampia parte delle
applicazioni.
Invece il pin MCLR
è necessario per la Vpp durante la programmazione in-circuit (ICSP)
nel modo HV.
Quindi si dovranno seguire le condizioni relative.
NOTE:
- Va
osservato che RA5 funziona solamente
come
ingresso
e non è programmabile come uscita.
- Il fatto che il pin
sia fissato nel __CONFIG come RA5 NON ne esclude la funzione di
programmazione, che viene automaticamente abilitata dalla presenza
della tensione HV.
|
Un particolare da tenere presente è che al pin RA5 è associata una resistenza
di weak pull-up programmabile. In effetti il registro WPUA contiene
esclusivamente il bit per l' abilitazione di questa resistenza, che, di default
al POR, è abilitata:
; WPUA - Weak pull-up Port A
; -----------------------------
; reserved b7:6 ------: riservato, 0
;
|
; WPUA5:0 | b5 ------: WPU
su RA5 (se MCLR disabilitato)
;
| | 1=enabled
0=disabled
;
| | se
MCLR abilitato, WPUA5 sempre abilitato
; reserved
| |b4:0 ---:
riservato, 0
;
| ||
WPUAVAL EQU B'00000000'
; POR default --1-----
|
Quindi:
-
se MCLR è usato come MCLR può non servire una resistenza
esterna di pull-up, dato che quella interna è automaticamente abilitata
-
se MCLR è usato come RA5, la resistenza di weak up può
essere abilitata o meno, a seconda delle necessità
Azione
9:
se si utilizza MCLR come MCLR
esterno non occorre alcuna modifica
10. - CMCON
In PIC16F1827 i comparatori NON sono abilitati dal default, come invece
capita per altri chip (anche perchè una funzione di input analogico è già
impostata dagli ingressi dell' ADC). Di conseguenza non occorre alcuna
azione per disabilitarli al POR; occorrerà invece abilitarli se necessari.
Azione 10: non
occorre alcuna azione se non si intendono utilizzare i comparatori
11. - Altre periferiche
Abbastanza intelligentemente, praticamente tutte le funzioni addizionali
sono disabilitate al POR. Questo è anche nella logica del più basso
consumo: i moduli disabilitati non assorbono corrente.
Ne consegue che non occorre alcuna azione addizionale al default a riguardo
delle periferiche addizionali, che restano inoperose fino a che non vengono
abilitate dal programma.
Azione 11: non
occorrono azioni per escludere altre periferiche .
AVVERTENZA:
Va
osservato che, come per tutti i PIC, se viene abilitato un
modulo di periferica, la funzione di GPIO relativa ai pin di questa
periferica solitamente viene sovra passata dalla funzione
specifica del modulo e i pin interessati non potranno, ovviament,
essere utilizzati come I/O generici contemporaneamente alle funzioni
del modulo. |
In particolare, 16F1827 implementa l' APFC - Alternate Pin FUnction Control,
ovvero la possibilità di attribuire a diversi pin, alternativamente, la stessa
funzione relativa ad una periferica.
Due registri appositi, APFCON0 e APFCON1 gestiscono questo re indirizzamento.
Il loro default al POR è 00h, ovvero le attribuzioni di funzione ai pin sono
queste:
Funzione base del pin |
default alternativo al POR |
RB1 |
RX/DT |
RB2 |
SDO1 |
RB5 |
SS1 |
RB7 |
P2BSEL |
RB6 |
CCP2/P2A |
RB7 |
P1D |
RB6 |
P1C |
RB3 |
CCP1/P1A |
RB2 |
TX/CK |
Si nota come lo stesso pin possa assumere molteplici funzioni, a seconda di
quale periferica è abilitata. Ovviamente potrà essere utilizzato per una sola
funzione alla volta.
Però, se non attiviamo periferiche interne, APFC e le funzioni
alternative non hanno alcun peso e i pin sono dedicati ai loro GPIO
generici.
12.- Last but not least...
Valgono sempre le seguenti note di carattere generale:
Prima di iniziare la conversione di un vecchio sorgente per F84 o C84 e adattarlo
ad un 16F1xxx, è opportuno considerare i seguenti punti:
-
Non impegnarsi in un lavoro superiore alle proprie
possibilità. E' probabile che un sorgente complesso sia afflitto dal
problema della mancanza di documentazione e di commenti che potrebbero
essere indispensabili per chiarire e risolvere punti oscuri, dove non è
facile interpretare la logica di chi lo ha scritto.
Iniziate con cose semplici, per poi passare a quelle più complesse quando
avete un minimo di esperienza
-
Alla larga dai programmi scritti con la parte opposta
alla testa, ovvero quelli in cui sono utilizzati solamente valori assoluti e
$.
Programmi del genere sono portabili solo con grande fatica. Se proprio non
potete farne a meno, probabilmente è meglio prima aggiustare la situazione
sostituendo gli assoluti con label, quindi convertire.
-
Attenzione ai programmi scritti senza un
minimo di forma (template) o senza commenti: si può rivelare difficile
capire cosa il programmatore originale intendesse fare e come, sopratutto se
questo si va ad aggiungere al punto 2.
|
In particolare, non si smetterà mai di tenere viva l'
attenzione sui punti 2 e 3, che, quanto mai spesso, sono fonte di
fallimento per i principianti.
Azione 12: il sorgente, sia esso in Assembly o in C o in qualsiasi altro
linguaggio dovrà assolutamente essere nelle forme canoniche e dotato di
sufficienti commenti per permettere di essere riletto.
Per riassumere
Per riassumere i punti principali da osservare per convertire un
sorgente da 16F84 a 16F128 sono solo questi:
-
Azione 1: non occorre alcuna
modifica all' hardware
-
Azione 2: sostituire la definizione e il file .inc con quello del processore
scelto
-
Azione 3: aggiornare il __CONFIG per la modalità di clock scelta ed eventualmente modificare nel programma il default dell'
oscillatore
-
Azione 4: modificare la riga di CONFIG con quella adatta
al processore
-
Azione 5:
modificare l' indirizzo di inizio RAM
ed inizialmente utilizzare un template adeguato
-
Azione
6:
utilizzare banksel o comunque prestare attenzione alla posizione dei registri
nei banchi
-
Azione
7:
occorre una azione di verifica
del giusto indirizzamento dei registri
-
Azione
8:
occorre una azione per
disabilitare la funzione di ingresso analogico e i pull-up se essi non sono
necessari
-
Azione
9:
se si utilizza MCLR come MCLR
esterno non occorre alcuna modifica
-
Azione
10: non occorre alcuna azione
se non si intendono utilizzare i comparatori
-
Azione
11: non
occorrono azioni per escludere altre periferiche.
-
Azione
12: il sorgente, sia esso in Assembly o in C o in qualsiasi altro
linguaggio dovrà assolutamente essere nelle forme canoniche e
dotato di sufficienti commenti per permettere di essere riletto.
|
|