Autor Tema: uart por software xc8  (Leído 5071 veces)

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

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
uart por software xc8
« en: 07 de Junio de 2015, 10:57:08 »
Hola a todos ...hace mucho que uso una uart por software que paso al foro AngelGris ...y esta funciona bien la parte de TX ...hasta ahora nunca la habia usado como RX ...hace ya mucho tiempo que intento y no puedo hacerla funcionar ...me imagino que seran los tiempos ...he buscado los tiempos ttl para 9600 bps y he hecho muchas cosas y nada.... sigue sin funcionar ...no se que es lo que estoy haciendo mal ...pero no lo veo ..por eso la consulta ...les paso las dos subrutinas que estoy probando e incluso he mezclado ambas y nada sigue sin funcionar el Getst_s  o el Getch_s ...si al alguien me da una mano ...bienvenido ...

les paso las dos que estoy intentando usar .....el micro es un 16f819
Muchas gracias a todos

Código: [Seleccionar]
#include <xc.h>
#include "uart.h"

    #define _XTAL_FREQ 8000000
    #define TxPin PORTBbits.RB0
    #define RxPin PORTBbits.RB1
    #define BaudRate 9600
     
   
   

// definido para un clock de 8 mhz



     //  #define BitDelay (1000000/BaudRate)
     //  #define HalfBitDelay (500000/BaudRate)
   
       //#define DelayReceivebit __delay_us(BitDelay-2)
       

        #define DelayReceivebit  __delay_us(97.16666666667)
       #define DelayStartBit  __delay_us(100.16666666667)
       #define DelaySendBit __delay_us(94.1666666667)
       

void InitSoftUart(void)
    {
     TxPin = 1;
    }
     


unsigned char getch_s(void)
 {
   unsigned char contador = 7;
   unsigned char letra = 0;

   while (RxPin == 1);
   DelayReceivebit;
   do
   {
     if (RxPin == 1) letra += 128;
     letra = letra >> 1;
     contador--;
     DelaySendBit;
   }
   while (contador > 0);
   DelaySendBit;
   return letra;
 }


void putch_s (unsigned char data)
 {
    unsigned char contador = 8;

   TxPin = 0;
   DelayStartBit;
   do
   {
     TxPin = data & 1;
     DelaySendBit;
     data = data >> 1;
     contador--;
   }
   while (contador > 0);
   TxPin = 1;
   DelayStartBit;   //tiempo de espera del bit de stop
 }

 void putst_s (const char *word)
 {
   while (*word != 0)
   {
     putch_s(*word);
     word++;
   }
 }

 char * getst_s (char * st)
 {
   char * st1;
   char caracter;

   st1 = st;
   do
   {
     caracter = getch_s();
     if (caracter != '\r')
     {
       *st1 = caracter;
       st1++;
     }
     *st1 = '\0';
   }
   while (caracter != '\r');
   return st;
 }


Código: [Seleccionar]
#include "swuart.h"

   void swinit_uart(void)
{
#if defined TXONLY
   TXDIR = 0;
#elif defined RXONLY
   RXDIR = 1;
#elif defined TXRX
   TXDIR = 0;
   RXDIR = 1;
}

void swputch(unsigned char _dato)
{
   unsigned char _bits2 = 8;

   TXPIN = 0;
   __delay_us(BitOutDelay);
   do
   {
TXPIN = _dato & 1;
__delay_us(BitOutDelay);
_dato = _dato >> 1;
_bits2--;
   }
   while (_bits2 > 0);
   TXPIN = 1;
   __delay_us(_BitOutDelay);
}

void swputs(unsigned char *_st)
{
  //   swputch('c');
    while (*_st != 0)
   {
    swputch(*_st);
_st++;
   }
  //   swputch('f');

}

unsigned char swgetch(void)
{
   unsigned char _datain = 0;
   unsigned char _bits2 = 8;

   while (RXPIN == 1);
   __delay_us(StartDelay);
   do
   {
_datain = _datain >> 1;
if (RXPIN == 1) _datain |= 0b10000000;
__delay_us(BitInDelay);
_bits2--;
   }
   while (_bits2 > 0);
   __delay_us(BitOutDelay/2);
   return _datain;
}

void swgets(unsigned char *st)
{
   unsigned char *word;
   unsigned char character;

   word = st;
   do
   {
character = swgetch();
if (character != '\r')
{
   *word = character;
   word++;
}
   }
   while (character != '\r');
   *word = 0;
}
#endif


Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2980
Re: uart por software xc8
« Respuesta #1 en: 07 de Junio de 2015, 11:10:14 »
Hola, es probable que sea por la configuración de los pines, coge un polimeteo y mide el pin RX si ese pin da 0 voltios no esta configurado para la uart. Prueba a configurarlo como entrada antes de configurar la uart.

Un saludo.

Desconectado AG1

  • PIC16
  • ***
  • Mensajes: 105
Re: uart por software xc8
« Respuesta #2 en: 07 de Junio de 2015, 11:15:15 »
Hola:
   Las rutinas tan dependientes de los tiempos es mejor hacerlas en ASM. Habría que ver el código que genera el compilador.
Salu2.

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: uart por software xc8
« Respuesta #3 en: 07 de Junio de 2015, 11:27:41 »
Gracias por la respuesta ....eso ya esta bien tema puertos ...entrada salida esta todo bien ...es mas la rutina funciona, pero decodifica mal o recibe mal , gracias



