amigos del foro, saludos cordiales


He diseñado el siguiente código con el pic basic pro usando el pic 16f877a, el código es para una fuente simétrica, quiero que este mismo código funcione con el pic 16f887.

'* Nombre: FUENTE SIMETRICA.BAS *
'* Autor: [JOSE LUIS COMAS LLINAS] *
'* *
'* Aviso: Copyright (c) 2020 [seleccione VER ... OPCIONES DEL EDITOR] *
'* : Todos los derechos reservados *
'* Fecha: 10/02/2020 *
'* Versión: 1.0 *
'* Notas: *
'*: *
'************************************************* ***************
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,"JOSELUISCOMASLLINAS "
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

' 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 "." 'Mostrar punto decimal


ceros: bhold = bhold / 10 'Establecer bhold para que sea el próximo lugar a la derecha
If (aint <bhold) AND (bhold> 1) Entonces 'Verifique el cero inicial en decimal
Lcdout "0" 'Pantalla cero inicial
Vaya a bucle de ceros para buscar otro cero
Terminara si

LCDOUT diciembre aint 'mostrar el resto de la parte decimal


Terminara si


aint = ahold 'Restaura el valor original de aint


Regreso





amigos espero y me puedan ayudar gracias

jose