Autor Tema: Problema Con Rs232 (Un getc no me deja continuar)  (Leído 3123 veces)

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

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Problema Con Rs232 (Un getc no me deja continuar)
« en: 18 de Febrero de 2010, 19:35:28 »
Aqui de nuevo con una duda estoy realizando una comunicacion con dos micros, un 4550 y un 2550 lo cual consiste en lo siguiente:

4550 tiene un dip de 8 pines en el puerto b y dos display uno en el puerto A y otro en el D, al recibir un dato este despliega en hambos un numero que oscile dentro del 00 al 99, cuando quiero enviar los datos que hay en el puerto b tengo que oprimir un boton que esta conectado en el puerto e0 para que este envie los datos.

el 2550 tien tambien un dip en el puerto con la diferencia que este tiene una lcd, cuando recibe el dato del 4550 lo despliega en la Lcd, y al precionar el boton que tiene en el puerto C4, este envia los datos que estan en el Dip.

el problema cuando pruebo por separado los micros funcionan bien pero al conectar los dos no pasa nada y ademas hasta que no se le envia un dato a alguno de los dos pics no hacen nada aqui les dejo los codigo de los programas.

Pic18f4550
Código: C
  1. #include <18f4550.h>
  2. #fuses NOWDT,NOPROTECT,NOLVP,INTRC_IO
  3. #use delay (clock= 8000000)
  4. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
  5. #use standard_io (a)
  6. #use standard_io (b)
  7. #use standard_io (d)
  8. #use standard_io (e)
  9.  
  10. void recepcion()
  11. {
  12. char in,de,un;
  13.   in=getc();
  14.   delay_ms(100);
  15.   de=in&0xf0;
  16.   un=in&0x0f;
  17.       switch(de)
  18.       {
  19.          case 0x00:
  20.          output_a(0xc0);
  21.          break;
  22.          case 0x10:
  23.          output_a(0xf9);
  24.          break;
  25.          case 0x20:
  26.          output_a(0xa4);
  27.          break;
  28.          case 0x30:
  29.          output_a(0xb0);
  30.          break;
  31.          case 0x40:
  32.          output_a(0x99);
  33.          break;
  34.          case 0x50:
  35.          output_a(0x92);
  36.          break;
  37.          case 0x60:
  38.          output_a(0x82);
  39.          break;
  40.          case 0x70:
  41.          output_a(0xf8);
  42.          break;
  43.          case 0x80:
  44.          output_a(0x80);
  45.          break;
  46.          case 0x90:
  47.          output_a(0x90);
  48.          break;
  49.          }
  50.         switch(un)
  51.       {
  52.          case 0x00:
  53.          output_d(0xc0);
  54.          break;
  55.          case 0x01:
  56.          output_d(0xf9);
  57.          break;
  58.          case 0x02:
  59.          output_d(0xa4);
  60.          break;
  61.          case 0x03:
  62.          output_d(0xb0);
  63.          break;
  64.          case 0x04:
  65.          output_d(0x99);
  66.          break;
  67.          case 0x05:
  68.          output_d(0x92);
  69.          break;
  70.          case 0x06:
  71.          output_d(0x82);
  72.          break;
  73.          case 0x07:
  74.          output_d(0xf8);
  75.          break;
  76.          case 0x08:
  77.          output_d(0x80);
  78.          break;
  79.          case 0x09:
  80.          output_d(0x90);
  81.          break;
  82.          }  
  83. }
  84.  
  85. void main()
  86. { char orden,dato;
  87.    for(;;){
  88.    dato=input_b();
  89.    if(input(PIN_e0)==0)
  90.       {
  91.    delay_ms(100);
  92.    putc(dato);
  93.       }  
  94.      else
  95.      recepcion();
  96.    }
  97. }

Programa pic18f2550
Código: [Seleccionar]
#include <18f2550.h>
#FUSES INTRC_IO,NOWDT,PUT,MCLR,NOBROWNOUT,NOLVP,NOPROTECT,NODEBUG,NOFCMEN,NOIESO
#use delay(Internal=8M)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
//------------ Pines del LCD ---------------------//
#define LCD_E     PIN_C0
#define LCD_CK    PIN_C1   
#define LCD_DAT   PIN_C2
//--------------------------------------------------//
#include "lcd3.c"
#use standard_io (a)
#use standard_io (b)

