Autor Tema: PIC velocidad de transmicion serial  (Leído 3067 veces)

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

Desconectado FJPPitta

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
    • Mi pagina personal
PIC velocidad de transmicion serial
« en: 02 de Febrero de 2007, 01:37:09 »
Saludos, estoy trabajando en un lector de frecuencia ya que tengo un sensor de color que convierte la cantidad espectral de luz de color en una determinada frecuencia, implemente la rutina que lee frecuencia que viene en el ejemplo del CCS y la modifique a mis necesidades, realizo el control y de momento necesito transmitir 400 datos del PIC a la PC para analizar el comportamiento por medio del PIC (si se que se puede hacer con el osciloscopio pero necesito datos que el micro pueda detectar). Como salida de mi pic tengo 3 potenciometros digitales de incremento los cuales mueven la referencia de tres fuentes de luz.

Me sucede algo curioso, envio datos a la computadora a 9200Bps y obtentengo mi frecuencia bien la puedo analizar y puedo colocar mi referencia adecuadamente, pero cuando aumento la velocidad de transmision a 115600 si obtengo una buena lectura de frecuencia pero no un buen ajuste de las referencias.

Cuando inicio el programa posiciono mis 3 potenciomestros a 8.4KOhms y durante la ejecucion del programa solo muevo uno de ellos a 9.4KOhms.

Si configuro la velocidad del puerto en 9200 cuando inicia se colocan los potenciometros al valor fijado.

Si configuro la velocidad del puerto a 115600 los potenciometros no se mueven a donde les he indicado.

Aqui esta el codigo principal:
Código: [Seleccionar]
#include <16f873a.h>
#include "tcs230.h"
#include "lib.h"
#fuses HS,NOWDT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=115600, xmit=PIN_c6, rcv=PIN_c7)    <-------- Aqui le he cambiado y solo funciona con 9200

#define LED_estado PIN_B7
#define IR 85
#define IV 85
#define IA 85

int sube=0;
int32 sensor;

void main()
{

      int i=0;

      inicializa_pot();
      filtro_rojo();
      escala_100();

      sube_azul(IA);
      sube_verde(IV);
      sube_rojo(IR);

      printf ("Espera de 10 segundos para estabilizar . . . \r\n");
      delay_s(10);

      printf ("Comienza la medicion \r\n");
      for (i=1;i<=250;i++)
     {
          sensor=lee_freq8();
          printf("%LU \r\n",sensor);
     }

     sube_rojo(10);

     for (i=1;i<=250;i++)
    {
         sensor=lee_freq8()*64;
         printf("%LU \r\n",sensor);
    }

    printf ("Termina la medicion \r\n");

}


Las funciones que indico se localizan tanto en TCS230.h y lib.h y ya fueron probadas multitud de ocaciones y funcionan adecuadamente, de hecho el programa realiza la funcion que deseo pero me paso esto. Solo es eso, ya que la comunicacion serie se da bien.

Si se necesita puedo colocar lo que tengo en mis librerias.

Saludos
FJPPitta
Que la fuerza te acompañe

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: PIC velocidad de transmicion serial
« Respuesta #1 en: 02 de Febrero de 2007, 08:19:13 »
Los baudeajes estándar son 9600 y 115200 respectivamente.  Te anduvo bien a 9200 porque en realidad las usart tienen una buena olgura para comunicarse con dispositivos que tengan diferente baudeaje.

De todas formas, es poca la información que nos provees.  Más allá de eso, te sugiero que bajes la velocidad a 57600 y que compruebes si así te funciona.

Por otra parte, sería importante que aclares a qué te refieres con que te muestra o se mueven a donde le has indicado.

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)

Desconectado FJPPitta

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
    • Mi pagina personal
Re: PIC velocidad de transmicion serial
« Respuesta #2 en: 02 de Febrero de 2007, 21:01:34 »
Saludos, si me equivoque al escribir el 9200 pero si utilizo el 9600 ya que hago que coincida con la velocidad del hyperterminal.

