Ayuda con programa en PBP (ADC y promedios)

#1
Saludos

tengo problemas con este código en PBP, lei los datos de sensores conectados al PIC16F877A, los guarde en variables (word) y quiero sacar el promedio de esos valores para mostrarlo en una LCD, hice el código, pero no puedo conseguir que me salga el resultado esperado, la averdad, no se que es lo que pasa.

Código:
DEFINE OSC 4
' DEFINICION DE PARAMETROS DEL LCD
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_LINES 2

' PARAMETROS DEL ADC
DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50

' VARIABLES
TEMP1   VAR WORD
TEMP2   VAR WORD
TEMPT   VAR WORD
HUM1    VAR WORD
HUM2    VAR WORD
HUM3    VAR WORD

TRISA = 1
TRISB = 0

PAUSE 500    ' PAUSA DE INICIALIZACION DEL LCD
ADCON1 = %10000010

LCDOUT $FE,1
INICIO:
 PAUSE 500
TERMO1:
    ADCON0 = %11000001
    ADCIN 0,TEMP1
    TEMP1 = 488*TEMP1

TERMO2:
    ADCON0 = %11001001
    ADCIN 1,TEMP2
    TEMP2 = 488*TEMP2

    TEMPT = (TEMP1 + TEMP2)     ' el resultado de TEMPT se divide entre 2 para sacar el promedio

    LCDOUT $FE,1,DEC TEMP1,"  ",DEC TEMP2
    LCDOUT $FE,$C0,DEC TEMPT

    GOTO INICIO
END
En la imágen adjunta, muestra donde estan las entradas, además de el resultado que el código muestra en la LCD, como veran, la suma de los números en la primera línea no muestra lo que deberia ser, y dividiendo eso entre 2, pues, es mucho más vajo el valor mostrado.
 

Adjuntos

#2
Hola...
Un poco de lógica y según el manual del PicBasic... tal y como lo veo digamos, si el dato leído de un canal es mas de 150 y lo multiplicas por 488, necesariamente el resultado es mayor que una variable de 16bits; es ahí el problema ya que (488 * 150 = 73200 que excede al máximo soportado por la variable tipo WORD que es 65535).
Ahora el mismo manual posee soluciones a dicho problema y se pueden usar los siguientes:

VAR1 * VAR2 = simple multiplicación (de 8 bits y solo los 16bits mas bajos).
VAR1 ** VAR2 = el resultado son los 16bits mas altos.
VAR1 */ VAR2 = el resultado es la media de la multiplicación.

Entonces puedes mezclar (**) para obtener los 16bits altos de la multiplicación y (*) para los 16bits bajos.

Saludos..
 
#3
Saludos ByAxel, muchas gracias por la respuesta.

Bueno, la verdad, ya encontre la solucion, pero creo que no tan práctica. Lo que planteas me parece bien, lo voy a poner en práctica y comento que tal me fue.

El código de cómo lo hice es el siguiente:

Código:
DEFINE OSC 4
' DEFINICION DE PARAMETROS DEL LCD
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_LINES 2

' PARAMETROS DEL ADC
DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50

' VARIABLES
TEMP1   VAR WORD
TEMP2   VAR WORD
TEMPT   VAR WORD
HUM1    VAR WORD
HUM2    VAR WORD
HUM3    VAR WORD
a var word
b var word

TRISA = 1
TRISB = 0

PAUSE 500    ' PAUSA DE INICIALIZACION DEL LCD
ADCON1 = %10000010
LCDOUT $FE,1
INICIO:
 PAUSE 500
TERMO1:
    ADCON0 = %11000001
    ADCIN 0,TEMP1
    TEMP1 = 488*TEMP1
    
TERMO2:
    ADCON0 = %11001001
    ADCIN 1,TEMP2
    TEMP2 = 488*TEMP2
    a = TEMP1/2
    b = TEMP2/2
    TEMPT = a + b
    'TEMPT = DIV32 10    esta como comentario
    LCDOUT $FE,1,DEC TEMP1,"  ",DEC TEMP2
    'LCDOUT $FE,$C0,DEC TEMPT   esta como comentario
    LCDOUT $FE,$C0,DEC TEMPT,"  ",DEC TEMPT DIG 4,DEC TEMPT DIG 3,".",DEC TEMPT DIG 2,DEC TEMPT DIG 1,$DF,"C"
    GOTO INICIO
END
el resultado en la imagen (esquina inferior derecha) del promedio
 

Adjuntos

#4
Va bien usando el DIV32 pero esta el detalle que solo sigue trabajando con 16bits en TEMPx ya que de ese modo solo consigues el valor incompleto. Lleva el ejemplo que te mostré en la multiplicación usando solo (*) el resultado es 488 * 150 = 73200, que en binario es (1 0001 1101 1111 0000), y fácilmente sobrepasa los 16bits quedando solo (0001 1101 1111 0000) con la cual trabajas pero si usas el (**) obtienes el último bit que hace falta para obtener el valor completo.
Claro que operar así es engorroso ya que el valor los tienes en variables distintas puesto que el PBP no opera directamente mas de 16bits.

