PDA

View Full Version : wrong positive and negative voltages on lcd 20x4



josepic
- 20th April 2023, 13:32
I am in a symmetrical source project with pic 16f886, but in the proteus simulation the voltage values displayed on a 20x4 lcd, and these values are different from the registers in the proteus dc voltmeters.
and the negative voltage displayed on the 20x4 lcd is displayed very fast.
and the positive voltage displayed on the 20x4 lcd is displayed normal


If someone could please review the code and correct it, I would appreciate it and thank you

'Config for 16f886
#CONFIG
__config _CONFIG1, _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_ON & _LVP_OFF & _CP_ON & _CPD_ON
#ENDCONFIG


include "fp2032.bas"    ' Include file for 14-bit core with RAM at $20 (32-bit)
define OSC 8
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTC
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTC
DEFINE LCD_EBIT 1
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2




DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_ SAMPLEUS 50
'************************************************* *******************
LED VAR PORTC.4
TXD VAR PORTC.6
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:
TRISC.6 = 0       'in
TRISC.7 = 1       'out
TRISA = 255       'Port_A = in
ADCON1 = 000010   'left alignment
TRISB.6 = 0       'out


LCDOUT $FE,2," FUENTE SIMETRICA " '1_line
LCDOUT $FE,$C0," JOSE LUIS COMAS LL " '2_line
LCDOUT $FE,$94,"VOLT.NEGATIVO:-" '3_line
LCDOUT $FE,$D4,"VOLT.POSITIVO:+" '4_line
COMENZAR:
ADCIN 1, B1 'read negativ via chanal_1_ADC
ADCIN 2, B2 'read positiv via chanal_2_ADC

'send ADC to terminal
SEROUT2 TXD,188,["$", "$", DEC4 B1,"$", "$",DEC4 B2,10,13]

aint = B1 'read -volt_to+B1
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
'++++++++++++++
'pv 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
'++++++++++++++
'pv 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

' The fpdisplayr routine checks for number of places, then adds the appropriate
' value to achieve rounding. To save RAM space, the values are hard coded
' in floating point format.


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
                  
' The fpdisplay routine outputs the signed value of aarg in decimal floating point format. It
' can display a positive value of 65535, and decimals to 4 places. The number of decimal
' places should be stored in fpplaces before calling the routine. The routine reads the
' floating point value of aarg. This value should NOT be converted to an integer before
' calling fpdisplay. The integer conversion will be perfomed as part of this routine, and
' aint will be returned to the calling program just as from the itofa routine.


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
'pv LCDOUT $FE,$A3," " 'Limpia el espacio donde se coloca el voltaje negativo
'pv LCDOUT $FE,$A3
'pv LCDOUT $FE,$E3," " 'Limpia el espacio donde se coloca el voltaje positivo
'pv LCDOUT $FE,$E3




https://drive.google.com/file/d/11pN...uhMMrPdIk/view (https://drive.google.com/file/d/11pNGsWwOuIejz0-MrePI4xmuhMMrPdIk/view)
I attached a video link where you will see the code failure.


You will see in the ldc 20x4 the negative voltage is displayed very quickly, the lcd will register voltage 12.45 and in the proteus dc voltmeter it registers 12.5V


in the 20x4 lcd it registers a positive voltage of 12.58, it displays normal and in the dc voltmeter of proteus it will register a voltage of 12.6V.
You will see that the decimals record different values of both positive and negative voltages.
I hope that the video can serve you better to see and correct the code.
thank you

Ioannis
- 20th April 2023, 20:44
What happend to this thread? ?
https://www.picbasic.co.uk/forum/showthread.php/26589-wrong-positive-and-negative-voltages-on-lcd-20x4?p=153989#post153989

Ioannis

richard
- 21st April 2023, 02:30
my take

i doubt many would risk unvetted zipped content from google drive, youtube would be safer.


what does displayed very fast mean ?


what does displayed normal mean ?


has it ever worked or is it just a proteus simulation, proteus does not really work for some real time things


you could certainly fudge something up to correlate with proteus' measurements but it would be unlikely to work as precisely
in reality and each unit manufactured would need individual code tweaking [hardly practical for production],as an academic exercise
for students it may be useful to explain the differences between reality and simulated environment's






there is no schematic.
no voltage range given. no explanation of the analog input divider. why the pos rail uses a different divider to the neg rail
no power supply


why use fp ,can you really expect accuracy to 2 decimals.
in a real situation you need to account for , reference accuracy/noise, conversion linearity / noise
voltage divider accuracy and noise on the measured signal not to mention temperature effects
you can easily mash out large numbers of decimals to display but their base accuracy cannot be justified




what does symmetric power supply mean ,the code is just a display


if its symmetric then why is +- different ? , over what range are we talking about




two dp accuracy from single asynchronous adc results is not plausible afaics esp without a stable voltage reference for adc


surely a lowpass filter is needed either electrical or software based , even oversampling could be employed
and a temperature compensated voltage reference used if you really need that sort of precision



op has remained steadfastly mute on any discussion on any points and just wants working code provided

Ioannis
- 21st April 2023, 21:49
....

op has remained steadfastly mute on any discussion on any points and just wants working code provided

Then maybe chatGPT can give help!

Ioannis

richard
- 21st April 2023, 23:44
Then maybe chatGPT can give help

interesting thought

josepic
- 24th April 2023, 00:14
my take

i doubt many would risk unvetted zipped content from google drive, youtube would be safer.


what does displayed very fast mean ?


what does displayed normal mean ?


has it ever worked or is it just a proteus simulation, proteus does not really work for some real time things


you could certainly fudge something up to correlate with proteus' measurements but it would be unlikely to work as precisely
in reality and each unit manufactured would need individual code tweaking [hardly practical for production],as an academic exercise
for students it may be useful to explain the differences between reality and simulated environment's






there is no schematic.
no voltage range given. no explanation of the analog input divider. why the pos rail uses a different divider to the neg rail
no power supply


why use fp ,can you really expect accuracy to 2 decimals.
in a real situation you need to account for , reference accuracy/noise, conversion linearity / noise
voltage divider accuracy and noise on the measured signal not to mention temperature effects
you can easily mash out large numbers of decimals to display but their base accuracy cannot be justified




what does symmetric power supply mean ,the code is just a display


if its symmetric then why is +- different ? , over what range are we talking about




two dp accuracy from single asynchronous adc results is not plausible afaics esp without a stable voltage reference for adc


surely a lowpass filter is needed either electrical or software based , even oversampling could be employed
and a temperature compensated voltage reference used if you really need that sort of precision



op has remained steadfastly mute on any discussion on any points and just wants working code provided

I have solved the problem, I attach image

josepic
- 24th April 2023, 00:18
9361

I have solved the problem, I attach image