Autor Tema: Codigo no se Cicla  (Leído 2651 veces)

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

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Codigo no se Cicla
« 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

Desconectado septiembre_negro

  • PIC18
  • ****
  • Mensajes: 310
Re: Codigo no se Cicla
« Respuesta #1 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);
}

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: Codigo no se Cicla
« Respuesta #2 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 ?

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Codigo no se Cicla
« Respuesta #3 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!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Codigo no se Cicla
« Respuesta #4 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.
El papel lo aguanta todo

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: Codigo no se Cicla
« Respuesta #5 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);}
             }
}

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Codigo no se Cicla
« Respuesta #6 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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: Codigo no se Cicla
« Respuesta #7 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

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Codigo no se Cicla
« Respuesta #8 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.

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: Codigo no se Cicla
« Respuesta #9 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

Desconectado yopepe

  • PIC10
  • *
  • Mensajes: 19
Re: Codigo no se Cicla
« Respuesta #10 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.

Desconectado Ata

  • PIC10
  • *
  • Mensajes: 11
Re: Codigo no se Cicla
« Respuesta #11 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



Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: Codigo no se Cicla
« Respuesta #12 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


Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: Codigo no se Cicla
« Respuesta #13 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. }

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Codigo no se Cicla
« Respuesta #14 en: 19 de Septiembre de 2009, 11:38:43 »
Hola.

Que bien.

Siempre es mejor trabajar la USART por interrupcion que por polling.
El papel lo aguanta todo


 

anything