TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Eyedol en 21 de Agosto de 2006, 22:33:39
-
Tengo un grave problema amigos no se que hacer con un pic 16f877a estoy leyendo una entrada analogica por el AN0 todo funciona bien el lcd y entrada pero me tiene confundido la resolucion que muestra este micro tiene entradas analogas de resolucion 10 bit (0-1023)
pero cuando envio el valor de la variable al lcd me da valores desde 0-65535 algo asi como 16bit pero no lo son porque van avanzando a medida que muevo el potenciometro en el puerto analogo de 64 en 64 osea que al final son 1024 cuentas pero PORQUE MUESTRA DE 0 A 65535?
ADEMAS E REALIZADO MUCHISMAS PRUEBAS Y ME SIGUE DANDO RESULTADOS INSATISFACORIOS ADJUNTO EL CODIGO EN EL CODIGO SE VE TRANTANDO DE REFLEJAR UN VALOR DE O A 100 PERO NO HACE LO ESPERADO TAMBIEN ENVIA UN DATO POR EL PUERTO SERIE Y TAMPOCO LO HACE BIEN:
NOTA: EL POTENCIOMETRO ES DE UN MEGAOHNMIO EN EL AN0 OSEA VARIA MUY FINAMENTE. TAMBIEN E PROBADO COLOCAR # EN VES DE DEC A VER SI FUNCIONA Y ES LO MISMO. :( :( :(
define OSC 20
include "modedefs.bas"
Define LCD_DREG PORTD
Define LCD_DBIT 4
Define LCD_RSREG PORTB
Define LCD_RSBIT 0
Define LCD_EREG PORTB
Define LCD_EBIT 1
Define ADC_BITS 10
pause 1000
input portb.6
output portb.7
b1 var byte
variable var word
temp var byte
pause 500
lcdout $FE,1,"PRUEVA LCD"
gosub boton
boton:
button portb.6,0,100,10,b1,1,enviar
gosub boton
enviar:
high portb.7
pause 100
low portb.7
ADCIN 0,variable ' Lea el canal 0 a variable
pause 500
temp = (variable*100)/1023
lcdout $FE,1,dec variable," ",dec temp
serout portb.5,2,[variable]
gosub boton
end
-
Hola mira asi de una vista rapida tu programa esta medio rarito no?
mira cuando haces esto
pause 500
lcdout $FE,1,"PRUEVA LCD"
gosub boton
boton:
button portb.6,0,100,10,b1,1,enviar
gosub boton
tienes 2 gosub boton lo cual tu programa va a estar ahi siempre porque no veo por donde lo saques de esa rutina, luego lo que ves en el lcd y lo que mandas a la pc es
lcdout $FE,1,dec variable," ",dec temp
serout portb.5,2,[variable]
y la variable arriba la definiste como word
b1 var byte
variable var word
temp var byte
aca te dejo unna rutina que hice es muy basica para medir temperatura y mostrarla en un lcd esta en este post.
http://www.todopic.com.ar/foros/index.php?topic=12300.0
dale una checadita a la parte que te digo y tambien porque no checa el programa que puse ahi en el link y te das una idea. si no de todas formas aca vemos que onda
-
navaismo amigo gracias por tu rapida respuesta....
mira acepto lo que me dices acerca de esas rutinas solo estan hay porque es codigo reciclado de otros programas que habia hecho esperimentando un poco.
mi problema en si, no es lo de las variables porque las e puesto byte word etc. y igual me pasa lo mismo. El problema esta en que cuando envio la VARIABLE "variable" al lcd me envia un numero del 0 al 65472 variando de 64 en 64 que quiero decir pues que tiene 1024 cuentas (contando el cero) porque 64*1023 = 65472 y eso es lo que me muestra en el lcd cuando tengo la entrada a 5 VDC. Otra cosa es que no se como hacer una rutina para tomar esta variable y convertirlo en algo entendible para un usuario por ejemplo una medicion de temperatura de 0 a 100 ºC o una presion de 0 a 200 psi (claro esta tomados de unos sensores). e visto como lo hacen con 8 bits ejemplo.
temp = (variable*100)/255 algo asi pero hago esto con 10bit y me da algo estraño menos lo esperado ejem:
temp = (variable*100)1023
soy nuevo en esto asi que disculpen que sea tan chivo. actualemte estoy leyendo tu articulo pero esta algo largo y no soy muy dado a la programacion.
-
Hola mira lo del link no te hagas muchas bolas ya que lo unko que hice fue anexar a la rutina de punto flotante una simple linea.
MIra te muestro. sin el punto flotante la rutina quedaria asi:
Define __16F877 1 ' DEFINICION DE MCU
Define LCD_DREG PORTD
Define LCD_DBIT 4
Define LCD_RSREG PORTA ' DEFINICION DE LOS REGISTROS DEL LCD
Define LCD_RSBIT 2
Define LCD_EREG PORTA
Define LCD_EBIT 5
Define ADC_CLOCK 3 ' PONIENDO EN 3 EL RELOJ DE LA FUENTE
Define ADC_BITS 10 ' NUMERO DE BITS DEL RESULTADO
Define ADC_SAMPLEUS 15 ' SETEO DEL TIEMPO DE MEDICION
TRISA = 11 ' PUERTO A 3 ENTRADAS Y 3 SALIDAS
TRISB = 127
ADCON1 = 142 ' PUERTO A COMO ADC Y JUSTIFICACION A LA DERECHA
Low PORTA.4 ' APAGO LINEA DEL LCD R/W (W)
Pause 500 ' PAUSA PARA LCD
sensor var byte ' VARIABLE PARA GUARDAR EL VALOR DE ADC
temp var word
TERMO VAR PORTA.0
INIT:
lcdout $fe,1, " TEMPERATURA DE:"
LCDOUT $FE,$C0,dec temp," ßC"
ADCIN TERMO, sensor
temp=(sensor*104)
goto init
obviamente solo mostrara enteros si es un numero decimal solo habra ceros, de igual forma yo no puse voltajes de referencia lo cual hace bastante inexacta la rutina pero cuando la probe en el protoboard solo fallaba por 1 o 2 grados, cosa que no me molesto mucho.
el sensor que use es el famoso lm35 dz que segun se te entrega 10mV por cada grado, lo cual me ayudo a no hacer mas operaciones ni nada.
-
amigo e copiado el codigo que me diste y aun asi no me da los resultados esperados osea quisiera simplemente escalar la señal de entrada analogica y mostrarla de 0 a 100% en el display. al mostrar la variable no hay problema muesta un valor de que parte desde 0, 64, 128, 192 ......65472. pero si trato de mostrar un valor que refleje lo que en verda estoy midiendo temperatura o lo que sea pues se queda fijo en 0 o hace otras cosas menos lo esperado.
-
haber haber, ese ejemplo lo probe, midiendo temperatura y me mostraba la escala de la temperatura real +/- 2 grados lo ponia en la del lcdout DEC temp. haber sube el codigo para que lo cheque aca y lo simule talvez pueda ayudarte
-
Amigo mira el siguiente codigo:
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [set under view...options] *
'* Notice : Copyright (c) 2006 [set under view...options] *
'* : All Rights Reserved *
'* Date : 22/08/2006 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
define OSC 20
Define LCD_DREG PORTD
Define LCD_DBIT 4
Define LCD_RSREG PORTB
Define LCD_RSBIT 0
Define LCD_EREG PORTB
Define LCD_EBIT 1
adval var word 'Create adval to store result
x var byte
y var byte
TRISA = %11111111 ' Set PORTA to all input
ADCON1 = %10000010 ' Set PORTA analog and RIGHT justify result
ADCON0 = %11000001 ' Configure and turn on A/D Module
Pause 500 ' Wait .5 second
loop: ADCON0.2 = 1 'Start Conversion
notdone: pause 5
if ADCON0.2 = 1 Then notdone 'wait for low on bit-2 of ADCON0, conversion finished
adval.highbyte = ADRESH 'move HIGH byte of result to adval
adval.lowbyte = ADRESL 'move LOW byte of result to adval
x = (adval*100)
y = x/1023
Lcdout $fe, 1 'Clear screen
Lcdout "Value: ", DEC adval 'Display the decimal value
lcdout $fe,$c0,dec x, " ",dec y
Pause 100 'Wait .1 second
Goto loop 'Do it forever
End
....Lo obtube de la pasigina del pic basic la variable adval si es enviada al lcd de 0 a 1023 uno a uno excelente. si te das cuenta le agregue algo de codigo (las variable "x" e "y" y el codigo de calculo) pero los la variable "y" en el display sienpre esta en 0 y la variable x no es linial osea muestra numeros sin orden. creo que este esta mas facil que opinas?
ademas si puedes ayudarme a comprender que es lo que sucede con el "ADCIN chanel, var" como usarlo (algo que no sea lo que esta en la ayuda del pbp) y lo que pasa cuando envio los datos al lcd. etc ya sabes. gracias por tu apoyo amigo.
-
Eyedol.
Utiliza este enlace:http://www.rentron.com/PICX2.htm
Prueba con ese código a ver si te presenta algo mejor.
-
Hola Eyedol: el problema que tienes creo es que el dato que sacas por an0 está justificado a la izquierda, y no a la derecha como debería ser. te doy el ejemplo más simple de porqué te avanza de 64 en 64:
por ejemplo si el adc te mide el valor 1 y el resultado lo justificas a la derecha el resultado que te queda es así
00000000 00000001 = 1 decimal
Por el contrario si lo justificas a la izquierda te queda así:
00000000 01000000 = 64 decimal
se entiende?
saludos.
-
Eso es cierto flacoclau :o.
Pero si Eyedol dice: TRISA = %11111111 ' Set PORTA to all input
ADCON1 = %10000010 ' Set PORTA analog and RIGHT justify result
ADCON0 = %11000001 ' Configure and turn on A/D Module
sería algo muy extraño que no se compilara bien.
Eyedol, descarta el enlace que te puse.
Ese enlace utiliza la justificación a la izquierda (como sugiere Flacoclau) y no te servirá para 10 bits (lo siento :? me confundí).
-
:shock:
haber corriganme si me equivoco por favor. cuando yo uso el adc lo configuro asi
ADCON1 = 142 ' PUERTO A COMO ADC Y JUSTIFICACION A LA DERECHA
y los resultados que despliego me salen como quiero no uso el adcon0 nunca lo he usado y poner eso seria lo mismo a
ADCON1 = %10001110 ' PUERTO A COMO ADC Y JUSTIFICACION A LA DERECHA
saludos
creo que he vivido en un engaño jijijiji tengo que replantear muchos programas
-
Hola Navaismo.
Si usas PBP para adquirir la información de conversión (ADCIN canal, variable) no utilizas el ADCON0.
El ADCON0 lo usas si no utilizas la instrucción ADCIN.
Si tienes el microcode studio Plus has una simulación adquiriendo datos del A/D y fíjate en el registro ADCON0, verás lo que digo.
El ADCON1 es necesario, el ADCON0 no lo es (si usas PBP claro).
Espero ayude.
-
si asi es, uso PBP 2.46 con el MCSP v2.3 y siempre uso el adcon1 con el ADCIN volvi a probar el ejemplo que le puse a eyedol y me funciona bien.
-
haber analizando tu codigo veo una falta aca
ADCIN 0,variable ' Lea el canal 0 a variable
pause 500
temp = (variable*100)/1023
estas dividiendo entre 1023 lo cual esta mal se divide entre la cantidad de pedazos que serian 1024 y ademas no estas trabajando con variables con punto flotante entonces mira no te hagas bolas 100/1024=0.0976562 , en vez de trabajar con esas unidades prueba temp=variable*97 y a tu resultado lo divides entre 1000(pero mentalmente y eso es tu resultado aprox ni se te ocurra hacerlo en el programa del pic) y puedes mostrar en el lcd los valores en caso sea 100 voltios como maximo seria lo q muestres 100000 milivoltios solo cambian las unidades para que torturar tanto al compilador
-
Jovenes!!!!, de plano ya me hice bolas, a ver sia lguno de ustedes me puede sacar de dudas segun yo el codigo que esta aca http://www.todopic.com.ar/foros/index.php?topic=12300.0 (que como veran adapte el adcin a las rutinas de punto flotante, pa que luego no digan que me pirateo el programa). Mide la temperatura mas menos 2 grados porque porque tambien segun yo el lm35 dz entrega de -1V a 6v por lo cual mis vrefs son 0 y 5v.
ahora por lo que he estado viendo es muy probable que no entregue lo que es. Quisiera alguien probarlo y decirme que pasa.
-
Pues yo YA me hice bolas con el código ese navaismo :D
Cuando he tenido que hacer algo parecido (también use ese sensor) siempre trato de linealizar el sensor (sacar la ecuación de la recta).
Para ese caso si mal no recuerdo (fue en el 2004) use este ejemplo: http://www.rentron.com/PicBasic/LM34.htm
Son 8 bits pero se pueden ajustar a 10 bits.
-
Saludos amigos hace dias no me conectaba ya estoy aqui.... Gracias por aclararme varias dudas. aun me quedan algunas. veo que cuando utilizo "ADCIN canal, Variable" no necesito utilizar "ACON0" ya tengo ejemplo de como obtener los datos con los 10 bits con el adcon0 y el adcin pero me quedan unas dudas. creo que es lo mas simple. cuando utilizo el ejemplo del ultimo codigo que les mande (el que utiliza adcon0 para obtener el canal 0) enviando la variable directament al display osea esto:
adval.highbyte = ADRESH 'move HIGH byte of result to adval
adval.lowbyte = ADRESL 'move LOW byte of result to adval
Lcdout $fe, 1 'Clear screen
Lcdout "Value: ", DEC adval 'Display the decimal value
puedo observar en el display valores que van desde 0 a 1023. Ahora como hago para enviar digamos valores de 0 a 100%. se que electroando me ha dado un ejempo al respecto voy a ver como me va luego te cuento.
Ahora bien con respecto al adcin (mi dolor de cabeza) cuando envio los datos al display directamente eso es esto:
adcin 0,variable
pause 250
lcdout $FE,1,dec variable
me da valores que van desde 0 hasta 65472. los valores van de 64 en 64 porque? aunque es claro que la resolucion es de 1024 pues 65472/64 =1023 (mas el 0 son 1024). como haria en este caso para mostrar lo recivido por el puerto analogo en el display en valores de 0 a 100%. bueno imagino que es como sugiere electroando pero si pueden darme un codigo o una ecuacion de ejemplo para entender. aunque pienso corrijanme si me equivoco que mis ecuaciones estan bien solo que no lo doy el tratamiento adecuado a los datos (punto flotante) bueno saludos.
-
Pues si quieres mostrar valores de 0 a 100% digamos que 1024 es el 100% porque no intentas una regla de tres tomando que 0=0% y 1024=100%
-
aja oye eyedol si tenias razon con lo del los valores q te salian de 65472 creo esto esta escrito en el manual del picbasic pro actualizado me refiero descargate el manual de la misma pagina de melabs no uses los manuales antiguos alli hablan sobre ese problema eso te sale por lo de q en la configuiracion para 10 bits adcon.7=1 y creo para configuracion de 8 bits adcon.7=0 claro esto previamente usando en la cabecera los respectivos defines , usa el ejemplo que te comente
pero hay que tener cuidado tambien por ejemplo tedoy lo de un voltimetro que funciona con una resolucion aceptable , veamos , es para un rango de 0 a 5 voltios lo que debe salir por el lcd , lo que (aca si me entro la duda entre 1023 o 1024) bueno probare por 1023 la constante o razon de cambio sera (vmax-vmin)/1023=5/1023=0.004887 lo cual acercare a 0.0049 que es igual a 49/10000 y mira lo q te comente era multiplicar por ejemplo volt=variablemedida*49/10000 que me dara el valor entero y milivolt=variablemedida*49//10000 que me dara el valor del residuo o los decimales y se muestra en el lcd asi :dec1 volt,"." dec4 milivolt , ojo esto debes de tener en cuenta no pasarte la variable word pues fijate aca variablemedida*49(no debe de pasarse 65536) si es que por la resolucion variablemedida al maximo me dara 1023 entonces 1023*49= 50127 uf con las justas hasta alli te puedo ayudar no se una idea para hacer mas grande la multiplicacion o no lo e probado pero se podria usar la operacion */ creo q te da los bits medios de el resultado de 32 bits :mrgreen:
-
Precisamente lo que dices electronando.
4.88 milivolts por cada bit a 10 bits.
Cuando me pasa eso yo uso la instrucción DIV32 y no he tenido mayor problema que ajustar a menos de los 65535 (si quiero 5.0000, 5000.0, 500.00, etc.) o cualquier cantidad que requieras.
-
AAAAAAAAAHHHHHHHHH, me estoy volviendo loco.........
Bueno he repaso una y otra vez este post, y nada quedo peor. Repito alguein seria tan amable de checar el codigo que puse en el link de unos mensajes arriba. lo unico que anexe fue el adcin y reflejar la variable en las del punto flotante. Porque me interesa, porque todos mis programas estan basados en ese metodo, normalmente nunca hago ecuaciones, ni nada el dia que probe con el link de rentron que me paso mario cuando me tenia que dar 1024 me daba 1068 y cuando tenia que dar 2 me daba 4 u 8.
Haber segun he explicado hasta el cansancio sin respuesta alguna usando el lm35 (y checando en el mismo foro otros post, me confundo mas y mas) este sensor entrega 10mV por cada grado es decir cuando el lm35dz me de 10mV en el adc voy a tener un 2 decimal que equivale a 1ºC y asi sucesivamente, por ejemplo cuando me de 30mV voy a tener 3ºC y en el ADC un 6 decimal.
Podria alguien desmentirme uso 10 bits y justificado a la derecha. ¿Entonces para que hacer tantas ecuaciones y un promedio si al final me sale diferente?
Ayudad a este pobrre ciego a ver jijiji
-
Hola Navaismo.
:? MMMmmmmmmmmmmmmmmmmmmmmmmm :?
El código que pones no le entiendo aqui:
Define ADC_CLOCK 3 ' PONIENDO EN 3 EL RELOJ DE LA FUENTE
Define ADC_BITS 10 ' NUMERO DE BITS DEL RESULTADO
Define ADC_SAMPLEUS 15 ' SETEO DEL TIEMPO DE MEDICION
TRISA = 11 ' PUERTO A 3 ENTRADAS Y 3 SALIDAS
TRISB = 127
ADCON1 = 142 ' PUERTO A COMO ADC Y JUSTIFICACION A LA DERECHA
sensor var byte ' VARIABLE PARA GUARDAR EL VALOR DE ADC
TERMO VAR PORTA.0
ADCIN TERMO, sensor
resulthold= (sensor*104)
Si utilizas el ADC de 10 bits no estás tomando las lecturas adecuadas a la hora de hacer los cálculos porque como dice flacoclau:
por ejemplo si el adc te mide el valor 1 y el resultado lo justificas a la derecha el resultado que te queda es así
00000000 00000001 = 1 decimal
Por el contrario si lo justificas a la izquierda te queda así:
00000000 01000000 = 64 decimal
Tu tienes justificado a la derecha por lo que alcanzarías tu máximo aqui:
0000 0011 1111 1111.
Si tomamos la referencia de Electronando y hacemos (5v/2^n-1 bits) = (5v/1023 bits) = 4.887 milivots por cada bit del ADC para 10 bits.
Si tuvieras los 10 bits serían 4.999401 volts (se pierde exactitud en la resolución por el redondeo).
Al definir SENSOR como byte lo máximo que estás adquiriendo es: 0000 0011 1111 1111.
Lo anterior se traduce en (255) (4.887 milivotls) = 1.246185 que, para cuestiones prácticas vendría dándonos como 124.6 grados. Todo eso multiplicado por 104 que nos daría: (104) (1.246185) = 129.60324 grados.
Al multiplicar por 104 aumentas a casi 130 grados tu medición lo cual está dentro del rango (+155).
Con lo que comentas:Haber segun he explicado hasta el cansancio sin respuesta alguna usando el lm35 (y checando en el mismo foro otros post, me confundo mas y mas) este sensor entrega 10mV por cada grado es decir cuando el lm35dz me de 10mV en el adc voy a tener un 2 decimal que equivale a 1ºC y asi sucesivamente, por ejemplo cuando me de 30mV voy a tener 3ºC y en el ADC un 6 decimal.
Podria alguien desmentirme uso 10 bits y justificado a la derecha. ¿Entonces para que hacer tantas ecuaciones y un promedio si al final me sale diferente?
Ayudad a este pobrre ciego a ver jijiji
Ese sensor es de -55 a 150 grados, te da 10 mV/grado.
Si tienes 2 en el ADC tienes (2*0.004887) = 0.009774 => 9.774 mV => casi un grado pero no es un grado.
Si tienes 6 en el ADC tienes (6*0.004887) = 0.029332 => 29.332 mV => Poco mas de 29 grados pero lejos de 30 grados.
Si tomamos esto como referencia tendremos que:
Si tienes 255 en el ADC tienes (255*0.004887) = 1.246185 => 1246185 mV => 124.6185 grados; como multiplicas por 104 tenemos que te da 129.60324 grados, que no se parece a 127.5 grados.
Eso es lo que yo veo del código (mencionas que +- Vref son 5 y 0).
No pienses en 10 mV/grado, piensa en cuántos bits del convertidor son necesarios para que te den 10 mV y por ende, un grado; dos bits no te dan 10 mV.
Veo que tu redondeas a 5mV cada bit (lo cual no está mal).
Si solo utilizarás los 8 bits de menor peso en el convertidor para tus cálculos, no necesitas usar el AD a 10 bits, puedes definir que usarás 8 en el DEFINE ADC_BITS.
Espero no hacerte mas bolas :D.
Por eso uso la DIV32, te ayuda mas y sería una solución para lo que propone electronando.
Saludos.
-
Ah gracias, que "toy" me vi jeje, eso de deifnir la variable como byte, no me habia fijado. BUeno gracias voy a probar todo lo que me dicen
-
Saludos amigos yo ya he entendido todo lo que me han dicho gracias por su colaboracion creo que con todo esto esta claro que es lo que pasaba. yo tambien habia declarado mi variable como BYTE ese era uno de mis problemas ademas que no sabia que para usar adcin habia que usar justificacion a la derecha. bueno quiero hacer un nuevo tema con un problema derivado de este y es tener precision en los resultados enviados al LCD (Con decimales y todo) pero sin usar punto flotante. si alguien sabe algo aviseme. Gracias por su colaboracion :lol: :lol: :lol: :-/ :-/ :-/ :-/. ah adjuno el codigo que realice para enviar un valor de 0 a 100 al lcd pero no me siento satisfecho pues la precision deja mucho que desear. al menos ya tengo mi valor de 0 a 100. :? :? :?
define OSC 20
Define LCD_DREG PORTD
Define LCD_DBIT 4
Define LCD_RSREG PORTB
Define LCD_RSBIT 0
Define LCD_EREG PORTB
Define LCD_EBIT 1
Define ADC_CLOCK 3 ' PONIENDO EN 3 EL RELOJ DE LA FUENTE
Define ADC_BITS 10 ' NUMERO DE BITS DEL RESULTADO
Define ADC_SAMPLEUS 30 ' SETEO DEL TIEMPO DE MEDICIONDefine ADC_CLOCK
ADCON1 = %10000010 ' Set PORTA analog and RIGHT justify result
pause 500
x var word
a var x.lowbyte
b var x.highbyte
perc var word
porc var word
pirc var word
rtotal var word
total var word
c var x.9
d var x.8
f var word
g var word
lcdout $FE,1,"Iniciando..."
pause 500
conversion:
adcin 0,x
pause 50
f = d * 256
g = c * 512
perc = f * 50
porc = g * 25
pirc = a * 25
perc = perc/512
porc = porc/256
pirc = pirc/255
total = perc + porc + pirc
lcdout $fe,1,"V: ",dec x
lcdout $fe,$C0,"n: ",dec total,"ºC"
pause 250
goto conversion
end
-
hola amigos no se si me podiran ayudar estoy haciendo un conversor analogo digital con el 16F877A ya lo he logrado mas o menos le estoy leyendo a un potenciometro de o 255 pero quiero que en el LCD me muestre lo que me arroja un canal en una escala de 0 a 500 con 2 decimales y el segundo de 0 a 30 con 2 decimales pero quisiera que se muestre 0,01 ; 0,02 ;0.03; asi hasta llegar a la escala que mencione anteriormente seria posible por si acaso posteo el codigo que he realizado para ver si me dan una mano
;==========================================================================================================
;-------------------------------* CONFIGURACION INTERNA DEL MICROCONTROLADOR *----------------------------
@devicext_osc ; oscilador externo XT
define osc 4
;==========================================================================================================
;---------------------------- * CONFIGURACION DE COMUNICACION DEL LCD *------------------------------------
define LCD_DREG PORTD
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 4
;==========================================================================================================
;-------------------------------------* DECLARACION DE VARIABLES *-----------------------------------------
P1 VAR WORD
P2 VAR WORD
P3 VAR WORD
X VAR word
Y VAR BYTE
BOTON VAR PORTB.4
BOTON1 VAR PORTB.5
BOTON2 VAR PORTB.6
BOTON3 VAR PORTB.7
BO VAR BYTE
B1 VAR BYTE
BA VAR BYTE
;========================================================================================================
;-------------------------------------------* CARATULA * ------------------------------------------------
PAUSE 200
FOR BO =144 TO 128 STEP -1
LCDOUT $FE,1
LCDOUT $FE,BO," TORNO CN "
LCDOUT $FE,$0C,B1
PAUSE 100
NEXT
LCDOUT $FE,$C0
FOR BO=0 TO 15
LOOKUP BO,[" MICROLOGIX 1100 "],B1
LCDOUT $FE,$0C,B1
PAUSE 100
NEXT
pause 1500
FOR Y = 0 TO 2
PAUSE 200
LCDOUT $FE,1,"POR FAVOR ESPERE"
LCDOUT $FE,$C0
LCDOUT $FE,$0C,"CARGANDO"
FOR BO = 0 TO 15
LOOKUP BO,["........"],B1
LCDOUT $FE,$0C,B1
PAUSE 150
NEXT
NEXT
PAUSE 300
;=======================================================================================================
;--------------------------* CONFIGURACION INTERNA DEL CONVERSOR ANALOGO DIGITAL *----------------------
ADCON1=%100
INICIO:
PAUSE 300
POTEN1:
ADCON0=%1000001
GOSUB MEDIR
P1= ADRESH
POTEN2:
ADCON0=%1001001
GOSUB MEDIR
P2=ADRESH
POTEN3:
ADCON0=%1011001
GOSUB MEDIR
P3=ADRESH
x=P1*2
;=========================================================================================================
;----------------------------* CONFIGURACION DE VISUALIZACION DE ALARMAS *--------------------------------
IF BOTON=1 THEN
LCDOUT $FE,1
LCDOUT $FE,$1,"E.LON:"
LCDOUT $FE,$88,DEC X,".",DEC2 P1, "mm"
LCDOUT $FE,$C0,"E.TRAN:"
LCDOUT $FE,$c9,DEC (P2*30)/255,".",DEC2 P2,"mm"
IF BOTON1=1 THEN
LCDOUT $FE,1
LCDOUT $FE,$1,"E.LON:"
LCDOUT $FE,$88,DEC X,".",DEC2 P1, "mm"
LCDOUT $FE,$C0,"E.TRAN:"
LCDOUT $FE,$c9,DEC (P2*30)/255,".",DEC2 P2,"mm"
IF BOTON2=1 THEN
LCDOUT $FE,1
LCDOUT $FE,$1,"E.LON:"
LCDOUT $FE,$88,DEC X,".",DEC2 P1, "mm"
LCDOUT $FE,$C0,"E.TRAN:"
LCDOUT $FE,$c9,DEC (P2*30)/255,".",DEC2 P2,"mm"
IF BOTON3=1 THEN
LCDOUT $FE,1
LCDOUT $FE,$1,"E.LON:"
LCDOUT $FE,$88,DEC X,".",DEC2 P1, "mm"
LCDOUT $FE,$C0,"E.TRAN:"
LCDOUT $FE,$c9,DEC (P2*30)/255,".",DEC2 P2,"mm"
ELSE
LCDOUT $FE,1,$82," ULTIMO DATO"
LCDOUT $FE,$C0," BORRADO"
ENDIF
ELSE
LCDOUT $FE,1,$82,"TODOS LOS DATOS"
LCDOUT $FE,$C0," BORRADOS"
ENDIF
ELSE
LCDOUT $FE,1,$82," DATO GRABADO"
LCDOUT $FE,$C0
ENDIF
ELSE
LCDOUT $FE,1,$82," MEMORIA LLENA"
LCDOUT $FE,$C0
ENDIF
GOTO INICIO
;========================================================================================================
;--------------------------* CONFIGURACION DE MUSTREO DEL CONVERSOR A/D *--------------------------------
MEDIR:
PAUSE 50
ADCON0.2=1
PAUSEUS 50
RETURN
end
la variables P1 P2 P3 son las que manejo la informacion desde el potenciometro lo que dice alarmas son para cuando me de informacion otro circuito me despliegue en el LCD ese aviso...por favor ayuda
-
disculpa estoy haciendo una calculadora de 4 digitos pero al colocar la operacion mas grande es decir 9999*9999 me da 37601 y donde guardo la multiplicacion es una variable de tipo word, tendra algun detalle el lcd? la programacion es la correcta la estoy haciendo con un 16f877a les estare agradecido