Problema en voltímetro digital

Tengo un problema en mi programa de voltímetro digital.
El voltímetro hace de 0v a 5v mi problema es ¿como hacer para que sea de -5v a 5v ?

Utilizo el PIC16F877A

Aquí esta mi programa.
Código:
'***************************************************************
'*  Name    : UNTITLED.BAS                                                                                       *
'*  Author  : [select VIEW...EDITOR OPTIONS]                                                               *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS]                                     *
'*          : All Rights Reserved                                                                                     *
'*  Date    : 29/11/2012                                                                                            *
'*  Version : 1.0                                                                                                       *
'*  Notes   :                                                                                                            *
'*          :                                                                                                               *
'****************************************************************
' Programa de voltimetro con pic basic pro de tension (0-5VDC) e ilustracion en 
' LCD con 2 decimas a traves de pic 16f877A. 

'definicion de Oscilador externo

@ device xt_osc ; oscilador externo XT 
define osc 4                        ; especifica que se va a utilizar uno de 4 Mhz


Define    LOADER_USED    1

' Definicion de configuracion de pines para comunicacion con lcd a 4bits.

DEFINE LCD_DREG PORTB                'Seleccion de port B 
DEFINE LCD_DBIT 4                        'Seleccion de RB4 a RB7 
DEFINE LCD_RSREG PORTB               'Seleccion de port B 
DEFINE LCD_RSBIT 0                       'Seleccion de RB4 a RB7 
DEFINE LCD_RWREG PORTB               'RS en port B 
DEFINE LCD_RWBIT 1                      'RS en RB1
DEFINE LCD_EREG PORTB                   'RS en port B 
DEFINE LCD_EBIT 2                         'RW en RB2 
DEFINE LCD_EBITS 4                       'RW en RB2   
DEFINE LCD_LINES 2                       '2 lineas 
DEFINE LCD_COMMANDUS 2000         '2 lineas 
DEFINE LCD_DATAUS 50                   '2 lineas 
ADCON1=6
CMCON=7                                     

' Definicion de parametro de conversion A/D 

DEFINE  ADC_BITS        10         ' Selecionar numero de bits conversion A/D 
DEFINE  ADC_CLOCK       3         ' Selecionar reloj interno de conversion A/D
DEFINE  ADC_SAMPLEUS    50        ' Selecionar tiempode conversion Useg

'creacion de variable y configuracion puertos del pic 16f877A

adval    Var    Word    'Variable donde se va ha guardar medida obtenida
TRISA = %11111111    ' Selecionar PORTA como entrada 
ADCON1 = %10000010    ' Selecionar PORTA analogo 
Low PORTB.2            ' LCD R/W colocado a cero logico(W)
Pause 500           ' esperar 0.5 second

'Inicio del programa

voltimetro:
    
Adcin 0, adval        'leer canal cero y guardar resultado en al avariable adval
adval = (adval */ 500)>>2    'lectura de tension 
LCDOut $fe,1       ' Clear LCD
LCDOUT $fe,$83,"VOLTAJE"
lcdout $fe,$c5,DEC (adval/100),".", DEC2 adval 'mostrar en LCD  
Pause 100           ' esperea 100mseg
Goto voltimetro       ' volver medir 
End
 

Adjuntos

  • voltimetro.zip
    16.4 KB · Visitas: 52
Última edición por un moderador:
Primero tendrías que convertir esos -5 +5v a una señal de 0 á 10v, puedes hacerlo creando una nueva masa conectada a -5v, para que el vivo pase a tener como masa de referencia -5v en vez de 0v. Una vez hecho eso, solo tienes que aplicar un divisor resistivo para reducir esos 10v a 5v.
 
Por medio del circuito que adjunto (creo que lo vi en la web) es posible medir tensiones tanto negativas como positivas con el ADC del microcontrolador, para esto te recomiendo implementar tanto R1 como R3 como potenciómetros para ajustar mejor la medida.
 

Adjuntos

  • medirac.png
    medirac.png
    120.2 KB · Visitas: 49
Bueno, amigos. Les comento, he realizado un código en pic basic pro para visualizar en lcd 20x4 voltaje negativo y positivo para una fuente simétrica.
A
djunto el enlace del vídeo de la simulación de proteus.
E
l detalle es que los voltajes me quedan parpadeando de manera continua, y la idea es que se queden fijos.
Adjunto el código completo, y con la ayuda de ustedes ver qué error he cometido en el código de programación y su corrección.
G
racias.
https://drive.google.com/file/d/19zVIgpcGwliJ5BENU3GAp1xTRELDTNa4/view

