Error al compilar con PIC C de CCS

En C++ se que se puede.
en C++ se hace
C++:
int n = 7; /* o lo que se te ocurra */
int *arreglo = new int[n];
para que vaya al heap, por que en los PIC que casi no tienen stack la otra declaración seguro te fuerza un stack-overflow ya que la asignación la mete en el stack.

De todas formas, declarar infinitamente una variable dentro del while :eek:
Naaa...normalmente el compilador optimiza el comportamiento y el "scope" de esa declaración, pero como bien decís, no está permitida en el ANSI C, y es algo como hacer:
C++:
for( int i=0; i < 10; i++ ) {
/* bla bla bla */
}
 
El error dice: Expression must evaluate to a constant . Cómo puedo hacer que el arreglo acepte mi variable global?
Primero deberíamos saber qué compilador estás usando. Como te han dicho antes, si es un compilador moderno se debería poder activar las compatibilidades C99 o C11 que permiten la declaración de Arrays de longitud variable, que te permitirían declarar un array de esa manera, pero mucho cuidado con hacerlo dentro del bucle while(), ya que podría ocurrir un agotamiento de la memoria.

Si tu compilador no tiene soporte de esa nueva característica, pues supongo que no te queda más remedio que reservar memoria con malloc() y liberarla más tarde con free().
 
Les adjunto la imagen donde está el código con el cual intento enviar los números del 0 al 9 por comunicación serial USART, pero el virtual terminal no está mostrando dichos números. ¿Dónde está el error??

El PIC usado es el 16F876

En la segunda imagen se muestran los comentarios de la simulación de proteus.

C:
/***************************************************************/
#include<16F876.h>
#fuses XT,NOWDT,NOLVP
#use delay (crystal=4MHz)

#byte SPBRG = 0x99
#byte RCSTA = 0x18
#byte TXREG = 0x19
#byte TXSTA = 0x98
#byte PIE1 = 0x8C
#byte PIR1 = 0x0C //bandera txif bit 4
#byte INTCON = 0x0B

int8 i;

void main(){
   TXSTA &= ~(1<<2); //baud rate baja vel.

   SPBRG = 5; //para baud rate de 9600 (en baja vel)

   TXSTA &= ~(1<<4); //modo asincrono

   RCSTA = 0x80; //habilita puerto tx como serial

   PIE1 |= (1<<4); //HAB. INT. POR TX

   TXSTA |= (1<<5); //habilita transmision

   INTCON = 0xC0; //int. globales y peri.

   while(1){
      for(i=0; i<=9; i++){
         if(PIR1 & (1<<4)){ //si txif =1
            TXREG = i;
            delay_ms(500);
         }
      }
   } //while
} //main

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

Gracias.
 

Adjuntos

  • sample_proteus.JPG
    sample_proteus.JPG
    159.1 KB · Visitas: 5
  • program_log_proteus.JPG
    program_log_proteus.JPG
    58.4 KB · Visitas: 5
Última edición por un moderador:
Si estás usando PIC C Compiler de CCS toda esa configuración de registros es innecesaria. (Hasta parece para ATmega o XC8)
Tan solo se requiere declarar lo siguiente:
#use RS232 (UART1, BAUD = XXXXX)
Eso establece usar USART por hardware, donde XXXXX son los baudios.
Esa declaración acepta más parámetros que puedes encontrar en la ayuda del programa.
Y como quieres usar RS-232 por hardware, también te recomiendo usar la interrupción por recepción "RDA" y olvidarte del polling.

En la segunda imagen se muestran los comentarios de la simulación de proteus.
Eso no sirve de nada, si acaso, errores del compilador.
 
Gracias por la respuesta rapida D@rkbytes, interesante dato lo del #use RS232 (UART1, BAUD = XXXXX) para programación por hardware.
Si, tienes razón, lo de lo innecesario que parece toda esa configuración de registros pero lo hago así a propósito para familiarizarme con la hoja de datos de los pics ya que apenas estoy empezando el estudio de los microcontroladores.

Y a pesar que ya me mostraste como hacer la configuración usando la directiva #use rs232... aun me queda la duda de por qué si segui todos los pasos que muestra la hoja de datos no me funciona.

Estuve buscando lo de la interrupción por recepción RDA en toda la hoja de datos y no me aparece.

Y si no es mucho pedir...¿Que es eso del polling?
 
si, tienes razon, lo de lo innecesario que parece toda esa configuración de registros pero lo hago así a propósito para familiarizarme con la hoja de datos de los pics, ya que apenas estoy empezando el estudio de los microcontroladores.
Usando lenguaje ensamblador, seguro que te familiarizas con los registros.
a pesar que ya me mostraste como hacer la configuración usando la directiva #use rs232... aún me queda la duda de por qué si seguí todos los pasos que muestra la hoja de datos, no me funciona.
¿Qué baudrate se supone que quieres usar?
Con 4 MHz 19200 Bps ya van justos.
estuve buscando lo de la interrupción por recepción RDA en toda la hoja de datos y no me aparece.
Eso no viene en la hoja de datos porque es una directiva del compilador.
Esa información se encuentra en la documentación del compilador. (La tecla F1 hace magia)
INT_RDA.jpg
Y si no es mucho pedir... ¿Qué es eso del polling?
Polling (Wikipedia)
 
El baud rate que quiero usar es de 9600, para configurar ese baud rate usé la formula : baudios = Fosc/64*(SPBRG + 1)
despejando SPBRG me dio 5.51 , por lo que cargue el registro SPBRG con 5.
 
Hola Mautron , no sé exactamente si el pic css compiler deja que configures todo manejando los registro, lo supe intentar pero no me funcionó, y no le dí importancia porque en realidad era un código de los AVR, que pretendía hacerlo portable entre los dos micros.

Lo que sí me funcionó y a la perfección es el manejo totalmente manual de las entradas y salidas digitales, empleando el bitmask y no las funciones del CCS.

Lo primero que deberías hacer es indicarle al compilador que manejaras manualmente las entradas/salidas digitales, también mira los .h que corresponden al micro en cuestión, porque suelen tener las direcciones de los registros y sus nombres, de esa forma no requerís darle la dirección a mano.

Busca bien que hace "set env" del ccs, para estas cuestiones. Siempre podes mirar el archivo de salida que genera el compilador, en assembler, para saber exactamente lo que tradujo.

Y es como haces, mirando la hoja de dato y ayudándote de un código, por ejemplo del sdcc compiler o el compilador nativo del Microchip.

 
Atrás
Arriba