TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: darck_khronos en 16 de Septiembre de 2009, 16:57:38

Título: Codigo no se Cicla
Publicado por: darck_khronos en 16 de Septiembre de 2009, 16:57:38
Realice el siguiente codigo en un pic 16f877

Código: [Seleccionar]
#include <16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
#include <LCD.C>

void main()
   {
    int16 lectura;
         lcd_init();
   Do   {
         lectura=getchar();
         if(lectura==0x00){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx esperando        ");   
         lcd_gotoxy(1,2);
         printf(lcd_putc,"                    "); 
         output_b(lectura);}
      else if (lectura<=0x01){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");   
         lcd_gotoxy(1,2);
         printf(lcd_putc,"PUERTA ABIERTA       "); 
         output_b(lectura);}
      else if (lectura<=0x03){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");   
         lcd_gotoxy(1,2);
         printf(lcd_putc,"FALLA FUSIBLE        "); 
         output_b(lectura);}
      else if (lectura<=0x07){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL      ");   
         lcd_gotoxy(1,2);
         printf(lcd_putc,"MAQ. EN OPERACION     "); 
         output_b(lectura);}         
      else if (lectura<=0x0F){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");   
         lcd_gotoxy(1,2);
         printf(lcd_putc,"MAQ. BLOQUEADA       "); 
         output_b(lectura);}
      else if (lectura<=0x1F){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");   
         lcd_gotoxy(1,2);
         printf(lcd_putc,"FALLA DE C.F.E.      "); 
         output_b(lectura);}
      else if (lectura<=0x3F){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");   
         lcd_gotoxy(1,2);
         printf(lcd_putc,"FALLA RECTIFICADOR   "); 
         output_b(lectura);}         
      else if (lectura<=0x7F){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");   
         lcd_gotoxy(1,2);
         printf(lcd_putc,"FALLA + RECTIFICADOR "); 
         output_b(lectura);}
      else if (lectura<=0xFF){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");   
         lcd_gotoxy(1,2);
         printf(lcd_putc,"ALTA TEMPERATURA     "); 
         output_b(lectura);}
         }While(1);
}

Cuando lo conecto hasta que no le doy Click en el Master Clear no me imprime las señales que le mando

Siempre que quiero saber lo que sucede devo de darle Master Clear

Lo que no entiendo es por que no me respeta el Do While
Título: Re: Codigo no se Cicla
Publicado por: septiembre_negro en 16 de Septiembre de 2009, 17:52:51
Realice el siguiente codigo en un pic 16f877

Código: [Seleccionar]
#include <16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
#include <LCD.C>

void main()
   {
    int16 lectura;
         lcd_init();
   Do   {
         lectura=getchar();
         if(lectura==0x00){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx esperando        ");   
         lcd_gotoxy(1,2);
         printf(lcd_putc,"                    "); 
         output_b(lectura);}
      else if (lectura<=0x01){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");   
         lcd_gotoxy(1,2);
         printf(lcd_putc,"PUERTA ABIERTA       "); 
         output_b(lectura);}
      else if (lectura<=0x03){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");   
         lcd_gotoxy(1,2);
         printf(lcd_putc,"FALLA FUSIBLE        "); 
         output_b(lectura);}
      else if (lectura<=0x07){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL      ");   
         lcd_gotoxy(1,2);
         printf(lcd_putc,"MAQ. EN OPERACION     "); 
         output_b(lectura);}         
      else if (lectura<=0x0F){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");   
         lcd_gotoxy(1,2);
         printf(lcd_putc,"MAQ. BLOQUEADA       "); 
         output_b(lectura);}
      else if (lectura<=0x1F){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");   
         lcd_gotoxy(1,2);
         printf(lcd_putc,"FALLA DE C.F.E.      "); 
         output_b(lectura);}
      else if (lectura<=0x3F){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");   
         lcd_gotoxy(1,2);
         printf(lcd_putc,"FALLA RECTIFICADOR   "); 
         output_b(lectura);}         
      else if (lectura<=0x7F){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");   
         lcd_gotoxy(1,2);
         printf(lcd_putc,"FALLA + RECTIFICADOR "); 
         output_b(lectura);}
      else if (lectura<=0xFF){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");   
         lcd_gotoxy(1,2);
         printf(lcd_putc,"ALTA TEMPERATURA     "); 
         output_b(lectura);}
         }While(1);
}

