¿Cómo guardar en la EEPROM las veces de ejecución de un programa?

#1
hola queria saber como grabar en lenguaje basic (uso el microcode estudio ) dentro del pic 16f628a dentro de la memoria eeprom la cantidad de veces que se me lea el programa .
Lo que quiero hacer es que cada ves que el programa que tengo dentro del microcontrolador se ejecute en su totalidad me lo cuente en la memoria eeprom .Si el programa se ejecuta una ves me marque uno en la eeprom si lo ejecuta dos veces me ponga un dos en la eeprom y asi sucesivamente. ...
 
#3
_INTOSC_OSC_NOCLKOUT
Define OSC 4
cmcon=7
trisb=0
Portb=%00000000
PAUSE 2000
led 1 var portb.0
led 2 var portb.1
led 3 var portb.2
high led 1
pause 1000
high led 2
pause 1000
high led 3
pause 1000
END
 
#4
Ese programa únicamente encenderá cada LED con un retardo de un segundo y quedarán encendidos.
Lo que necesitas hacer, es escribir la memoria con un número inicial. Por ejemplo, el 1 para la primera vez.
Después, cada vez que se ejecute el programa o tras un reset, leer ese valor, incrementarlo y sobreescribirlo.
 
#5
Hola, te invito a que leas el libro "microcontrolador pic16f84: desarrollo de proyectos" by Enrique Palacios Municio. Aunque esta enfocado al pic16f84 (el cual ya esta descontinuado), la temática del libro es muy buena. No puedo darte el link del libro porque va contra las políticas del foro pero utiliza el buscador de google. Viene un capitulo sobre la memoria eeprom, lectura y escritura.
 
#7
como seria el codigo que tendria que escribir si en el programa tuviera un boton que daria inicio al programa y cada ver que ese boton seria presionado comensaria a andar el programa y a la vez en la memoria eeprom me sumaria ( como un contador ) para saber cuantas veces fue pulsado ese boton.



_INTOSC_OSC_NOCLKOUT
Define OSC 4
cmcon=7
trisb=0
trisa=%00000001
porta=0
Portb=%00000000
prende var porta.0 ;prende

pulsar:
if prende =1 then inicio
PAUSE 1000
GOTO pulsar

inicio:
PAUSE 2000
led 1 var portb.0
led 2 var portb.1
led 3 var portb.2
high led 1
pause 1000
high led 2
pause 1000
high led 3
pause 1000
END
 
Última edición:
#8
Puedes probar con algo así:
PHP:
Define OSC 4                    ; Definir que se trabajará con 4MHz.

Inicio:
    Data @0, 0                  ; Escribir un 0 inicial en la dirección 0 de la EEPROM interna.
    ; Declaración de variables:
    Contador    Var Byte
    ; Configuración de registros:
    CMCON = 7                   ; Comparadores analógicos OFF
    ; Configuración de terminales:
    Symbol LED1     = PORTB.0   ; LED indicador de conteo activo
    Symbol LED2     = PORTB.1   ; LED indicador de conteo terminado.
    Symbol Pulsador = PORTA.0   ; Pulsador de inicio de programa.
    
    ; Ejecución inicial de conteo:
    Read 0, Contador            ; Leer la dirección 0 de la memoria y guardar el contenido en "Contador"
    
    If Contador <= 10 Then      ; Si la variable "Contador" no ha llegado a 10...
        High LED1               ; Indicar que aún no se llega a 10 ejecuciones.
        Low LED2
        GoTo Esperar_Pulsador   ; Ir a la rutina "Esperar_Pulsador"
    Else                        ; Caso contrario... (Más de 10 ejecuciones)
        Low LED1                ; Indicar que ya se superaron las 10 ejecuciones.
        High LED2
        GoTo Conteo_Excedido    ; Ir a la rutina "Conteo_Excedido"
    EndIf

Esperar_Pulsador:
    If Pulsador = 1 Then        ; Si se presiona el pulsador. (Activo en 1)...
        Contador = Contador + 1 ; Incrementar la variable "Contador"
        Write 0, Contador       ; Reescribir el valor en la EEPROM interna (Dirección 0)
        GoTo Programa           ; Ir a la rutina "Programa"
    Else                        ; Caso contrario (Pulsador en 0)
        GoTo Esperar_Pulsador   ; Regresar a la etiqueta "Esperar_Pulsador"
    EndIf
    
Programa:
    ; Hacer algo aquí:
    ; De ejemplo...
    Toggle PORTB.7
    Pause 500
    GoTo Programa
    
Conteo_Excedido:
    ; Hacer algo aquí...
    ; De ejemplo...
    Toggle PORTB.6
    Pause 500
    GoTo Conteo_Excedido
    
    End
 
#9
¿apoco 16f84a no es obsoleto?
yo opino que escribir las veces que se ejecuta el programa se va a terminar la eprom

digo

Código:
inicio

mostrar el contador de eprom

hacer la tarea

incrementrar contador eprom

escribir en eprom el contador

modo sleep
seria lo mas adecuado


pero si hacemos esto asesinariamos la eprom por la N cantidad de veces que se ejecuta el programa

Código:
inicio

bucle:

mostrar contador eprom

hacer la tarea 

incrementar contador eprom

escribir contador en la eprom

volver al bucle:
si ponemos un bucle infinito se escribira a la velocidad que se ejecuta el programa y al paso de unas horas la eprom terminara su vida util de escritura
 
