Mi programa no respeta la funcion declarada

Hola que tal, estoy diseñando un control de acceso que estoy ya casi por terminar, aqui una imagen de proteus

c26j5.png


y aqui esta mi codigo

Código:
#INCLUDE <16F887.H>
#USE DELAY (CLOCK = 4M)
#INCLUDE <LCD2.C>
#FUSES INTRC_IO,NOWDT,NOPUT,NOMCLR,NOPROTECT,NOCPD,NOBROWNOUT,BROWNOUT_NOSL,NOIESO,NOFCMEN,NOLVP,NODEBUG,BORV40
#BYTE PORTA = 0X05
#BYTE TRISA = 0X85
#BYTE PORTB = 0X06
#BYTE TRISB = 0X86
#BYTE PORTC = 0X07
#BYTE TRISC = 0X87
#BYTE PORTD = 0X08
#BYTE TRISD = 0X88
BYTE CONST BARRIDO[4] = {0XF7,0XFB,0XFD,0XFE};
BYTE CONST BARRIDO2[13] = {0X09,0X0C,0X06,0X03,0x09,0X0C,0X06,0X03,0x09,0x0C,0X06,0X03,0x09};

////////////////////////////////////////////////////////////////////////////////
INT SECUENCIA()  //Esta es la secuencia del motor que quiero que se de cuando acierte la contraseña
{
   TRISD=0X00;
   PORTD=0X00;
   signed INT I=0;
   INT COUNTER=0;
   
   FOR( ; ; )
   {
   IF(COUNTER < 4)
   {
   FOR(I=0;I<13;I++)
         {
         PORTD = BARRIDO2[I];
         DELAY_MS(100);
         COUNTER++;
         }
   }
   ELSE
   {
   DELAY_MS(5000);
   FOR(I=13;I>0;I--)
         {
         PORTD = BARRIDO2[I];
         DELAY_MS(100);
         COUNTER--;
         }
   }
   }
}
////////////////////////////////////////////////////////////////////////////////

INT TECLADO ()
{
INT CONT,I,DEC;
DO
{
CONT=0;
FOR(I=0;I<=3;I++)
{
PORTB=BARRIDO[I];
IF(BIT_TEST(PORTB,4) != 1)
{
WHILE(BIT_TEST(PORTB,4) != 1){}
BREAK;
}
CONT=CONT+1;
IF(BIT_TEST(PORTB,5) != 1)
{
WHILE(BIT_TEST(PORTB,5) != 1){}
BREAK;
}
CONT=CONT+1;
IF(BIT_TEST(PORTB,6) != 1)
{
WHILE(BIT_TEST(PORTB,6) != 1){}
BREAK;
}
CONT=CONT+1;
IF(BIT_TEST(PORTB,7) != 1)
{
WHILE(BIT_TEST(PORTB,7) != 1){}
BREAK;
}
CONT=CONT+1;
DELAY_MS(10);
}
}
WHILE(CONT == 16 );
SWITCH(CONT)
{
CASE 0:
DEC=1;
BREAK;
CASE 1:
DEC=4;
BREAK;
CASE 2:
DEC=7;
BREAK;
CASE 3:
DEC=15;
BREAK;
CASE 4:
DEC=2;
BREAK;
CASE 5:
DEC=5;
BREAK;
CASE 6:
DEC=8;
BREAK;
CASE 7:
DEC=0;
BREAK;
CASE 8:
DEC=3;
BREAK;
CASE 9:
DEC=6;
BREAK;
CASE 10:
DEC=9;
BREAK;
CASE 11:
DEC=14;
BREAK;
CASE 12:
DEC=10;
BREAK;
CASE 13:
DEC=11;
BREAK;
CASE 14:
DEC=12;
BREAK;
CASE 15:
DEC=13;
BREAK;
DEFAULT:
BREAK;
}
RETURN DEC;
}
////////////////////////////////////////////////////////////////////////////////
VOID MAIN ()
{
//WRITE_EEPROM(6,0);
INT CONT=0,I,FLAG,FLAG1=0,CONT1,ERROR=0;
INT PASSWORD[6];
LCD_INIT();
TRISB = 0XF0;
TRISA = 0X00;
TRISD = 0X00;
PORTD = 0X00;
BIT_CLEAR(PORTA,0);
FLAG=READ_EEPROM(6);
////////////////////////////////////////////////////////////////////////////////
IF(FLAG!=1)
{
DO
{
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"  NEW PASSWORD  ");
FOR(I=0;I<=5;I++)
{
CONT = TECLADO();
LCD_GOTOXY(I+1,2);
PRINTF(LCD_PUTC,"%1u               ",CONT);
PASSWORD[I]=CONT;
IF(I==5)
{
DELAY_MS(500);
}
}
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"\f**ARE YOU SURE? ");
CONT = TECLADO();
WHILE(CONT != 14 )
{
IF(CONT==15){BREAK;}
CONT = TECLADO();
}
}
WHILE(CONT == 14 );
////////////////////////////////////////////////////////////////////////////////
WRITE_EEPROM(6,1);
FOR(I=0;I<=5;I++)
{
LCD_GOTOXY((I+1)*2,2);
PRINTF(LCD_PUTC,">>>>>");
CONT=PASSWORD[I];
WRITE_EEPROM(I,CONT);
DELAY_MS(300);
}
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC," PASSWORD SAVED  ");
DELAY_MS(500);
}
////////////////////////////////////////////////////////////////////////////////
FOR( ; ; )
{ 
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"\fPRESS OK TO\nENTER PASSWORD");
DELAY_MS(3500);
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"\fPRESS CANCEL TO\nCHANGUE PASSWORD");
DELAY_MS(3500);
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"\fOK\nCANCEL");
CONT = TECLADO();

////////////////////////////////////////////////////////////////////////////////
WHILE(CONT == 15)
{
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"\f ENTER PASSWORD ");
FOR(I=0;I<=5;I++)
{
CONT = TECLADO();
PASSWORD[I]=CONT;
LCD_GOTOXY(I+1,2);
PRINTF(LCD_PUTC,"*");
}
FOR(I=0;I<=5;I++)
{
CONT=PASSWORD[I];
CONT1=READ_EEPROM(I);
IF(CONT != CONT1){FLAG1=1;}
}
IF(FLAG1==1)
{
ERROR++;
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"\f PASSWORD ERROR!  ");
DELAY_MS(1000);
LCD_GOTOXY(1,2);
PRINTF(LCD_PUTC,"TRY AGAIN...  %1u",ERROR);
DELAY_MS(1000);
FLAG1=0;
IF(ERROR==3)
{
BIT_SET(PORTA,0);
DELAY_MS(10000);
ERROR=0;
}
BIT_CLEAR(PORTA,0);
}
ELSE
{
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"\fPASWORD CORRECT!");
DELAY_MS(1000);
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"\fOPENING DOOR");
DELAY_MS(1000);
SECUENCIA();
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//EN ESTA SECCION ES CUANDO SE ACIERTA LA CONTRASEÑA Y CUANDO DEBERIA HACER LA SECUENCIA DEL MOTOR!
////////////////////////////////////////////////////////////////////////////////////////////////////////////



}
}
////////////////////////////////////////////////////////////////////////////////
WHILE(CONT == 14)
{
DO
{
FLAG1=0;
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"\f ENTER PASSWORD ");
FOR(I=0;I<=5;I++)
{
CONT = TECLADO();
PASSWORD[I]=CONT;
LCD_GOTOXY(I+1,2);
PRINTF(LCD_PUTC,"*");
}
FOR(I=0;I<=5;I++)
{
CONT=PASSWORD[I];
CONT1=READ_EEPROM(I);
IF(CONT != CONT1)
{
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"\fTRY AGAIN... ");
DELAY_MS(100);
FLAG1=1;
}
}
}
WHILE(FLAG1 == 1);
DO
{
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"\f  NEW PASSWORD  ");
FOR(I=0;I<=5;I++)
{
CONT = TECLADO();
LCD_GOTOXY(I+1,2);
PRINTF(LCD_PUTC,"%1u               ",CONT);
PASSWORD[I]=CONT;
IF(I==5)
{
DELAY_MS(500);
}
}
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC,"\f**ARE YOU SURE? ");
CONT = TECLADO();
WHILE(CONT != 14 )
{
IF(CONT==15){BREAK;}
CONT = TECLADO();
}
}
WHILE(CONT == 14 );
////////////////////////////////////////////////////////////////////////////////
WRITE_EEPROM(6,1);
FOR(I=0;I<=5;I++)
{
LCD_GOTOXY((I+1)*2,2);
PRINTF(LCD_PUTC,">>>>>");
CONT=PASSWORD[I];
WRITE_EEPROM(I,CONT);
DELAY_MS(300);
}
LCD_GOTOXY(1,1);
PRINTF(LCD_PUTC," PASSWORD SAVED  ");
DELAY_MS(500);
}
}
}

El programa del control de acceso casi esta terminado pero no se como hacer que se haga mi secuencia de motor a pasos, alguien que me diga porque no respeta la funcion "SECUENCIA"
que he puesto para que esto pase??
 
dices que no la respeta pero que es lo que hace? de momento veo que tienes un if counter < 4, y luego sumas a ese counter 13 con el for..., y luego en la siguiente vuelta, counter vale por lo menos 13, con lo que descuentas otros 13... y eso lo repites continuamente en un bucle infinito... ¿que tiene que hacer realmente el programa?

Un saludo
 
Atrás
Arriba