Cuando lo conecto hasta que no le doy Click en el Master Clear no me imprime las señales que le mando

Siempre que quiero saber lo que sucede devo de darle Master Clear

Lo que no entiendo es por que no me respeta el Do While



Haber si te funciona tuve el mismo problema el do no hacia el bucle corría una ves el código la solución fue terminar el do así


Código: [Seleccionar]

printf(lcd_putc,"ALTA TEMPERATURA     "); 
         output_b(lectura);}
 }
While(1);
}
Título: Re: Codigo no se Cicla
Publicado por: darck_khronos en 16 de Septiembre de 2009, 18:10:42
Ya lo compile y lo grabe en el pic y sigo en las mismas simplemente tengo ke darle master Clear para poder ver que sucede alguna idea de por que no me genere el ciclo ?
Título: Re: Codigo no se Cicla
Publicado por: gera en 16 de Septiembre de 2009, 18:14:21
Rarisimo lo q te pasa :? A simple vista no veo ningun error de sintaxis. Proba hacer el bucle precondicional asi:
Código: [Seleccionar]
while(TRUE)
{
   //aca tu codigo
}
saludos!
Título: Re: Codigo no se Cicla
Publicado por: MLO__ en 16 de Septiembre de 2009, 18:16:06
Hola.

El problema puede venir del uso de la funcion getchar(); que lo haces por polling.
Título: Re: Codigo no se Cicla
Publicado por: darck_khronos en 16 de Septiembre de 2009, 21:10:42
ya modifique el codigo incluso asi y nada mas nada estoy suviendo el video a youtube para que vean que sucede


Código: [Seleccionar]
void main()
   {
    int16 lectura;
         lcd_init();
         lectura=getchar();
   while(TRUE)
      {
         if(lectura==0x00){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx esperando        ");  
         lcd_gotoxy(1,2);
         printf(lcd_putc,"                    ");  
         output_b(lectura);}
      else if (lectura<=0x01){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");  
         lcd_gotoxy(1,2);
         printf(lcd_putc,"PUERTA ABIERTA       ");  
         output_b(lectura);}
      else if (lectura<=0x03){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");  
         lcd_gotoxy(1,2);
         printf(lcd_putc,"FALLA FUSIBLE        ");  
         output_b(lectura);}
      else if (lectura<=0x07){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL      ");  
         lcd_gotoxy(1,2);
         printf(lcd_putc,"MAQ. EN OPERACION     ");  
         output_b(lectura);}        
      else if (lectura<=0x0F){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");  
         lcd_gotoxy(1,2);
         printf(lcd_putc,"MAQ. BLOQUEADA       ");  
         output_b(lectura);}
      else if (lectura<=0x1F){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");  
         lcd_gotoxy(1,2);
         printf(lcd_putc,"FALLA DE C.F.E.      ");  
         output_b(lectura);}
      else if (lectura<=0x3F){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");  
         lcd_gotoxy(1,2);
         printf(lcd_putc,"FALLA RECTIFICADOR   ");  
         output_b(lectura);}        
      else if (lectura<=0x7F){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");  
         lcd_gotoxy(1,2);
         printf(lcd_putc,"FALLA + RECTIFICADOR ");  
         output_b(lectura);}
      else if (lectura<=0xFF){
         lcd_gotoxy(1,1);
         printf(lcd_putc,"Rx Recibiendo AL     ");  
         lcd_gotoxy(1,2);
         printf(lcd_putc,"ALTA TEMPERATURA     ");  
         output_b(lectura);}
             }
}
Título: Re: Codigo no se Cicla
Publicado por: BrunoF en 16 de Septiembre de 2009, 21:24:17
La línea:
          lectura=getchar();

debe estar dentro del while{}  para poder actualizarse...

Además, puede que si estás bombardeando al uC con datos por el RS232, estés desbordando el buffer del micro, provocando un error en el módulo que impide la lectura del mísmo.

