¡Ay, Meta, no me has entendido...!
Vamos a ver, las interrupciones son para lo que son, y me gustan mucho, pero no las utilizaría para esto.
Tú hazlo como prefieras.
Entendido.
Normal que se te atasque en la tabla de datos... Es que no es código ejecutable. No te limites a copiar y pegar el código que te he puesto, porque sólo es un ejemplo para que entiendas cómo lo haría yo. Por favor, estúdiatelo.
Te lo voy a explicar de nuevo, a ver:
Tú tienes que sacar por el puerto de salida 4 combinaciones diferentes de LEDs. Y cada una de esas 4 combinaciones es un byte que podemos sacar por el puerto GPIO. ¿Correcto?
Clarísico.
Lo que yo te propongo es que guardes en una tabla esas 4 combinaciones. Es, por tanto, una tabla de 4 bytes, y la guardamos en la EEPROM.
Ahora tenemos que acceder a esa tabla. Fíjate que el primer byte está en la dirección Tabla + 0, el segundo en Tabla + 1, el tercero en Tabla + 2 y el cuarto en Tabla + 3. O sea, siempre es la dirección Tabla + c, siendo "c" un número del 0 al 3. Llamemos a ese número "Contador".
Me viene muy bien que tengas 4 estados diferentes, porque así yo voy a manejar mi contador muy fácilmente. Para pasar de un valor al siguiente lo incremento, y después tengo que asegurarme que del 3 pasa de nuevo al 0. Si observas estos números en binario, verás que en los 2 bits de menos peso, el 4 es igual que el 0. Te lo demuestro:
0 dec = 000000
00 bin
1 dec = 000000
01 bin
2 dec = 000000
10 bin
3 dec = 000000
11 bin
4 dec = 000001
00 bin
De esta forma, en vez de tener que hacer comparaciones y saltos, me basta con hacerle al contador un AND con el valor 3 (00000011 bin) y ya he conseguido el mismo objetivo; que del 3 pase al 0.
¿Y para qué quiero un contador del 0 al 3? Pues para acceder a los distintos datos de la tabla que puse en la EEPROM. Si yo cojo la dirección Tabla y le sumo el valor del contador, ya tengo a mi disposición el valor que tengo que sacar por el puerto. Es muy fácil trabajar así, y te ahorras un porrón de instrucciones.
Eso de ahorrar mucho código mejor que mejor.
Mi idea era un poco diferente. Sólo siempre usar un byte de toda la EEPROM para guardar y leer datos, puede que un byte más para guardar el Contador.
La EEPROM es para modificarla. Los 4 bytes que almacenas en EEPROM, ¿no es mejor guardarla en la Flash?
El motivo lo digo que siempre esos son de solo lectura, lo que vas a modificar en un byte de los 4 estados que hay a su salida de del PIC. ¿Me entiendes?
Ojo, lo que digo es un concepto, no tiene que ser así. Aún así seguiré tu criterio.
El último detalle que nos queda ver, es que el valor del contador también debe ir guardado en una variable en la EEPROM, para que así mantenga su valor aunque apagues el PIC. Léete el datasheet del PIC para saber cómo coger ese valor o guardarlo. Yo te puse un ejemplo cogiendo un dato de la tabla, pero eso era sólo un trozo del programa; no termina ahí.
Otra cosa, por favor, ¿puede alguien explicarme cómo hacéis para incluir los archivos de texto? No sé cuál es la opción y es muy complicado explicar algo de esta forma. Gracias.
Venga, Meta. Resetea tu cabeza, que creo que debes de estar hecho un lío, y ánimo compañero, que todos hemos pasado por ahí. (sólo que algunos no tuvimos Internet para consultar)
Estuve mucho tiempo sin Internet para consultar .
Lo que hice en C# simulando un PIC12F629, el código fuente lo tienes arriba. Esto es como curiosidad y tener las cosas claras. En temas de tiempo mejor usar ya el C si se complica el PIC.
Acuérdate que cambié de idea. Hay que programar el PIC que al pulsar 5 seg el botón del PIC, cambia de estado, si lo pulsas en un momento, el PIC no hace nada.
Aquí hay información y en español.
Memoria de Datos EEPROM
La memoria de datos EEPROM se puede leer y escribir durante una operación normal (rango completo de VDD). Esta memoria no está mapeada directamente en el espacio del archivo de registro. En su lugar, es indirectamente direccionada a través de los Registros de Función Especial (SFR). Hay cuatro SFRs utilizados para leer y escribir esta memoria:
• EECON1
• EECON2 (no es un registro implementado físicamente)
• EEDATA
• EEADR
EEDATA contiene los 8 bits de datos de lectura y escritura, y EEADR contiene la dirección de acceso a la ubicación de la EEPROM. Los PIC12F629/675 tienen 128 bytes de datos EEPROM con un rango de direccionamiento de 0h a 7Fh.
La memoria de datos EEPROM permite la lectura y escritura de bytes. La escritura de un byte automáticamente borra la ubicación y escribe el nuevo dato (borra antes de escribir). La clasificación de la memoria de datos EEPROM está preparada para elevados ciclos de borrado y escritura. El tiempo de escritura está controlado por un temporizador interno. El tiempo de escritura varía con la tensión y la temperatura, así como de un chip a otro. Consulta las especificaciones de AC para límites exactos.
Cuando la memoria de datos tiene protección de código, la CPU puede continuar leyendo y escribiendo los datos de la memoria EEPROM. El programador del dispositivo no puede acceder a esta memoria.
Información adicional sobre la EEPROM de datos está disponible en el manual de referencia PIC®Mid-Range, (DS33023).
bit 7-0
EEDATn: valor del Byte a leer o escribir desde la EEPROM de datos
bit 7 Sin implementar: debería estar a 0
bit 6-0
EEADR: especifica una de las 128 localizaciones para operaciones de Lectura/Escritura de la EEPROM
EEADR
El registro EEADR puede direccionar hasta un máximo de 128 bytes de datos EEPROM. Sólo siete de los ocho bits en el registro (EEADR<6:0 >) son necesarios. Se ignora el MSb (bit 7).
El bit superior siempre debe ser ‘0’ para seguir siendo compatible con dispositivos que tengan más memoria de datos EEPROM.
Registros EECON1 Y EECON2
EECON1 es el registro de control con cuatro bits bajos físicamente implementados. Los cuatro bits superiores están sin implementar y se leen como '0's.
Los bits de control RD y WR inician la lectura y escritura, respectivamente. Estos bits no se pueden borrar, tan sólo activarse, vía software. Se borran por hardware al completarse una operación de la lectura o escritura. La incapacidad para borrar el bit WR por software previene una accidental terminación prematura de una operación de escritura.
El bit WREN, cuando está activado, permitirá una operación de escritura. En Power-up, el bit WREN está borrado. El bit WRERR está activado cuando una operación de escritura es interrumpida por un MCLR Reset, o un WDT Time-out Reset durante una operación normal. En estas situaciones, a seguir de un RESET, el usuario puede comprobar el bit WRERR, borrarlo y volver a escribir la ubicación. Los datos y la dirección se borrarán, por lo tanto, los registros EEDATA y EEADR tendrán que ser reinicializados.
El bit de bandera de interrupción EEIF en el registro PIR1 se establece cuando se completa la escritura. Este bit debe desactivarse por software. EECON2 no es un registro físico. La lectura de EECON2 leerá todos como '0'. El registro EECON2 se utiliza exclusivamente en la secuencia de escritura de datos en la EEPROM.
bit 7-4 Sin implementar: Se leen como '0'
bit 3
WRERR: bit de bandera EEPROM error
1 = una operación de escritura terminada prematuramente (cualquier MCLR Reset o WDT Reset durante una operación normal o BOD detectado)
0 = operación de escritura terminada
bit 2
WREN: bit de habilitación de escritura EEPROM
1 = permite ciclos de escritura
0 = inhibe escritura de datos
bit 1
WR: bit de Control de Escritura
1 = inicia un ciclo de escritura (El bit es borrado por hardware una vez la escritura finaliza. El bit WR puede únicamente activarse, no borrarse, por software)
0 = el ciclo de escritura de datos EEPROM se ha completado
bit 0
RD: bit de Control de Escritura
1 = inicia una lectura EEPROM (La lectura toma un ciclo. RD se borra por hardware. El bit RD puede únicamente activarse, no borrarse, por software)
0 = no inicia una lectura EEPROM
Leyendo la Memoria de Datos EEPROM
Para leer una posición de la memoria de datos, el usuario debe escribir la dirección en el registro EEADR y, a continuación, activar el bit de control RD (EECON1<0>), como se muestra en el ejemplo 8-1. Los datos están disponibles, en el siguiente ciclo, en el registro EEDATA. Por lo tanto, puede leerse en la siguiente instrucción. EEDATA mantiene este valor hasta otra lectura, o hasta que se escribe por el usuario (durante una operación de escritura).
Escribiendo en la Memoria de Datos EEPROM
Para escribir en una posición de la EEPROM, el usuario en primer lugar debe escribir la dirección en el registro EEADR y los datos al registro EEDATA. A continuación, el usuario debe seguir una secuencia específica para iniciar la escritura de cada byte, como se muestra en el ejemplo 8-2.
La escritura no iniciará si la secuencia anterior no se sigue exactamente (escribir 55h en EECON2, escribir AAh en EECON2 y activar el bit WR) para cada byte. Se recomienda encarecidamente que las interrupciones se deshabiliten durante este segmento de código. Un contador de ciclo se ejecuta durante la secuencia necesaria. Cualquier número que no sea igual a los ciclos necesarios para ejecutar la secuencia impedirá que los datos se escriban en la EEPROM.
Además, se debe activar el bit WREN en EECON1 para habilitar la escritura. Este mecanismo impide escrituras accidentales de datos en la EEPROM debido a una errante (inesperada) ejecución de código. El usuario debe mantener el bit WREN a 0 en todo momento, excepto cuando se actualiza la EEPROM. El bit WREN no se borra por hardware.
Después de que se haya iniciado una secuencia de escritura, borrar el bit WREN no afectará a este ciclo de escritura. El bit WR no podrá activarse a menos que el bit WREN esté activado.
Al final del ciclo de escritura, el bit WR será borrado por hardware y se activa el bit de bandera EE de interrupción de escritura completada (EEIF). El usuario puede habilitar esta interrupción o sondear este bit. El bit EEIF del registro (PIR<7>) debe ser borrado por software.
Verificar Escritura
Dependiendo de la aplicación, buenas prácticas de programación pueden dictar que el valor que se escribe en la EEPROM de datos deba ser verificado (ver ejemplo 8-3) para confirmar la escritura del valor deseado.
Usando la EEPROM de Datos
La memoria de datos EEPROM es una matriz de bytes direccionables de alta-resistencia, que se ha optimizado para el almacenamiento de información con cambios frecuentes (por ejemplo, las variables de programa u otros datos que se actualizan con frecuencia).
Frecuentes cambios de los valores normalmente se actualizarán más a menudo que las especificaciones D120 o D120A. Si esto no es el caso, debe realizarse una actualización de la matriz. Por esta razón, las variables que cambian con poca frecuencia (como constantes, ID, calibración, etc.) deberían ser almacenadas en la memoria de programa FLASH.
Protección contra falsas Escrituras
Hay condiciones en las que el dispositivo no debe escribir datos a la memoria EEPROM. Para proteger contra las falsas Escrituras EEPROM, se han construido diversos mecanismos. En Power-up, se borra WREN. Además, el Power-up Timer (72 ms de duración) previene de escrituras en la EEPROM.
La secuencia de inicio de escritura y el bit WREN juntos ayudan a prevenir una escritura accidental durante:
• Brown-out
• Problemas de energía
• Mal-funcionamiento del software
Memoria de datos EEPROM con CODE PROTECT
La Memoria de Datos puede tener protección de código programando el bit CPD a ‘0’.
Cuando la memoria de datos tiene protección de código, la CPU es capaz de leer y escribir datos en la EEPROM. Se recomienda proteger el código de la memoria de programa (CP) cuando se protege el código de la memoria de datos (CPD). Esto impide que cualquier persona programe ceros sobre el código existente (que se ejecutará como NOPs) para llegar a una rutina añadida, programada en posiciones no utilizadas de la memoria de programa, que sacará el contenido de la memoria de datos. Programar posiciones que no se utilizan a ‘0’ también ayudará a prevenir que la protección del código de la memoria de datos sea alterada.
Nota(1): EECON2 no es un registro físico.
Hay que leer bien.