Problema de compilación en PIC C Compiler

Hola amigos, esta línea esta en un código de mensaje anterios.
Executing: "C:\Program Files (x86)\PICC\Ccsc.exe" +FM "Cronometro_DISPLAY.c" +DF +LN +T +A +M +Z +Y=9.
Estoy interesado en modificar algunos parametros para que ccs no me genere algunos archivos al compilar.
como el lst, pjt, sim. He leido en la ayuda el commnad_line_compiler. Pero no logro entender muy bien.
como hacerlo.
 
Yo uso un archivo de procesos por lotes .bat
Originalmente creado por Arossini y lo he modificado para la nueva versión de PIC C Compiler y Proteus.
(También funciona para versiones anteriores.)
Lo ejecutas y pregunta si deseas realizar la limpieza de archivos.

Aquí lo adjunto.

Nota:
Si éste archivo es ejecutado en raíz, también eliminará los archivos de las extensiones seleccionadas en todas las sub carpetas.
 

Adjuntos

  • Limpiar PICC.rar
    336 bytes · Visitas: 12
Hola amigos, soy nuevo en el foro.
Si pudieran ayudarme, pues estoy tratando de probar el encendido de un led.
Ya compilé el código, pero cuando cargo el .hex en el proteus, no hace nada.

Aquí les dejo el código.
PHP:
#include <16f876.h>
#fuses XT,NOWDT
#use delay (clock=4000000)
#use fast_io(B)

void main(void)
{
port_b_pullups(true);
set_tris_B(0x01); // configuracion de todos los pines como salida
output_low(Pin_B1);
while(1)
{
if(input(PIN_B0)==1)
output_low(Pin_B1);
else
output_high(Pin_B1);
}
}
 
Última edición por un moderador:
Checa si funciona así:

Código:
#include <16f876.h>
#fuses XT,NOWDT
#use delay (clock=4M)
//#use fast_io(B)

void main(void)
{
port_b_pullups(true);
set_tris_B(0x01); // configuracion de todos los pines como salida
output_low(Pin_B1);

while(1)
{
if(input(PIN_B0)==1){
output_low(Pin_B1);
}
else{
output_high(Pin_B1);
}
}
}
 
Última edición por un moderador:
¿Podría explicarme por qué no funcionaba usando esa directiva?
En realidad, así como está tu programa debe funcionar, pero debes tener en cuenta que estás usando las resistencias pull-up internas del puerto B.
Entonces RB0 mantendrá un 1 por medio de la resistencia pull-up.
Por lo tanto, será más común esperar un 0 que un 1, que es cómo está en tu programa.
Así que todo depende de cómo compares y cómo tengas el hardware.

Algo más comprensible por código usando las resistencias pull-up, sería de esta forma:
PHP:
#include <16f876.h>
#use     delay (crystal = 4MHz)
#use     fast_io(B)

void main(void)
{
   port_b_pullups(true);         // Habilitar resistencias pull-up
   set_tris_B(0x01);             // RB0 cómo entrada, los demás cómo salidas.
   output_b(0x00);               // Bits configurados cómo salida, en cero al iniciar.
   
   while(true)
   {
      if(input(PIN_B0) == 0)     // Si RB0 está en 0...
         output_high(Pin_B1);    // RB1 en 1
      else                       // Caso contrario...
         output_low(Pin_B1);     // RB1 en 0
   }
}
 
Última edición:
Hola soy nuevo en el foro y en el lenguaje C.
Al querer compilar el programa me sale 3 errores, esos errores son: 23, 48, 31. El programa es bastante sensillo.
Les agradeceria mucho si podrian Ayudarme

Les dejo el programa:

#include <Probando entradas y salidas 16f628.h>
#include <16f628.h>
#BYTE TRISB=0x86
#BYTE PORTB=0x06
#BYTE OPTION_REG= 0x81

void main()
{
port_B_pullups(0xFF);
bit_clear(OPTION_REG,7);
bit_set(TRISB,0);
bit_clear(TRISB,1);
bit_clear(PORTB,1);

while(TRUE)
{
if(bit_test(portb,0)==1)
bit_set(portb,1);
else
bit_clear(portb,1);

}

}
 
