Comparación de variables en PICBasic

#1
ola estimados amigos de foros de electronica, a los tiempos otra vez por aqui por este sitio
esperando que esten de lo mejor.

estoy haciendo un contador programable por interrup B0.

mi trabajo consta en que cuando inicia el contador entra a un menu previo para ajustar un numero
cualquiera del 0000 al 9999, entonces para poder ajustar rapidamnte un numero alto, le e divido en cuatro
variables llamadas (unid, dece, cent, mile) que cuando la variable (cuenta) se iguala a estas cuatro, me activa un led.

Entonces quisiera saber como lo comparan estas cuatro variables, (unid, dece, cent, mile)
que me forman un numero del 0000 al 9999 para al igualarse con mi variable (cuenta) y se active mi led.
por fa ahi esta mi programa, les envio y mi codigo.

las variables llegan cargadas hasta la pantalla lcd 16x2 ppero no me compara con la variablew (cuenta.)

Para probar cualquier cuenta al esquema en isis le eh puesto un generador de pulsos para acelerar las prruebas.
Ahi le pongo por si las dudas.
 

Adjuntos

pandacba

Rocker Bear
#2
Tu progrma me parece demasiado intrincado para algo tan simple
Por un lado tenes que de esas 4 variables almacenar el valor en una sola, para conformar un número y a ella compararla con cuenta y deben tener la misma dimensión para ello
Veo que haces unidad=numero ambos son variables incompatibles unidad es byte y numero word, por otro lado supongo que lo que queres es armar el número, y eso esta mal si vos pones unida=numero estas poniendo el contenido de numero en unid, como esa tiene cualquier cosa estas poniendo eso en unid, con lo cual el valor que le cargaste se pierde y luego haces lo mismo con dece, cent y mile por lo tanto nunca se armo el valor de número
para logarar armar numero se hace de otra forma
num= unida + 10 *dece + 100*cent + 1000 *mile de esta forma armas num
 
#3
No veo la utilidad de usar una variable por dígito.
No conozco el picBasic PRO pero yo declararía la variable como unsgined int o unsigned double, dependiendo de como sean en ese compilador; hay algunos en los que INT es 8 bits y otros en donde son 16.
Si es por sacar datos por el LCD, normalmente ya hay una función "print cuenta" que ya arregla los números para que salgan como deben, Lo mismo no la hay en ese compilador pero me extrañaría.
 
#4
osea si yo quiero programar a mi contador para que llegue por ejemplo hasta: 2743 , no tengo que configurar numero por numero verdad? como lo ajusto de una forma rápida. gracias
 

pandacba

Rocker Bear
#5
No hace falta, pero si por alguna razón así lo hicieras hay que armarlo de nuevo de la forma que te mostre.
Para hacerlo de otra manera depende de como lo implementes, si es un teclado númerico, vas captando cada digito , por ejemplo sabes que el primero es la unidad el segundo la decena y asi, y sumas a tu variable cada digito, la unidad directamente la decena lo multiplicas por 10, a la centena por 100 y así, hay otras formas, por ejemplo si lo haces con ruedas decimales codificadas en BCD, o si lo haces con un sistema de 4 teclas tu variable inicialmente esta en 0 por lo tanto tu display debería mostrar "0000" cuando activas el entar datos empieza por la unidad y parpadea, subes y o bajas para ajustar, una vez lisgo te desplazas a la decena y asi, internamente haces lo mismo que en caso anterior
 

Dr. Zoidberg

Well-known-Papá Pitufo
#6
osea si yo quiero programar a mi contador para que llegue por ejemplo hasta: 2743 , no tengo que configurar numero por numero verdad? como lo ajusto de una forma rápida. gracias
No sé como se hace en PIC Basic, pero en C (CCS) es muuuuuy simple.
Solo tenés que definir una variable de tipo tal que "quepa" el mayor número a representar (por ejemplo, para 9999 vale con un int16 o como se llame en PicBasic). Por ejemplo:
C:
int16 contador = 0;
Luego incrementas o decrementás esa variable según tu antojo, y cuando quieras escribirla en el display LCD, solo tenés que hacer:
C:
printf( lcd_putc, "%04d", contador);
Si querés definir un límite en la cuenta, tendrás que usar algunos if para que el conteo no supere los valores que definas en ellos.

Buscá como se hace esto en PIC Basic y listo
 

pandacba

Rocker Bear
#7
En Pic basic es fácilisimo, solo que tienes que empezar tu programa de cero, ya que hay muchas cosas demás
Necesita tan simplemente dos variables una donde pone el número a comparar y la otra donde se acumula el contdor.

El lío se lo ha echo en como armar ese número a partir de datos entrados en teclado
 
#9
No lo había entendido muy bien.
Vale, te cuento como lo hacía yo aunque era en ensablador y para tres cifras...

Algo así

Inicio:
Uni=0
deci=0
centi=0
mil=0

bucle:
if se pulsa un numero
mil = centi
centi = deci
deci = uni
uni = tecla pulsada

if se pulsa enter
numero = mil*1000+centi*100+deci*10+uni
salir del bucle