Código:
include "fp2032.bas" ' Include file for 14-bit core with RAM at $20 (32-bit)

 DEFINE LCD_DREG PORTD
 DEFINE LCD_DBIT 4
 DEFINE LCD_RSREG PORTE
 DEFINE LCD_RSBIT 0
 DEFINE LCD_EREG PORTE
 DEFINE LCD_EBIT 1
 DEFINE LCD_BITS 4
 DEFINE LCD_LINES 2
 DEFINE ADC_BITS 10
 DEFINE ADC_CLOCK 3
 DEFINE ADC_ SAMPLEUS 50

 '************************************************* *******************
 ' Definición de puertos y variables
 '************************************************* *******************
 LED VAR PORTB.6 'Define el led en el pin 6 del puerto B
 TXD VAR PORTC.6 'Define el pin de transmision serial en el pin 6 del puerto C
 B1 VAR WORD
 B2 VAR WORD
 VALOR1 VAR BYTE
 VALOR2 VAR BYTE
 fpplaces var byte ' Used to define number of decimal places in fpdisplay,fpdisplayr
 ahold var word ' Required by fpdisplay
 bhold var word ' Required by fpdisplay

 '************************************************* *******************
 ' Inicio del programa principal
 '************************************************* *******************
 INICIO:
 TRISC.6 = 0 'Configura puerto RC6 como salida
 TRISC.7 = 1 'Configura puerto RC7 como entrada
 TRISA = 255 'Configura puerto A como entrada
 ADCON1 = %11000010 'Justifica el resultado hacia la izquierda
 TRISB.6 = 0 'Configura puerto RB6 como salida

 LCDOUT $FE,2," FUENTE SIMETRICA "
 LCDOUT $FE,$C0," JOSE LUIS COMAS LL "
 LCDOUT $FE,$94,"VOLT.NEGATIVO:-"
 LCDOUT $FE,$D4,"VOLT.POSITIVO:+"

 COMENZAR:
 ADCIN 1, B1 'Lee el voltaje negativo en el canal 1 del ADC
 ADCIN 2, B2 'Lee el voltaje positivo en el canal 2 del ADC

 'Envia los valores del ADC a la terminal
 SEROUT2 TXD,188,["$", "$", DEC4 B1,"$", "$",DEC4 B2,10,13]

 aint = B1 'Transfiere el valor del ADC del voltaje negativo

 gosub itofa 'Conviertelo a punto flotante

 bint = 2000 'Carga el valor 2000 (5*400)

 gosub itofb 'Conviertelo en punto flotante

 gosub fpmul 'ADCres * 2000

 bint = 52224 'Carga el valor de la cuenta maxima del ADC * 51

 gosub itofb 'Conviertelo en punto flotante

 GOSUB fpdiv '(ADCres * 2000)/52224

 LCDOUT $FE,$A3," " 'Limpia el espacio donde se coloca el voltaje negativo

 LCDOUT $FE,$A3

 fpplaces = 2 : Gosub fpdisplayr ' Call display routine

 aint = B2 'Transfiere el valor del ADC del voltaje positivo
 gosub itofa 'Conviertelo a punto flotante
 bint = 35 'Carga el valor 35 (5*7)
 gosub itofb 'Conviertelo en punto flotante
 gosub fpmul 'ADCres * 35
 bint = 1024 'Carga el valor de la cuenta maxima del ADC
 gosub itofb 'Conviertelo en punto flotante
 GOSUB fpdiv '(ADCres * 35)/1024
 LCDOUT $FE,$E3," " 'Limpia el espacio donde se coloca el voltaje positivo
 LCDOUT $FE,$E3
 fpplaces = 2 : Gosub fpdisplayr ' Call display routine
 HIGH LED
 GOTO COMENZAR


 fpdisplayr: If fpplaces=0 Then ' Set floating point barg to 0.5
 bexp = $7E
 bargb0 = $00
 bargb1 = $00
 bargb2 = $01
 Endif

 If fpplaces=1 Then ' Set floating point barg to 0.05
 bexp = $7A
 bargb0 = $4C
 bargb1 = $CC
 bargb2 = $CD
 Endif

 If fpplaces=2 Then ' Set floating point barg to 0.005
 bexp = $77
 bargb0 = $23
 bargb1 = $D7
 bargb2 = $0B
 Endif

 If fpplaces=3 Then ' Set floating point barg to 0.0005
 bexp = $74
 bargb0 = $03
 bargb1 = $12
 bargb2 = $6F
 Endif

 If fpplaces=4 Then ' Set floating point barg to 0.00005
 bexp = $70
 bargb0 = $51
 bargb1 = $B7
 bargb2 = $17
 Endif

 Gosub fpadd ' add barg to aarg

 fpdisplay: bexp = aexp ' Store the FP value of aarg to the barg variables

 bargb0 = aargb0

 bargb1 = aargb1

 bargb2 = aargb2

 Gosub ftoia ' Convert aarg to integer

 ahold = aint ' Save this value for the final display

 Gosub itofa  ' Convert integer back to float

 Swap aexp,bexp ' Swap the FP values of aarg and barg before subtraction
 Swap aargb0,bargb0
 Swap aargb1,bargb1
 Swap aargb2,bargb2

 Gosub fpsub ' Subtract the integer portion from the full number

 bint = 10 ' Make bint = 10 E fpplaces

 If fpplaces=2 Then
 bint = 100
 Endif

 If fpplaces=3 Then
 bint = 1000
 Endif

 If fpplaces=4 Then
 bint = 10000
 Endif

 bhold = bint ' Save the integer value of bint for zeros loop

 Gosub itofb ' Convert bint to integer prior to FP multiply

 Gosub fpmul ' Multiply the decimal portion x 10 E fpplaces

 Gosub ftoia ' Convert result to aint integer

 Lcdout dec ahold ' Display integer portion


 If fpplaces > 0 Then
 Lcdout "." ' Display decimal point

 zeros: bhold = bhold / 10 ' Set bhold to be next place to right

 If (aint < bhold) AND (bhold > 1) Then ' Check for leading zero in decimal
 Lcdout "0" ' Display leading zero
 Goto zeros ' loop to check for another zero
 Endif

 Lcdout dec aint ' Display the rest of the decimal portion

 Endif

 aint = ahold ' Restore the original value of aint

 
 Return
 