void main()
{
    char orden,in;
    lcd_init();
    while(TRUE) {
        delay_ms(100);
        orden = input_b();
        if(input(PIN_C4)==1) {
            lcd_gotoxy(1,1);
            printf(lcd_putc,"RX En Espera      ");
            putc(orden);
            }
        else{
        in=getc();
        lcd_gotoxy(1,1);
        printf(lcd_putc,"Tx En Mando ",);
        lcd_gotoxy(8,2);
        printf(lcd_putc,"%c",in);
                 }
 }
}
Dejo la simulacion tambien

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problema Con Rs232 (Un getc no me deja continuar)
« Respuesta #1 en: 18 de Febrero de 2010, 19:59:50 »
Hola.

Si vas a usar la recepcion por polling, usa la funcion kbhit(), para saber cuando esta lleno el bufer de recepcion. Otra opcion es usar interrupciones para la USART.

Saludos
El papel lo aguanta todo

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: Problema Con Rs232 (Un getc no me deja continuar)
« Respuesta #2 en: 18 de Febrero de 2010, 20:01:23 »
Gracias MLO___ Disculpa la ignorancia como funciona la funcion kbhit() que mencionas

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Problema Con Rs232 (Un getc no me deja continuar)
« Respuesta #3 en: 18 de Febrero de 2010, 21:22:59 »
Hola, disculpa que me entrometa.

La función kbhit() sirve para esperar un dato en el buffer de recepción del puerto serie del micro, ej:

white(true){
   if(kbhit()){
      proceso...
   }
   esperando...
}

La función kbhit devuelve un 1 cuando se detecta un dato en el buffer
.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problema Con Rs232 (Un getc no me deja continuar)
« Respuesta #4 en: 19 de Febrero de 2010, 00:45:13 »
Exactamente.

Cuando el dato esta listo en el bufer de recepcion la funcion kbhit() retorna un 1, asi que, siguiendo el ejemplo del amigo Cryn, se debería poner la funcion getc(), dentro del if:

Código: C#
  1. while(true)
  2. {
  3.  if(kbhit())
  4.  {
  5.   DatoRx = getc();
  6.   ...
  7.  }
  8. }

Saludos

El papel lo aguanta todo

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: Problema Con Rs232 (Un getc no me deja continuar)
« Respuesta #5 en: 19 de Febrero de 2010, 01:20:01 »
Ya modifique los dos programas y al enlazarlos en proteus funcionan el detalle ahora es que cuando cambio los dip de posision en el codigo que me sale en la terminar virtual si cambia pero el de la Lcd ya nop
4550
Código: C
  1. #include <18f4550.h>
  2. #fuses NOWDT,NOPROTECT,NOLVP,INTRC_IO
  3. #use delay (clock= 8000000)
  4. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
  5. #use standard_io (a)
  6. #use standard_io (b)
  7. #use standard_io (d)
  8. #use standard_io (e)
  9.  
  10. void recepcion()
  11. {
  12. char in,de,un;
  13.   if(kbhit()){
  14.   in=getc();
  15.   de=in&0xf0;
  16.   un=in&0x0f;
  17.       switch(de)
  18.       {
  19.          case 0x00:
  20.          output_a(0xc0);
  21.          break;
  22.          case 0x10:
  23.          output_a(0xf9);
  24.          break;
  25.          case 0x20:
  26.          output_a(0xa4);
  27.          break;
  28.          case 0x30:
  29.          output_a(0xb0);
  30.          break;
  31.          case 0x40:
  32.          output_a(0x99);
  33.          break;
  34.          case 0x50:
  35.          output_a(0x92);
  36.          break;
  37.          case 0x60:
  38.          output_a(0x82);
  39.          break;
  40.          case 0x70:
  41.          output_a(0xf8);
  42.          break;
  43.          case 0x80:
  44.          output_a(0x80);
  45.          break;
  46.          case 0x90:
  47.          output_a(0x90);
  48.          break;
  49.          }
  50.         switch(un)
  51.       {
  52.          case 0x00:
  53.          output_d(0xc0);
  54.          break;
  55.          case 0x01:
  56.          output_d(0xf9);
  57.          break;
  58.          case 0x02:
  59.          output_d(0xa4);
  60.          break;
  61.          case 0x03:
  62.          output_d(0xb0);
  63.          break;
  64.          case 0x04:
  65.          output_d(0x99);
  66.          break;
  67.          case 0x05:
  68.          output_d(0x92);
  69.          break;
  70.          case 0x06:
  71.          output_d(0x82);
  72.          break;
  73.          case 0x07:
  74.          output_d(0xf8);
  75.          break;
  76.          case 0x08:
  77.          output_d(0x80);
  78.          break;
  79.          case 0x09:
  80.          output_d(0x90);
  81.          break;
  82.          }  
  83.     }
  84. }
  85.  
  86. void main()
  87. { char dato;
  88.  for(;;){
  89.    dato=input_b();
  90.    if(input(PIN_e0)==0)
  91.      putc(dato);
  92.    else
  93.      recepcion();
  94.    }
  95. }

