Autor Tema: Sigo sin poder mandar datos de 10 bits por el puerto serie  (Leído 3939 veces)

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

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Sigo sin poder mandar datos de 10 bits por el puerto serie
« en: 29 de Octubre de 2004, 17:59:00 »
Hola

Por mas que trato no lo he logrado y es que necesito mandar a través del puerto serie datos de 10 bits y que el pic los reciba, y éste a su vez me envíe datos de 10 bits del convertidor. Hice un programa pero en ocasiones me manda datos hasta de 16 bits, es decir, me da valores de mas de 1024.
Codigo:

#include <16f874A.h>
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,WRT
#device ADC=10
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  

main()
{
   int temp,datolow,datohigh;
   long dato;
   dato=0;
   temp=0;
   datolow=0;
   datohigh=0;
   set_tris_b(0x00);
   setup_adc_ports( ALL_ANALOG );
   setup_adc( ADC_CLOCK_INTERNAL );
   set_adc_channel( 0 );
 
   while (TRUE)
        {
           output_high(PIN_B7);
           delay_us(100);  
           dato = read_adc();
         datolow=dato;
         temp=(dato>>8);
         datohigh=temp&3;
         printf("%u   ",datohigh);      
         printf("%u   ",datolow);
        }
}


Es la última parte que me falta de mi código para graficar, si alguien me puede ayudar se lo agradecería mucho.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Sigo sin poder mandar datos de 10 bits por el puerto serie
« Respuesta #1 en: 30 de Octubre de 2004, 02:01:00 »
El código que has pegado es el de la transmisión del PIC hacia el PC (el de la recepción falta).

Aparentemente el código está bien, primero envia la parte alta y luego la baja del resultado de la conversión, no le veo problema. ¿Has probado con otras temporizaciones?

Un saludo

PD. En una versión anterior del compilador (que será la que usas) se utilizaba como fuse WRT, posteriormente en otras versiones lo corrigieron y el fuse ahora hay que programarlo como NOWRT (como lógicamente debe ser).

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 682
RE: Sigo sin poder mandar datos de 10 bits por el puerto serie
« Respuesta #2 en: 30 de Octubre de 2004, 09:03:00 »
Hola, si lo que dice POCHER  es cierto, ahora si estas usando CCS ESTO

while (TRUE)
        {
           output_high(PIN_B7);
           delay_us(100);  
           dato = read_adc();
         datolow=dato;
         temp=(dato>>8);
         datohigh=temp&3;
         printf("%u   ",datohigh);      
         printf("%u   ",datolow);
        }

Funciona y es mucho mas sencillo asi.


while (TRUE)
        {
           output_high(PIN_B7);
           delay_us(100);  
          printf("%lu
",read_adc());
        }

De esta manera puedes obviar variables y el codigo es mas corto, te recomiendo leer el manual de CCS y mirar muy detenidamente la forma de emplear la funcion printf, pues en lo personal me he complicado a veces escribiendo codigo inutilmente, encontraras que es una funcion muy potente, espero que te sirva,
El envio de los carateres de control es para ordenar los datos cuando los recibes
con una terminal o emulador en una PC como es el hyperteminal de windows, para enviarlo a otro micro deberas suprimirlo.

saludos

ARIEL



saludos
PikMan

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
RE: Sigo sin poder mandar datos de 10 bits por el puerto serie
« Respuesta #3 en: 03 de Noviembre de 2004, 19:33:00 »
Hola, de hecho ya corregí mi código y ya incluyo la parte de recepción. Ahora mi problema es que para ciertos valores que guardo en la variable muestras, pues no llega el correcto, es decir, si yo desde visual basic mando un 150, al momento de desplegar en el lcd el valor guardado en la variable muestras pues no es 150 sino 406, en fin, yo creo que solo es un error de declaración de variables pero no estoy seguro.  El código es el siguiente:
Codigo:

#include <16f874A.h>
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,WRT
#device ADC=10
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  
#include<lcd.c>

main()
{
   long i,dato;
   char valor, datohigh, datolow, temp;
   int periodohigh, periodolow, muestrashigh, muestraslow, tmuestreo;
   long periodo, muestras;
   setup_adc_ports( ALL_ANALOG );
   setup_adc( ADC_CLOCK_INTERNAL );
   set_adc_channel( 0 );
   lcd_init();
   
 
   while (TRUE)
        {
         while(!kbhit()); //Espera la recepcion de un caracter
         valor=getc();
         if (valor=="j")
           {  
            output_high(PIN_B7);
            putc("8");
            while(!kbhit());
            muestrashigh=getc();
            while(!kbhit());
            muestraslow=getc();
            while (!kbhit());
            periodohigh=getc();
            while(!kbhit());
            periodolow=getc();
            muestras=muestrashigh*256+muestraslow;
            periodo=periodohigh*256+periodolow;
            tmuestreo=periodo/muestras;
            lcd_putc("f");
            lcd_gotoxy(1,1);
            printf(lcd_putc,"p=%4lu",periodo);
            lcd_gotoxy(9,1);
            printf(lcd_putc,"m=%4lu",muestras);
            lcd_gotoxy(1,2);
            printf lcd_putc,"tm=3u",tmuestreo);                                                                                                                                              
            output_high(PIN_B6);
            for (i=1;i<=muestras;i++)
    {
                   delay_us(tmuestreo);
                  dato = read_adc();
      datolow=dato;
      temp=(dato>>8);
      datohigh=temp&3;
      putc(datohigh);
      putc(datolow);
   }
           }
       }
}



De antemano gracias por la ayuda.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Sigo sin poder mandar datos de 10 bits por el puerto serie
« Respuesta #4 en: 04 de Noviembre de 2004, 02:55:00 »
El problema te viene porque crees que lo que estas recibiendo es un número y no es así, es un caracter ASCII, además la función getc() solo recibe 1 caracter (recibirías un 3, un 7 o lo que sea, pero no más de 1 caracter)

Tienes que usar la función gets() para recibir toda la cadena de caracteres, que por cierto no es necesario que la descompongas en parte alta y baja, puedes mandar todo el número entero, aunque sea long, eso sí el último caracter a transmitir debe ser un RETURN para que el gets sepa que se acabó.

Lo recibido lo guardas en una variable que luego tendras que pasar a entero o a long usando las funciones atoi() o atol() y ahora sí, ya podras hacer operaciones matemáticas con la variable.

Un saludo

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
RE: Sigo sin poder mandar datos de 10 bits por el puerto serie
« Respuesta #5 en: 04 de Noviembre de 2004, 17:08:00 »
Hola Pocher

De hecho si sabía que lo que recibía era un caracter, lo que no sabia era el número de caracteres que recibía. Ahora bien, entonces la parte de recepción en el pic la puedo hacer como dices, lo que no se es mandar el return. Cuando yo mando el número desde visual lo hago así:

Serial.Output = Chr(muestras)

donde Chr lo que hace es mandar el ascii del valor contenido en la variable muestras. Entonces si yo mando un valor de 3000, cómo lo estaría recibiendo el pic ?

Lo raro de esto es que lo hice como lo planteé anteriormente, y pues un valor de 3600 llega al pic como 3600.

Haré lo que me dices y luego les cuento. Gracias.