Última edición por un moderador:
Subo el archivo de simulación de Proteus y verán que los voltajeS negativoS y positivos parpadean y no se quedan fijos.
La librería "fp2032.bas" esta incluida y si no la incluiría al compilar el código generaría error.

Nota: el código funciona para el PIC 16f877a, Microchip, anuncio que este PIC ya es obsoleto y lo dejara de producir y vienen otros reemplazo como en el PIC 16f886 y otros.

Bueno este es un trabajo para la universidad, pero como están las cosas obtendrée un 4.0 en la calificación en electrónica digital y veré mas adelante como migro este código para que funcione para el PIC 16f886
 

Adjuntos

  • FUENTE SIMETRICA CON PIC 16F877A.rar
    30.7 KB · Visitas: 9
Última edición por un moderador:
Subo el archivo de simulación de Proteus y verán que los voltajeS negativoS y positivos parpadean y no se quedan fijos.
La librería "fp2032.bas" esta incluida y si no la incluiría al compilar el código generaría error.

Nota: el código funciona para el PIC 16f877a, Microchip, anuncio que este PIC ya es obsoleto y lo dejara de producir y vienen otros reemplazo como en el PIC 16f886 y otros.

Bueno este es un trabajo para la universidad, pero como están las cosas obtendrée un 4.0 en la calificación en electrónica digital y veré mas adelante como migro este código para que funcione para el PIC 16f886
Hay 2 situaciones posibles.

1- La lectura NO cambia, es decir el valor que se muestra es el mismo, pero parpadeante.
Eso se resuelve solo mostrando LOS CAMBIOS DE VALOR y el resto del tiempo, mantener fija la muestra. En este caso se debe trabajar CON INTERRUPCIONES para que todo se VEA bien.
Es decir que HAGO lecturas del puerto, pero solo los muestro cuando han cambiado si no, omito la función mostrar en el Display.

2- La lectura SI cambia
No me voy a poner a analizar su código al detalle, pero, las veces que me ha pasado algo parecido fue porque el programa trabajaba de manera LITERAL.
Es decir, que la electrónica y el programa del usuario, lo hacían bien y al límite de sus posibilidades y me impedían hacer una lectura correcta por su permanente cambio de datos.
En este caso, la permanente fluctuación de la captura de datos era el problema. Esto amerita escribir mas código, para evitar los muestreos TAN RÁPIDOS, por ejemplo cada 0,5 segundos, o solo cuando han superado cierto umbral de tiempo y valor de la magnitud.
Ese es el camino. Siempre considerando que las fuentes de alimentación ya estan bien reguladas.
 
Última edición:
Que conste que nunca he programado en picbasic pero esa colección de gotos y gosubs siendo que permite crear funciones no me gusta mucho.

Si medio funciona pruébala en el equipo real. Soy poco amigo de simulaciones.
 
La información esta a medias y solo se puede adivinar.

Falta "fp2032.bas" y al no esta entre lo adjuntado, el archivo hex generado, no se puede simular y ver lo que realmente pasa.

Adivinando: apostaría a que no le da la capacidad de procesamiento a la CPU para que Ares simule en tiempo real lo que pasa en ese esquema.

