Gracias por todo, ya quite la escritura de la eeprom, mas tarde se la agregare, pero ya solo por si se desconecta el pic, pero ahora me tope con un problema un poco mas complicado, al menos para mi, este proyecto lo dividimos en 2 partes y un compañero hizo lo otro que es poner un código con un teclado matricial y al poner ese código, ya puedes entrar a ver y modificar los pasajeros, todo lo de la contraseña y el teclado funciona perfectamente, pero el problema es que una vez que el pin donde esta el sensor que ahora es el e0, al ser utilizado aunque sea 1 vez, ya se queda bloqueado todo el programa no puede iniciarse, pero si pongo el programa y le doy al pin e1 inicia lo de la contraseña la pongo y puedo ver datos, pero al presionar el botón del sensor el programa se bloquea, que puede estar pasando, tiene que ver con la interrupción del timer 1? Muchas gracias
#include <16F877A.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(clock=4000000)
#define LCD_DB4 PIN_D4
#define LCD_DB5 PIN_D5
#define LCD_DB6 PIN_D6
#define LCD_DB7 PIN_D7
#define LCD_RS PIN_D2
#define LCD_E PIN_D3
#include<lcd1.c> //libreria manejo lcd
#include<KBD1.c>
#rom 0x2100={'2','6','1','2'} // escribir en la memoria eeprom
#define use_portb_kbd TRUE
//---------------variables----------------------------------------------------//
LONG personas = 0,personas1=0, pasajeros=0;
short alarma=0, inicio;
int vuelta;
int a;
int i;
int j=0; // contador
char k; // lectura del teclado
char dato[4],clave[4]; //dato: almacena los digitos, clave: es la contraseña
int ingresos;
//----------------Fin variables-----------------------------------------------//
#int_TIMER1
void TIMER1_isr(void)
{
vuelta++; /// aumenta la vuelta cada .5 seg
set_timer1(3036);
clear_interrupt(int_timer1); // limpio flag
if(vuelta==60) //si la vuelta da 60, en segundos 30,
{alarma=1;} //se activa la alarma porque el sensor esta siendo tapado
}
void todo (void){
while(1){
//------------------------lcd----------------------------------------------//
lcd_gotoxy(1,1);
printf (lcd_putc,"Sensor:%lu ",personas);
lcd_gotoxy(1,2);
printf (lcd_putc,"Pasa:%lu A:%u %lu ",pasajeros,alarma,personas1);
//-----------------------lcd fin--------------------------------------------//
pasajeros = personas / 2;
personas1=read_eeprom(01);
//---------------este deberia ser 0, es para el apagado de emergencia--------//
if (input(pin_e1)) // Si esta en 1 entra
{ write_eeprom(01,personas);
delay_ms(200);}
//---------------------------------------fin----------------------------------//
if(input(pin_e2)){
alarma = 0;
personas= 0;
pasajeros = 0;
}
}
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER1);
while(1){
lcd_init ();
kbd_init();
port_b_pullups(TRUE);
if (input(pin_e0)) //El sensor detecto algo
{
set_timer1(3036); // Cargo el timer con el valor correspondiente, limpio flags y activo su interrupcion
clear_interrupt(int_timer1);
enable_interrupts(INT_TIMER1);
while(input(pin_b0)); // Mientras este atrapado en este bucle, es decir mientras no se suelte el sensor va a estar atrapado aca y va a funcionar la interrupcion
personas++; // Si se solto cuento como que atravezo una persona, vera si luego cuando se activa la alarma si cuenta exactametne como persona o no.
}
else
{
disable_interrupts(INT_TIMER1); // Se solto el boton? entonces deshabilito las interrupciones del TIMER1 ya que no las necesito mas
vuelta=0; // Y Pongo a 0 mi variable vueltas por si llega a ocurrir de nuevo y quiero que comienze de 0
}
if (input(pin_e1))
{inicio=1;}
if(inicio==1)
{
//-----------------------clave-----------------------------------------------
printf(LCD_putc, "\f");
lcd_putc("\fINGRESE SU CLAVE ");
i=0;
while(i<4){
k=kbd_getc(); // leer la tecla presiono
if(k!=0){
dato[i]=k;
i++;
lcd_gotoxy(i,2); // posicion i de la segunda linea
lcd_putc('*');
}
}
for(i=0;i<4;i++)
clave[i]=read_eeprom(i); //guarda la constraseña en el vector clave
if( dato[0]==clave[0] && dato[1]==clave[1] && dato[2]==clave[2] && dato[3]==clave[3])
{
lcd_gotoxy(1,1);
printf (lcd_putc,"\fClave correcta");
lcd_gotoxy(1,2);
printf (lcd_putc,"Adelante!");
ingresos = ingresos +1;
delay_ms(200);
lcd_gotoxy(1,1);
printf (lcd_putc,"\fHas entrado %u",ingresos);
lcd_gotoxy(1,2);
printf (lcd_putc,"veces");
delay_ms(500);
todo ();
}
else{
lcd_putc("\fClave incorrecta ");
lcd_putc("\n ");
j++;
if(j==3){
lcd_putc("\fTecladoBloqueado ");
lcd_putc("\n ");
delay_ms(60000);
j=0;
}
delay_ms(2000);
}
//---------------clave fin------------------------------------------------------
}
}
}