Autor Tema: Contador de dos digitos con memoria  (Leído 3108 veces)

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

Desconectado kohaiotak

  • PIC10
  • *
  • Mensajes: 6
Contador de dos digitos con memoria
« en: 07 de Septiembre de 2004, 10:46:00 »
Hola amigos!
Quisiera que me ayudaran a encontrar un programa para PIC 16F84A de un contador de dos digitos, pero con memoria, o sea que cuando el circuito se desconecte de la fuente, y se vuelva a encender, mantenga el dato desde donde se quedo.... y siga contando desde ahi... por favor si alguien sabe donde puedo encontrarlo o si alguien lo tiene y me lo puede pasar, estaria muy agradecido con ustedes, ya que soy nuevo en esto y no tengo muchos conocimiento, lo necesito para mi expo de proyecto y aun no lo tengo, es importante para mi....

mi correo: kohai_otak@yahoo.com


Por favor
Gracias de antemano

Desconectado Carlete71

  • PIC18
  • ****
  • Mensajes: 433
RE: Contador de dos digitos con memoria
« Respuesta #1 en: 07 de Septiembre de 2004, 16:49:00 »
Mira, no tengo el programa, pero si gustas entre todos podemos ayudarte para que lo hagas. En principio lo que se me ocurre es que uses la EEPROM de datos para almacenar los dígitos que cuentas, de esa manera cuando se desenergice el circuito, el último dato quedará en la memoria.

Te animas?

Saludos,

Desconectado kohaiotak

  • PIC10
  • *
  • Mensajes: 6
RE: Contador de dos digitos con memoria
« Respuesta #2 en: 08 de Septiembre de 2004, 11:05:00 »
Si! me animo y gracias por la ayuda....
Ya encontre un contador de dos digitos en la pagina de todopic:
http://www.todopic.com.ar/asm/doble_contador_00_99/

Aqui lo coloco:


      TITLE                 "Contador doble 00-99"
      SUBTITLE              "Revision Nø 2"
      LIST                  F = INHX8M, MM = ON, T = ON, ST = OFF
      RADIX                 HEX
      ERRORLEVEL            0, -302, -306
      PROCESSOR             16F84A          ;16F84A-20/P

      #INCLUDE              <P16F84A.INC>
      __CONFIG              _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC
      __IDLOCS              H"0000"
;
;  B"00111111" B"11111001"
;       3F         F
;           3FF9
;
; Configuration Bits     16F84A
;
; SCRAMBLER     CP       PWRTE      WDT      OSC
;
; 00 = SI    0 = SI     0 = SI    0 = NO   00 = LP
; 3F = NO    1 = NO     1 = NO    1 = SI   01 = XT
;                                          10 = HS
;                                          11 = RC
;
;****************
;Cristal utilizado
;****************
;
; 04Mhz en modo XT con 1 useg por instrucción
;
;****************
;Descripcion del uso de cada pin.
;****************
;
; DIGITO_2A   ( digito 2A )                    RA2             pin    1
; DIGITO_1A   ( digito 1A )                    RA3             pin    2
; PULSADOR_R  ( Pulsador R )                   RA4/TOCK1       pin    3
; MCLR/VPP    ( reset y voltage Vpp )          MCLR/VPP        pin    4
; VSS         ( negativo 0V )                  VSS             pin    5
; LED_F       ( led del segmento F )           RB0/INT         pin    6
; LED_E       ( led del segmento E )           RB1             pin    7
; LED_D       ( led del segmento D )           RB2             pin    8
; LED_C       ( led del segmento C )           RB3             pin    9
; LED_B       ( led del segmento B )           RB4             pin   10
; LED_A       ( led del segmento A )           RB5             pin   11
; LED_G       ( led del segmento G )           RB6             pin   12
; PULSADOR_I  ( pulsador I )                   RB7             pin   13
; VDD         ( positivo 5V )                  VDD             pin   14
; OSC         ( salida )                       OSC2/CLKOUT     pin   15
; OSC         ( entrada )                      OSC1/CLKIN      pin   16
; DIGITO_1B   ( digito 1B )                    RA0             pin   17
; DIGITO_2B   ( digito 2A )                    RA1             pin   18
;
;****************
;Definicion de RAM del usuario.
;****************
;
      CBLOCK      H"0C"
      Dig1A                     ;acumulador decenas para el contador A
      Dig2A                     ;acumulador unidades para el contador A
      Dig1B                     ;acumulador decenas para el contador B
      Dig2B                     ;acumulador unidades para el contador B
      Rota                      ;variable para desplazamiento de display
      Loops1                    ;variables usadas en retardos
      Loops2
      ENDC