ElElel3 dijo:
Hola soy nuevo en el foro y en el lenguaje C.
Al querer compilar el programa me sale 3 errores, esos errores son: 23, 48, 31. El programa es bastante sensillo.
Les agradeceria mucho si podrian Ayudarme

Buenas.
El error esta en la librería "Probando entradas y salidas 16f628.h", si tienes esa libreria sube tambien el codigo para poder ayudarte.
O prueba compilar de esta forma:
Código:
//#include <Probando entradas y salidas 16f628.h>
#include <16f628.h> 
#BYTE TRISB=0x86
#BYTE PORTB=0x06
#BYTE OPTION_REG= 0x81
void main()
{
port_B_pullups(0xFF);
bit_clear(OPTION_REG,7);
bit_set(TRISB,0);
bit_clear(TRISB,1);
bit_clear(PORTB,1);

while(TRUE)
{
if(bit_test(portb,0)==1) 
bit_set(portb,1);
else
bit_clear(portb,1); 

}

}
 
Buenas. Entré por acá revisando sus entradas antes de escribirles.
Llevo un buen rato practicando e intentando hacer lo que se me ocurre y me encontré con un problema.

El programa no compila correctamente y el funcionamiento esperado no es el conseguido.
Al apretar los botones los LEDS finales no encienden de la manera que quiero.

Aquí pondré lo que me propuse realizar ( He ido avanzando desde 0 haciendo rutinas de LEDS y es por donde voy usando el mismo programa base )

El programa es el siguiente:

a) Utilizar el puerto B para rutinas de LEDS iniciales
b) Utilizar el puerto D para la parte de POTENCIA

1) Un LED azul se mantiene encendido durante todo el proceso. Él indica que el sistema está activo.
2) Un LED amarillo estará intermitente mientras transcurre un tiempo de espera.
3) Se encenderá un LED verde de aprobación.
4) Se encenderá un LED azul ( POT ON ) indicando que la parte de potencia puede ser activada.
5) Mediante un botón controlar cual de los dos LEDS Verdes será encendido. (simulando Izquierda y Derecha de un motor DC a través del PIC)

El código que hice es éste:
PHP:
#include <16f877a.h> // PIC a usar
#fuses hs, nowdt
#use delay(clock=20M) // Frecuencia de 20Mhz

int16 timer;

void main()
{
   set_tris_b(0b00000000);    // Puerto B es salida   
   set_tris_d(0b11110000);    // Puerto D 0-3 son salida y 4-7 son entrada
   output_b(0b00000001);      // LED que muestra encendido del dispositivo
   output_d(0b00000000);      //Puerto comienza en 0 lógico
   timer=0;
   {
   while (timer<5){           //Inicio de rutina
   timer=timer+1;
      output_b(0b01000001);
      delay_ms(500);
      output_b(0b00000001); 
      delay_ms(500);                                  
   }                          // Fin de la rutina
   output_b(0b10000001);      // Enciende LED de aprobación
   delay_ms(1000);            // Tiempo de espera para parte de potencia
   output_d(0b00000001);      // Enciende LED de activación 2
   }
        if (input(pin_d7));     // Entrada para LED 1 mediante botón
          output_d(0b00000101);
        if (input(pin_d6));     // Entrada para LED 2 mediante Botón
          output_d(0b00001001);
   }

* Al usar ELSE después del if ( Quise mantenerlo activo y con el botón solo cambiar la dirección, en un comienzo) me daba otro error: Esperaba una expresión numérica. ¿?

*Luego quiero agregarle al problema un sensor de nivel y necesitare leer las variables, por eso también me resulta imprescindible lograr esto.

Si de alguna manera me pueden ayudar a entender este meollo, les agradecería.

Gracias, saludos y espero lograr pronto mis objetivos para compartirlos por acá para otros que tengan las mismas inquietudes que yo.

Esquema Electrónico en Proteus 8 adjunto con este mensaje.

NOTA: Tengo muchas dudas sobre el esquema eléctrico con los botones y las fuentes.
Intento usar unas flechitas y no tener que usar Vsource pero las pongo y no me hacen nada, es otra duda que me sale así.
 

Adjuntos

  • Diagrama prueba 1.png
    Diagrama prueba 1.png
    71.3 KB · Visitas: 4
