Autor Tema: comunicar dos pic por la uart(ayuda urgente)  (Leído 2861 veces)

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

Desconectado marisela

  • PIC10
  • *
  • Mensajes: 5
comunicar dos pic por la uart(ayuda urgente)
« en: 27 de Abril de 2006, 12:17:33 »
Hola a todos!!!  :-) Necesito enviar una cadena de caracteres de un pic 18f4620 a otro igual mediante la uart, pero no se como hacer ya que empece enviando un caracter y no me hizo nada ahora imaginen que intente enviar una cadena :? aui les envio el simple codigo que hice que no funciona a ver si me pueden ayudar o si tiene un codigo que haga lo que quiero por favor me lo envian..Tambien estuve leyendo que ahi uart por software y por hadware y no entendi mucho por fa quien sepa algo de esto ayudenme. GRACIAS de antemano

------------------------------------------------------------------------------------------------------------------------------------------------------
codigo del transmisor
--------------------------------------------------------------------------------------------------------------------------------------------------------
#include <18F4620.h>
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT,WDT128,XT, NOPROTECT, IESO, BROWNOUT, BORV21, NOPUT, NOCPD, NOSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOEBTR, NOCPB, NOEBTRB, NOWRTC, NOWRTB, NOFCMEN, NOXINST, NOPBADEN, NOLPT1OSC, NOMCLR
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)



void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);


while (1)
{
printf("A");
}

}
--------------------------------------------------------------------------------------------------------------
codigo del receptor
--------------------------------------------------------------------------------------------------------------
#include <18F4620.h>
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT,WDT128,XT, NOPROTECT, IESO, BROWNOUT, BORV21, NOPUT, NOCPD, NOSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOEBTR, NOCPB, NOEBTRB, NOWRTC, NOWRTB, NOFCMEN, NOXINST, NOPBADEN, NOLPT1OSC, NOMCLR
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)


void main()
{

char dato;

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);


dato=getc();

if (dato=='A')
{
      output_high(PIN_B0);
      delay_ms(500);
      output_low(PIN_B0);
}

}

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: comunicar dos pic por la uart(ayuda urgente)
« Respuesta #1 en: 27 de Abril de 2006, 15:14:40 »
En tu código veo varias cosas que yo no las hubiese hecho asi ... me explico:

El emisor está constantemente enviando a toda la velocidad que le es posible, así te va a ser difícil comprobar en el receptor si te está llegando bien la emisión .... En el código que yo te propongo dejo un espacio pausado para que le dé tiempo al receptor a recibir lo que le mandan, procesarlo y ponerse de nuevo a la escucha ....

El receptor está constantemente descargando el contenido de la USART sin comprobar si ésta ha recibido o no algo, con lo cual en el tiempo en que presumiblemente tendrías que encender el led han llegado cientos de caracteres desde el PIC emisor ...  En el código que yo te propongo primero le pregunto a la USART si hay algo pendiente de recibir y solo en caso afirmativo paso a descargarlo y procesarlo.

Una sana costumbre consiste tambien en que cuando hagas parpadear un Led le pongas un Delay para el tiempo en alto y otro Delay para el tiempo en bajo, porque de lo contrario se te puede dar el caso de que lo enciendas esperes 500 ms, como tú has puesto, lo apagues ... y unos pocos microsegundos despues vuelvas a encenderlo, sin darte tiempo a ver si se ha apagado o nó.


En fin, prueba con esto y cuentános que tal te ha ido ....  :mrgreen:

(¿Son obligatorios la paridad y los 9 bits?)

Un saludo.

------------------------------------------------------------------------------------------------------------------------------------------------------
codigo del transmisor
--------------------------------------------------------------------------------------------------------------------------------------------------------
#include <18F4620.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT, NOPBADEN
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);


   while (true){          // Bucle infinito
     printf("A");          // envío el caracter A
     delay_ms(600);   // espero al que el PIC receptor reciba y procese sin recibir mas cosas para que no se solapen
   }                          // y ademas para que me de tiempo a ver el efecto producido por mi envío-recepción
}                             // (no sería mala idea implementar un procedimiento de ACK)

--------------------------------------------------------------------------------------------------------------
codigo del receptor
--------------------------------------------------------------------------------------------------------------
#include <18F4620.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT, NOPBADEN
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)


void main()
{

   char dato='\0';   // Declaro la variable de entrada y la inicializo a 0x00

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   while (true){                          // Bucle infinito
      if(kbhit()){                          // si hay algo pendiente de descargar en la UART ... 
         dato=getc();                    // lo descargo sobre la variable -dato-
         if (dato=='A'){                 // si el contenido de la variable -dato- es igual al caracter 'A'
            dato='\0';                     // reinicializo la variable -dato- a 0x00
            output_high(PIN_B0);    // activo el pin B0
            delay_ms(250);            // espero 250 milisegundos
            output_low(PIN_B0);     // desactivo el pin B0
            delay_ms(250);            // espero otros 250 milisegundos
         }
      }
   }
}
« Última modificación: 27 de Abril de 2006, 15:40:51 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado marcegoncba

  • PIC10
  • *
  • Mensajes: 17