;
#define       PULSADOR_R   PORTA,4
#define       PULSADOR_I   PORTB,7
;
Reset
  ORG         H"000"            ; Vector de inicio, o sea, desde aqui
                                ; comienza la ejecución del progrma
                                ; cuando se alimenta al pic...POR.."Power On Reset"
      GOTO    Inicio            ; Salta hacia el inicio del progrma
  ORG         H"004"            ; Vector de interrupción, o sea aqui salta
                                ; el PCl cuando se produce una interupción
      RETURN                    ; Retorna sin habilitar las interrupciones
;
;-------------------------------------------------------------------
;-                          Subrrutinas                            -
;-------------------------------------------------------------------
;
Retardo                         ;subrutina de retardo
      movwf   Loops1            ;la variable de trabajo contiene la cant.
Top2  movlw   D"110"            ;de ms a demorar
      movwf   Loops2
Top1  nop
      nop
      nop
      nop
      nop
      nop
      decfsz  Loops2,F          ;controla si termina 1mS
      goto    Top1
      decfsz  Loops1,F          ;controla si termina el retardo completo
      goto    Top2
      return
;
;-------------------------------------------------------------------
;
IncDecenas                      ;rutina de incremento x 10
      clrf    INDF              ;pone a cero las unidades
      incf    FSR,F             ;selecciona el registro de las decenas
      incf    INDF,F            ;incrementa el contador de decenas
      movf    INDF,W            ;carga en work el conteo de las decenas
      xorlw   H"0A"             ;si work era 10, entonces quedara en cero
      skpnz                     ;si es cero, el flag z queda alto
      clrf    INDF              ;pasa de 99 a 00            
      return                    ;retorna
;
;-------------------------------------------------------------------
;
IncUnidades                     ;rutina de incremento
      movwf   FSR               ;seleciona el registro de las unidades
      incf    INDF,F            ;incrementa el contador de unidades
      movf    INDF,W            ;carga en work el conteo de las unidades
      xorlw   H"0A"             ;si work era 10, entonces quedara en cero
      skpnz                     ;si es cero, el flag z queda alto
      call    IncDecenas        ;incrementa las decenas
      movlw   D"250"            ;retardo de 100ms
      call    Retardo
      return
;
;-------------------------------------------------------------------
;
; entrada : W            Valor bcd a convertir         (H"00" a H"09").
; salida  : W            Valor 7 segmentos
;
;La codificacion de los siete segmentos es la siguiente.
;
;   GABCDEF
;B"xxxxxxxx"
;
;        A
;      ----
;   F |    | B
;     |  G |
;      ----
;   E |    | C
;     |    |
;      ---- o
;        D
Tabla                           ;genera los numeros sobre el display
      andlw   B"00001111"       ;solo H"0F"
      addwf   PCL,F             ;agrega al cont. programa el valor de work
      retlw   B"00111111"       ;genera el 0
      retlw   B"00011000"       ;genera el 1
      retlw   B"01110110"       ;genera el 2
      retlw   B"01111100"       ;genera el 3
      retlw   B"01011001"       ;genera el 4
      retlw   B"01101101"       ;genera el 5
      retlw   B"01101111"       ;genera el 6
      retlw   B"00111000"       ;genera el 7
      retlw   B"01111111"       ;genera el 8
      retlw   B"01111101"       ;genera el 9
;
;Los siguientes debuelven E de "error", esto es por si se pasa
;un valor a la tabla desde H"0A" hasta H"0F".
;
      retlw   B"01100111"       ;genera la E
      retlw   B"01100111"       ;genera la E
      retlw   B"01100111"       ;genera la E
      retlw   B"01100111"       ;genera la E
      retlw   B"01100111"       ;genera la E
      retlw   B"01100111"       ;genera la E
;
;-------------------------------------------------------------------
;-                      Programa Principal                         -
;-------------------------------------------------------------------
;
Inicio                          ;programa principal
      bsf     STATUS,RP0        ;selecciona el banco de memoria alto
      movlw   B"00010000"       ;configura RA0~RA3 como salidas
      movwf   TRISA             ;y RA4 como entrada
      movlw   B"10000000"       ;configura RB0~RB6 como salidas
      movwf   TRISB             ;y RB7 como entrada
      bcf     STATUS,RP0        ;selecciona el banco de memoria bajo
      clrf    Dig1A             ;inicializa acumuladores
      clrf    Dig2A
      clrf    Dig1B
      clrf    Dig2B
      movlw   H"00"             ;envia ceros a los transistores para apagar
      movwf   PORTA             ;todos los displays
;
Empe  btfss   PULSADOR_R        ;¿ Esta presionado el pulsador R ?
      goto    Mostrar           ;No
      movlw   Dig1A             ;Carga el puntero para el primer contador
      call    IncUnidades       ;llama la rutina de incremento para el contador A
