TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: clements3rd en 27 de Octubre de 2008, 02:16:05

Título: Cerradura Digital con PIC16F84
Publicado por: clements3rd en 27 de Octubre de 2008, 02:16:05
Hola a todos! Que tal?

Me han mandado un proyecto en clases y espero no abusar de sus conocimientos. Tengo una parte resuelta pero hay otra que me esta dando dolores decabeza. Primero les colocare el enunciado aca:

* La clave será ingresada mediante un teclado numérico de 4x3. Dicha clave debe ser de 4 dígitos.
* Las claves registradas deben almacenarse en la memoria EEPROM del micro.
* Administrar la memoria de la mejor manera para guardar la mayor cantidad de usuarios posibles.
* Solamente el administrador puede agregar y eliminar claves de usuarios.
* Se utilizará la tecla * para empezar a digitar la clave de acceso de un usuario nuevamente, esto en caso de que crea que se equivoco en un numero.
* Se utilizará la tecla # luego de que un usuario marque los 4 dígitos de la clave para verificar si está registrado. De ser así, se abrirá la puerta permitiéndole el acceso al otro ambiente, la cual se simulará activando por 2 segundos un Relé conectado al pin RA2.
* Mediante el pin RB0 (Usando Interrupción) se simulará el sensor que indicará si fue violentada la puerta. Dicho sensor debe estar en modo Normalmente Cerrado.
* Si el la puerta fue violentada, debe activarse una alarma sonora conectada al pin RA1, la cual solamente se desactivara si se introduce una clave valida.

Ahora, la parte que me tiene un poco loco es la siguiente:
Citar
* Administrar la memoria de la mejor manera para guardar la mayor cantidad de usuarios posibles.

Esto quiere decir que:
*Tengo 64bytes en la EEPROM, si guardo cada digito de la clave en un byte cada uno, puedo tener un maximo de 16 usuarios, ya que 64/4=16
*Pero si guardo 2 digitos en un byte, puedo tener 4 los 4 digitos en 2 bytes, lo que me daria un maximo de 32 usuarios. Esto es lo que quiero lograr.

Deberia hacer un swap en un registro entre los 2 primeros digitos y entre los 2 segundos, y guardarlos en un byte de la eeprom cada registro "swapeado", para asi solamente ocupar 2 bytes.

No se si me entienden bien, a lo mejor sea un poco confuso todo esto.

Luego de esto pues hay que saber como acceder entre usuarios, para grabar y leer. Supongo que a traves de alguna tabla.

Espero que puedan ayudarme, ya que creo que se nota que estoy un poco enredado con esto :D
Título: Re: Cerradura Digital con PIC16F84
Publicado por: MGLSOFT en 27 de Octubre de 2008, 08:40:15
Un Byte puede guardar un valor decimal desde 0 hasta 255.
Como podrias guardar en un solo Byte un numero como 9999 sin truncarlo??
No hay forma que lo hagas, deberas guardarlo en dos bytes, por ejemplo parte alta y parte baja, en ese caso guardarias 99 en ambos bytes.


se entiende??

UPPS!! lei mal, mil disculpas....
Para guardar dos digitos en un solo byte, podrias hacerlo con swap y mascaras de bits, de forma de copiar un numero dentro de otro.
Para extraerlo despues, se hace a la inversa. :)
Título: Re: Cerradura Digital con PIC16F84
Publicado por: clements3rd en 27 de Octubre de 2008, 12:54:15
Hola MGLSOFT! Que tal?

Gracias por tu respuesta.

Bueno, lo del swap se hacerlo. Ahora me preguntaba si podria ser de esta manera (pondre un ejemplo)

Para escritura:
Tengo un Numero A, Ejemplo 0000 0011
y un Numero B, Ejemplo 0000 0101

Guardaria primero el numero A en un registro X y el B en un registro Y. Hago un swap en el regisro Y y por medio de una "OR?" entre X e Y lograria tener en un solo byte los 2 numeros, estoy en lo correcto?

Ahora, para el proceso a la inversa, en este caso para leer, haria lo mismo al contrario pero con una "AND?"

En cuanto a lo que me dices de las mascaras de bits si no se mucho, podria darme unaidea de como funcionan?

Un saludo y gracias nuevamente.
Título: Re: Cerradura Digital con PIC16F84
Publicado por: jacrmr en 27 de Octubre de 2008, 13:05:45
Es exactamente como mencionas. Las máscaras de bits es precisamente lo que vas a hacer. Vas a enmascarar digamos con b'00001111' haciendo un iorwf por ejemplo y tus bits D0 a D3 se pondrán a 1, conservando el valor anterior en tus bits D4 a D7. Haciendo un andwf por ejemplo con la misma máscara de bits, tus bits D0 a D3 se conservarán con su valor anterior, pero pondrás a cero los bits D4 a D7.
Título: Re: Cerradura Digital con PIC16F84
Publicado por: clements3rd en 27 de Octubre de 2008, 13:16:55
Hola jacrmr Que tal?
Citar
jacrmr dijo:
Es exactamente como mencionas. Las máscaras de bits es precisamente lo que vas a hacer. Vas a enmascarar digamos con b'00001111' haciendo un iorwf por ejemplo y tus bits D0 a D3 se pondrán a 1, conservando el valor anterior en tus bits D4 a D7. Haciendo un andwf por ejemplo con la misma máscara de bits, tus bits D0 a D3 se conservarán con su valor anterior, pero pondrás a cero los bits D4 a D7.

