Autor Tema: transmisor-receptor rs232  (Leído 4753 veces)

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

Desconectado marc_85

  • PIC10
  • *
  • Mensajes: 16
transmisor-receptor rs232
« en: 05 de Marzo de 2007, 00:16:46 »
Hola amigos, hace poco que he entrado en el mundo de los microcontroladores. He hecho muchos ejemplos con el ccs y fucionan bien. Ahora he intentado hacer un sistema de transmision con dos pic's 16f84A pero le he dado muchas vueltas y no consigo que funcione. Si alguien pudiera hecharle un vistazo se lo agradeceria mucho.

Funcionamiento.
El emisor.
Permanece durmiendo hasta recibir una primera interrupcion por el puerto RB0. Empieza a contar secuencialmente de 0 a 15 esperando 0,5 segundos en cada número y reflejandolo en el puerto A.
Al recibir la segunda interrupción transmite el numero actual mediante rs232 por la patilla RB1. Hago una conversion de tipos para poder utilizar el putchar.

El receptor.
Permanece escuchando en la patilla B2. Al recibir un caracter lo convierte a numero entero y lo compara con su referencia. Si es igual, activa la patilla RB7.

Supongo que habra grandes fallos ya que soy novato en C tambien.

EMISOR


#include <16F84A.H>
#use delay(clock=4000000)
#fuses XT,NOWDT
#use RS232(BAUD=1200, BITS=8, PARITY=N, XMIT=PIN_B1, RCV=PIN_B2)
 
int cont_int=0;      //contador de interrupcion
int contador;      //contador principal (0000,0001,0010,0011,.. en el puerto A)



#int_EXT
EXT_isr()
{   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   #ASM
   goto   0x0080      //apunta al "if" de abajo pero no sabia como hacerlo
  #ENDASM

}



void main()
{

   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
     
      while(true){
         sleep();

      if (cont_int==0){
               cont_int=1;
      for (contador=0,contador<16,contador++){
         PORTA=contador;              //Supongo que el PORTA esta mal.
                     delay_ms(500);}
               }
         else if(cont_int==1){
                  char contaletra;
                  contalletra=(int)contador;      //conversion de tipo para poder utilizar putchar
                  putchar(contaletra);
                  cont_int=0;}
               else cont_int=0;}

}



RECEPTOR

#include <16F84A.H>
#use delay(clock=4000000)
#fuses XT,NOWDT
#use RS232(BAUD=1200, BITS=8, PARITY=N, XMIT=PIN_B1, RCV=PIN_B2)

char letra;
int referencia;      //referencia del receptor



void main()
{

   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
 
   while(true){
       letra=getchar();
   int numero=(char)letra;      //conversion de tipo

   if (numero==referencia) OUTPUT_BIT(PIN_B7,1);}}
 

Espero que puedan ayudarme, muchas gracias.



Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: transmisor-receptor rs232
« Respuesta #1 en: 05 de Marzo de 2007, 20:15:55 »
Así no lo vas a conseguir necesitas que los pic se comuniquen entre ellos, poniendo en cada uno de ellos un nombre para la comunicación en la directiva #use RS232...

Ahora mismo no tengo tiempo, si puedo mañana por la tarde te pongo un ejemplo...auque si buscas en el foro hay ejemplos de como se realiza...de hecho ya contesté alguno sobre este tema.

Un saludete.

Bueno hemos sacado tiempo de donde hemos podido y aquí tienes el código...para un pic...en el otro tendrás que programar algo por el estilo...espero que te sirva de ayuda o al menos para hacerte una idea de como funciona...

 //COMUNICACIÓN   

#include <18F4550.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=12000000)


#USE RS232(BAUD=19200, XMIT=PIN_C6, RCV=PIN_C7, stream=PC)

#USE RS232(BAUD=19200, XMIT=PIN_A0, RCV=PIN_A1, stream=RF)

void main(void) {

      char c,d;

      while(TRUE)  //Bucle infinito
      {
         if (kbhit(PC))  //interrumpimos si el PC envia o recibe datos
            {
               c = getc(PC);  //Cogemos los datos que nos da el PC
               putc(c,RF);  //y lo sacamos por la patilla A0 con protocolo RS232 
            }
           
         if (kbhit(RF)) 
            {
               d = getc(RF); 
               putc(d,PC); 
            }
      }
}  //ESTE PROGRAMA DE COMUNICACIÓN FUNCIONA PERFECTAMENTE
« Última modificación: 05 de Marzo de 2007, 20:37:54 por c4_esp_VR »

Desconectado marc_85

  • PIC10
  • *
  • Mensajes: 16
Re: transmisor-receptor rs232
« Respuesta #2 en: 05 de Marzo de 2007, 22:23:48 »
Muchas gracias por tu respuesta. Nada mas tenga un momento empiezo por ahí. Aunque supongo a primera vista que este es un dispositivo que actua como una especie de puente etre el pc y otro dispositivo, no?

Nuevamente, gracias.

Desconectado championz

  • PIC16
  • ***
  • Mensajes: 127
Re: transmisor-receptor rs232
« Respuesta #3 en: 12 de Marzo de 2007, 15:34:23 »
Una pregunta... he hecho varios programas que se comunican con algun dispositivo por RS 232... pero siempre llego al mismo problema... cuando configuro los puertos de RX y TX siempre debo SI O SI usar los puertos que en el datasheet figuran como TX y RX ... cuando los cambio la comunicacion no resulta, cambio elhardware tambien obviamente... no tendria que andar igual?

por ejemplo... el pic 18F252 los pines son C7 y C6 ... pero si quiero usar por ejemplo A1 y A2 no funciona... me esta faltando algo? uso siempre el mismo codigo... pero de una forma anda y de la otra no.

gracias!

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: transmisor-receptor rs232
« Respuesta #4 en: 12 de Marzo de 2007, 16:03:30 »
Una pregunta... he hecho varios programas que se comunican con algun dispositivo por RS 232... pero siempre llego al mismo problema... cuando configuro los puertos de RX y TX siempre debo SI O SI usar los puertos que en el datasheet figuran como TX y RX ... cuando los cambio la comunicacion no resulta, cambio elhardware tambien obviamente... no tendria que andar igual?

por ejemplo... el pic 18F252 los pines son C7 y C6 ... pero si quiero usar por ejemplo A1 y A2 no funciona... me esta faltando algo? uso siempre el mismo codigo... pero de una forma anda y de la otra no.

gracias!

Usar la usart por hardware y por software puede que sea 'transparente' para tu código pero no lo es para el PIC.

Si la comunicación es con eventos muy veloces , la que se hace por software tiene grandes chances de fracasar cuando se entremezclan con otros eventos!

Busca este tema en el foro, hace unos días diego (redpic) posteó explicando las diferencias.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)


 

anything