PIC tips & tricks
 
  Box
Passare dal 16F84A al 16F628A

Vedere anche:

Perché il PIC 16F84A è tanto popolare?

È molto probabile che sia perchè ci sono migliaia di esempi, in Internet e su libri e riviste, poiché è da anni che si progetta con il PIC16F84A essendo stato uno dei primi microcontroller di Microchip.

Il PIC16F84 è stato il primo microcontroller di Microchip ad essere fabbricato con tecnologia Flash. Questo accelerò ed economizzò il processo di sviluppo.
Oggi questo microcontroller è considerato obsoleto ed è stato rimpiazzato da altri modelli con migliori prestazioni e minore costo.
In questo appunto si descrive un'eventuale sostituzione con un PIC16F627/628/648, il quale è stato progettato per un uso intermedio tra il PIC16F84 ed i PIC16F877.

Confronto con alcuni PIC a 18 pin

PIC 16F... 84/84A 627A/628A/648A 818/819 88
Memoria programma (flash) 1k 1k (627A)
2k (628A)
4k (648A)
1k (818)
2k (819)
4k
Memoria dati RAM 68 bytes 224 bytes (627A)
224 bytes (628A)
256 bytes (648A)
128 bytes (818)
256 bytes (819)
368 bytes
EEPROM 64 bytes 128 bytes (627A)
128 bytes (628A)
256 bytes (648A)
128 bytes (818)
256 bytes (819)
256 bytes
Pin I/O utilizzabili 13 16 16 16
Timers 1 3 3 3
Oscillatore interno clock - 48 KHz
4 MHz
da 31 KHz
a 8 MHz
da 31 KHz
a 8 MHz
Modulo cattura/comp/PWM - 1 1 1
Convertitore A/D (canali) - - 5 (10bit) 7 (10bit)
Comparatori - 2 - 2
Riferimento di tensione - 1 - 1
Perif. Comunicaz. seriale - USART SPI, I2C AUSART,
SPI, I2C
Programm. a bassa tens. (LVP) - si si si
Costo (cat. RS) 9,41, 4 MHz
6,52, 20 MHz
1,80 (627A)
2,04 (628A)
2,31 (648A)
2,16 (818)
4,46 (819)
3,13

I microcontroller di Microchip sono stati progettati affinché il programmatore possa trasportare un programma di una famiglia di microcontroller in un altro compatibile, senza troppi cambiamenti.
Tuttavia, bisogna tenere conto che alcuni registri e flag cambiano locazione in memoria ed è necessario ridefinire i valori delle costanti EQU.
La maniera più semplice per modificare un programma, è quella di utilizzare i files di inclusione che fornisce Microchip (quelli con estensione .inc), i quali hanno le definizioni di tutti i registri, le costanti ed i flag. Approfittando di queste definizioni e della forma strutturata di programmazione, il cambiamento di famiglia dei microcontroller diventa meno critico e più facile.

In alcuni casi i registri speciali cambiano ubicazione ed in altri cambiano banco nella RAM. Sarà perciò necessario uno studio completo del programma, per verificare che l'introduzione di codice addizionale per cambiare banco non influisca sul funzionamento.
Bisogna tenere conto che i bit di cambio di banco IRP ed RP1 non si possono utilizzare per uso generale e si devono mantenere a 0.

Un altro problema che si presenta è che il PIC16F84 possiede 68 bytes di RAM per i registri di uso generale che sono accessibili da qualunque banco.
Questo rappresenta un problema perché la serie 16F627/628/648 ha 256 bytes di RAM ripartito in quattro banchi.
Qualunque accesso del programma ai registri dal banco 1 deve essere modificato affinché acceda solamente al banco 0 mediante l'associazione di istruzioni bcf RP0 e bsf RP0.

I registri di uso generale devono essere ricollocati a partire dalla locazione 20h e nel caso in cui non si possa aggiungere codice per il cambiamento dei banchi, si può approfittare degli ultimi 16 registri, i quali sono mappati in modo che vi si possa accedere da qualunque banco.
Il resto dei registri con funzioni speciali che corrispondono ai moduli periferici CCP1, USART, Comparatori, TIMER 1 e 2, possono essere utilizzati, ma non è consigliabile poiché possono generare interruzioni o funzionamento errato del programma.

Il PIC 16F627/628/648 possiede fino a 4 Kbytes di memoria programma a 14 bits, la quale rimpiazza perfettamente il PIC16F84 che possiede solo 1 Kbyte. Non è necessario nessun adattamento al programma e si può usare tutta la memoria rimanente per espanderlo.

 
 