if se pulsa backspace
uni = deci
deci = centi
centi = mil
mil =0

print en el lcd mil,centi,deci,uni //efectivamente lo hacía así, sumando el caracter 20h creo que era para que saliera en ascii

goto bucle


Luego en el resto del programa usaba la variable número directamente
 
#10
gracias amigo pandacba, por la formula que me alcanzaste. pude lograr mi cometido, estoy que quiero cerrar el proyecto y tengo otro inconveniente en el bucle uno, (esta en medio de la rutina de la interrupción), quiero poner varias sentencias; como por ejemplo, cuanto la cuenta se iguale a la variable numero (numero cualquiera guardado en eeprom) durante el conteo por b0, se encienda mi led azul (chicharra). otro, que cuando la cuenta este en cero y que la variable numero desee guardarlo en cero , que mi led azul se mantenga apagado, otro, cuando la cuenta etsa en cualquier numero , con un pulsador encerar la cuenta desde cero.
Bueno e colocado mis sentencias dentro del bucle uno, pero no me funciona el programa, por que creo que están mal y se pone en conflicto por fa en que estoy mal....ya que estoy terminando la placa ya. jjejeje:rolleyes: gracias
 

Adjuntos

#11
(APORTE )Hola estimados Amigos Foreros, les agradesco mucho de su ayuda, quizá la ultima parte no me soplaron, jejeje pero quiero decirles que , gracias a ese silencio, pude entender un poquito mas de (Interrupt B0), estuve repasando el tema y bueno aqui les comparto este contador que se programa a cualquier numero y comparado este con la cuenta suena una buzzer, y si no tenemos limite de cuenta , lo dejamos en cero y cuenta hasta 65565, gracias.
Ah, quisiera mejorarlo, si es que me pueden soplar,. ejemplo: programo la cuenta en cien, quiere decir que cuando llegue a cien suena el buzzer, pero la cuenta no se queda ahi si no que continua, entonces cuando llegue a 200 quiero que igual suene y asi 300, 400, etc. osea cómo le agrego a mi programa ese múltiplo. Gracias
*soplar= decir en el oido, en voz baja.
 

Adjuntos

#12
incremento = 100
compara =incremento
bucle:
if cuenta = compara
sonar el buffer
compara = compara +incremento
if compara >65235 then compara = incremento

goto bucle
 
#13
Hola mi amigo. Quiero hacerte una pregunta. ¿Por-qué este proyecto en el proteus funciona, pero en la realidad solamente la interrupción RB0 no funciona?
Por favor, una pista.
 
Última edición por un moderador:
#14
Es lo que tiene la realidad. Y si lo pones en un entorno industrial seguramente arda...

Yo apostaría por tres o cuatro cosas pero a saber. Como no pones esquemas ni nada no puedo adivinar mas.
 
Última edición:
#16
hamito
Una sugerencia: no todos usamos los mismo programas tanto para la simulación como para la representación gráfica por lo que a la hora de pedir ayuda se trata de cubrir el mayor universo de posibles participante. No pones en tu adjunto el archivo compilado(hex) por lo que si alguien quiere probar y no usa o tiene instalado al PBP, "pasa de largo", lo mismo con el esquemático, puedes exportarlo en el ISIS a BMP o hacer un PDF que es mas "universal" su uso.

En cuanto a Proteus solo es un simulador y la realidad es otra cosa que no coinciden en todos los casos al 100%.

Hay que ver que hiciste tu como PCB real o montaje, etc.

Saludos.

Ric.
 

Adjuntos

#18
hamito, gracias por el esquema en modo visible.
No uso isis y por eso no lo había podido ver.



¿Que fuente usas?
¿Como está montado?
¿Están bien los fuses y todas esas cosas?
¿Que parte funciona y que parte no?
 
#19
Bueno doy gracias a todos por sus respuestas y aportes.
El contador es simlple. al iniciar la tarjeta me permite elegir si voy directamente a contar con start o entrar a configurar un numero a comparar para que suene una chicharra, la cuenta se da a travez de Portb.0 de forma manual.
* estoy sospechando de los fuses, que fuses deberia elegir? ya que trabajo con win7 , 64bits y no me permite @ divise, me sale error, mi grabador es el pickit2.
* o tambien sospecho de una resistencia de 220 ohm que le eh puesto a rb3 para encender un led de inicio del programa.
Gracias por su ayuda.
ya lo tengo en plaquita. enviare una imagen.
 

Adjuntos

#20
El detalle que veo dentro de la interrupción es que solo tienes que borrar por software la bandera del bit 1 del intcon:
Código:
DISABLE ;deshabilita las interrupciones en el handler
verde:
cuenta =cuenta +1
if cuenta = numero then
high chicha
endif

if cuenta> numero then
low chicha
endif
;INTCON = %10010000 ;habilita la interrupción B.0 <cambiar esto
INTCON.1 = 0 ;borrar bandera de interrupcion por rb0 ;<por esto
RESUME ;retorna a programa principal donde ocurrió la inte.
ENABLE ;Habilita las interrupciones después del handler
 

Adjuntos

Temas similares

Arriba