TODOPIC
Simuladores, editores de PCB, etc => Simuladores de circuitos => Mensaje iniciado por: fergar2 en 29 de Octubre de 2003, 04:19:00
-
Hola!!.
Sigo con la conversion A/D y ya he logrado q funcione.
Ahora estoy probando a mostrar el resultado por la VTERM pero al tratarse de un float no se como mandarselo para q me lo muestre.
Alguien ha probado algo parecido?.
Muchas gracias por anticipado.
-
Yo sí que he probado en C de CCS, a enviar una variable float al terminal virtual y va bien. Si quieres pon tu código y lo revisamos.
Un saludo
-
Hola, estoy usando el compilador PICC de Hi Tech, este es el codigo, la parte q contiene los comentarios es en la q esta el problema.
Gracias por la ayuda.
#include <pic.h>
#include <stdio.h>
#include "delay.h"
#include "adc.h"
#define BYTE unsigned char
#define INT_16 short
void rs232_init() {
RC6 = 0; // RC6 = TX Salida
RC7 = 1; // RC7= RX Entrada
SPBRG = 0x81;
TXSTA = 0b00100100; // Configuración RS232 transmisión:
// modo asíncrono, 8 bits, alta velocidad (K=16) a 19200
RCSTA = 0b10010000; // Configuración RS232 recepción: 8 bits, recepción continua
}
void rs232_send(unsigned char data) {
TXREG = data;
while (!TRMT);
}
void main()
{
BYTE canal,bajo,alto;
INT_16 valor;
float res;
rs232_init(); /*Inicializacion de la USART */
TRISB=0x00; /*Todos los pines del puerto B (los 8) son de salida para seleccion de los MUX*/
TRISA0=1;
TRISA2=1;
TRISA3=1;
ADCON1=0b11001100;
PORTB=0x00;
canal=0x00;
adc_read(canal); //Funcion que realiza la conversion A/D
DelayUs(2);
bajo=ADRESL;
alto=ADRESH;
valor=ADRESH;
valor=(valor<<8)+ADRESL;
res=valor*0.004883; //Lo multiplico por 0.004883 pq estoy usando un Vref+ de 5v (5/1024=0.004483)
//y asi conozco el valor de entrada analogico.
rs232_send(res); //El problema es q al enviar la USART los datos byte a byte no se como
//enviarle un dato q ocupe mas de un byte para q la terminal lo reconozca
//como un float o un int.
//rs232_send(bajo);
//rs232_send(alto);
//rs232_send(valor);
//rs232_send("");
}
-
Con Hitech he trabajado muy poco. En CCS yo lo que hago es definir:
long medidaADC; //Para 8 bits con int sería suficiente
float const resoluc=5.0/256.0; //Conversión de 8 bits
float valor;
.
.
.
... y este valor lo puedes mandar a la LCD o al terminal.
Un saludo
-
Hola pocher.
Lo primero gracias por tu ayuda pero no entiendo como se puede mandar un float a la VTERM.
La rutina que uso yo solo manda 1 byte cada vez, existe alguna en CCS que envie un float de manera que la terminal lo interprete como tal??, en ese caso me podrias indicar donde encontrarla??.
Un saludo.
Fernando
-
Hola
En el C de CCS usas la instruccion printf para las salidas por el puerto serier del pic por lo que
printf("%f",variable);
te manda un valor float por el puerto serie.
Una manera de evitar usar variables float es usar milivolts por lo que en lugar de tener 5/1024 (o 5/256) tendrias 5000/1024 (o 5000/256) lo que te da valores enteros y asi ahorrar memoria.
Saludos
Luis
-
De acuerdo con lo que dice lu6vg. Por si quieres enviarlo también a la LCD aquí hay un ejemplo: http://miarroba.com/foros/ver.php?temaid=1062827&foroid=46840
Un saludo
-
Si no te aclaras con el envio del resultado de la conversión al terminal, te pongo el programa entero.
Un saludo
-
Gracias por las respuestas, no se me habia ocurrido el usar milivoltios, es lo q tiene ser novato
.
Un saludo.