Re: comunicar dos pic por la uart(ayuda urgente)
« Respuesta #2 en: 28 de Abril de 2006, 12:15:04 »
Adicionalmente a lo dicho por RedPic se puede usar la interrupción que se produce cuando llega un caracter a la USART, ir llenando un buffer de datos y cuando el buffer esté lleno procesar la información.
La rutina de interrupción puede ser algo como esto:
Código: CSS
  1. #int_RDA
  2. void RDA_isr() {
  3.         //actualiza el dato recibido en el buffer
  4.         RXbuffer[RXdataIndex] = getc();
  5.         //actualiza el indice, si llega al final de la cuenta
  6.         //indica que se recibio la respuesta y desactiva la
  7.         //interrupcion (ningun dato posterior sera tomado en cuenta)
  8.         RXdataIndex = (RXdataIndex + 1) % RX_BUFFER_SIZE;
  9.         //si se completa el buffer de recepción indicar que
  10.         //se procese la orden recibida
  11.         if (!RXdataIndex){
  12.                 disable_interrupts(INT_RDA);
  13.                 checkCommFlag = 1;
  14.         }
  15. }

En el programa principal, durante el setup de periféricos hay que activar la interrupción
   enable_interrupts(INT_RDA);

Y el loop infinito del main queda algo así:
Código: CSS
  1. //loop infinito
  2.         for(;;){
  3.                 //hacer cosas...
  4.                
  5.                 //si se activa la bandera de buffer lleno
  6.                 if(checkCommFlag){
  7.                         //hacer cosas con el buffer de datos
  8.  
  9.                         //borrar la bandera
  10.                         checkCommFlag = 0;
  11.                         //se vuelven a tener en cuenta las interrupciones
  12.                         enable_interrupts(INT_RDA);
  13.                 }
  14.                 //hacer más cosas...
  15.  
  16.         }
   
Las declaraciones de variables queda algo así:
Código: CSS
  1. //un buffer de 5 bytes
  2. #define RX_BUFFER_SIZE 5
  3. //el índice del buffer
  4. static int RXdataIndex;
  5. //el buffer incializado en 0
  6. int RXbuffer[RX_BUFFER_SIZE] = {0,0,0,0,0};
  7. //bandera para comprobar la comunicación
  8. static short int checkCommFlag;
La transmisión podría ser algo análogo a esto, pero es la idea lo que quiero mostrar. Yo lo uso para comunicar un master con un esclavo en duplex y a mí me funciona.

Saludos

PD: el micro que uso es el 16F877 master y el 16F627 esclavo
« Última modificación: 28 de Abril de 2006, 13:16:28 por Nocturno »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: comunicar dos pic por la uart(ayuda urgente)
« Respuesta #3 en: 28 de Abril de 2006, 13:17:27 »
Te he puesto el Geshi en tu post anterior, para que se vea mejor.

Desconectado marisela

  • PIC10
  • *
  • Mensajes: 5
Re: comunicar dos pic por la uart(ayuda urgente)
« Respuesta #4 en: 03 de Mayo de 2006, 10:25:19 »
HOLA a todos!! gracias a redpic por el codigo que me enviaste ya resolvi mi problema gracias a tus consejos  :-/
 a nocturno tambien gracias no sabia que habia una interrupcion para eso gracias voy a intentar hacerlo por ahi tambien..

   Gracias por solucionarme el problema!!!

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: comunicar dos pic por la uart(ayuda urgente)
« Respuesta #5 en: 03 de Mayo de 2006, 11:00:26 »
Me haces feliz con poder haberte sido útil.

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado marcegoncba

  • PIC10
  • *
  • Mensajes: 17
Re: comunicar dos pic por la uart(ayuda urgente)
« Respuesta #6 en: 04 de Mayo de 2006, 08:26:23 »
de nada...
Ya veo que he quedado fuera de los créditos finales de la película :(

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: comunicar dos pic por la uart(ayuda urgente)
« Respuesta #7 en: 04 de Mayo de 2006, 08:42:11 »
No te preocupes marcegoncba, está claro que se ha confundido de nombre. Marisela un poco más de atención para quienes te ayudan.

Desconectado marisela

  • PIC10
  • *
  • Mensajes: 5
Re: comunicar dos pic por la uart(ayuda urgente)
« Respuesta #8 en: 04 de Mayo de 2006, 15:21:26 »
hola marcegoncba!! por favor te ruego que me disculpes me confundi de nombre lo que trate de hacer  fue darle gracias a todos los que me respondieron fue solo una confucion, mis disculpas.....Los tres me dieron ideas muy buenas que me ayudaron.... tratare de estar mas despierta la proxima vez  :mrgreen:
 
GRACIAS TOTALES  :D