Fig.1 - Funzione dei pin del 16F84A, 16F88, 16F628A e 16F819

Come vediamo nella figura 1, il PIC16F627/628/648 è compatibile pin a pin col PIC16F84, al quale sono state aggiunte funzioni specifiche extra, in modo di aumentare le sue prestazioni.
In questa maniera si ricollocano nel port B le funzioni speciali che tradizionalmente si trovavano nel port C.
La stessa cosa succede nel port A, dove si trovano gli ingressi analogici del modulo Comparatore e di Riferimento Interno. Perciò abbiamo disponibili in un microcontroller di 18 pin il modulo CCP1, il Comparatore interno e la Porta Seriale Asincrona.
Un altro miglioramento per l'aumento di I/O è la possibilità di utilizzare reset ed oscillatore interni, liberando i pin MCLR, CLKIN e CLKOUT e permetterne un uso generale.

Per essere compatibili col PIC16F84 si devono disattivare le funzioni secondarie che sono unite ai Port e pin di sincronizzazione, MCLR e CLK.
Nel caso del Port A si devono aggiungere due linee di codice al programma per disabilitare il modulo Comparatore e permettere l'uso di I/O digitali.
Il modulo di riferimento di tensione si disabilita durante il reset senza causare problemi.
Non è strettamente necessario aggiungere le due linee di codice, poiché il modulo comparatore si disattiva durante il reset, ma gli ingressi rimangono configurati come analogici e consumano corrente extra.

    CLRF PORTA       ;Inizializza PORT A
    MOVLW 0x07       ;Disabilita i comparatori e
    MOVWF CMCON      ;abilita i pin per funzioni I/O
    BCF STATUS, RP1
    BSF STATUS, RP0  ;Seleziona il Bank1
    MOVLW 0x1F       ;Valore per inizializzare la direzione dei dati
    MOVWF TRISA      ;Setta RA<4:0> come input
                     ;TRISA<5> viene sempre letto come ‘1’.
                     ;TRISA<7:6> dipende dal modo dell'oscillatore

Il Port B non richiede configurazioni extra perché i moduli periferici associati col Port B si disabilitano durante il reset. Queste periferiche non consumano corrente extra, né generano interruzioni quando sono disabilitate.

I pin MCLR, CLKIN e CLKOUT si impostano coi fuses di configurazione.
Bisogna tenere conto che ci sono stati alcuni cambiamenti nei fuses di configurazione tra la serie PIC16F62X e la serie PIC16F62XA, perciò si consiglia di utilizzare il codice di configurazione come si mostra di seguito.

    __config _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _BOREN_OFF &
             _MCLRE_OFF & _LVP_OFF & _CPD_OFF

Questo permette di utilizzare qualunque microcontroller senza preoccuparsi per l'ubicazione e la funzione dei fuses.
Per essere compatibile col PIC16F84 si deve aggiungere il codice della seconda riga per disabilitare le funzioni speciali che sono incompatibili.
Si deve anche tenere conto che ci sono quattro modalità del circuito oscillatore compatibili col PIC16F84, i quali sono XT, LP, HS ed RC modo esterno, mentre il resto è incompatibile.

Il PIC16F627/628/648 possiede 10 fonti di interruzione contro le 4 fonti di interruzione del PIC16F84. Questo obbliga a cambiare posto alla maschera di abilitazione EEIE ed il flag di interruzione EEIF del modulo EEPROM e ricollocarli nei registri PIE1 e PIR1 vicino alle altre fonti di interruzione.
Invece della maschera di abilitazione EEIE si usa la maschera di abilitazione di interruzione periferica PEIE che abilita l'interruzione dei moduli periferici.

Questo modulo lavora come nella versione del PIC16F84, ma in questo caso cambiano ubicazione alcuni registri e flag, per questo la routine di scrittura e lettura deve essere riorganizzata e bisogna cambiare il posto delle istruzioni BSF RP0 e BCF RP0. Le routine di lettura e scrittura EEPROM sono più semplici poiché i registri EEADR, EECON1, EECON2 ed EEDATA si trovano tutti nel banco 1, essendo necessario un solo cambiamento di banco in tutta la routine. Tenere conto che si deve abilitare la maschera di interruzioni periferica PEIE.

Qui sotto vediamo la mappa dei registri del PIC 16F627/628.


Registri del PIC16F627/628

( continua )

Ultima modifica  

 
Privacy Policy Cookie Policy