Hola, es probable que sea por la configuración de los pines, coge un polimeteo y mide el pin RX si ese pin da 0 voltios no esta configurado para la uart. Prueba a configurarlo como entrada antes de configurar la uart.

Un saludo.
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: uart por software xc8
« Respuesta #4 en: 07 de Junio de 2015, 11:29:32 »
Si es cierto ..podria ser en asm ...pero de todas maneras deberia funcionar igual con tiempos __delay_us ....no veo porque no

Gracias de todos modos



Hola:
   Las rutinas tan dependientes de los tiempos es mejor hacerlas en ASM. Habría que ver el código que genera el compilador.
Salu2.
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2980
Re: uart por software xc8
« Respuesta #5 en: 07 de Junio de 2015, 11:41:42 »
Si recibes, pero no recibes lo que debes en una trama, quizá es que lo estas leyendo al revés, quizá por el rx te esta llegando primero el byte mas significativo y tu crees que es el menos,  o viceversa.

Comprueba lo por si acaso.

Un saludo

Desconectado AG1

  • PIC16
  • ***
  • Mensajes: 105
Re: uart por software xc8
« Respuesta #6 en: 07 de Junio de 2015, 13:15:11 »
Si quieres haz esta pequeña modificación y me comentas:

Código: [Seleccionar]
#define despacio_que_tengo_prisa(1000000UL/SWUARTBAUD)/4
unsigned char swgetch(void)
{
     unsigned char _datain = 0;
     unsigned char _bits2 = 8;

     while (RXPIN == 1);
     __delay_us(StartDelay);
     do
     {
       _datain = _datain >> 1;
              __delay_us(despacio_que_tengo_prisa);
             //ahora sí que leo el puerto.
       if (RXPIN == 1) _datain |= 0b10000000;
             //ahora si que leí el puerto dejo que el retardo total sea el mismo.
              __delay_us(BitInDelay-despacio_que_tengo_prisa);
       _bits2--;
     }
     while (_bits2 > 0);
      __delay_us(BitOutDelay/2);
   return _datain;
}

Salu2,


Si es cierto ..podria ser en asm ...pero de todas maneras deberia funcionar igual con tiempos __delay_us ....no veo porque no

Gracias de todos modos



Hola:
   Las rutinas tan dependientes de los tiempos es mejor hacerlas en ASM. Habría que ver el código que genera el compilador.
Salu2.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: uart por software xc8
« Respuesta #7 en: 07 de Junio de 2015, 15:32:02 »
Yo opino que si vas a hacer una UART por soft, a no ser que tu programa solo este leyendo el pin constamente y no haga absolutamente nada, o lo que vaya a hacer se encuentre medido perfectamente para que nunca pueda perder un bit o coincida que cada lectura sea en un punto especifico de tiempo (codigo a ejecutar = tiempo definido ), sino tendrias problemas.

Tambien si no haces nada y recibis, podes tener problemas si no sos el maestro, ya que si recibis un dato en cualquier momento y tu programa justo pasaba de la lectura del pin puede que te pierdas un bit o mas, o tal ves ninguno.

Lo mas seguro vas a tener que usar algun timer e interrupciones de flanco.
« Última modificación: 07 de Junio de 2015, 16:02:06 por KILLERJC »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2980
Re: uart por software xc8
« Respuesta #8 en: 07 de Junio de 2015, 15:36:27 »
Como dice killer yo he tenido problemas al leer una uart por software cuando mi micro estaba haciendo otras cosas, hasta tal punto que si no metias la lectura en un while hasta que terminara corrompia los datos por los tiempos pero claro esto retrasa las demas cosas que esta haciendo el micro.

un saludo

Desconectado AG1

  • PIC16
  • ***
  • Mensajes: 105
Re: uart por software xc8
« Respuesta #9 en: 07 de Junio de 2015, 16:40:43 »
    Imagino que el motivo por el cual Rseliman quiere utilizar la UART por software será que el PIC 16F819 no la tiene implementada por hardware.

    Si mantiene controlados los tiempos, inhibe interrupciones cuando esté en modo RX o TX y ademas utiliza un oscilador a cristal no tiene porque tener muchos problemas. Además cuanto mayor sea la frecuencia de oscilador, le quedará más tiempo para otras tareas ya que la velocidad que quiere utilizar es de 9600bps.

Salu2.

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: uart por software xc8
« Respuesta #10 en: 07 de Junio de 2015, 18:55:02 »
Gracias a todos por tan rapidas repuestas ...si es cierto el 819 no tiene uart por hard , y el tema de utilizarla por soft es porque solo tengo que recibir los ok de la respuesta de un esp8266 wifi ...o sea es solo para verificar que el comando at que envia al esp8266 me esta respondiendo con ok nada mas ...y en ese moemnto no tengo que hacer nada solo eso .. o sea que envio un comando AT y espero su respuesta OK desp Otro y lo mismo ...hasta el final ...creo que no deberia tener problemas si la uart anda bien ...el tx anda perfecto 0 error
}

voy a hacer mas pruebas y les comento ...muchas gracias a todos




    Imagino que el motivo por el cual Rseliman quiere utilizar la UART por software será que el PIC 16F819 no la tiene implementada por hardware.

    Si mantiene controlados los tiempos, inhibe interrupciones cuando esté en modo RX o TX y ademas utiliza un oscilador a cristal no tiene porque tener muchos problemas. Además cuanto mayor sea la frecuencia de oscilador, le quedará más tiempo para otras tareas ya que la velocidad que quiere utilizar es de 9600bps.

Salu2.
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!


 

anything