Un saludo.
Título: Re: Codigo no se Cicla
Publicado por: darck_khronos en 16 de Septiembre de 2009, 21:30:39
La línea:
          lectura=getchar();

debe estar dentro del while{}  para poder actualizarse...

Además, puede que si estás bombardeando al uC con datos por el RS232, estés desbordando el buffer del micro, provocando un error en el módulo que impide la lectura del mísmo.

Un saludo.

en los primeros codigos estaba dentro del while y aun asi nada necesitaba mtclr
Título: Re: Codigo no se Cicla
Publicado por: pablomanieri en 17 de Septiembre de 2009, 09:44:50
para que el micro salga del reset debes poner ese pin a 5V, en 0V está en reset. Verifica que lo estás conectando correctamente. Una observación, no lo dejes al aire porque sino no va a funcionar, en el video no se ve bien como lo conectas.
Título: Re: Codigo no se Cicla
Publicado por: darck_khronos en 17 de Septiembre de 2009, 11:18:41
para que el micro salga del reset debes poner ese pin a 5V, en 0V está en reset. Verifica que lo estás conectando correctamente. Una observación, no lo dejes al aire porque sino no va a funcionar, en el video no se ve bien como lo conectas.

El reset esta en 5 Volst, solo hago el cambio de 0 a 5 para que vean que hasta que se hace ese movimiento El pic lee lo que llega por rs232
Título: Re: Codigo no se Cicla
Publicado por: yopepe en 17 de Septiembre de 2009, 11:46:16
Que tal. Yo te diría que revises por el lado de lo que dice BrunoF, quizas el tiempo que tarda en "dar la vuelta" el bucle es largo comparado a la velocidad en que te llegan los datos por RS232 y, por lo tanto se te produce un desborde de buffer (ya que lees una vez por vuelta por lo que veo). Si llega a ser esto, podrías hacer lo siguiente:

-Si no te molesta perder datos, podes agregar ERRORS a la declaración de la interfaz RS232 así se borran los flags de errores automáticamente (tené en cuenta que te va a sobreescribir los valores anteriores, así que si no los leiste los vas a perder).

-Podrias utilizar interrupción para capturar los datos que llegan por el RS232 e ir almacenandolos para luego utilizarlos.

Un saludo y suerte.
Título: Re: Codigo no se Cicla
Publicado por: Ata en 17 de Septiembre de 2009, 13:13:44
Amigo darck Khronos

Quizas lo que te sucede sea debido a que la data recibida es muy rapida, es decir, los bytes son enviados al pic uno detras del otro con poco tiempo entre ellos.

Y el UART del PIC cae en overrun (RCSTA,OVERR = 1) y se bloquea, solo se libera haciendo RCSTA,CREN=0 luego =1 y leyendo RCREG para vaciar el fifo del uart.

Anexo un pequeño codigo ejemplo para ilustrar lo que pienso:

INCHAR    BTFSS       RCSTA,OERR             ;OVER RUN ERROR?
                GOTO       INCH1                        ;NO, SALE
                BCF          RCSTA,CREN              ;SI, CLEAR ERROR
                BSF          RCSTA,CREN
                MOVF        RCREG,W                   ;DUMMY READ OVER RUN DATA

INCH1       BTFSS      PIR1,RCIF                   ;WAIT DATA RX IN
                GOTO       INCH1
                MOVF        RCREG,W                   ;READ DATA -> CHAR
                MOVWF     CHAR
                RETURN

El codigo esta en assembler para ser especifico a lo que me refiero... Personalmente me ha pasado con ciertos compiladores
Tipo C18, HITECH, CCS, que la funcion getchar() la implementan sin cuidar la condicion de over-run del UART solo notorio cuando
se transmite data bytes mas rapido de lo que tu codigo tarda en vaciar el RCREG del uart.

Quizas deberias hacerlo Mediante INTs.. llevando un buffer dedicado.. de ese modo no se te escapa ningun dato.

Espero te sirva de algo mi opinion.

Saludos


Título: Re: Codigo no se Cicla
Publicado por: darck_khronos en 17 de Septiembre de 2009, 20:06:16
Sigo buscando solucion y tomando en cuenta lo que me dicen de paso igual aqui dejo mi programa