Entiendo, entiendo. Entonces es un valor que me sirve para ambos propositos.

Entonces creo que esta parte la tengo mucho mas clara, gracias por sus respuestas.

Ahora, como hago para "decirle al sistema" en que localidad de la eeprom grabar a un usuario si quiero hacerlo por orden? de igual manera para leer el dato.

y como asignarle a cada usuario 2 localidades de la eeprom?

No pido codigos, solo pido ideas que me ayuden a desarrollar esto  :mrgreen:

Saludos!
Título: Re: Cerradura Digital con PIC16F84
Publicado por: jacrmr en 27 de Octubre de 2008, 13:21:46
Tendrás que asignar un byte de la eeprom como "índice" en donde conservarás el número de usuario (o dirección de la eeprom) ya sea del último usuario o del usuario siguiente, para que este valor se conserve siempre y no sobreescribas sobre los usuarios ya "registrados".
Título: Re: Cerradura Digital con PIC16F84
Publicado por: clements3rd en 27 de Octubre de 2008, 13:28:37
Tendrás que asignar un byte de la eeprom como "índice" en donde conservarás el número de usuario (o dirección de la eeprom) ya sea del último usuario o del usuario siguiente, para que este valor se conserve siempre y no sobreescribas sobre los usuarios ya "registrados".

Indice... a ver... esto podria hacerlo a traves del uso de tablas?
Título: Re: Cerradura Digital con PIC16F84
Publicado por: jacrmr en 27 de Octubre de 2008, 13:45:37
No necesitas tablas para ello. Simplemente es un valor en el que llevarás la cuenta del siguiente usuario (o el último), o su dirección en la eeprom.
Título: Re: Cerradura Digital con PIC16F84
Publicado por: clements3rd en 27 de Octubre de 2008, 14:04:48
Vale...

Dejame ver que se me ocurre y cualquier cosa sigo preguntando  :D

Cuando tenga algo un poco mas avanzado voy pegando codigos por aqui
Título: Re: Cerradura Digital con PIC16F84
Publicado por: MGLSOFT en 27 de Octubre de 2008, 16:36:56
Puedes utilizar un solo indice para los usuarios y los datos en EEPROM.
Por ejemplo:
Usuario con indice 0
Indice en EEPROM = indice usuario x 2

Guarda/extrae datos de posicion 0 y 1 de EEPROM


Ejemplo con otro indice:
Usuario con indice 8
Indice en EEPROM = indice usuario x 2

Guarda/extrae datos de posicion 16 y 17 de EEPROM


Te recuerdo que multiplicar por 2 es facil en assembler, solo es un desplazamiento a la izquierda. :mrgreen:
Título: Re: Cerradura Digital con PIC16F84
Publicado por: jeremylf en 27 de Octubre de 2008, 21:35:00
Hola, hace poco agrege eso a mi proyecto actual, espero te sirva:

Para leer:
Código: [Seleccionar]
      for (usuar = 0; usuar < 4; usuar++)
      {
         for (clav = 0; clav < 4; clav += 2)
         {
            clave[usuar][clav] = read_ext_eeprom((DG_CLAVES + (usuar * 2)) + (clav / 2));
            clave[usuar][clav + 1] = clave[usuar][clav] & 0b00001111;
            clave[usuar][clav] >>= 4;
         }
         
         //printf("\r\n*Clave usuario #%u: %u - %u - %u - %u", usuar + 1, clave[usuar][0], clave[usuar][1], clave[usuar][2], clave[usuar][3]);
      }

Para guardar:
Código: [Seleccionar]
write_ext_eeprom(DG_CLAVES, (CLAVE_U1_1_D << 4) + CLAVE_U1_2_D);         //Clave 1 y 2 de un usuario.
write_ext_eeprom(DG_CLAVES + 1, (CLAVE_U1_3_D << 4) + CLAVE_U1_4_D);   //Clave 3 y 4 del mismo usuario... ocea 4 claves en dos bytes xD

Ojala lo entiendas  :mrgreen:

Suerte, un saludo.
Título: Re: Cerradura Digital con PIC16F84
Publicado por: clements3rd en 28 de Octubre de 2008, 14:51:57
Citar
jeremylf dijo:

Ojala lo entiendas  :mrgreen:

Suerte, un saludo.

Gracias por tu aporte jeremylf. Estoy tratando de traducirlo para asembler :D