tengo un problema con el16f877a, creo que es mi prorama, sucede que cuando lo simulo en proteus me ejecuta todo el programa normal, pero cuando grabo el programa en el pic y lo ejecuto en mi protoboard no sucede nada, ya comprobe el pic y el grabador haciendo otro programita simple y me ejecuta normal en mi protoboard.Les dejo mi programita haber si alguien me ayuda.
*************
el programa consiste en un teclado 3X4, un LCD 2x16, una memoria eeprom y el PIC16F877a
al ingresar una clave de 4 digitos, si es correcta, graba una serie de datos en la eeprom, al ingreso de cada digito te muestra en el display.utilizo la interrupcion de timer para originar un calendario , esto me sirve para que cada vez que ingrese(acceda la clave) se guarde la fecha y hora en la eeprom.
*****************
#include <16F877a.H>
#fuses XT, NOWDT, NOPROTECT, NOLVP
#use delay(clock = 4000000)
#use i2c(master,sda=PIN_C4,scl=PIN_C3)
#define use_portb_kbd TRUE
#define use_portd_lcd true
#include <lcd.c>
#include <kbd.c>
#include <stdlib.h>
#use RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, BITS=8)
#rom 0x2100={'0','2','1','8','9','0','0','1','2','0','2','4','1','9','5','0','2','8','4','0','3','7','3','0','4','6','2','0','5','5','1','0'}
int Segundos=0;
int Year=14,Mes=9,Dia=04,Hora=18,Minuto=55;
int yeari,mesi,diai,horai,minutoi,c=0,d=0;
INT8 dato;
#define BISIESTO(year)(year%4 == 0)
#define EEPROM_ADDRESS long int
//timer///
#int_TIMER1
void TIMER1_isr(void)//Función de interrupción por desbordamiento TMR1
{
output_toggle(PIN_A3);
segundos++;
if(Segundos == 60) {Minuto++; Segundos=0;
if(Minuto == 60) {Hora++; Minuto=0;
if(Hora == 24) {Dia++; Hora=0;
if ( (Dia == 29 && Mes==2 && !BISIESTO(Year))
|| (Dia == 30 && Mes==2)
|| (Dia == 31 && (Mes==4 || Mes==6 || Mes==9 || Mes==11 ))
|| (Dia == 32)
) {Mes++;Dia=0;}
if(Mes == 13) {Year++; Mes=0;}
}}}
set_timer1(0x0BDC);//carga del TMR1
}
void write_ext_eeprom(long int address,BYTE data) //Escribir en la eeprom
{
short int status;
i2c_start();
i2c_write(0xA0);
i2c_write(address>>

;
i2c_write(address);
i2c_write(data);
i2c_stop();
i2c_start();
status=i2c_write(0xa0);
while(status==1)
{
i2c_start();
status=i2c_write(0xa0);
}
}
BYTE read_ext_eeprom(long int address)
{
BYTE data;
i2c_start();
i2c_write(0xA);
i2c_write(address>>11);
i2c_write(address);
i2c_start();
i2c_write(0xa1);
data=i2c_read(0);
i2c_stop();
return(data);
}
#int_RDA
void RDA_isr(){
EEPROM_ADDRESS address=0;;
char keypress=' ';
keypress=' ';
if(kbhit()){
Keypress=getc();
switch (keypress){
case 'I':
WRITE_EXT_EEPROM(0,0);
address=0;
DATO=0;
while(DATO<=254){
address++;
DATO=READ_EXT_EEPROM(address);
printf("%u",dato);
}
break;
case 'O':
WRITE_EXT_EEPROM(0,0);
address=0;
lcd_gotoxy(1,1);
printf(lcd_putc,"BORRANDO EEPROM");
lcd_gotoxy(1,2);
printf(lcd_putc,"PLEASE WAIT... ");
puts("BORRANDO EEPROM");
while (d<=128){
d++;
while(c<=254){
WRITE_EXT_EEPROM(address,255);
address++;
c++;
}
c=0;
}
hora = hora+1;
lcd_gotoxy(1,1);
Printf(lcd_putc," ");
lcd_gotoxy(1,2);
Printf(lcd_putc,"INGRESE PASSWORD");
puts("EEPROM BORRADA");
break;
}
}
}
//***** Programa Principal *****//
void main()
{
char k;
int i,a=3;
char data[4],clave[31]; //matrices para guardar clave y datos
lcd_init();
kbd_init();
port_b_pullups(TRUE);
output_low(PIN_A0);
output_low(PIN_A2);//led Verde =off
output_low(PIN_A1);//led rojo=on
inicio: setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//Setup timer: Reloj interno, preescaler= 8
enable_interrupts(INT_TIMER1);//Habilito interrupción particular del TIMER1
enable_interrupts(GLOBAL);//Habilito interrupciones globales
enable_interrupts(INT_RDA);
set_timer1(0x0BDC);//Carga del TMR1
while(TRUE){
i=0;//posicion de la matriz
lcd_gotoxy(1,2);
Printf(lcd_putc,"INGRESE PASSWORD");//primer dato
while(i<=3)
{ //para cuatro datos
k=kbd_getc();//lee el teclado
if(k!=0)//si se ha pulsado alguna tecla
{
data
=k;//se guarda en la posicion correspondiente
i++;
lcd_gotoxy(i+1,1);
printf(lcd_putc,"*");//siguiente dato
output_high(PIN_A0);
delay_ms(50);
Output_low(PIN_A0);
delay_ms(300);
}
}
for(i=0;i<=31;i++)
{
//pasa datos de eeprom a la matriz clave
clave=read_eeprom(i);
}
if((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2])&&(data[3]==clave[3]))//clave 1
{
lcd_gotoxy(1,1);
printf(lcd_putc,"\fBIENVENIDO");//compara los datos con la clave
lcd_gotoxy(1,2);
printf(lcd_putc,"J. PRUDENCIO");
WRITE_EXT_EEPROM(a,101);
a++;
goto activa;
}
if((data[0]==clave[4])&&(data[1]==clave[5])&&(data[2]==clave[6])&&(data[3]==clave[7]))//Clave 2
//compara digito a digito los valores almacenados en la eeprom y la clave introducida
{
lcd_gotoxy(1,1);
printf(lcd_putc,"\fBIENVENIDO");
lcd_gotoxy(1,2);
printf(lcd_putc,"J. FIGUEROA");
WRITE_EXT_EEPROM(a,102);
a++;
goto activa;
}
if((data[0]==clave[8])&&(data[1]==clave[9])&&(data[2]==clave[10])&&(data[3]==clave[11])) // clave 3
{
lcd_gotoxy(1,1);
printf(lcd_putc,"\fBIENVENIDO");//compara los datos con la clave
lcd_gotoxy(1,2);
printf(lcd_putc,"J. TUESTA");
WRITE_EXT_EEPROM(a,103);
a++;
goto activa;
}
if((data[0]==clave[12])&&(data[1]==clave[13])&&(data[2]==clave[14])&&(data[3]==clave[15])) // clave 4
{
lcd_gotoxy(1,1);
printf(lcd_putc,"\fBIENVENIDO");//compara los datos con la clave
lcd_gotoxy(1,2);
printf(lcd_putc,"P. VENTURA");
WRITE_EXT_EEPROM(a,104);
a++;
goto activa;
}
if((data[0]==clave[16])&&(data[1]==clave[17])&&(data[2]==clave[18])&&(data[3]==clave[19])) // clave 5
{
lcd_gotoxy(1,1);
printf(lcd_putc,"\fBIENVENIDO");//compara los datos con la clave
lcd_gotoxy(1,2);
printf(lcd_putc,"R. AYALA");
WRITE_EXT_EEPROM(a,105);
a++;
WRITE_EXT_EEPROM(a,dia);
goto activa;
}
if((data[0]==clave[20])&&(data[1]==clave[21])&&(data[2]==clave[22])&&(data[3]==clave[23])) // clave 6
{
lcd_gotoxy(1,1);
printf(lcd_putc,"\fBIENVENIDO");//compara los datos con la clave
lcd_gotoxy(1,2);
printf(lcd_putc,"R. MOYA");
WRITE_EXT_EEPROM(a,106);
a++;
goto activa;
}
if((data[0]==clave[24])&&(data[1]==clave[25])&&(data[2]==clave[26])&&(data[3]==clave[27])) // clave 7
{
lcd_gotoxy(1,1);
printf(lcd_putc,"\fBIENVENIDO");//compara los datos con la clave
lcd_gotoxy(1,2);
printf(lcd_putc,"H. LEON");
WRITE_EXT_EEPROM(a,107);
a++;
goto activa;
}
if((data[0]==clave[28])&&(data[1]==clave[29])&&(data[2]==clave[30])&&(data[3]==clave[31])) // clave 8
{
lcd_gotoxy(1,1);
printf(lcd_putc,"\fBIENVENIDO");//compara los datos con la clave
lcd_gotoxy(1,2);
printf(lcd_putc,"W. GARCIA");
WRITE_EXT_EEPROM(a,108);
a++;
goto activa;
}
else{
lcd_gotoxy(1,1);
printf(lcd_putc,"\PASSWORD ERROR");//clave erronea
delay_ms(400);
output_low(PIN_A0);
delay_ms(100);
output_high(PIN_A0);
delay_ms(100);
output_low(PIN_A0);
delay_ms(100);
output_high(PIN_A0);
delay_ms(100);
output_low(PIN_A0);
}
lcd_gotoxy(1,1);
delay_ms(100);
printf(lcd_putc," ");
lcd_gotoxy(1,2);
printf(lcd_putc," ");
}
activa:
output_high(PIN_A0);
delay_ms(300);
output_low(PIN_A0);
delay_ms(50);
output_high(PIN_A0);
delay_ms(30);
output_low(PIN_A0);
delay_ms(200);
output_high(PIN_A1);//led rojo Off
output_high(PIN_A2); // led verde =on
delay_ms(2000);
output_low(PIN_A1);//cierra la cerradura con pulso al relé
output_low(PIN_A2);//led verde =off
diai=100 + dia;
WRITE_EXT_EEPROM(a,diai);
mesi = 100 + mes;
a++;
WRITE_EXT_EEPROM(a,mesi);
yeari = 100+year;
a++;
WRITE_EXT_EEPROM(a,yeari);
a++;
horai = 100+hora;
WRITE_EXT_EEPROM(a,horai);
a++;
minutoi=minuto + 100;
WRITE_EXT_EEPROM(a,Minutoi);
a++;
lcd_gotoxy(1,1);
printf(lcd_putc," ");
lcd_gotoxy(1,2);
printf(lcd_putc," ");
goto inicio;
}
*************************************