Mi sistema es sl siguiente: Tengo un PIC16F873A el cual esta conectado a un TCS230(sensor de color) por el puerto A y por el puerto C esta conectado a 3 X9C103P (potenciometro digital). El programa inicia y hace un barrido en el otenciometro digital para colocarlos en 0KOhm ya que son de Incremento y tienen memoria de modo que no puedo determinar la resistencia asi que primero los inicio a cero. Despues los coloco en 8.5KOhm. Con la funcion "filtro_rojo();" indico el filtro del TCS230 que estara activo durante el proceso ademas de indicar la escala (son movimientos del puerto A).

Código: [Seleccionar]
void filtro_rojo (void)
{
output_low(pin_A2);
output_low(pin_A3);

}

Código: [Seleccionar]
void escala_100()
{
output_high(pin_A0);
output_high(pin_A1);
}


Luego lo que hago es tomar 250 muestras de la frecuencia y cambio un potenciometro de 8.5KOhms a 9.5KOhms y vuelvo a tomar 250 muestras de la frecuencia (aplico un escalón).

Las muestras las tomo y las mando al puerto serie a la velocidad indicada.

Cuando envio a 9600 todo funciona bien.

Cuando envio a otra velocidad una de las referencias en lugar de iniciar en 8.5 inicia en un valor por debajo (no es un valor fijo por eso no lo pongo) del minimo que necesito.

Para mi no tiene nada que ver la velocidad de comunicacion ya que se encarga de otra cosa, pero si veo que hay diferencias incluso en la frecuencia que obtengo. La medicion de la frecuencia la realizo con retardo de 8ms.

No soy muy bueno explicando cosas que yo hago pero intento hacer el mejor esfuerzo.

Saludos
FJPPitta
Que la fuerza te acompañe

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: PIC velocidad de transmicion serial
« Respuesta #3 en: 02 de Febrero de 2007, 22:01:23 »
¿Puedes probar ese mismo hardware, sin sensar nada ni activar los potenciómetros?

La idea es que pruebes tu usart por ejemplo a 19200 bps, enviando un string de texto para separar causas que tengan que ver con el hardware y con el software.

Ve cambiando el baudeaje hasta 57600 para ir descartando cosas.

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)

Desconectado FJPPitta

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
    • Mi pagina personal
Re: PIC velocidad de transmicion serial
« Respuesta #4 en: 03 de Febrero de 2007, 12:28:17 »
He probado el circuito unicamente activando los potenciometros por medio de botones externos y por separado probe el circuito de sensado comunicandome por serial a 9600 y ambos funcionan adecuadamente, cuando los uno y pongo a funcionar la comunicacion a 9600 la activacion de los potenciometros funciona adecuadamente. El problema es cuando aumento la velocidad.

Todos los movimientos de los potenciometros son programados dentro del micro, hyperterminal solo la utilizo para visualizar la salida.

Saludos
FJPPitta
Que la fuerza te acompañe

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: PIC velocidad de transmicion serial
« Respuesta #5 en: 03 de Febrero de 2007, 13:00:02 »

Todos los movimientos de los potenciometros son programados dentro del micro, hyperterminal solo la utilizo para visualizar la salida.



Ahhh, entonces tienes algún retardo por ahi que al hacerse más pequeño te está jugando una mala pasada!!!!


- 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)

Desconectado FJPPitta

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
    • Mi pagina personal
Re: PIC velocidad de transmicion serial
« Respuesta #6 en: 03 de Febrero de 2007, 17:38:22 »
Ciertamente para mover los potenciometros de forma adecuada requiero de 100us pora cada movimiento.

Código: [Seleccionar]
void sube_azul(int r)
{
  int i;
  output_high(UD);
  output_low(CS3);
  for(i=0;i<=r;i++)
  {
   output_low(INC);
   delay_us(100);
   output_high(INC);
  }
  output_high(CS3);
}

donde defino

Código: [Seleccionar]
#define INC PIN_C2
#define UD PIN_C1
#define CS1 PIN_C3
#define CS2 PIN_C5
#define CS3 PIN_B0

mientras mas requiera moverme mas tiempo necesito, si me muevo 10 veces como lo he programado requiero un poco mas de 1ms en realizar la operación.

Voy a tratar de analizar esa parte.
Que la fuerza te acompañe