#10
¿A poco el 16F84A no es obsoleto?
Obsoleto, sí, descontinuado, no. :cool:
Yo opino que escribir las veces que se ejecuta el programa se va a terminar la EEPROM.
Pero si hacemos esto asesinaríamos la EEPROM por la N cantidad de veces que se ejecuta el programa.
Si se quisiera hacer lo que mencionas, se podría hacer una evaluación para determinar cuanto tiempo de vida tendrá la EEPROM, que se estima alrededor de 1,000,000 de ciclos de lectura y escritura.
Aparte se puede usar un entero de 64 bits para lograr el cometido si esa fuera la intensión. :eek:
Si ponemos un bucle infinito se escribirá a la velocidad que se ejecuta el programa y al paso de unas horas la EEPROM terminará su vida útil de escritura.
Podría ser, pero como el amigo aguss piensa usar un pulsador para realizar ese conteo, es más probable que lo primero que se dañe, sea el mismo pulsador. :D
 
#11
¿Cómo hago si tengo tres programas y quiero con un botón cambiar los programas?
O sea, yo quiero poder seleccionar qué programa se ejecute en el PIC.
Código:
Trisb=%00000000 ;convierte todos los pines del puerto B en salidas
discoteca:      ;nombre de la subrutina
Portb=%00000001 ;enciende el puerto B.0, los demás permanecen apagados
GOSUB pedro     ; ir a subrutina pedro y volver cuando diga RETURN
Portb=%00000010 ;enciende el puerto B.1, los demás les apaga
GOSUB pedro     ; ir a subrutina tiempo y volver cuando diga RETURN
Portb=%00000100 ;enciende el puerto B.2, los demás les apaga
GOSUB pedro     ; ir a subrutina pedro y volver cuando diga RETURN
Portb=%00001000 ;enciende el puerto B.3, los demás les apaga
GOSUB pedro     ; ir a subrutina pedro y volver cuando diga RETURN
Portb=%00010000 ;enciende el puerto B.4, los demás les apaga
GOSUB pedro     ; ir a subrutina pedro y volver cuando diga RETURN
Portb=%00100000 ;enciende el puerto B.5, los demás les apaga
GOSUB pedro     ; ir a subrutina pedro y volver cuando diga RETURN
Portb=%01000000 ;enciende el puerto B.6, los demás les apaga
GOSUB pedro     ; ir a subrutina pedro y volver cuando diga RETURN
Portb=%10000000 ;enciende el puerto B.7, los demás les apaga
GOSUB pedro     ; ir a subrutina pedro y volver cuando diga RETURN
GOTO discoteca  ; ir al inicio del programa
pedro:          ;esta es la subrutina pedro
PAUSE 200       ;retardo de 200 milisegundos, aquí podemos cambiarlo
RETURN          ;volver al GOSUB que le envió


IF porta.4 = 1 THEN discoteca 
IF porta.4 = 0 then 
  
Trisb=%00000000 ;convierte todos los pines del puerto B en salidas
discoteca1:      ;nombre de la subrutina
Portb=%00000001 ;enciende el puerto B.0, los demás permanecen apagados
GOSUB pedro1     ; ir a subrutina pedro y volver cuando diga RETURN
Portb=%00000010 ;enciende el puerto B.1, los demás les apaga
GOSUB pedro1     ; ir a subrutina tiempo y volver cuando diga RETURN
Portb=%00000100 ;enciende el puerto B.2, los demás les apaga
GOSUB pedro1     ; ir a subrutina pedro y volver cuando diga RETURN
Portb=%00001000 ;enciende el puerto B.3, los demás les apaga
GOSUB pedro1     ; ir a subrutina pedro y volver cuando diga RETURN
Portb=%00010000 ;enciende el puerto B.4, los demás les apaga
GOSUB pedro1     ; ir a subrutina pedro y volver cuando diga RETURN
Portb=%00100000 ;enciende el puerto B.5, los demás les apaga
GOSUB pedro1     ; ir a subrutina pedro y volver cuando diga RETURN
Portb=%01000000 ;enciende el puerto B.6, los demás les apaga
GOSUB pedro1     ; ir a subrutina pedro y volver cuando diga RETURN
Portb=%10000000 ;enciende el puerto B.7, los demás les apaga
GOSUB pedro1     ; ir a subrutina pedro y volver cuando diga RETURN
Portb=%01000000
GOSUB pedro1     ; ir a subrutina pedro y volver cuando diga RETURN
Portb=%00100000
GOSUB pedro1
Portb=%00010000 
GOSUB pedro1
Portb=%00001000
GOSUB pedro1
Portb=%00000100
GOSUB pedro1
Portb=%00000010
GOSUB pedro1
Portb=%00000001
GOSUB pedro1   
GOTO discoteca1  ; ir al inicio del programa
pedro1:          ;esta es la subrutina pedro
PAUSE 200       ;retardo de 200 milisegundos, aquí podemos cambiarlo
RETURN          ;volver al GOSUB que le envió
 
Última edición por un moderador:
#13
Me parece que NO tiene sentido grabar directamente en la EEPROM, todas las veces que se ejecuta el programa. Más bien almacenar el dato en una variable y cuándo el PIC es desconectado de la alimentación, guardar ese dato en dicha EEPROM. Claro que para lograr ésto, debe detectarse una baja de tensión en la línea antes del regulador de 5V. y mediante un condensador sostener la tensión unos cuantos milisegundos, para que el PIC logre almacenar los datos antes de apagarse.
 
#14
pudiera ser una pilita CR2032 pudiera ayudar no? con un pin detectas un nivel logico alto cuando la energia se vaya al demonio la pilita aun sigue alimentando al micro y el pin ya no tendra un nivel logico entonces es ahi cuando entra la funcion grabar en eeprom
 
Arriba