Hitec-C Compiler : i nuovi nomi mnemonici che causano errori nei vecchi programmi

Recentemente è stata rilasciata la versione 9.81 del noto compilatore Hi-Tech C. Alla data attuale tale versione non è ancora inclusa nell’ultima release disponibile di MPLAB (la 8.63, scaricabile qui, e che contiene invece l’Hitec-C 9.80) e può essere comunque scaricata da questo link e installata a parte. MPLAB utilizzerà la versione installata di Hitec-C più recente.

Dall’uscita di questa versione 9.81 sono iniziati a comparire nei principali forum, e siti internet riguardanti i picmicro, richieste di aiuto in seguito al verificarsi di problemi di compilazione. Tutto questo perché, in questa nuova versione del compilatore, sono stati cambiati i nomi mnemonici di alcuni dei principali registri. In pratica i file header di tutti i pic ora riportano nuovi nomi mnemonici (ad esempio il registro OPTION ora si chiama OPTION_REG e così via), per cui andando a compilare i vecchi programmi, che con le versioni fino alla 9.80 funzionavano, ecco che si verificano errori del tipo :

Error [192] (...) Undefinied identifier "OPTION"

L’errore è chiaro: il compilatore ci sta dicendo che nel nostro programma ha incontrato la parola “OPTION” che non riconosce perchè non è definita da nessuna parte… ed ha ragione! Perchè ora nel file header del nostro pic, tale definizione ha cambiato nome! Il motivo di tale cambiamento è dato probabilmente dalla volontà di unificare i nomi dei registri per le varie classi di pic e renderli quanto più simili a quelli indicati sui datasheet o più chiari.

In aggiunta, adesso, se vogliamo spulciare l’elenco dei nomi mnemonici associati ai registri, tutto è diventato più semplice in quanto c’è un file header separato per ogni picmicro! Tanto per fare un esempio, dalla versione 9.81 dell’Hitec-C, il file header del PIC16F877A ora si chiama semplicemente pic16f877a.h mentre prima, con le vecchie versioni, si chiamava pic168xa.h (dal momento che serviva per più di un pic) … e difatti in molti non lo riuscivano a trovare proprio perchè il nome vecchio non sempre è semplice da afferrare.

Il bit RBPU, ad esempio, che serve ad attivare le resistenze di pullup sulle porte B, ora è divenuto nRBPU. Questo per indicare che il bit è negato, ovvero funziona con una logica inversa: tale bit va posto a zero per attivare la funzione e a 1 per disattivarla contrariamente a quanto potrebbe essere logico pensare. Difatti tale bit, come tutti i bit negati, è indicato nel datasheet con la scritta RBPU sopralineata. Questa nuova nomenclatura dovrebbe quindi aiutare a ricordarsi come funzionano questi bit.

L’elenco dei cambiamenti purtroppo non è indicato nei manuali. Nella release note dell’Hitec-C 9.81, disponibile a questo indirizzo si legge a pagina 6:

New header file generation (9.81) Header files in the 9.81 version are now generated from a central database rather than being hand crafted. This may mean that the names of some SFRs or bits within SFRs in the new header files may be different to those in the header files that were previously used by the compiler. The header files that were previously shipped with the compiler are no longer maintained, but are supplied with this version of the compiler and can be used by defining the macro _LEGACY_HEADERS. Ideally, this macro should be defined using the compiler’s -D option, or in the Define macros field in the Compiler tab of the MPLAB IDE Build Options dialog. If you use a #define to define this, make sure you place this above the line which includes <htc.h>. The legacy include files are located in the legacy directory, inside the include directory of the compiler.

In pratica viene detto che ora i file header, e quindi i nomi mnemonici associati ai registri, vengono generati a partire da un database centralizzato anzichè compilati a mano. Questo ovviamente è una garanzia di coerenza. Viene quindi illustrato anche come aggirare il problema in maniera semplice. Le nuove versioni, difatti, oltre ai nuovi file headers, con i nuovi nomi mnemonici (che si trovano sempre nella cartella \include), hanno ancora gli headers vecchi contenuti nella cartella \include\legacy. Anzichè pasticciare con lo spostamento dei files o la ridenominazione dei registri ci basta seguire il consiglio chiaramente specificato nella release note: per far richiamare gli headers “vecchi” al posto di quelli nuovi, basta includere:

#define _LEGACY_HEADERS

prima della riga

#include <pic.h>

o, se usiamo includere htc.h,  prima della riga

#include <htc.h>

Ricordo nuovamente che htc.h, quando andiamo a programmare un pic, include pic.h, il quale a sua volta include l’header del pic che stiamo usando. Per cui nel caso della programmazione dei pic o includiamo htc.h, o pic.h, non cambia nulla.

Il file header pic.h, difatti, include a sua volta un altro header: chipselect.h, è questo file che esegue il controllo della macro _legacy_headers ed eventualmente include i vecchi nomi mnemonici, tale header difatti non è presente nelle versioni di hitech-c precedenti alla 9.81 ed assolve unicamente a tale funzione.

Un altro sistema, se non vogliamo includere questa riga nei nostri programmi, è quello di includere tale define direttamente nelle opzioni del compilatore per il progetto corrente. Dal menù project selezioniamo Build Options -> Project:

Nella finestra che si presenta, alla scheda “Compiler”, scriviamo “_LEGACY_HEADERS” nella zona indicata come da figura seguente:

Premiamo quindi il pulsante Add, in automatico da ora in poi, per questo progetto, la macro sarà definita in automatico senza doverla includere nel codice:

In ogni caso sconsiglio questo secondo sistema perchè fa perdere di vista un passaggio importante della compilazione. Per attenersi ad un processo di standardizzazione inevitabile consiglio piuttosto di cambiare i nomi mnemonici. Trovare i nuovi nomi non è un’ operazione difficile in quanto, andando a compilare, gli errori restituiti fanno capire chiaramente quali sono quelli non più validi, poi basta mettere mano al file header del nostro pic per trovare il nuovo nome.

In ogni caso, allego qui sotto una tabella (probabilmente non esaustiva) riportante i vecchi nomi mnemonici del PIC16F877 utilizzati fino alla versione 9.80 (compresa) affiancati dai rispettivi nomi usati nella versione 9.81:

CONFIGURATION BITS
Hitec-C fino a 9.80 (compresa)Hitec-C da 9.81 in poi
RCFOSC_EXTRC
HSFOSC_HS
XTFOSC_XT
LPFOSC_LP
WDTENWDTE_ON
WDTDISWDTE_OFF
PWRTENPWRTE_ON
PWRTDISPWRTE_OFF
BORENBOREN_ON
BORDISBOREN_OFF
LVPENLVP_ON
LVPDISLVP_OFF
DPROTCPD_ON
DUNPROTCPD_OFF
WRTENWRT_OFF
WP1WRT_256
WP2WRT_1FOURTH
WP3WRT_HALF
DEBUGENDEBUG_ON
DEBUGDISDEBUG_OFF
PROTECTCP_ON
UNPROTECTCP_OFF

ADCON0
Hitec-C fino a 9.80Hitec-C da 9.81 in poi
ADGOGO
GODONEGO_DONE

OPTION REGISTER
Hitec-C fino a 9.80Hitec-C da 9.81 in poi
OPTIONOPTION_REG
RBPUnRBPU

PCON 
Hitec-C fino a 9.80Hitec-C da 9.81 in poi
PORnPOR
BORnBOR

SSPSTAT
Hitec-C fino a 9.80Hitec-C da 9.81 in poi
DAD_A
STOPI2C_STOP
STARTI2C_START
RWR_W

Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)