Autor Tema: Emudor de USART en un PIC16f877A  (Leído 8613 veces)

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

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Emudor de USART en un PIC16f877A
« en: 20 de Noviembre de 2008, 15:20:44 »
Hola,
Quisiera saber :?: si alguien a implementado un emulador de USARt en un PIC16F877A, necesito comunicarme por dos puerto serie usando este pic. 

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Emudor de USART en un PIC16f877A
« Respuesta #1 en: 20 de Noviembre de 2008, 16:15:17 »
Saludos!

Espero haberte entendido bien, con "emulador de USART" te refieres a tener un código que haga las veces del módulo USART que tiene el pic, correcto? Ya que estás usando dos puertos seriales, supongo que ya estás usando el hardware USART del micro. En qué lenguaje programas? Si es C o Basic, pues no hay problema, porque puedes usar tantos pines para comunicación serial como necesites, el compilador se encarga de todo... puedes usar cualquier pin de E/S para la interfaz serial... si especificas el lenguaje en el que estás trabajando se te podría ayudar más...
Para assembler si hay que ponerle un poco más de echar código y más código.

Ok nos leemos!  :mrgreen:


"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: Emudor de USART en un PIC16f877A
« Respuesta #2 en: 20 de Noviembre de 2008, 17:52:07 »
Hola,
Quisiera saber :?: si alguien a implementado un emulador de USARt en un PIC16F877A, necesito comunicarme por dos puerto serie usando este pic. 

No te entiendo bien meduza  :shock:
Quieres enviar informacion desde el pic16f877a a por ejemplo dos pc o dos pic conectados a ese micro?

yo no entender  :D

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Re: Emudor de USART en un PIC16f877A
« Respuesta #3 en: 20 de Noviembre de 2008, 18:35:39 »
Citar
Espero haberte entendido bien, con "emulador de USART" te refieres a tener un código que haga las veces del módulo USART que tiene el pic, correcto? Ya que estás usando dos puertos seriales, supongo que ya estás usando el hardware USART del micro

 :-/ hola firepic, estas en lo correcto, yo estoy trabajando con el CCS  :-)

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: Emudor de USART en un PIC16f877A
« Respuesta #4 en: 20 de Noviembre de 2008, 19:21:54 »
Ah meduza si es asi me supongo que el CCS trae instrucciones para eso!
En pic basic pro asi como en proton tambien existen instrucciones que te emulan el usart del pic, como son el serin, serout, rsin, rsout entre otras.

Pero si es ccs lo que te hace falta deberias darte una vuelta por el sub foro de lenguaje c para microcontroladores, de seguro alli hay bastante informacion al respecto   :mrgreen:

Saludos

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Emudor de USART en un PIC16f877A
« Respuesta #5 en: 20 de Noviembre de 2008, 22:17:06 »
Medusa, fíjate en esto:



Esta es la ayuda de CCS para el #use rs232.
Lo que debes hacer es declarar la tasa de baudios (BAUD=), declarar el pin de transmisión y de recepción (XMIT y RCV), y asignarle un nombre (STREAM=). Entonces cuando vayas a enviar, por ejemplo, no usas el común "printf(value)", sino "fprintf(stream,value)".
Te coloco un ejemplo:

Código: C
  1. //Esto va junto con las demás declaraciones de inicio
  2. #use rs232(BAUD=19200,XMIT=PIN_B7,RCV=PIN_B6,STREAM=serialemulado)
  3.  
  4. //Si quieres enviar un dato, digamos una variable "value" previamente declarada:
  5. fprintf(serialemulado,value);
  6. //Para recibir:
  7. value=fgetc(serialemulado);

Y pues eso sería todo. Claro que en este caso, PORTB debe ser declarado el pin 7 como salida y pin 6 como entrada.
De esa forma puedes agregar varios puertos seriales si los necesitas, asignándole diferentes "stream". Claro que el puerto serial por hardware no sufriría modificaciones y debería seguir funcionando con los comandos comunes printf, getc.

Espero puedas resolver tu problema, luego nos cuentas como te fue.
Un cordial saludo, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Re: Emudor de USART en un PIC16f877A
« Respuesta #6 en: 20 de Noviembre de 2008, 23:09:43 »
Gracias por la ayuda pero talves no me explique bien  :mrgreen:, lo que necesito es transmitir y recibir simultanemente ya se por el UART fisico como por el UART virtual (si recibo un dato en el UART fisico retransmitir este dato por UART Virtual y si recibo algun dato por el UART virtual retransmitir este dato por le UART Fisico) :?:

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Emudor de USART en un PIC16f877A
« Respuesta #7 en: 21 de Noviembre de 2008, 07:44:24 »
Tienes que habilitar ambas USART al comienzo de tu programa, utilizando el #use RS232 que te ha indicado Firepic con StreamId diferentes, por ejemplo, STREAM=USART_FISICO y STREAM=USART_VIRTUAL

Y luego, para hacer lo que quieres, se me ocurre que podría servir lo siguiente:

Código: C
  1. while (1) {
  2.         if (keybsp(USART_FISICO))
  3.                 fputc(fgetc(USART_FISICO),USART_VIRTUAL);
  4.         if (keybsp(USART_VIRTUAL))
  5.                 fputc(fgetc(USART_VIRTUAL),USART_FISICO);
  6. }

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Emudor de USART en un PIC16f877A
« Respuesta #8 en: 21 de Noviembre de 2008, 12:55:20 »
Tambien se puede asignar el pin de recepcion a algun pin con interrupcion al flanco (pin_b0, por ejemplo) y de esa manera te quedan las dos USART con recepcion mediante interrupcion.

