TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Thulsa Doom en 20 de Diciembre de 2011, 16:04:03
-
Hola a todos, resulta que estoy desarrollando un proyecto en ccs en el cual recorro un menú con dos pulsadores, pulsadormas que se supone que va de 0 a 5 y cuando llega a 5 se pone en 0 para repetir el proceso y pulsadormenos que va desde el 5 hasta el 0 y cuando llega a 0 pasa al 5.
Pues el pulsadormas no tengo problemas me funciona bien, el algoritmo es este:
int limitemas=5;
if(input(selectmas)==0){
delay_ms(20); //Un retraso para evitar rebotes del pulsador
swicht++; //Se incrementa la variable swicht
if(swicht > (limitemas-1)){ //Si la variable swicht es mayor que límitemas -1
swicht = 0; // se pone la variable swicht a 0
}
}y el pulsadormenos es:
int limitemenos=0;
if(input(selectmenos)==0){
delay_ms(20);
swicht--;
if(swicht < (limitemenos )){
swicht=5;
}
}
pero en el pulsadormenos es donde me viene los problemas, no consigo que me funcione bien, he probado muchas maneras sin éxito.
la variable int va de 0 a 255 y creo pensar que cuando la decremento y llega al 0, el siguiente decremento será 255 y por eso es por lo que no me funciona correctamente, a parte de eso, cuando la cuenta de pulsadormas va por 4 e intento pulsar pulsadormenos para bajar de 4 a 3 y así sucesivamente me da saltos raros no baja secuencialmente si no que pone el número que de la gana a veces.
¿Que estoy haciendo mal?.
¿se puede hacer esto de otra manera más eficiente y menos complicada?
saludos
-
No se si tendrá nada que ver, pero si se pulsa menos y switch es 0, después pasa a ser 255, lo raro es que después pulsando más, si por ejemplo tienes 253, marque el valor correcto.
-
hola
Pienso que podrias mejorar el antirrebote, porque aunque haces un delay no compruebas nuevamente el estado del pin y puede ser la causa de los valores aleatorios que dices.
Efectivamente si decrementas un int cuado esta en 0 el siguiente paso será 255
-
No se si tendrá nada que ver, pero si se pulsa menos y switch es 0, después pasa a ser 255, lo raro es que después pulsando más, si por ejemplo tienes 253, marque el valor correcto.
No marca el valor correcto.
me explico, si decremento y me paso del 0 y salta a 255, el programa no hace nada se queda esperando un valor que nunca llegará, pero si empiezo a incrementar con el +, tengo que apretarlo varias veces hasta subir del valor que quedo en el negativo hasta llegar a un valor que el programa reconozca, ejemplo.
si pulso el (-) hasta llegar a 250, luego para llegar a 0 tengo que ir pulsando el (+) e ir recortando hasta llegar por ejemplo al 1 y ahí el programa empieza a funcionar de nuevo
hola
Pienso que podrias mejorar el antirrebote, porque aunque haces un delay no compruebas nuevamente el estado del pin y puede ser la causa de los valores aleatorios que dices.
Efectivamente si decrementas un int cuado esta en 0 el siguiente paso será 255
¿y cómo podría mejorarlo?, ¿tienes algún ejemplo para parcticarlo?
-
if(swicht < (limitemenos )){
swicht=5;
}
si limitemenos = 0 esa condicion nunca se cumplira, en todo caso tendrias que poner limitemenos=1
-
lo he pobado como dices y nada no funciona
-
quitale los parentesis de (limitemenos ), y prueba cambiando delay_ms(20) por 100, si pones valores mas grandes podras ver mejor como actua el codigo a camara lenta.
-
Yo concuerdo con Jhozate, además de poner un delay, hay que volver a hacer el chequeo y si sigue estando en 0 la tecla pulsada es porque efectivamente se está presionando y allí es donde hay que actuar.
Sería algo así....
si pulsador == 0
{
retardo;
si pulsador == 0
{
hacer todo el proceso
}
}
-
Hola que tal pero creo que tu problema tiene que ver con la declaración de la variable recuerda una variable int son 16bits es decir que al decrementar el valor sera 65535,
no 255, a menos que un int se pueda promover a unsigned char.
cuando tu incrementas el valor o hay problema,pero si al decrementar.
Saludos
-
La variable int depende de la arquitectura que estas usando si tu pic es de 8 o 16 bits, porque no intentas usar algo como esto
int limitemenos=0;
if(input(selectmenos)==0){
delay_ms(20);
if(swicht == 0){
swicht=255;
goto end;
}
swicht--;
end:
}
-
Prueba así a ver que tal.
int limitemas=5;
if(input(selectmas)==0)
{
delay_ms(20); //Un retraso para evitar rebotes del pulsador
swicht++; //Se incrementa la variable swicht
if(swicht >= limitemas) //Si la variable swicht es mayor o igual que límitemas
{
swicht = 0; // se pone la variable swicht a 0
}
}
if(input(selectmenos)==0)
{
delay_ms(20);
swicht--;
if(swicht >= limitemas )
{
swicht=4;
}
}
A parte de mejorar los antirrebotes que te han comentado.
Saludos
-
Yo concuerdo con Jhozate, además de poner un delay, hay que volver a hacer el chequeo y si sigue estando en 0 la tecla pulsada es porque efectivamente se está presionando y allí es donde hay que actuar.
Sería algo así....
si pulsador == 0
{
retardo;
si pulsador == 0
{
hacer todo el proceso
}
}
Gracias, entendido el pseudocódigo
Bueno he conseguido hacerlo funcionar bien, creo que es la solución pero si a alguien que se le ocurre otra forma mejor......
// Declaraciones de Post-Procesado
#include <16f876a.h>
#FUSES xt,nowdt,noprotect
#USE delay(clock=4000000)
#define use_portb_lcd TRUE
#include <FLEX_LCD.C>
#use standard_io (A)
#use standard_io (B)
#use standard_io (C)
//****************************Definiciones de pines***********************
#define mas PIN_B4 //Interruptor mas
#define menos PIN_B5 //Interruptor menos
int pulsador=0;
#int_RB
void Pulsadores_B4_B7(){ //Función de interrupción
int limitepulsador=9; //Variable límite para los pulsadores
if(input(mas)==0){ //si está pulsado el puerto B4
delay_ms(20); //antirrebote
if(input(mas)==0){ //se comprueba de nuevo si está pulsado B4
pulsador++; //Incremento
if(pulsador > (limitepulsador-1)){ //Si la variable pulsador es mayor que (9-1)=8
pulsador = 0; //pone la variable pulsador a 0
}
}
}
if(input(menos)==0){ //Si se pulsa B5
delay_ms(20); //Retraso antirrebote
if(input(menos)==0){ //Se comprueba que todavía sigue pulsado el B5
pulsador--; //si es así se decrementa la variable pulsador
if(pulsador > limitepulsador ){ //hasta que la variable pulsador supere el límite de 9
pulsador=8; //y pone la variable a 8
}
}
}
}
La manera de que he llegado es lo siguiente:
Int, va de 0 a 255, entonces si bajo de 0 me salta a 255 con lo cual éste número es mayor que el límite de 9, si lo incremento pues lo mismo llega un momento que supera el límite de 9
Con lo cual si la variable es mayor que el límite, hago que se cargue el límite máximo y listo