Título: Re: Codigo no se Cicla
Publicado por: darck_khronos en 19 de Septiembre de 2009, 00:35:06
Para quien guste ya repare el codigo de la red aqui les dejo el Codigo de RX

Código: C
  1. #include <16F877A.h>
  2. #fuses XT,NOWDT,NOPROTECT,NOLVP
  3. #use delay(clock=4000000)
  4. #use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
  5. #include <LCD.C>
  6. #BYTE TRISA=0X85
  7. #BYTE PORTA=0X05
  8.  
  9. int16 lectura;
  10. #int_RDA
  11. RDA_isr()
  12. {
  13.  lectura=GETC();
  14. }
  15.  
  16. void main()
  17.    {
  18.     bit_clear(TRISA,0);
  19.     enable_interrupts(INT_RDA);
  20.     enable_interrupts(GLOBAL);
  21.       lcd_init();
  22.       do
  23.       {
  24.       //lectura=getc();
  25.       if(lectura==0x00){
  26.          lcd_gotoxy(1,1);
  27.          printf(lcd_putc,"Rx esperando        ");  
  28.          lcd_gotoxy(1,2);
  29.          printf(lcd_putc,"                    ");  
  30.          output_b(lectura);}
  31.       else if (lectura<=0x01){
  32.          lcd_gotoxy(1,1);
  33.          printf(lcd_putc,"Rx Recibiendo AL     ");  
  34.          lcd_gotoxy(1,2);
  35.          printf(lcd_putc,"PUERTA ABIERTA       ");  
  36.          output_b(lectura);}
  37.       else if (lectura<=0x03){
  38.          lcd_gotoxy(1,1);
  39.          printf(lcd_putc,"Rx Recibiendo AL     ");  
  40.          lcd_gotoxy(1,2);
  41.          printf(lcd_putc,"FALLA FUSIBLE        ");  
  42.          output_b(lectura);}
  43.       else if (lectura<=0x07){
  44.          lcd_gotoxy(1,1);
  45.          printf(lcd_putc,"Rx Recibiendo AL      ");  
  46.          lcd_gotoxy(1,2);
  47.          printf(lcd_putc,"MAQ. EN OPERACION     ");  
  48.          output_b(lectura);}        
  49.       else if (lectura<=0x0F){
  50.          lcd_gotoxy(1,1);
  51.          printf(lcd_putc,"Rx Recibiendo AL     ");  
  52.          lcd_gotoxy(1,2);
  53.          printf(lcd_putc,"MAQ. BLOQUEADA       ");  
  54.          output_b(lectura);}
  55.       else if (lectura<=0x1F){
  56.          lcd_gotoxy(1,1);
  57.          printf(lcd_putc,"Rx Recibiendo AL     ");  
  58.          lcd_gotoxy(1,2);
  59.          printf(lcd_putc,"FALLA DE C.F.E.      ");  
  60.          output_b(lectura);}
  61.       else if (lectura<=0x3F){
  62.          lcd_gotoxy(1,1);
  63.          printf(lcd_putc,"Rx Recibiendo AL     ");  
  64.          lcd_gotoxy(1,2);
  65.          printf(lcd_putc,"FALLA RECTIFICADOR   ");  
  66.          output_b(lectura);}        
  67.       else if (lectura<=0x7F){
  68.          lcd_gotoxy(1,1);
  69.          printf(lcd_putc,"Rx Recibiendo AL     ");  
  70.          lcd_gotoxy(1,2);
  71.          printf(lcd_putc,"FALLA + RECTIFICADOR ");  
  72.          output_b(lectura);}
  73.       else if (lectura<=0xFF){
  74.          lcd_gotoxy(1,1);
  75.          printf(lcd_putc,"Rx Recibiendo AL     ");  
  76.          lcd_gotoxy(1,2);
  77.          printf(lcd_putc,"ALTA TEMPERATURA     ");  
  78.          output_b(lectura);}
  79.              }while(true);
  80. }
Título: Re: Codigo no se Cicla
Publicado por: MLO__ en 19 de Septiembre de 2009, 11:38:43
Hola.

Que bien.

Siempre es mejor trabajar la USART por interrupcion que por polling.