Autor Tema: Errores al compilar programa en CCS para PIC16F88  (Leído 16121 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #15 en: 28 de Marzo de 2014, 19:34:35 »
haaa, no habia visto que en mi comentario también desaparecieron los corchetes y no se ve la corrección

deberia ser así

Código: C
  1. DireccionRecibida[i]=DatoEntrada[i];

"Nada es imposible, no si puedes imaginarlo"

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #16 en: 28 de Marzo de 2014, 19:39:12 »
ya encontré tu error

Código: C
  1. for(i=0;i<10;i++){ //Con éste for obtengo la direccion recibida por UART
  2. DireccionRecibida[i]=DatoEntrada[i];
  3. }

estas copiando los caracteres desde la posición 0 hasta la posición 9, es decir, estas copiando 10 caracteres, no 9
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #17 en: 29 de Marzo de 2014, 06:28:23 »
ya encontré tu error

Código: C
  1. for(i=0;i<10;i++){ //Con éste for obtengo la direccion recibida por UART
  2. DireccionRecibida[i]=DatoEntrada[i];
  3. }

estas copiando los caracteres desde la posición 0 hasta la posición 9, es decir, estas copiando 10 caracteres, no 9


Vale eso ya lo acabo de cambiar. Otra cosa rivale. cuando realizo algo de éste estilo:

FlagString=strcmp(CanalRecibido,"CH2");
   else if(FlagString==0){
      set_adc_channel(2);
   }


me da un error diciendo lo siguiente:

A numeric expression must appear here


Y bueno cuando cambio "CH2" por el array de caracteres CH2 (ya que CH2[4]="CH2") también me da error al compilar.
« Última modificación: 29 de Marzo de 2014, 09:36:16 por Prototipe88 »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #18 en: 29 de Marzo de 2014, 10:26:28 »
Hola, probe compilar tu código y tenia varios errores, le corregi todo lo que no dejaba compilar, aunque no cambié la lógica, checa si ya lo puedes compilar  hace lo que quieres, entonces ya podemos revisar la lógica


Código: C
  1. #include <16F88.h>
  2. #device adc=10 //INDICO EL NÚMERO DE BITS DEL ADC
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6. #fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
  7. #use delay(clock=8000000)
  8. #use rs232(baud=9600, xmit=PIN_B5, rcv=PIN_B2) //CONFIGURO PUERTO SERIE
  9.  
  10.  
  11. char can0[5]="CH0";
  12. char can1[5]="CH1";
  13. char can2[5]="CH2";
  14. char can3[5]="CH3";
  15. char can4[5]="CH4";
  16. char can5[5]="CH5";
  17.  
  18. char DireccionPIC[10]= "$ADQ,P01,"; //Es la direccion del PIC
  19. char DireccionPICrespuesta[30]="$DAT,P01,";
  20.  
  21. //Definición de variables
  22.  
  23. int ValorADC=0; //Variable para lectura ADC
  24. int CopiaValorADC;
  25. int i=0; //Variable para ciclos for
  26. int Maskara=0; //Variable para obtencion de bits '0' o '1'
  27. char StringValorADC[12]={0};//Cadena de caracteres para guardar valor ADC en Carcteres
  28. char PreDatoSalida[15]={0};
  29. char DatoEntrada[15]={0}; //String para guardar el dato de entrada por UART
  30. char DatoSalida[24]={0}; //String para guardar lo que envio por UART
  31. char DireccionRecibida[10]={0}; //Variable para guardar direccion entrada
  32. char CanalRecibido[6]={0}; //Variable para guardar canal ADC a leer
  33. int FlagUART;
  34.  
  35. #INT_RDA
  36. void INT_UART() {
  37.  
  38. gets(DatoEntrada);
  39. FlagUART=TRUE;
  40.  
  41. }
  42.  
  43.  
  44. void main(){
  45.  
  46. enable_interrupts(GLOBAL); //HABITILRO TODAS LAS INTERRUPCIONES GLOBALES
  47. enable_interrupts(INT_RDA); //HABILITO LA INTERRUPCIÓN UART
  48. setup_adc_ports(sAN0|sAN1|sAN2|sAN3|sAN4|sAN5); //INDICO EL PIN A0/A1/A2/A3/A4/A5 COMO ENTRADA ANALÓGICA
  49. setup_adc(ADC_CLOCK_INTERNAL); //CLOCK  INTERNO PARA CONVERSIÓN ADC
  50.  
  51. while(1){
  52.  
  53. if(FlagUART==TRUE){
  54.  
  55. FlagUART=FALSE;
  56.  
  57. for(i=0;i<9;i++){  //Con éste for obtengo la direccion recibida por UART
  58.     DireccionRecibida[i]=DatoEntrada[i];
  59. }
  60.     i=0;
  61.     DireccionRecibida[9]=0; //Pongo caracter nulo para que sea string
  62.  
  63. if(strcmp(DireccionRecibida, DireccionPIC)==0){ //Comparo si la direccion recibida coincide con la del PIC
  64.  
  65.    for(i=0;i<4;i++){
  66.       CanalRecibido[i]=DatoEntrada[i+9]; //Si coincide obtengo el canal de lectura del ADC
  67.    }
  68.     i=0;
  69.     CanalRecibido[4]=0;   //Pongo caracter nulo para que sea string
  70.  
  71.    if(strcmp(CanalRecibido,can0)==0){ //voy comparando para ver qué canal he obtenido y leo CHX
  72.      set_adc_channel(0); //SELECCIONO CANAL 0 (PIN A0) DEL ADC PARA A LEER.
  73.    }
  74.  
  75.    else if(strcmp(CanalRecibido,can1)==0){
  76.       set_adc_channel(1);
  77.    }
  78.  
  79.    else if(strcmp(CanalRecibido,can2)==0){
  80.       set_adc_channel(2);
  81.    }
  82.  
  83.    else if(strcmp(CanalRecibido,can3)==0){
  84.       set_adc_channel(3);
  85.    }
  86.  
  87.    else if(strcmp(CanalRecibido,can4)==0){
  88.       set_adc_channel(4);
  89.    }
  90.  
  91.   else if(strcmp(CanalRecibido,can5)==0){
  92.       set_adc_channel(5);
  93.    }
  94.  
  95. delay_us(20); //retardo para leer ADC
  96. ValorADC=read_adc(); //lectura ADC
  97.  
  98. for(i=0;i<10;i++){ //Con un for recorreré solo 10 posiciones del resultado ValorADC (ADC 10 bits)
  99.  
  100.     CopiaValorADC=ValorADC; //Realizo una copia del valor numérico del ADC para no perderlo
  101.     Maskara=CopiaValorADC>>i; //Quiero tener el bit "i" a la derecha del todo
  102.     Maskara=Maskara&0x0000000000000001;  //realizo una AND para ver si tengo un [1] o un
  103.    if(Maskara==1){
  104.        StringValorADC[10-i]='1';  //Meto los bits (en forma de caracter) en el String StringValorADC
  105.     }
  106.     else{
  107.        StringValorADC[10-i]='0';
  108.     }
  109. }
  110.  
  111. StringValorADC[0]=','; //Pongo una ',' al principio del resultado
  112. StringValorADC[11]=0; //Por último pongo el caracter nulo (para que sea String)
  113.  
  114. strcat(DireccionPICrespuesta,CanalRecibido); //Concateno DireccionPICrespuesta y el canal "CHX")
  115.  
  116. strcat(DireccionPICrespuesta,StringValorADC);//concateno String anterior y Valor del ADC
  117.  
  118. puts(DireccionPICrespuesta); //Envio un solo String con la direccion, canal CHX y el resutado del PIC por UART.
  119.  
  120.    }
  121.  
  122.   }
  123.  
  124.  }
  125.  
  126. }
"Nada es imposible, no si puedes imaginarlo"

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #19 en: 29 de Marzo de 2014, 10:29:58 »
yo cambiaria esta parte del código

Código: C
  1. if(strcmp(CanalRecibido,can0)==0){ //voy comparando para ver qué canal he obtenido y leo CHX
  2.      set_adc_channel(0); //SELECCIONO CANAL 0 (PIN A0) DEL ADC PARA A LEER.
  3.    }
  4.  
  5.    else if(strcmp(CanalRecibido,can1)==0){
  6.       set_adc_channel(1);
  7.    }
  8.  
  9.    else if(strcmp(CanalRecibido,can2)==0){
  10.       set_adc_channel(2);
  11.    }
  12.  
  13.    else if(strcmp(CanalRecibido,can3)==0){
  14.       set_adc_channel(3);
  15.    }
  16.  
  17.    else if(strcmp(CanalRecibido,can4)==0){
  18.       set_adc_channel(4);
  19.    }
  20.  
  21.   else if(strcmp(CanalRecibido,can5)==0){
  22.       set_adc_channel(5);
  23.    }


por algo así



Código: [Seleccionar]
set_adc_channel(canalreibido[2]-0x30);


como ves, quitas muchas comparaciones si solo tomas en cuenta el elemento 2 de tu vector CHX, y le restas 0x30 para que el '0' lo vuelva 0 y el '1' lo vuelva 1 y así con los demás valores

Saludos
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #20 en: 30 de Marzo de 2014, 07:51:44 »
Código nuevo por si lo quieres revisar abajo expongo algunas dudas en el siguiente post:

Código: [Seleccionar]
#include <16F88.h>
#device ADC=10 //INDICO EL NÚMERO DE BITS DEL ADC

#include <stdio.h>
#include <string.h>

#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
#use delay(clock=8000000)
#use rs232(baud=9600, xmit=PIN_B5, rcv=PIN_B2) //CONFIGURO PUERTO SERIE

char DireccionPIC[10]= "$ADQ,P01,"; //Es la direccion del PIC
char DireccionPICrespuesta[10]="$DAT,P01,";

//Definición de variables

int ValorADC=0; //Variable para lectura ADC
//int CopiaValorADC=0;
int i=0; //Variable para ciclos for
//int Maskara=0; //Variable para obtencion de bits '0' o '1'
char StringValorADC[12]={0};//Cadena de caracteres para guardar valor ADC en Carcteres
char DatoEntrada[13]={0}; //String para guardar el dato de entrada por UART
char DatoSalida[24]={0}; //String para guardar lo que envio por UART
char DireccionRecibida[10]={0}; //Variable para guardar direccion entrada
char CanalRecibido[4]={0}; //Variable para guardar canal ADC a leer
int FlagUART=0;
int FlagString=1;

#INT_RDA
void INT_UART() {

for(i=0;i<12;i++){
DatoEntrada[i]=getc();
 }

DatoEntrada[12]='\0';
i=0;
FlagUART=1;

} //ya he enviado por UART: "$ADQ,P01,CHx,n"


void main(){

enable_interrupts(GLOBAL); //HABITILRO TODAS LAS INTERRUPCIONES GLOBALES
enable_interrupts(INT_RDA); //HABILITO LA INTERRUPCIÓN UART
setup_adc_ports(sAN0|sAN1|sAN2|sAN3|sAN4|sAN5); //INDICO EL PIN A0/A1/A2/A3/A4/A5 COMO ENTRADA ANALÓGICA
setup_adc(ADC_CLOCK_INTERNAL); //CLOCK INTERNO PARA CONVERSIÓN ADC

while(1){

if(FlagUART==1){

FlagUART=0;

for(i=0;i<9;i++){  //Con éste for obtengo la direccion recibida por UART
    DireccionRecibida[i]=DatoEntrada[i];
}
    i=0;
    DireccionRecibida[9]='\0'; //Pongo caracter nulo para que sea string

FlagString=strcmp(DireccionRecibida, DireccionPIC);
   
if(FlagString==0){ //Comparo si la direccion recibida coincide con la del PIC

 for(i=0;i<3;i++){
      CanalRecibido[i]=DatoEntrada[i+9]; //Si coincide obtengo el canal de lectura del ADC
   }
 i=0;
 CanalRecibido[3]='\0';   //Pongo caracter nulo para que sea string


   if((FlagString=strcmp(CanalRecibido,(char*)"CH0"))==0){ //voy comparando para ver qué canal he obtenido y leo CHX
     
    set_adc_channel(0); //SELECCIONO CANAL 0 (PIN A0) DEL ADC PARA A LEER.
   }

   else if((FlagString=strcmp(CanalRecibido,(char*)"CH1"))==0){

      set_adc_channel(1); 
   }
 
   else if((FlagString=strcmp(CanalRecibido,(char*)"CH2"))==0){
      set_adc_channel(2);
   }

   else if((FlagString=strcmp(CanalRecibido,(char*)"CH3"))==0){
      set_adc_channel(3);
   }

   else if((FlagString=strcmp(CanalRecibido,(char*)"CH4"))==0){
      set_adc_channel(4);
   }

  else if((FlagString=strcmp(CanalRecibido,(char*)"CH5"))==0){
      set_adc_channel(5);
   }

delay_us(20); //retardo para leer ADC
ValorADC=read_adc(); //lectura ADC

////for(i=0;i<10;i++){ //Con un for recorreré solo 10 posiciones del resultado ValorADC (ADC 10 bits)
//
//    CopiaValorADC=ValorADC; //Realizo una copia del valor numérico del ADC para no perderlo
//    Maskara=CopiaValorADC>>i; //Quiero tener el bit "i" a la derecha del todo
//    Maskara=Maskara&0x0000000000000001;  //realizo una AND para ver si tengo un [1] o un [0].
//    if(Maskara==1){
//       StringValorADC[10-i]='1';  //Meto los bits (en forma de caracter) en el String StringValorADC
//    }
//    else{
//       StringValorADC[10-i]='0';
//    }
//}
//

sprintf(StringValorADC,",%d",ValorADC); //pongo en StringValorADC el ValorADC pero en formsto string

//StringValorADC[0]=','; //Pongo una ',' al principio del resultado
//StringValorADC[11]='\0'; //Por último pongo el caracter nulo (para que sea String)

strcat(DatoSalida,DireccionPICrespuesta); //Concateno DireccionPICrespuesta y el canal "CHX")
strcat(DatoSalida,CanalRecibido);
strcat(DatoSalida,StringValorADC);//concateno String anterior y Valor del ADC

printf("%s", DatoSalida); //Envio un solo String con la direccion, canal CHX y el resutado del PIC por UART.

   }
 
  }

 }

}
« Última modificación: 31 de Marzo de 2014, 09:13:18 por Prototipe88 »

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #21 en: 31 de Marzo de 2014, 09:04:48 »
Bueno, respecto a la cadena de caracteres que tengo que recibir por puerto serie lo modifiqué por ésto:
Tengo que recibir por puerto serie una cadena de 12 caracteres (12bytes + 1byte de caracter nulo [ '\0' ] ).

Código: [Seleccionar]
char DatoEntrada[13]={0};

          for(i=0;i<12;i++){
          DatoEntrada[i]=getc();
          }

         DatoEntrada[12]='\0'; //ya tengo un string con el string del puerto serie recibido

Creo que la función getc() permite obtener solo un carácter del puerto serie (1byte) con lo cual si sé que voy a recibir 12bytes (el byte del caracter nulo no lo tengo en cuenta) pues realizo un FOR para ir metiendo esos caracteres en un array de caracteres que para que se convierta en string le inserto por último el caracter nulo '\0'


Luego la duda que tengo es, al final del código,  para convertir un valor de INT a STRING realizo lo siguiente (en el anterior post lo hice de una forma un poco rara pero creo que ésta es mejor):

Código: [Seleccionar]
sprintf(StringValorADC,",%d",ValorADC);
Es decir que el ValorADC que es un INT le pongo una coma delante y lo guardo en StringValorADC en forma de string ya que el caracter nulo lo pone automáticamente esa función.

Es decir que tendré algo así: si ValorADC=750 entonces StringValorADC=",750"


Luego otra cosa es:


Código: [Seleccionar]
strcat(DatoSalida,DireccionPICrespuesta);
La función STRCAT permite concatenar srings de diferentes longitudes siempre y cuando el string de destino (en mi caso DatoSalida) sea suficientemente grande. Bien pues imaginad que tengo lo siguiente:

Código: [Seleccionar]
DatoSalida[15]="HolaMundo"
DireccionPICrespuesta[3]="001"

Cuando realizo la concatenación se hará justo despues del último caracter del DatoSalida? es decir tendré esto?

DatoSalida[15]="HolaMundo001" + el caracter nulo ?
« Última modificación: 31 de Marzo de 2014, 09:10:51 por Prototipe88 »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #22 en: 31 de Marzo de 2014, 11:17:36 »
Citar
Creo que la función getc() permite obtener solo un carácter del puerto serie (1byte) con lo cual si sé que voy a recibir 12bytes (el byte del caracter nulo no lo tengo en cuenta) pues realizo un FOR para ir metiendo esos caracteres en un array de caracteres que para que se convierta en string le inserto por último el caracter nulo '\0'

esto es correcto, con getc solo obtienes un caracter


Citar
Es decir que el ValorADC que es un INT le pongo una coma delante y lo guardo en StringValorADC en forma de string ya que el caracter nulo lo pone automáticamente esa función.

Es decir que tendré algo así: si ValorADC=750 entonces StringValorADC=",750"

correcto


Citar
Cuando realizo la concatenación se hará justo despues del último caracter del DatoSalida? es decir tendré esto?

DatoSalida[15]="HolaMundo001" + el caracter nulo ?

también es correcto
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #23 en: 31 de Marzo de 2014, 11:42:25 »
MUCHÍSIMAS GRACIAS rivale. Eres todo una máquina  :)

