Vai al contenuto
PLC Forum


PIC "C" da PICCLITE a CCS - Cosa cambia?


elsabz

Messaggi consigliati

Ciao a tutti,

tempo fa ho realizzato una applicazione con il PIC 16F877A. Ho creato con successo un programma in linguaggio C con il compilatore PICClite della HITECH-Software, integrato in MPLAB 7 con ICD2. Adesso mi trovo nella condizione di dover prendere una decisione per poter ampliare il progetto. In pratica vorrei provare il compilatore CCS, visto che i costi sono decisamente inferiori rispetto alla versione licenziata della HITECH-Software (125,00 EURO contro 1000,00 EURO). Quello che vorrei sapere è se il codice sviluppato con PICCLITE è portabile con facilità in CCS. Sicuramente il linguaggio C ha una elevata portabilità, quello che mi preoccupa sono le cose critiche. Detto questo vorrei porre alcune domande in merito:

1.) il file heder pic.h che ho incluso nel progetto con PICCLITE c'è anche con il CCS uno uguale o simile?

2.) l'interrupt nel PCCLITE lo ho gestito con la funzione di sistema

void interrupt inter(void)

, nel CCS come avviene questo?

3.) Come mai il compilatore CCS costa cosi tanto in meno? Ci sarà un motivo!?!

Grazie in anticipo a chi volesse cortesemente rispondermi!

Saluti

Sergio

Link al commento
Condividi su altri siti


Ciao elsabz, con CCS devi inserire il file .h che ti viene fornito in libreria.

la gestione degli interrupts è simile, cambia solo un poco la forma. Comunque trovi tutto nell'ottimo help on line del Compilatore.

Le differenze di prezzo stanno prima di tutto nelle politiche commerciali. CCS si rivolge ad un target diverso di Hitech. Poi c'è anche un'ottimizzazione forse migliore in Hitech, ma non sempre.

Link al commento
Condividi su altri siti

Ciao Livio,

si ho visto che c'è tutto sul sito della CCS. Ho anche già provato ad installare la versione demo del compilatore PCM for 14bit MCUs e ho iniziato la migrazione. Subito ho notato che gli identificatori che usa PICCLITE (pic.h) sono diversi da CCS, il cui file header è nella libreria come hai detto tu (16F877A.h). Mi sembra che le differenze sono abbastanza consistenti, ma penso che ne valga la pena visto il gran risparmio. Ad esempio con PICCLITE per impostare un TRISA basta scrivere

TRISA=0b00011111;
, mentre con CCS bisogna scrivere
SET_TRIS_A(0b00011111);
. Adesso sto cercando di capire come settare PORTA. Un'altra questione che mi sono posto e come si fa nel CCS ad accedere ad una variabile del bank1. Nel PICCLITE bastava dichiarare
bank1 int pippo;

, nel CCS non so ancora magari se qualcuno me lo può suggerire gliene sarei grato.

Ciao

Sergio

Link al commento
Condividi su altri siti

Oggi il forum mi sembra strano! Mi chiede continuamente la userid e password pur essendo già loggato, non riesco a capire cosa succede!

A parte questo, trovo anche strano il compilatore CCS, non riesco a comprendere come posso settare il registro ADCON1, con PICCLITE basta scrivere

ADCON1 = 0b00000110;

, con CCS come si fà?

Nel manuale ho trovato la funzione SETUP_ADC_PORTS() ma non riesco a capire come posso fare per settare il valore del registro come lo voglio!

Grazie

Sergio

Link al commento
Condividi su altri siti

Vai nell'help e confronta le "built in functions", guarda anche i files di esempio che vengono citati. Se proprio sei in difficoltà ti posto un esempio (appena riesco a reperirlo nei meandri degli archivi)

Link al commento
Condividi su altri siti

Forse ho trovato la soluzione:

premesso che gli identificatori che con PICCLITE erano riconosciuti con CCS non lo sono, ho dedotto che mi devo creare tali identificatori. Quindi se scrivo

#byte ADCON1 = 0x9F
dico al preprocessore che ADCON1 è una variabile byte il cui indirizzo è 9Fh. 9Fh è l'indirizzo del registro ADCON1, questo valore l'ho preso dal datasheet del PIC16F877A. Poi nel programma scrivo
ADCON1 = 0b00000110;

cosi il compilatore lo digerisce!

Poi non so se funziona perchè non ho qua un PIC per provare!

Qualcuno me lo può confermare?

Ciao

Grazie

Link al commento
Condividi su altri siti

Ciao Sergio

Ti allego il codice CCS di un programmino di prova. Funziona con 876 e 877 (testato con entrambi). Scarta la parte display e conversioni e tieni solo la parte A/D_C

//////////////////////////////////////////////////////////////////////////
////                          876_ad_disp.C                           ////
////                                                                  ////
////  Questo programma legge un canale A/D, esegue la media           ////
////  su 5 letture e lo visualizza su un display a 3 cifre            ////
//////////////////////////////////////////////////////////////////////////
/***************************************************************
* Funzione per convertire un esadecimale binario <= 1000 in un
* numero in BCD su tre decadi. In questo caso le centinaia
* possono arrivare fino a 15 (F) quindi il numero esadecimale
* <= 1599
***************************************************************/
long binbcd(long bcd)
{
	long a, b, d;
	int i;
	int unit, dec, cent;
	port_b = 0x30;
	port_c = 0x80;
	if (bcd > 99)
  {
  	cent = (int)(bcd/100);
  	b = (long)(cent)*100;
  	a = bcd - b;
  }
	else
  {
  	a = bcd;
  	cent = 0;
  }
	if(a>9)
  {
  	dec =(int)(a)/10;
  	d = (long)(dec)*10;
  	unit =(int)(a-d);
  }
	else
  {
  	unit = a;
  	dec = 0;
  }
	i = unit;
	i = i | 0x10;
	port_b = i;
	i = dec;
	i = i | 0x20;
	port_b = 0x30;
	port_b = i;
	i = cent;
	port_b = 0x30;
	i = i | 0x30;
	output_low(PIN_C7);
	port_b = i;
	delay_us(10);
	output_high(PIN_C7);

}