2550
Código: C
  1. #include <18f2550.h>
  2. #FUSES INTRC_IO,NOWDT,PUT,MCLR,NOBROWNOUT,NOLVP,NOPROTECT,NODEBUG,NOFCMEN,NOIESO
  3. #use delay(Internal=8M)
  4. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
  5. //------------ Pines del LCD ---------------------//
  6. #define LCD_E     PIN_C0
  7. #define LCD_CK    PIN_C1  
  8. #define LCD_DAT   PIN_C2
  9. //--------------------------------------------------//
  10. #include "lcd3.c"
  11. #use standard_io (a)
  12. #use standard_io (b)
  13.  
  14. void main()
  15. {
  16.     char orden,in;
  17.     lcd_init();
  18.     while(TRUE) {
  19.         orden = input_b();
  20.         if(input(PIN_C4)==1) {
  21.             lcd_gotoxy(1,1);
  22.             printf(lcd_putc,"RX En Espera      ");
  23.             putc(orden);
  24.             }
  25.         else if(kbhit()){
  26.         in=getc();
  27.         lcd_gotoxy(1,1);
  28.         printf(lcd_putc,"Tx En Mando ",);
  29.         lcd_gotoxy(8,2);
  30.         printf(lcd_putc,"%c",in);
  31.                  }
  32.  }
  33. }

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problema Con Rs232 (Un getc no me deja continuar)
« Respuesta #6 en: 19 de Febrero de 2010, 11:51:19 »
Hola.

Prueba poner el codigo de la LCD fuera del if que evalua el kbhit().

Saludos
El papel lo aguanta todo

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: Problema Con Rs232 (Un getc no me deja continuar)
« Respuesta #7 en: 21 de Febrero de 2010, 20:26:58 »
ya logre solucionar lo del Pic 4550 el detalle ahora es el pic 2550, ya que al enviarle la informacion solo la presenta por unos segundos y despues se cicla y ya no envia datos y al recibirlos no hace nada tampoco, alguna idea de como podria implementar en este pic la interrupcion por :

#int_RDA
RDA_isr()