Revisa las modificaciones en el archivo modificado, creo que es lo que buscas en cuanto a estabilidad y también esta adjuntado la librerías que faltan para compilarlo en PBP3.

Cuando consultes debes ayudar a que te ayuden blindando toda la información.

Saludos.
 

Adjuntos

  • Fuen.rar
    81.1 KB · Visitas: 11
hola adjunto de nuevo la simulación de la fuente en proteus y tiene el código hex para su simulación.
ademas el código hex tiene la librería "fp2032.bas"
ademas estoy mirando como migro este codigo para que el pic 16f887, ya que este es una version mejorada del pic 16f887a.
espero y me me pueda ayudar gracias
 

Adjuntos

  • FUENTE SIMETRICA CON PIC 16F877A.zip
    34.1 KB · Visitas: 8
Busca información sobre la instrucción DIV32 y cómo se puede usar para realizar operaciones con punto flotante.
Yo he usado la instruccion de división del 80C196KC (cuando la tierra aún estaba caliente y los tiranosaurios paseaban en mi jardín) , para crear una biblioteca de cálculo en punto FIJO, no en punto FLOTANTE....no creo que pueda usarse una división entera para cálculo en punto flotante...dudo que ese PIC tenga el hardware para operar como FPU....
 
Última edición:
Sí, exactamente, eso es, punto fijo.
Uno como programador sabe donde poner el punto, el microcontrolador, no.
El problema con la librería FP2032.bas es que hace muchos procesos para ir moviendo el punto y por ende usa mucha memoria.
El gran problema aquí es que el lenguaje Basic es muy limitado, y mucho más lo es el PBP.
 
El punto flotante, era más cómodo, a partir de registros de 32 bits, si mal no recuerdo :rolleyes: :unsure: :giggle: Donde a uno le sobra lugar donde ponerla.....mmmm... mepa que sonó medio feo.
Bueh, donde colocar los elementos ...digamos.
 
El gran problema aquí es que el lenguaje Basic es muy limitado, y mucho más lo es el PBP.
Al 80C196 lo programaba en PLM, un lenguaje de Intel para sistemas embebidos...muy parecido e igual de conversado que el Pascal. Yo hice las rutinas de punto fijo (32bits --> 24 de parte entera y 8 de parte decimal) en assembler pero siguiendo el uso del Stack Pointer como lo hace el lenguaje C, por que el PLM usaba el mismo protocolo de invocación de las funciones.
Yo tenía que controlar posición y velocidad de un motor de mando directo en una articulación de un robot (si..con un PID), y usando el punto flotante del PLM, que era muy cómodo, no podía bajar de un tiempo de muestreo de 12ms...y necesitaba menos de 1ms. Cuando usé las rutinas de punto fijo bajé a 120us y el motor resultó completamente manso de controlar...
 
Hola. Les cuento que he resuelto el problema del parpadeo de los voltajes negativos y positivos.
He cambiado el PIC16F877A y usé el PIC16F886, la versión mejorada para el PIC16F877A

Les comparto la simulación en Proteus y el código hex para el PIC16F886
Espero que sea de su agrado.
 

Adjuntos

  • PV PIC 16F886.rar
    34.7 KB · Visitas: 8
Última edición por un moderador:
Hola. Les cuento que he resuelto el problema del parpadeo de los voltajes negativos y positivos.
He cambiado el PIC16F877A y usé el PIC16F886, la versión mejorada para el PIC16F877A

Les comparto la simulación en Proteus y el código hex para el PIC16F886
Espero que sea de su agrado.

Solo tenia que corregir en el Código esto

'++++++++++++++
'pv LCDOUT $FE,$A3," Limpia Voltaje Negativo
LCDOUT $FE,$A3
'++++++++++++++


'++++++++++++++
'pv LCDOUT $FE,$E3," " Limpia Voltaje Positivo
LCDOUT $FE,$E3
'++++++++++++++
 
Hola Chicos Les Comento Que He Corregido El Código PbP y en la Simulación Proteus Lcd 20x4 Registran Los Valores Deseados Voltaje Negativo y Voltaje Positivo Fuente Simétrica.
Utilice El Amplificador Operacional Lm358 en Modo Inversor.
Adjunto Simulación Proteus y Código Hex
Utilice Pic 16F877A
espero que sea de agrado :cool:
Gracias Señor Moderador (y)

Alguna Observación o Mejora al Circuito?🤔
 

Adjuntos

  • Simulacion Corregida Fuente Simetrica (1).jpg
    Simulacion Corregida Fuente Simetrica (1).jpg
    98.1 KB · Visitas: 13
  • Volt Digital 16F877A.zip
    33.2 KB · Visitas: 8
Última edición:
Atrás
Arriba