/*******************************************************************
*
*******************************************************************/


#include <16F876.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#USE      standard_io(C)
#USE      fast_io(B)
#USE      fast_io(A)

long lrd_AD(5);
int istato_a = 0;
int iold_stato_a = 0;
int icnt_conv = 0:

/*******************************************************************
*
*******************************************************************/
main() {

	int1 loopDoneFlag;
	int i;
	long sum, conv;

    setup_timer_1(T1_INTERNAL);               // Set up timer to instruction clk
    setup_counters(RTCC_INTERNAL,RTCC_DIV_4);
    setup_timer_1(T1_INTERNAL);
    set_timer1(0xC350);   //Caricato 50.000 ==> 50.000 * 4 * 125nsec = 25msec
    enable_interrupts(GLOBAL);
    enable_interrupts(int_timer1);

    set_tris_b(0x00);          // RB = output
	set_tris_c(0x80);  //RC7 = output
    set_tris_a(0b11111111);          // RA1 = input
    setup_port_a( ALL_ANALOG );
    setup_adc( ADC_CLOCK_INTERNAL );
    set_adc_channel( 0 );
	cnt_conv = 0;
	sum = 0;

   while (TRUE)
	{
  if (icnt_conv = 5)
  	{
    icnt_conv = 0;
    sum = 0;
    for(i=0;i<5;++i)
          {
            	delay_ms(10);
      sum+=lrd_AD(i);
        }
    conv = (sum/5);
      }
   }
}

Link al commento
Condividi su altri siti

Ciao Livio,

grazie per aver postato il codice, in ogni modo sono riuscito a far girare una parte del programma che avevo fatto con il PICCLITE. In pratica quello che ho scritto nel mio post precedente è confermato e quindi con le direttive del preprocessore, sono riuscito a rendere portabile il mio codice senza fare grandi modifiche.

Ora dovrò modificare e testare la parte interrupt e penso di non aver problemi, visto che ho anche degli esempi.

Una cosa me mi domando è come fà il compilatore PCM CCS a gestire i banchi di memoria (bank0,1,2,3)? Forse lo fà automaticamente? Con il PICCLITE bisognava dichiarare le variabili con bank1 o 2,3 anteposto!

Ciao

Sergio

Link al commento
Condividi su altri siti

Ciao,

ho un altro problema, dovendo fare del debug con MPLAB 7.22 e CCS PCM demo, mi sono accorto che non funziona. Quando programmo il target con MPLAB mi da il seguente errore:

ICD0083: Target not in debug mode, unable to perform operation

Qualcuno sa aiutarmi?

Ciao

Sergio

Link al commento
Condividi su altri siti

Ciao,

sono alla disperazione massima wallbash.gif

Non ne vengo fuori, non mi lascia fare questo benedetto debug!

Eppure l'ho sempre fatto con HITECH PICCLITE!

La programmazione avviene correttamente il debug no!

L'hardware è identico, uso MPLAB V7.40, e ho ICD 2, l'unica cosa che ho cambiato è il compilatore, come da oggetto della presente discussione.

Ho cercato di documentarmi sulla problematica e ho scoperto alcune cose:

- la predefinizione "#device ICD=TRUE" sembra essere fondamentale per eseguire il debug

- dopo che si compila con questa direttiva i bit di configurazione vengono settati in posizione di default, pertanto con la direttiva "#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP" riesco a rimetterli a posto, in ogni modo il problema persite!

Vi prego aiutatemi! worthy.gif

Link al commento
Condividi su altri siti

Non so come mai, ma adesso sono riuscito a fare il debug!

Ho aperto il progetto fatto con PICCLITE e ho fatto il debug per verificare se funzionava ancora. Poi quando ho visto che funzionava, ho aperto il progetto compilato con CCS e quindi sono rimasto molto sopreso nel vedere che il debug funzionava! In ogni modo sarei curioso di sapere perchè è accaduto questo, pertanto se qualcuno lo sa si faccia avanti, nel caso che lo scoprirò da solo ve lo farò sapere.

Ciao

Sergio

Link al commento
Condividi su altri siti

Può succedere. Probabilmente c'è qualche bugs nel compilatore e, a volte, s'impalla. Solitamente è sufficiente chiudere tutto, togliere l'alimentazione al target ed iniziare da capo. Con la mia versione di CCS questo problema è praticamente scomparso, mentre con la vecchia versione che usavo capitava frequentemente.

Link al commento
Condividi su altri siti

  • 2 weeks later...

Ciao,

ho completato le mie prove con il compilatore CCS e ho concluso che non lo utilizzero a causa dei tanti problemi riscontrati. Non ho capito come mai ma non riuscivo a fare il debug (ICD0083: Target not in debug mode, unable to perform operation), questo mi ha fatto perdere tanto tempo e aimè ho tirato tante bestemmie wallbash.gif .

Sconsolato e afflitto da questi problemi, tramite un amico, mi sono procurato il compilatore PICC della HI-TECH, quello non limitato ed ho riscontrato che il problema di debug non c'era più biggrin.giftongue.gifbiggrin.gif .

Ora funziona tutto a dovere, riesco a lavorare molto bene rispetto prima!

Comunque grazie a Livo per i consigli!

Ciao

Sergio

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...