Respecto a los if: if((FlagString=strcmp(CanalRecibido,(char*)"CH0"))==0) por qué razón me da Warnings?

Igualmente voy a mirar de implementarlo como tu decias. Voy a intentar realizarlo.

También me acaba de surgir una pequeña duda. Si yo realizo:

Código: [Seleccionar]
output_high(PIN_B1);
output_high(PIN_B0);

El compilador ya sabe que se trata de salidas y no tengo que especificarle nada no? Es que he leído algo sobre #use standard_io(PUERTO) que ya está definida por defecto en el compilador y hace ésto de averiguar que pines los utilizamos como salidas y cuales como entrada.
« Última modificación: 01 de Abril de 2014, 12:44:56 por Prototipe88 »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #24 en: 02 de Abril de 2014, 12:57:24 »
Hola, no habia visto que habias actualizado tu último post.

el warning que te sale supongo que es porque estas haciendo una declaracion dentro de un if, y no debe ser así.

en cuanto a los outputs, por default el compilador esta en standard_io, y cada que usas un output, se ponen como salidas los pines correspondientes y cada que usas un input se ponen como entradas, sin embargo, te recomiendo que configures propiamente tus entradas y salidas, ya que si despúes quieres programar en otro lenguaje o usar algun otro tipo de micro, te vas a quedar con la costumbre de que se configuran solos los puertos.


