Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

01/07/2012 #1


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



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??
03/07/2012 #2


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
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.