Una solución seria reducir al un valor proporcional a TEMPx luego de leer el ADC y usar tablas para obtener la temperatura o usar directamente las tablas de temperatura con el valor leído del ADC; incluso luego de obtener de la tabla un valor aproximado a TEMPx puedes afinar el resultado (mayor o menor al proporcional), para obtener un resultado más próximo al medido.

Saludos
 
#5
Saludos, ahora, tengo otro problema, necesito hacer un voltimetro, de 0 a 5 V, para poder avanzar en un proyecto mas grande. No se como hacerlo, ya intente variando el voltaje con un potensiometro a la entrada del ADC, lo que logro es hacer que me muestre en la LCD un valor entre 0 y 1024 (10 bits de resolucion), por ejemplo, 512, lo que no logro es que ese valor me de un valor de 2.5, que seria el valor de voltaje leido.

Intente hacer lo siguiente:

(512*5)/1024 igual a 2.5

pero, no me muestra 2.5, ya que PBP no trabaja con decimales, tampoco muestra el 2.

Código:
DEFINE ADC_BITS 10
DEFINE ADC_SAMPLEUS 50

' DEFINICION DE VARIABLES
A VAR word
B VAR WORD
C VAR WORD

ADCON1 = %10000000
LCDOUT $fe,1        ' limpiando LCD
inicio:
    ADCON0 = %11001001
    adcin 0,a
    B = (A*488)
    c = (a**488)
    LCDOUT $fe,1,Dec A
    LCDOUT $fe,$C0,DEC b," ",DEC C
    pause 100
    goto inicio
end
El resultado se muestra en la imagen
 

Adjuntos

#6
Hasta donde conozco, el PBP solo soporta valores enteros por lo que para representar decimales se tiene que pensar maneras que salen por completo de una implementación matemática como las que enseñan en el colegio (regla de tres, no aplicable en PBP)...
Una solución simple y agradable...
voltimetro digital de 0 -5 DC

Saludos...
 
#8
Saludos.

Otraves yo, aqui, dandoles molestias.

Lo que me ocupa ahora, otraves las operaciones con decimales en PBP, esta ves ya un poco compleja, ya que tambien tiene division.

Lo siguiente:

Estoy realizando un sensado de la Humedad de suelo en el microcontrolador, para ello utilizo variaciones de voltaje en la entrada del ADC del PIC (0 a 5 V). La ecuacion que utilizo para que me de la humedad es la siguiente:

RH = (Vout - 0.958)/0.0307

esa ecuacion la saque del sensor HIH-4000.

El problema es ese, ya que al haber leido el voltaje que entra al ADC, ejemplo: entra 2.3 V, eso en el pic lo muestra como 230 y lo muestro como 2.3 en el PBP, y yo supongo que tengo que hagarrar el valor de 230 para tomarlo como Vout.

Muchas gracias
 
#9
Si la salida del sensor va de 0 - 5V que es proporcional a la humedad entonces no hay ningún problema...
solo tomas el valor del adc y debe ser proporcional al valor de la humedad... luego ya lo representas como desees...
 
#10
Saludos ByAxel

Pues..., efectivamente la salida del sensor si va de 0 a 5 V, y si es proporcional a la humedad, pero.... ¿¿ El PIC cómo va a saver que para un voltaje de 2.5 hay una humedad de 50%???

Muchas gracias
 
#11
Pues siempre tiene que haber un punto de referencia.
Yo nunca he trabajado con sensores de humedad pero por experiencia con sensores de temperatura siempre he partido por un punto; en un ejemplo: se arma un circuito que mide temperatura de -20 a +150 °C; el sensor da 1.89V a temperatura ambiente (eso lo tomaría como punto de referencia). Ahora en caso del sensor de humedad expresada en porcentaje, pondrías que 2.5V es igual al 50% de humedad relativa...

Creo que tendrías que darle una leída al tema de medir Humedad Relativa (+ el Psicrómetro por lo que necesitarías un sensor de temperatura).

Saludos...
 
#12
Hola.... Mis amigos les cuento que soy novato en este campo y me gustaria saber quien es tan amable y me ayuda enviandome unos de esos proyectos de voltimetros en pbp y proteus a la siguiente direccion








les agrdesco su ayuda

gracias amigos del foro
 
Última edición por un moderador:
#13
Hola.... Mis amigos les cuento que soy novato en este campo y me gustaria saber quien es tan amable y me ayuda enviandome unos de esos proyectos de voltimetros en pbp y proteus a la siguiente direccion








les agrdesco su ayuda

gracias amigos del foro
Como iniciarse en El Foro (Foros de Electrónica)

Te sugiero que edites tu comentario y borres tu correo, las cosas no las escondemos. Valdría que dijeras que nivel tienes o que has avanzado, de ese modo te ayudarían más...

Saludos.
 
Última edición por un moderador:
Arriba