Saludos
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #25 en: 02 de Abril de 2014, 15:42:21 »
Hola, no habia visto que habias actualizado tu último post.

el warning que te sale supongo que es porque estas haciendo una declaracion dentro de un if, y no debe ser así.

en cuanto a los outputs, por default el compilador esta en standard_io, y cada que usas un output, se ponen como salidas los pines correspondientes y cada que usas un input se ponen como entradas, sin embargo, te recomiendo que configures propiamente tus entradas y salidas, ya que si despúes quieres programar en otro lenguaje o usar algun otro tipo de micro, te vas a quedar con la costumbre de que se configuran solos los puertos.


Saludos



La duda que me surge es: Si utilizo un oscilador de cuarzo (es decir un oscilador externo) para el clock del micro debo utilizar las entradas RB6 y RB7 referentes al PIC 16F88. Si defino entradas y salidas previamente como debo configurar las del clock referentes al puerto B?

Es decir haria los iguiente?

#use standard_io(B)

y en la funcion del void main() definiría las entradas y salidas del puerto así? set_tris_B(0x)? (pero los RB6 y  RB7 si son del clock los configuro como entradas?

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #26 en: 02 de Abril de 2014, 15:55:16 »
cuando usas un oscilador externo no importa como configures los pines correspondientes, puedes verlo en la página 55 y 56 de la hoja de especificaciones
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #27 en: 02 de Abril de 2014, 18:29:10 »
cuando usas un oscilador externo no importa como configures los pines correspondientes, puedes verlo en la página 55 y 56 de la hoja de especificaciones

 :) Gracias rivale! estoy aprendiendo muchísimo gracias a tu ayuda.

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #28 en: 03 de Abril de 2014, 17:35:30 »
Ya casi ando acabando el programa. Quisiera con consultar una de éstas dudas que investigando no consigo resolver.

