Tutorials - PIC

 

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:

  1. Alcune periferiche sono presenti in un chip, ma non in un' altro.

  2. Le condizioni al POR possono abilitare o meno alcune periferiche.

  3. Alcuni chip dispongano di weak pull-up su vari pin e/o configurabili secondo diverse regole

  4. Inoltre, i chip più recenti possono implementare l'APFCON - Alternate Pin Function Control, che permette di programmare per diverse funzioni uno stesso pin

  5. 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:

  1. 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.
     

  2. 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:

   bsf      03h, 5 

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: 
  1. Va osservato che RA5 funziona solamente come ingresso e non è programmabile come uscita.
     
  2. 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:

  1. 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
     

  2. 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.

  3. 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.

 

 


 

 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 17/05/12.