Autor Tema: Apertura por código de una puerta  (Leído 2321 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado joss89

  • PIC10
  • *
  • Mensajes: 2
Apertura por código de una puerta
« en: 15 de Junio de 2015, 21:33:21 »
Buena tarde.

Estoy intentando realizar un montaje sencillo de un programa para la apertura de la cerradura de una puerta mediante un código, ingresado de forma serial, sin embargo, por mi inexperiencia (es mi primera vez en el mundo de los PICs), no he logrado el resultado esperado.

El código que he estado haciendo, probandolo con Proteus, introduciendo el código de acceso incorrecto, el resultado si es el que deseo, pero introduzco el correcto, me indica de tambien que es codigo incorrecto.

Cualquier ayuda o sugerencia que puedan darme, lo agradecere.

Saludos.

El código en PICC es el siguiente:

Código: [Seleccionar]
#include <16f877.h>
#use delay (clock=4M)
#use RS232 (BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_D4, RCV=PIN_D5)

void main (){
      char input[4];
      int data = 0;
      int codigo = 123;
   printf ( "Introduce el código para abrir la puerta: \r" ); //Mensaje pidiendo el código
   gets(input);
   data = input;
   while(data != codigo){ //Se define la accion si dato no es igual al código
   printf( "Código incorrecto, intente de nuevo. \r" );
   printf ("%s\r", input);
   printf (data);
   gets(input);
   data = (input);
   }
   printf( "Código incorrecto, intente de nuevo. \r" );
   printf ("%s\r", input);
}  

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Apertura por código de una puerta
« Respuesta #1 en: 15 de Junio de 2015, 22:44:58 »
Creo que quedaria algo asi:

Código: C
  1. #include <16f877.h>
  2. #include string.h
  3.  
  4. #use delay (clock=4M)
  5. #use RS232 (BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_D4, RCV=PIN_D5)
  6.  
  7. void main (){
  8.       char input[4],i;
  9.       int codigo[4] = "123"; // Es un ASCII
  10.  
  11. while(true)
  12.   {
  13.         printf ( "Introduce el código para abrir la puerta: \r" ); //Mensaje pidiendo el código
  14.        
  15.         //Tomo datos
  16.  
  17.         gets(input);   
  18.  
  19.         // Tome todos los datos ahora compruebo
  20.        
  21.        
  22.         if (strcmp(input,codigo))
  23.         {
  24.                 printf( "Código correcto\r" );
  25.         }
  26.         else
  27.         {
  28.                 printf( "Código incorrecto, intente de nuevo. \r" );
  29.         }
  30.          
  31.   }
  32. }

Observa todos los cambios, lo que se transmite por la UART normalemtne es un caracter ASCII, asi que si recibis 3 caracteres '1','2','3' no es lo mismo que el numero 123(0x7B) ,  por ejemplo el 1 es 0x31 , asi que tendrias 3 valores 0x31,0x32 y 0x33
Basicamente es un string "123"

Podrias transformarlo en numero? por supuesto, pero para que complicarnos? :). Por eso en codigo lo escribi como "123"

Otros errores que tuviste:

   char input[4];
   data = input;

Si haces eso no estas copiando lo que tiene input a data... sino que estas copiando la direccion de donde se encuentra input[0] a data

En C Un string es una coleccion de caracteres con un caracter nulo al ultimo, son vectores. El caracter nulo es para indicarle a C que ahi termina.
Ej:

char codigo[4]= "123"

es lo mismo que

char codigo[4] = {'1','2','3','\0'}

Por otra parte tu programa no estaba en un bucle infinito asi que apenas fuera malo o bueno el resultado quedaria atrapado para siempre

el strcmp(input,codigo) lo que hace es verificar que sean iguales, observa que no le pongo[0] o lo que sea, ya que busco de pasarles las direcciones (punteros).. Una forma simple de eso seria algo asi:

(input[0] == codigo[0]) && (input[1] == codigo[1]) && (input[2] == codigo[2]) && (input[3] == codigo[3])

Es decir si todos son iguales da un 1, sino da un 0. ( obviamente la funcion es un poco mas compleja, ya que ambos tienen que tener el mismo largo, etc etc etc. Pero es para que le entiendas
Esa funcion se encuentra normalmente en string.h y pertenece a C.
« Última modificación: 15 de Junio de 2015, 22:48:05 por KILLERJC »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Apertura por código de una puerta
« Respuesta #2 en: 16 de Junio de 2015, 09:12:41 »
Hola killerjc

La función strcmp es al revés, cuando las cadenas son iguales te regresa un 0  ;-)
"Nada es imposible, no si puedes imaginarlo"

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Apertura por código de una puerta
« Respuesta #3 en: 16 de Junio de 2015, 13:19:40 »
Hola killerjc

La función strcmp es al revés, cuando las cadenas son iguales te regresa un 0  ;-)

Tenes razon.. xD es que me guie rapidamente de un ejemplo que hay en el manual de CCS

Código: C++
  1. printf("Password: ");
  2. gets(string);
  3. if(strcmp(string, password))
  4.     printf("OK");

Y supuse rapidamente que debia ser un 1.
Ademas recuerdo bien que habia puesto como si la logica fuera un 0 ( es decir el printf con el codigo correcto en el else ) se ve que lo hize por instinto pero luego mire el ejemplo y lo cambie.

Desconectado joss89

  • PIC10
  • *
  • Mensajes: 2
Re: Apertura por código de una puerta
« Respuesta #4 en: 16 de Junio de 2015, 18:25:59 »
Buen día.

Gracias por la ayuda que me brindaron y sobre todo, gracias a la explicacion brindada, ya que me es de mucha ayuda para poder ir conociendo más sobre este tema de los PICs.

Saludos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Apertura por código de una puerta
« Respuesta #5 en: 16 de Junio de 2015, 18:41:22 »
Mas que sobre PICs fue problemas de programacion, o sea fue un problema de no manejar bien C , esto cualquier tutorial de C puede servirte.

Lo que vas a renegar con los PICs o debes aprender del PIC es por ahi como funciona una interrupcion, o un modulo, los puertos que tenes, que eso esta todo en el datasheet. Y como veo que usas CCS entonces por ahi tambien es conveniente que tengas a mano el manual de CCS ( busca en google "CCS manual" ) esta en ingles pero creo que esta bastante basico.


 

anything