;      
      btfss   PULSADOR_I        ;¿ Esta presionado el pulsador I ?
      goto    Mostrar           ;No
      movlw   Dig1B             ;para cargar el puntero
      call    IncUnidades       ;llama la rutina de incremento para el contador B
Mostrar
      movlw   H"08"             ;iniciar un 1 en el registro de rotacion
      movwf   Rota            
      movlw   Dig1A             ;con el registro selector (fsr) se apunta
      movwf   FSR               ;al primer dato que se va a mostrar
Disp  movlw   H"00"             ;colocar en cero el dato del display
      movwf   PORTB             ;para apagarlos
      movf    Rota,W            ;pasa rotacion del 1 a la variable work
      movwf   PORTA             ;enciende el transistor (display)
      movf    INDF,W            ;lee el dato del registro apuntado por fsr
      call    Tabla             ;genera el digito de 7 segmentos
      movwf   PORTB             ;envia el digito al puerto b
      movlw   H"03"             ;retardo de 3ms para visualizacion
      call    Retardo
      btfsc   Rota,0            ;controla si terminaron las cuatro rotaciones
      goto    Empe              ;si termino, vuelve desde el comienzo
      bcf     STATUS,C          ;carry en cero para no afectar las rotaciones
      rrf     Rota,F            ;desplaza el 1 que enciende los displays
      incf    FSR,F             ;incrementa el puntero. Apunta el proximo
      goto    Disp              ;digito a mostrar

      END



Pienso que hay que colocar las variables a guardar en la EEPROM, pero eso no se como se hace, ayudenme, si?








Desconectado Carlete71

  • PIC18
  • ****
  • Mensajes: 433
RE: Contador de dos digitos con memoria
« Respuesta #3 en: 08 de Septiembre de 2004, 16:47:00 »

Ok, pues lo que deberías hacer es grabar los dígitos en la EEPROM cada vez que se haga un incremento. Las rutinas para leer y escribir la EEPROM de datos están tabuladas en cualquier libro de PIC. Si no lo tienes puedo escanear el mío.

Que tomaría en cuenta?

1.- Que el próximo numero a contar sea el de la memoria EEPROM + 1.

2.- Que se permita mediante un pulsador inicializar la EEPROM de datos a Cero.

Saludos,

Desconectado kohaiotak

  • PIC10
  • *
  • Mensajes: 6
RE: Contador de dos digitos con memoria
« Respuesta #4 en: 08 de Septiembre de 2004, 21:01:00 »
Escrito originalmente por Carlete71

Que tomaría en cuenta?

1.- Que el próximo numero a contar sea el de la memoria EEPROM + 1.

2.- Que se permita mediante un pulsador inicializar la EEPROM de datos a Cero.

Saludos,


Si, las dos opciones q mencionaste son correctas, pienso q eso es lo que tiene q hacer...
Ahh y las rutinas de lectura y escritura en la EEPROM no las tengo
gracias por tu ayuda... creo q lo lograremos pronto







Desconectado Carlete71

  • PIC18
  • ****
  • Mensajes: 433
RE: Contador de dos digitos con memoria
« Respuesta #5 en: 09 de Septiembre de 2004, 07:53:00 »

Ok, dame un chance y te las escaneo.

Saludos,

Desconectado Carlete71

  • PIC18
  • ****
  • Mensajes: 433
RE: Contador de dos digitos con memoria
« Respuesta #6 en: 09 de Septiembre de 2004, 17:32:00 »

Ya coloqué las rutinas de lectura y escritura aquí:

http://miarroba.com/foros/ver.php?foroid=256746&temaid=2304198

Te recomiendo que te compres este libro, es el que está abajo de esta página, el rojo del medio. Es muy bueno.

Saludos,

Desconectado kohaiotak

  • PIC10
  • *
  • Mensajes: 6
RE: Contador de dos digitos con memoria
« Respuesta #7 en: 10 de Septiembre de 2004, 00:59:00 »
Oye, pues muchas gracias!
Y ahora con las rutinas, me imagino que hay q colocarlas en el programa y cambiarle algunas cosas a ellas, con q podriamos empezar Carlete?

P.S: a todos los q se quieran unir para ayudarnos, lo pueden hacer...

Desconectado kohaiotak

  • PIC10
  • *
  • Mensajes: 6
RE: Contador de dos digitos con memoria
« Respuesta #8 en: 10 de Septiembre de 2004, 19:42:00 »
Que valores del programa podriamos guardar en la EEPROM para que se mantenga el conteo?

Desconectado kohaiotak

  • PIC10
  • *
  • Mensajes: 6
RE: Contador de dos digitos con memoria
« Respuesta #9 en: 15 de Septiembre de 2004, 14:11:00 »
Ayudenme por favor, no se como incluir las rutinas de lectura y escritura de la EEPROM en el programa...


 

anything