Autor Tema: ADC Pic18f452 y lectura en hyperterminal  (Leído 2854 veces)

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

Desconectado Markinyo

  • PIC10
  • *
  • Mensajes: 6
ADC Pic18f452 y lectura en hyperterminal
« en: 24 de Noviembre de 2008, 14:56:18 »
Queridos amigos, hace unos dias estoy trabajando en un proyecto que tengo entre manos con el Pic18f452 y con el entorno del MPLAB y el compilador CCS. Mi pregunta es: Tengo un potenciometro en una entrada analógica del pic, luego he montado un max232 y sus condensadores pertinentes para ver el resultado de la conversion de los valores del potenciometro en el hyperterminal, como debo programar el pic para que me salgan los datos en milivoltios en el hyperterminal, como si fuera un tester vaia, es que en el hyperterminal me salen los valores en formato hex y me gustaria verlos como si fuera un multimetro.

Muchas gracias amigos.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: ADC Pic18f452 y lectura en hyperterminal
« Respuesta #1 en: 24 de Noviembre de 2008, 15:18:48 »
Supongo que para enviar valores al Hiperterminal usas Printf().
Si es asi deberias utilizar las opciones de formato que dispone esa instruccion.

Aqui el texto de la ayuda:

Outputs a string of characters to either the standard RS-232 pins (first two forms) or to a specified function.  Formatting is in accordance with the string argument.  When variables are used this string must be a constant.  The % character is used within the string to indicate a variable value is to be formatted and output.  Longs in the printf may be 16 or 32 bit.  A %% will output a single %.  Formatting rules for the % follows.

If fprintf() is used then the specified stream is used where printf() defaults to STDOUT (the last USE RS232).

Format:
The format takes the generic form %nt. n is optional and may be 1-9 to specify how many characters are to be outputted, or 01-09 to indicate leading zeros, or 1.1 to 9.9 for floating point and %w output. t is the type and may be one of the following:

c     Character
s     String or character
u     Unsigned int
d     Signed int
Lu    Long unsigned int
Ld    Long signed int
x     Hex int (lower case)
X     Hex int (upper case)
Lx    Hex long int (lower case)
LX    Hex long int (upper case)
f      Float with truncated decimal
g     Float with rounded decimal
e     Float in exponential format
w     Unsigned int with decimal place inserted. Specify two numbers for n. The first is a total field width.
       The second is the desired number of decimal places.
« Última modificación: 24 de Noviembre de 2008, 15:38:53 por MGLSOFT »
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: ADC Pic18f452 y lectura en hyperterminal
« Respuesta #2 en: 24 de Noviembre de 2008, 15:32:07 »
primero tendrias q hacer una conversion. Si tus tensiones de referencia estan entre 0V y 5V, significa que el ADC medira 0x00 para 0V, y 0xFF para 5V (si es que estas trabajando en 8bits).
Entonces para obtener el valor en voltios basta con una regla de 3 simple:
voltios = valor_hexa * 5/255

A continuacion te dejo un programita q hice hace un tiempo q hace exactamente lo q queres, esta hecho para un pic16f873 a 4Mhz
Código: C#
  1. #include <16f873a.h>
  2.  
  3. #fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
  4.  
  5. #use delay(clock=4000000)
  6.  
  7. #use standard_io(b)
  8.  
  9. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Definición del RS232
  10.  
  11. #device ADC=10
  12.  
  13.  
  14. void main()
  15.  
  16. {
  17.  
  18.    unsigned int valor;
  19.  
  20.    float volt;
  21.  
  22.    
  23.  
  24.    setup_adc_ports(AN0);
  25.  
  26.    setup_adc(ADC_CLOCK_DIV_8);
  27.  
  28.    set_adc_channel(0);
  29.  
  30.  
  31.  
  32.    printf("pic conectado...\n");
  33.  
  34.    while(TRUE)
  35.  
  36.    {
  37.  
  38.       valor = read_adc();
  39.  
  40.       delay_ms(500);
  41.  
  42.       volt = (float)valor * 5/255;
  43.  
  44.       printf("valor=%X   volt=%f \n",valor,volt);
  45.  
  46.    }
  47.  
  48. }

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Markinyo

  • PIC10
  • *
  • Mensajes: 6
Re: ADC Pic18f452 y lectura en hyperterminal
« Respuesta #3 en: 24 de Noviembre de 2008, 15:51:52 »
Si correcto, estoy trabajando con printf, pero con la ayuda del compilador ccs me lio un poquito, voy a probar las soluciones que me planteais a ver si me funciona y os cuento que tal me val.

Muchas gracias

Desconectado Markinyo

  • PIC10
  • *
  • Mensajes: 6
Re: ADC Pic18f452 y lectura en hyperterminal
« Respuesta #4 en: 24 de Noviembre de 2008, 16:24:11 »
He probado la solucion que me has mandago Gera y tengo un pequeño problemilla. La conversion no es del todo exacta además quando el tester me marca 2.55V en el hyperterminal me sale 5.01V y a la que le doy un poco mas parece como si se reiniciase y aparece en 2.66V en el hyperterminal sale 0.30V como podria arreglarlo???

Otra pregunta, si quisiera utilitzar los 10 bits como tendria que programarlo???

porque quando pones este comando #device ADC=10 se supone que le dices al pic que utilize los 10 bits no??? y luego la formula de la resolucion la pones como si fueran 8 bits???? No sé si es correcto lo que digo. Tambien deciros que utilizo un cristal de 10MHz.

A ver si me podeis ayudar. Gracias

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: ADC Pic18f452 y lectura en hyperterminal
« Respuesta #5 en: 24 de Noviembre de 2008, 16:39:21 »
A mi la medicion me anda perfecta, inclusive el tester altera la misma, asiq tengo q medir simultaneamente con el tester y con el ADC para que den iguales. La verdad que no se cual sera tu problema... estas queriendo medir mas de 5V?
Con respecto a lo de los 10 bits, cambia el valor 0xff por 0x3ff. (serian 10 unos en binario).
saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein


 

anything