En el ejemplo del CCS  EX_ENCRY.C esta una forma de uso.

Saludos
El papel lo aguanta todo

Desconectado Alejandro

  • PIC16
  • ***
  • Mensajes: 112
Re: Emudor de USART en un PIC16f877A
« Respuesta #9 en: 24 de Noviembre de 2008, 18:12:04 »
Hola MLO, estuve revisando el ejemplo que mencionas "EX_ENCRY.C" en donde se puede implementar una comunicacion entre dos PCs usando un USART implementado por software y otro por hardware, cuando envio un mensaje del USART Fisico al virtual este recibe el mensaje sin problemas pero cuando trato de hacer lo inverso es decir enviar un mensaje a traves del USART virtual al Fisico el mensaje llaga pero es ilegible, en el comentario de este ejemplo dice que esta encliptado en un sentido pero por mas que reviso este ejemplo no logro ubicar que lineas del programa que hacen la enliptacion, podrias decirme cual es mi error.

Código: [Seleccionar]
/////////////////////////////////////////////////////////////////////////
////                          EX_ENCRY.C                             ////
/////////////////////////////////////////////////////////////////////////
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

#define BUFFER_SIZE 32

///////////////////////////////////////////////////////////////// PORT 1
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

byte buffer1[BUFFER_SIZE];
byte next_in1 = 0;
byte next_out1 = 0;

#int_rda
void serial_isr1() {
   int t;

   buffer1[next_in1]=getc();
   t=next_in1;
   next_in1=(next_in1+1) % BUFFER_SIZE;
   if(next_in1==next_out1)
     next_in1=t;           // Buffer full !!
}

#define bkbhit1 (next_in1!=next_out1)

byte bgetc1() {
   byte c;

   while(!bkbhit1) ;
   c=buffer1[next_out1];
   next_out1=(next_out1+1) % BUFFER_SIZE;
   return(c);
}

void putc1(char c) {
   putc(c);
}


///////////////////////////////////////////////////////////////// PORT 2
#use rs232(baud=9600, xmit=PIN_B1, rcv=PIN_B0)

byte buffer2[BUFFER_SIZE];
byte next_in2 = 0;
byte next_out2 = 0;

#int_ext
void serial_isr2() {
   int t;

    buffer2[next_in2]=getc();
   t=next_in2;
   next_in2=(next_in2+1) % BUFFER_SIZE;
   if(next_in2==next_out2)
     next_in2=t;           // Buffer full !!
}

#define bkbhit2 (next_in2!=next_out2)

byte bgetc2() {
   byte c;

   while(!bkbhit2) ;
   c=buffer2[next_out2];
   next_out2=(next_out2+1) % BUFFER_SIZE;
   return(c);
}

void putc2(char c) {
   putc(c);
}

///////////////////////////////////////////////////////////////////////////////////////

void main() {
   char c;

   enable_interrupts(global);
   enable_interrupts(int_rda);
   enable_interrupts(int_ext);

   printf(putc2,"\r\n\Corriendo...\r\n");


   do {
      if(bkbhit1) {
   c = bgetc1();
putc2(c);
}
      if(bkbhit2) {
   c = bgetc2();
putc1(c);
}
   } while (TRUE);
}

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Emudor de USART en un PIC16f877A
« Respuesta #10 en: 24 de Noviembre de 2008, 20:56:03 »
Hola.

No hay error, es solo el primer bit el que se debe tener en cuenta, es decir el bit de start.

Código: [Seleccionar]
ext_int_edge(H_TO_L);
Saludos
El papel lo aguanta todo

Desconectado Alejandro

  • PIC16
  • ***
  • Mensajes: 112
Re: Emudor de USART en un PIC16f877A
« Respuesta #11 en: 25 de Noviembre de 2008, 00:30:46 »
Citar
No hay error, es solo el primer bit el que se debe tener en cuenta, es decir el bit de start.
Código:

ext_int_edge(H_TO_L);

No entiendo  :(  en que linea del programa debo de colocar este codigo?

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Re: Emudor de USART en un PIC16f877A
« Respuesta #12 en: 25 de Noviembre de 2008, 03:19:28 »
Hola Nocturno, he tratado de compilar usando tu sugerencia pero tengo un error con la sentencia keybsp que no es reconocido por el compilador, como puedo solucionar esto?

Citar
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,STREAM=USART_FISICO)
#use rs232(baud=9600, xmit=PIN_B6, rcv=PIN_B7,STREAM=USART_VIRTUAL)

main(){
while (1) {   
   if (keybsp(USART_FISICO))
      fputc(fgetc(USART_FISICO),USART_VIRTUAL);
         
   if (keybsp(USART_VIRTUAL))
      fputc(fgetc(USART_VIRTUAL),USART_FISICO);
    }
}

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Emudor de USART en un PIC16f877A
« Respuesta #13 en: 25 de Noviembre de 2008, 03:39:25 »
Disculpa, Medusa.
Todavía tengo reminiscencias de mi pasado en Visual Basic. Donde ponga keybsp() sustitúyelo por kbhit()

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Re: Emudor de USART en un PIC16f877A
« Respuesta #14 en: 25 de Noviembre de 2008, 04:15:23 »
Gracias Nocturno   :-/  funciona OK !!


 

anything