Tutorials - PIC

 

Come passare un programma Assembly scritto per 16F84 al 16F628 - II


Note

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

 


 

 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 21/10/10.