Una vez leo el ADC (de 10 bits del PIC) mediante ValorADC=adc_read() parece evidente que si la variable ValorADC es de tipo INT si mi valor de ADC lee 1000 pues ValorADC=1000 y si el ADC lee 900 pues ValorADC=900.

Yo quiero enviar por puerto serie una trama FIJA de X bytes. Si mi valor de ADC es 900 o 1000 parece evidente que la cantidad de bytes a enviar por puerto serie cambia. Yo necesito enviar algo fijo independientemente del valor del ADC. Yo para intentar resolver ésto realizo lo siguiente:


Código: [Seleccionar]
if(ValorADC<1000){

sprintf(StringValorADC,".0%d",ValorADC); //pongo en StringValorADC el ValorADC pero en formsto string

}

else if(ValorADC<100){

sprintf(StringValorADC,".00%d",ValorADC); //pongo en StringValorADC el ValorADC pero en formsto string

}

else if(ValorADC<10){

sprintf(StringValorADC,".000%d",ValorADC); //pongo en StringValorADC el ValorADC pero en formsto string

}


Como lo ves rivale? hay alguna solución mejor?
« Última modificación: 03 de Abril de 2014, 17:42:47 por Prototipe88 »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Errores al compilar programa en CCS para PIC16F88
« Respuesta #29 en: 03 de Abril de 2014, 17:44:04 »
Recuerda que en ccs el tipo int es de 8 bits, por lo que solo puedes guardar hasta 127 en numeros signados, para leer 10 bits necesitas usar un tipo long, que es un entero de 16 bits

no necesitas verificar si es mayor o menor a 1000, la forma correcta sería la siguiente:

Código: C
  1. printf ("%04l",ValorADC );


lo que vas a imprimir es un long, entonces es %l, y para que sea fija la cantidad de caracteres a mostar usas %04l:

donde el numero que sigue al % es con lo que va a rellenar, en este caso un 0, y el siguiente numero es la cantidad fija de dijitos que quieres mostrar, 4 en este caso.


Espero te sirva, Saludos
"Nada es imposible, no si puedes imaginarlo"


 

anything