Sólo veo el siguiente error:
Terminar una sentencia if con ; hará que no se ejecute.

Esto no es un error, pero es del Basic: timer = timer + 1;
En C es más sencillo realizar un incremento: timer ++;
 
Buenas
Agrego algunos detalles que te faltan a tu código:
1- el bucle infinito para sensar los botones
2- también seria mas conveniente utilizar los comandos "output_high(pin_x);", "output_low(pin_x);"
3- al oprimir los botónes, el comando "output_d(0b00001001);" creara un conflicto ya que utilizas el pin d6 y d7 como entradas y con ese comando lo estas mandando a 0 lógico. Mejor utiliza los comandos del item nº2.
 
Hola. Tengo un problema con mi código.
Al compilar me aparece el error 23: "Can not change device type this far into the code. " En la línea 5
#device ADC=10
Gracias, lindo día.
C:
//Arranque, paro e inversión de motor por temperatura, usando LM35

#include <18f4550.h>

#fuses NOMCLR, INTRC_IO

#device ADC=10

#use delay(clock = 8MHz)

#include <lcd.c>


//Conexiones LCD

#define LCD_RS_PIN      PIN_E0

#define LCD_RW_PIN      PIN_E1

#define LCD_ENABLE_PIN  PIN_E2

#define LCD_DATA4       PIN_D4

#define LCD_DATA5       PIN_D5

#define LCD_DATA6       PIN_D6

#define LCD_DATA7       PIN_D7



unsigned int16 temp;

float temperaturaLM35;


void main(){

  set_tris_a(0x3F);

  set_tris_b(0x00);

  setup_oscillator(OSC_8MHZ);                    // Oscilador interno a 8MHz

  setup_adc(ADC_CLOCK_INTERNAL);                 // Oscilador interno para ADC

  setup_adc_ports(AN0);                          // Configurar pin AN0 como análogo

  set_adc_channel(0);                            // Canal 0 (AN0)

  lcd_init();       

  

     //Mensaje inicial

   lcd_gotoxy(1,1);//Posiciona en LCD

   lcd_putc ("Arranque, paro e");//manda un mensaje al LCD

   lcd_gotoxy(1,2);

   lcd_putc ("inversion de giro");

   delay_ms(1000); //espera 1 segundo                   

   lcd_putc("\f"); //limpia el lcd

   lcd_gotoxy(1,1);//Posiciona en LCD

   lcd_putc ("con sensor de");//manda un mensaje al LCD

   lcd_gotoxy(1,2);

   lcd_putc ("temperatura LM35");

   delay_ms(1000); //espera 1 segundo                   

   lcd_putc("\f"); //limpia el lcd

 

   while(true){

      temp = read_adc();  //lee el dato de AN0

      // 1bit = 0.48828125°C, aplicamos regla de tres para temperatura final

      temperaturaLM35 = temp * 0.48828125;

      for(temperaturaLM35=21;temperaturaLM35<=26;)

      {

      output_b(0x00);

      lcd_putc("\f"); //limpia el lcd

      lcd_gotoxy(1,1);

      printf(lcd_putc,"Temp:%1.2f C",temperaturaLM35);

      lcd_gotoxy(1,2);

      printf(lcd_putc,"   Paro ");

      // %1.2f es para mostrar un entero y dos decimales de tipo floar

      delay_ms(1000);//espera 1000 milisegundos

      }

      for(temperaturaLM35=27;temperaturaLM35<=35;)

      {

      output_b(0x01);

      lcd_putc("\f");

      lcd_gotoxy(1,1);

      printf(lcd_putc,"Temp:%1.2f C",temperaturaLM35);

      lcd_gotoxy(1,2);

      printf(lcd_putc,"   Arranque");

      delay_ms(1000);

      }

      for(temperaturaLM35=12;temperaturaLM35<=20;)

      {

      output_b(0x02);

      lcd_putc("\f");

      lcd_gotoxy(1,1);

      printf(lcd_putc,"Temp:%1.2f C",temperaturaLM35);

      lcd_gotoxy(1,2);

      printf(lcd_putc,"  Inversion");

      delay_ms(1000);

      }

   }

}
 
Atrás
Arriba