Autor Tema: Como simplificar un número grande de registros? Proyecto estacionamiento!!  (Leído 2690 veces)

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

Desconectado Roquebolso

  • PIC10
  • *
  • Mensajes: 3
Hola gente,

Soy nuevo en éste foro y tengo una consulta.
Estoy haciendo un proyecto sobre un estacionamiento inteligente. Utilizo el pic16F628A
En pocas palabras la idea es:
-2 botones (uno de entrada de auto y otro de salida) RB0 y RB1
-8 lugares disponibles (colocando un encoder donde la entrada sea un cecimal 0-7 y la salida el binario correspondiente 3bits) RB2,3,4
-3 displays: uno que me diga en que puesto está al auto y los otros dos el importe a pagar.
         El importe a pagar sale de la diferencia entre el tiempo de salida con el de entrada multiplicado por un factor a convenir.
-los diplays están controlados con 3 transistores haciendo una interrupción cada 5ms.

En la práctica:
-entra un auto (aprieto el botón de entrada y le digo que puesto está libre) y tengo que guardar 2 registros: hora de entrada y lugar donde estaciona el auto (de 0 a 7).
-sale un auto (aprieto el botón de salida y le digo el puesto en que estaba) tengo que guardar la hora de salida y fijarme la hora de entrada para luego hacer la diferencia y decirle cual es el importe.
Ésto es lo básico.
Mi problema está cuando entra 1er auto, 2do auto, 3er auto,..... y sale el 3ero, luego entra otro y así sucesivamente.
Va a ir guardando las horas de entradas de cada uno con su respectivo puesto y ahi voy a tener que usar varios registros y no tengo mucha idea de eso.
Lo que pensé es en hacer una tabla utilizando direccionamiento indirecto (FSR) pero tampoco me alcanza....(me parece)
Esto lo pensé para no tener que manipular varios registros, sino que voy a utilizar la dirección de éstos e ir leyendo.
Necesito:
-una tabla con los puestos (en el banco 0)
-una tabla con la hora de entrada (en el banco 1)
-una tabla con la hora de salida (en el banco 2)
las tablas tienen que estar en orden.
Por ejemplo:    Banco 0    Banco1      Banco2
                           5        15:20:12    17:30:20
                           ....       ........         .......
                         
Se puede hacer ésto? y como lo podría hacer?
Gracias y espero que no haya sido tan largo... se que si, traté de explicarlo en pocos renglones!! :P

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Como simplificar un número grande de registros? Proyecto estacionamiento!!
« Respuesta #1 en: 28 de Mayo de 2008, 04:34:43 »
Hola!

La idea es buena.
Bueno. Suponiendo que los autos jamás pueden quedarse más de 24 horas, primero: no se si es tan relevante guardar los segundos(guardar los segundos implicaria usar 3 bytes para guardar cada hora contra 2 bytes si sólo guardas horas y minutos).

Segundo: Usaría el banco 2 para guardar la posición del auto(ya que con menos de 1 byte te alcanza y ese banco sólo posee 48 registros disponibles)-
Y el formato entonces sería:
             Banco 0                              Banco 1                            Banco 2
     hora entrada(16 bits)            hora salida(16 bits)               puesto(8 bits)

Ahora bien.
Como dispones de sólo 80 bytes en el Banco 1, estarías en condiciones de almacenar como máximo 40 registros.

Código: ASM
  1. CBLOCK  0x70
  2.            HoraIngresoL,HoraIngresoH
  3.            HoraEgresoL,HoraEgresoH
  4.            Puesto
  5.         ENDC
  6.  
  7. #define Inicio          0x20
  8. #define Final           0x48
  9.  
  10.         org     0x00
  11. Inicia
  12.     movlw Inicio
  13.     movwf FSR
  14. Loop
  15.     call   Guarda_Registro
  16.         goto    Loop
  17.  
  18.  
  19. Guarda_Registro
  20. ;Hora ingreso
  21.             movf HoraIngresoL,w
  22.             movwf INDF
  23.             incf FSR,F
  24.             movf HoraIngresoH,w
  25.             movwf INDF            
  26.  
  27. ;Hora egreso
  28.             decf FSR,F
  29.             bsf FSR,7      ;Direccionamiento indirecto al banco 1
  30.             movf HoraEgresoL,w
  31.             movwf INDF        
  32.             incf FSR,F
  33.             movf HoraEgresoH,w
  34.             movwf INDF        
  35.            
  36. ;Puesto
  37.             bcf   FSR,7               ;ahora banco 0
  38.             bsf   STATUS,IRP      ;ahora banco 2
  39.            
  40.             movlw Inicio
  41.             subwf FSR,F
  42.             bcf  STATUS,C
  43.             rrf  FSR,w
  44.             addlw Inicio
  45.             movwf FSR  
  46.  
  47.             movf Puesto,W
  48.             movwf INDF
  49.  
  50.             incf FSR,F
  51.             movf FSR,W
  52.             xorlw Final     ;fin memoria disponible?
  53.             movlw Inicio
  54.             btfsc STATUS,Z
  55.             movwf FSR
  56.             bcf   STATUS,IRP      ;ahora banco 0
  57.             movlw Inicio
  58.             subwf FSR,F
  59.             bcf   STATUS,C
  60.             rlf   FSR,w
  61.             addlw Inicio
  62.             movwf FSR
  63.             return

