buenas noches amigo traigo otro problemita con esto de los decimales.............el programa que muestro abajo es para mostrar en una LCD las revoluciones de un PAP con una caja de reduccion tiene un boton para subir y otro para bajar las revoluciones con un paso de 0.1 en el programa uso 2 maneras de manejar los decimales pero ambas no funcionan muy bien en la primera linea del LCD uso una rutina basada en la variable tlong uso 2 enteros y un decimal............pero no se ven los decimales solo el cero, el segundo uso la conversion de floar a string pero despues del punto decimal muestas varios decimales.........pero si se aprecia el salto de 0.1 alguien puede darme una ayudita????
program ArribaAbajo
dim Cont_H, Cont_L, oldstate_a, oldstate_b,TEA, TEB, Ret, SLCD, ch as byte
txt as char[7]
VR, Valor as word
RPM, RPS, FE, RR, NPPG, NPPP as float
tlong as longint
' Configuracion de los pines de LCD
sub procedure Interrupt()
Cont_H = Hi(VR) ' Valor alto del TMR0
TMR0H = Cont_H
Cont_L = Lo(VR) ' Valor Bajo del TMR0
TMR0L = Cont_L
INTCON.TMR0IF = 0 ' Limpia la bandera de interrupcion del TMR0
PORTC.0 = 1 ' Activa el Pin C.0 para controlar el PAP
for Ret = 0 to 3
next Ret
PORTC.0 = 0 ' Apaga el Pic C.0 para quenerar un pulso
end sub
main:
' Datos para calcular el valor del TMR0
FE = 16000000 ' Frecuencia de trabajo de Entrada
NPPP = 16 ' Numero de Pulsos Por Pulso
NPPG = 200 ' Numero de Pulsos Por Giro
RR = 15.3 ' Relacion de Reduccion
' Datos para calcular el valor del TMR0
TEA = 0
TEB = 0
oldstate_a = 0
oldstate_b = 0
ANSEL = 0 ' Configura los AN como I/O Digitales
ANSELH = 0
TRISB = $F0 ' Configuracion del PORTB
PORTB = $0F ' Configuracion de salida del PORTB
TRISC.0 = 0 ' El Puerto C es Digital
PORTC.0 = 0 ' Initialize PORTB
RPM = 0 ' Valor de inicializacion del TMR0
INTCON = %11100000 ' Activacion del TMRO
T0CON = %10001000 ' Configuracion de la entrada del
' TMRO y el PRESCALER (Se desactivo el Pres)
Lcd_Init(PORTC)
Delay_ms(2)
LCD_Cmd(LCD_CLEAR) ' lear display
Delay_ms(2)
LCD_Cmd(LCD_CURSOR_OFF) ' turn cursor off
Delay_ms(2)
Lcd_Out(1, 1,"RPM:" )
Delay_ms(2)
while TRUE
tlong = RPM * 100
ch = (tlong / 1000) mod 10 ' extract 10 digit
LCD_Chr(1,7,48+ch) ' write ASCII digit at 2nd row, 9th column
ch = (tlong / 100) mod 10 ' extract 1 digit
LCD_Chr_CP(48+ch) ' write ASCII digit at cursor point
LCD_Chr_CP(".")
ch = (tlong / 10) mod 10 ' extract .1 digit
LCD_Chr_CP(48+ch) ' write ASCII digit at cursor point
FloatTostr(RPM, txt) ' Transforma el Conteo de RPM en String
Lcd_Out(2, 7, txt) ' Muestra RPM en el LCD
' Rutina para Subir y bajar el valor de contador
' Boton de bajar el valor de las RPM, Si se mantiene pulsada
' por mas de un segundo incrementa 0.5 en cada paso
if Button(PORTB, 4, 1, 1) then
oldstate_a = 1
if TEA >= 60 then ' Si se mantiene pulsado por mas de un segundo
Delay_ms(300) ' activa una rutina de Icrementos de 0.5 a la Vez
RPM = RPM + 0.5
if RPM >= 70.0 then
RPM = 70.0
end if
else
Delay_ms(1)
TEA = TEA + 1
end if
end if
if oldstate_a and Button(PORTB, 4, 1, 0) then
if TEA <= 59 then ' Si se suelta el boton antes de segundo
RPM = RPM + 0.1 ' no hace ninguno incremento
end if
if RPM >= 70.0 then
RPM = 70.0
end if ' Se reinicia la deteccion de tecla pulsada
TEA = 0
oldstate_a = 0
end if
' Boton de bajar el valor de las RPM, Si se mantiene pulsada
' por mas de un segundo incrementa 0.5 en cada paso
if Button(PORTB, 5, 1, 1) then
oldstate_b = 1
if TEB >= 60 then
Delay_ms(300)
RPM = RPM - 0.5
if RPM <= 0.1 then
RPM = 0.1
end if
else
Delay_ms(1)
TEB = TEB + 1
end if
end if
if oldstate_b and Button(PORTB, 5, 1, 0) then
if TEB <= 59 then
RPM = RPM - 0.1
end if
if RPM <= 0.1 then
RPM = 0.1
end if
TEB = 0
oldstate_b = 0
end if
' Calculo de las RPS
RPS = RPM / 60
' Calculo del valor del TMR0 para Dividir La Frecuencia
' de salida para el Driver de PAP
VR = 65536 - ( FE / ( NPPP * NPPG * RPS * RR ))
wend
end.