Autor Tema: Como recibo mas de 8 bits por RS232? PIC18F4550  (Leído 1548 veces)

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

Desconectado luisluna16

  • PIC10
  • *
  • Mensajes: 1
Como recibo mas de 8 bits por RS232? PIC18F4550
« en: 02 de Junio de 2015, 14:50:44 »
Buen dia tengan todos, soy nuevo en el foro, soy Luis Luna y futuro ingeniero en electronica.
Necesito de su ayuda, como dice el titulo, necesito enviar desde la PC al PIC 12 datos de 1 bit cada uno por RS232, pero mi PIC18F4550 solo puede recibir 8 bits.
Es posible realizar tal transmision? :shock:
Eh investigado mucho pero no encuentro una explicacion o un ejemplo claros.
Si pudieran explicarme el concepto y un ejemplo, me ayudarian mucho.
Gracias de antemano.


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Como recibo mas de 8 bits por RS232? PIC18F4550
« Respuesta #1 en: 02 de Junio de 2015, 15:20:21 »
Podes hacerlo con interrupciones o sin interrupciones. Con sus ventajas y desventajas.

La interrupcion te permite rapidamente leer lo que llego y volver a seguir lo que estabas haciendo
Sin interrupcion te permite leerlo cuando quieras, el tema esta en que tenes que tener la precaucion de leerlo antes que llegue otro dato.

Vos envias 12 bits, anque en realidad se transmiten en bytes, es decir serian 2 bytes a transmitir. Y recibis en Bytes tambien, 1 por ves, si transmitis 100, recibis 100 pero uno por ves.

Supongamos sin interrupcion , con un receptor de 1 nivel de buffer ( o sesa puede almacenar solo 1 dato, la cantidad depende del modulo)
Cuando se almacena el dato se activa el flag RXIF , (esto depende del micro) y tu dato va a estar en RXREG (el nombre tmb depende del micro)

Algo asi, parecido pero para que te des una idea, seria sin interrupciones
Código: C
  1. int Vector_Guardado[2],j=0;
  2. bit dato_listo;
  3.  
  4.  
  5. if (RXIF == 1)                                  //Si esta en 1 llego un dato
  6. {
  7.         dato_listo=0;                           // Pongo a 0 ya que no se si ya llegaron los 2 datos o no, para que no me quede mitad de un dato viejo y mitad de uno nuevo
  8.         Vector_Guardado[j] = RXREG;             // Guardo lo que llego primero en Vector_Guardado[0] y luego cuando entre de nuevo en Vector_Guardado[1]
  9.         j++;
  10.         RXIF=0;                                 // Borro el flag
  11.         if(j==2)                                // LLego a 2, es decir ya se guardaron los 2 datos?, entonces pongo a 0 j, asi comienza de nuevo y 1 dato_listo para saber que el valor es valido.
  12.         {
  13.                 j=0;
  14.                 dato_listo=1;
  15.         }
  16.  
  17. }

Con interrupciones es exactamente igual, nomas que el codigo ese estaria dentro de la interrupcion

Código: C
  1. int Vector_Guardado[2],j=0;
  2. bit dato_listo;
  3.  
  4. void interrupt(void){
  5.  
  6. if (RXIF == 1)                                  //Si esta en 1 llego un dato
  7. {
  8.         dato_listo=0;                           // Pongo a 0 ya que no se si ya llegaron los 2 datos o no, para que no me quede mitad de un dato viejo y mitad de uno nuevo
  9.         Vector_Guardado[j] = RXREG;             // Guardo lo que llego primero en Vector_Guardado[0] y luego cuando entre de nuevo en Vector_Guardado[1]
  10.         j++;
  11.         RXIF=0;                                 // Borro el flag
  12.         if(j==2)                                // LLego a 2, es decir ya se guardaron los 2 datos?, entonces pongo a 0 j, asi comienza de nuevo y 1 dato_listo para saber que el valor es valido.
  13.         {
  14.                 j=0;
  15.                 dato_listo=1;
  16.         }
  17.  
  18. }
  19. }

Aclaracion: los codigos son de guia, no significa que vayan a funcionar perfectamente.
« Última modificación: 02 de Junio de 2015, 15:22:42 por KILLERJC »


 

anything