Bueno, eso sin usar ningun tipo de puntero...el FSR es su mísmo puntero...(asi q ojo! si lo modificas en otra parte del código)

Requisitos:
0x20>=Inicio<Final<=0x48

Saludos.
« Última modificación: 28 de Mayo de 2008, 04:56:22 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Roquebolso

  • PIC10
  • *
  • Mensajes: 3
Re: Como simplificar un número grande de registros? Proyecto estacionamiento!!
« Respuesta #2 en: 28 de Mayo de 2008, 10:43:11 »
Gracias Bruno!!

Tenés razón. Yo igual voy a usar: Minutos y segundos. Ya que para defenderlo en el proyecto no voy a esperar una hora para poder demostrarle que funciona.
Lo que pensé es aprovechar el tiempo que generé en la interrupcion cada 5ms para generar el tiempo real.
Cont-->200   para generar 5ms x 200 = 1 seg
ContSeg+1=ContSeg   cuando ContSeg=60 -----> ContMin+1=ContMin
De está manera voy a ir guardando los registros ContSeg y ContMin.

No entiendo porque decís que los bancos tienen 16bits, yo tengo entendido que éstos tienen 8bits en el pic16F628.
El programita que tu armaste lo estoy analizando paso a paso ya que como dije en el mensaje original no entiendo mucho el uso del direccionamiento indirecto. Supongo que HoraIngresoL,HoraIngresoH lo ponés asi porque decis que tiene 16 bits.
Algo q me pareció raro fue el uso del  rrf  FSR,w y rlf FSR,w. Para que los estás rotando?
No es mi intención que me digan como hacer todo, simplemente es que éste tema lo dimos por arriba en clase y me parece que sirve para mi proyecto y he leído en libros pero me está costando entenderlo.

Gracias y saludos.

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Re: Como simplificar un número grande de registros? Proyecto estacionamiento!!
« Respuesta #3 en: 28 de Mayo de 2008, 13:11:32 »
Hola Roquebolso:

Es necesario que lleves la cuenta de los segundos? por ejemplo en mi pais me parece que cobran 1hora x 3 soles (aprox es variable) es decir 1minutox0.016 centimos y aqui la minima unidad monetaria es 10 centimos, peor si sacamos la cuenta en segundos, seria un problema para dar vuelto aunque tal vez el sistema monetario de tu pais seguramente si se adapte, pero si no es el caso seria mejor tal vez cobrar por cada minuto o por cada 10minutos dependiendo.

Con ello tambien tu software seria un poco mas simple, mas facil y mas preciso en llevar la cuenta, bueno solo es una sugerencia.

Javicho.

Desconectado Roquebolso

  • PIC10
  • *
  • Mensajes: 3
Re: Como simplificar un número grande de registros? Proyecto estacionamiento!!
« Respuesta #4 en: 28 de Mayo de 2008, 13:24:27 »
Hola Javicho:

Entiendo lo que planteas. Igual el tema de como cobrar todavía no lo he definido y me parece que ahí no está lo complicado del proyecto. Tenés razón en lo que decís, voy a hacer algo por el estilo.
Igual sigo sin entender como manipular los distintos registros... aunque al menos ahora se por donde tengo que atacar el tema.

Gracias y saludos.
Nico.

Desconectado Javicho

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 570
Re: Como simplificar un número grande de registros? Proyecto estacionamiento!!
« Respuesta #5 en: 28 de Mayo de 2008, 13:42:25 »
Creo que mas bien primero deberias definir el asunto del cobro de los minutos de la hora etc porque eso te va a dar los limites maximos de los registros, conocido eso recien se puede optar una u otra forma.

Puedes apoyarte en el datasheet de cualquier reloj calendario como el PCF8583 por ejemplo ya que ellos llevan la cuenta de segundos minutos horas dias meses años etc tienen registros especificos para ello, analiza como estos chips distribuyen los tiempos en registros e implementalo igual en tu software.

Javicho.

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Como simplificar un número grande de registros? Proyecto estacionamiento!!
« Respuesta #6 en: 29 de Mayo de 2008, 11:54:29 »
Hola, creo que los calculos de diferencias de horas seria medi complicado, y más simple un contador de minutos, y luego si pasarlo a horas y minutos..
es decir, se almacena el dato de hora ingresado, y luego un contador de minutos... (con 2 bytes), que en realidad, ya podria ser un acumulador que sume el valor de la estadia....

Norberto
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...