Tengo este código:
Codigo:
void menu_modo(void)
{
lcd_putc("f");
lcd_gotoxy(1,1);
lcd_putc("Restaurar Valores?");
lcd_gotoxy(1,2);
lcd_putc("0 SI");
lcd_gotoxy(1,3);
lcd_putc("1 NO");
lcd_gotoxy(1,4);
lcd_putc("OPCION :");
for(i=0;i!=255;i++)
{
delay_ms(20);
restart_wdt();
lcd_gotoxy(10,4);
printf(lcd_putc,"%u",opc);
if(!t_mas){i=0; delay_ms(100); opc++; if(opc>1){opc=0;};}
else if(!t_mns){i=0; delay_ms(100); opc--; if(opc==255){opc=1;};}
else if(!t_ok){delay_ms(100); break;}
};
intf=0; intf1=0; intf2=0;
if(opc==0){lcd_putc("f"); break;}
else if(opc==1){menu_ajustes();}
}
Y este esquema para los pulsadores:
http://www.pablin.com.ar/electron/proyecto/turnero/
Os pongo este como ejemplo que es igual que el mio, es el de la R de 1K, NO el de 10+.
Bien, pues el resultado en el LCD es que es una cuenta ascendente continua de 0 a 1, y vuelta a 0, sin parar.... el problema es eso, q no está fijo :P ... y no se el pq :S
Gracias por adelantado! ;)
pd: en el proteus va perfecto :S, he comprobado que le llegan 5V al pic, con el pulsador en estado normal, y que efectivamente se va a 0V cuando se pulsa... he probado a cambiar la sentencia:
if(!t_mas)
por
if(t_mas==0)
q es lo mismo, y efectivamente, es lo mismo... sigue igual! jaja... alguna idea???
gracias! ;)
No lo entiendo!, definitivamente no lo entiendo!, he modificado lo anterior de la siguiente forma:
Codigo:
void menu_modo(void)
{
lcd_putc("f");
lcd_gotoxy(1,1);
lcd_putc("Restaurar Valores?");
lcd_gotoxy(1,2);
lcd_putc("0 SI");
lcd_gotoxy(1,3);
lcd_putc("1 NO");
lcd_gotoxy(1,4);
lcd_putc("OPCION :");
for(i=0;i!=255;i++)
{
delay_ms(20);
restart_wdt();
lcd_gotoxy(10,4);
printf(lcd_putc,"%u",opc);
if(!t_ok){delay_ms(100); break;}
else if(t_mas==0){i=0; delay_ms(100); opc++; if(opc>1){opc=0;};}
// else if(!t_mns){i=0; delay_ms(100); opc--; if(opc==255){opc=1;};}
};
intf=0; intf1=0; intf2=0;
if(opc==0){lcd_putc("f"); break;}
else if(opc==1){menu_ajustes();}
}
Comentar que el bucle for es un timeout, en el caso de que no se toke ningún boton durante 5 segundos se sale del menu, bien dicho esto, he omitido el pulsador t_mns, dejando solo el t_mas ... y parece que sigue teniendo el problema, por lo que el fallo está es esta linea:
else if(t_mas==0){i=0; delay_ms(100); opc++; if(opc>1){opc=0;};}
q es lo mismo que esto:
else if(!t_mas){i=0; delay_ms(100); opc++; if(opc>1){opc=0;};}
Bien lo que pretendo hacer es:
Cuando se pulse la tecla MAS (su estado pasa de 5V a 0V) en este momento tenemos 0V en la pata RB1 del 18F2520...
Codigo:
#byte pb =0xF81
#bit t_ok =pb.0 // RB0, pin21
#bit t_mas =pb.1 // RB1, pin22
#bit t_mns =pb.2 // RB2, pin23
En ese momento, hacemos lo que está dentro del bucle, es decir, i=0,delay...etc
Lo que falla es eso, que no lo hace cuando tiene 0V a la entrada, sino los 5V ... si cambio la acción del pulsador, i hago t_mas==1, entonces no hace nada de nada, tanto si activo como si no activo el pulsador.....
q falla?? creo q no es del código, sino alguna configuración del pic, las pull ups internas?? no entiendo nada! ...
:8}
Salu2!
:z):-( debe ser una tonteria pero no lo veo! no me puedo creer que lleve toda la tarde y esto sigue igual, he puesto esto dentro del bucle
Codigo:
delay_ms(20);
restart_wdt();
lcd_gotoxy(10,4);
printf(lcd_putc,"%u",opc);
tmas = input(t_mas);
tmns = input(t_mns);
tok = input(t_ok);
if(tmas==0){i=0; delay_ms(100); opc++; if(opc>1) opc=0;}
if(tmns==0){i=0; delay_ms(100); opc--; if(opc==255) opc=1;}
if(tok==0){delay_ms(100); break;}
printf(lcd_putc," %u %u %u",tok,tmas,tmns);
Sigue siendo todo hacer lo mismo que ya tenía... el ultimo printf me da estos valores
1 0 0
y no entiendo esos dos ceros, ya que a la entrada tiene 5V!!!!, por eso se vuelve loco, el caso es que no veo donde puede estar el fallo... este es el inicio de mi programa principal hasta la llamada a la función.. a ver si localizais ahi algun fallo :S
Codigo:
#include <18F2520.h>
#use delay(clock=4000000)
#include <lcd20x4.h>
#fuses XT,NOPROTECT,NOLVP,NOWDT
#define t_ok PIN_B0
#define t_mas PIN_B1
#define t_mns PIN_B2
void main()
{
lcd_init(); //inicializacion del lcd
menu_modo();
Alguna ayudita?? GRACIAS! ;)
Lo del wdt es pq he estado haciendo pruebas con el código y en el proteus si deshabilito el wdt no funciona, en fin, q solo eran pruebas :P
Por otro lado he encontrado el error, ahora que no entiendo su porque, para ello he utilizado este código:
Codigo:
#include <18F2520.h>
#use delay(clock=4000000)
#include <lcd20x4.h>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, NOPBADEN
#use fast_io(B)
void main()
{
int tecla;
set_tris_b(0x07);
port_b_pullups(TRUE);
lcd_init();
while(1){
tecla = input(PIN_B1);
if(tecla==0)
{
lcd_putc("f"
;
lcd_putc("tecla pulsada"
;
}
else
{
lcd_putc("f"
;
lcd_putc("tecla NO pulsada"
;
}
}
}
Pues bien, el resultado esq pulse o no la tecla, siempre me aparece como tecla pulsada, por el contrario, si uso el PIN_B0, va como debería, lo mismo pasa con el B2 ... es decir, que o le sucede algo al PIC, o es problema del compilador, pq los pulsadores estan bien... a ver si saco donde está el problema... y si puedo solucionarlo.
Gracias por la ayuda! 
EDITO: he compilado con otra versión (anterior), y sigue el mismo problema, he probado con el 18F2550, metiendole el programa del 18F2520, y sigue igual, por lo q creo q, a menos que haya algo mal en el código, creo q no ya que en el simulador va bien, el fallo está en el software :S ... miraré el 18F2520.h a ver si veo algo raro.......... me da q no voi a ver nada! jeje... intentaré tb hacerlo con otro puerto, creo q tengo un par de patas libres en el puerto C ...
Salu2!