Pic18f4550
Código: C
  1. #include <18f4550.h>
  2. #fuses NOWDT,NOPROTECT,NOLVP,INTRC_IO
  3. #use delay (clock= 8000000)
  4. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
  5. #use standard_io (a)
  6. #use standard_io (b)
  7. #use standard_io (d)
  8. #use standard_io (e)
  9.  
  10. void recepcion()
  11. {
  12. char in,de,un;
  13.   if(kbhit()){
  14.   in=getch();
  15.   de=in&0xf0;
  16.   un=in&0x0f;
  17.       switch(de)
  18.       {
  19.          case 0x00:
  20.          output_a(0xc0);
  21.          break;
  22.          case 0x10:
  23.          output_a(0xf9);
  24.          break;
  25.          case 0x20:
  26.          output_a(0xa4);
  27.          break;
  28.          case 0x30:
  29.          output_a(0xb0);
  30.          break;
  31.          case 0x40:
  32.          output_a(0x99);
  33.          break;
  34.          case 0x50:
  35.          output_a(0x92);
  36.          break;
  37.          case 0x60:
  38.          output_a(0x82);
  39.          break;
  40.          case 0x70:
  41.          output_a(0xf8);
  42.          break;
  43.          case 0x80:
  44.          output_a(0x80);
  45.          break;
  46.          case 0x90:
  47.          output_a(0x90);
  48.          break;
  49.          }
  50.         switch(un)
  51.       {
  52.          case 0x00:
  53.          output_d(0xc0);
  54.          break;
  55.          case 0x01:
  56.          output_d(0xf9);
  57.          break;
  58.          case 0x02:
  59.          output_d(0xa4);
  60.          break;
  61.          case 0x03:
  62.          output_d(0xb0);
  63.          break;
  64.          case 0x04:
  65.          output_d(0x99);
  66.          break;
  67.          case 0x05:
  68.          output_d(0x92);
  69.          break;
  70.          case 0x06:
  71.          output_d(0x82);
  72.          break;
  73.          case 0x07:
  74.          output_d(0xf8);
  75.          break;
  76.          case 0x08:
  77.          output_d(0x80);
  78.          break;
  79.          case 0x09:
  80.          output_d(0x90);
  81.          break;
  82.          }  
  83.     }
  84. }
  85.  
  86. void main()
  87. { char dato;
  88.  for(;;){
  89.    delay_ms(100);
  90.    dato=input_b();
  91.    if(input(PIN_e0)==0)
  92.      putc(dato);
  93.    else
  94.      recepcion();
  95.    }
  96. }

Pic18f2550
Código: C
  1. #include <18f2550.h>
  2. #FUSES NOWDT,PUT,MCLR,NOBROWNOUT,NOLVP,NOPROTECT,NODEBUG,NOFCMEN,NOIESO,XT
  3. #use delay(clock=4000000)
  4. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
  5. //------------ Pines del LCD ---------------------//
  6. #define LCD_E     PIN_C0
  7. #define LCD_CK    PIN_C1  
  8. #define LCD_DAT   PIN_C2
  9. //--------------------------------------------------//
  10. #include "lcd3.c"
  11. #use standard_io (a)
  12. #use standard_io (b)
  13.  
  14. void main()
  15. { char in, dato;
  16.  lcd_init();
  17.  for(;;){
  18.    delay_ms(100);
  19.    if(input(PIN_A0)==1){
  20.      putc(dato);
  21.      dato=input_b();}
  22.    else{
  23.    in=getch();
  24.    lcd_gotoxy(1,1);
  25.    printf(lcd_putc,"Tx En Mando ",);
  26.    lcd_gotoxy(8,2);
  27.    printf(lcd_putc,"%c",in);
  28.       }
  29.    }
  30. }

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problema Con Rs232 (Un getc no me deja continuar)
« Respuesta #8 en: 21 de Febrero de 2010, 21:02:19 »
Hola.

Usar la interrupcion para la USART es lo mas recomendable.

Normalmente -y es que se recomienda mucho- la rutina de interrupcion debe tomar muy poco tiempo. Un ejemplo muy básico seria:

Código: C#
  1. #int_RDA
  2. void RecepcionUSART_isr(void)
  3. {
  4.  BufferRx[i++] = getc();
  5.  FlagDatoOK=1;
  6. }

En el programa principal, ya harias lo que tienes que hacer evaluando el FlagDatoOK con un if:

Código: C#
  1. void main (void)
  2. {
  3.  enable_interrupts(INT_RDA);
  4.  enable_interrupts(GLOBAL);
  5.  ...
  6.  while(true)
  7.  {
  8.   if(FlagDatoOK)
  9.   {
  10.     FlagDatoOK=0;
  11.     ....//Resto de codigo
  12.   }
  13.  }
  14. }

Saludos
El papel lo aguanta todo

Desconectado sparta13

  • PIC10
  • *
  • Mensajes: 7
Re: Problema Con Rs232 (Un getc no me deja continuar)
« Respuesta #9 en: 12 de Marzo de 2014, 15:55:31 »
y que paso con el problema se soluciono????  :oops: