Hola que tal, estoy diseñando un control de acceso que estoy ya casi por terminar, aqui una imagen de proteus
y aqui esta mi codigo
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??
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??