Tengo medio hecho unos códigos del PIC16F84A-04, quiero grabar los Relay_1 al Relay_4 en la EEPROM, es decir, los últimos estados de los relés en ON o OFF. Aún así sigo intentado pero si les sale el código mejor que el mio, mejor que mejor.
Código:
;************************************ Meta_Control.asm **************************************
;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López. www.pic16f84a.org
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; SISTEMA DE GOBIERNO DESDE ORDENADOR: Desde el teclado de un ordenador se desea comandar
; el movimiento de una estructura móvil, según la siguiente tabla:
;
; TECLA (Por ejemplo) MOVIMIENTO
; ------------------- ----------
; t Adelante
; b Atrás
; a Izquierda
; l Derecha
; Espacio Parada
;
; La pulsación de cualquiera de estas teclas activa el estado de las salidas correspondiente
; RB3 (Adelante), RB2 (Atrás), RB1 (Izquierda), RB0 (Derecha) y apaga el resto.
;
; El movimiento que se está realizando aparece reflejado en un mensaje en el visualizador LCD
; del sistema y también en la pantalla del ordenador.
;
; El programa debe permitir modificar facilmente en posteriores revisiones en el hardware de
; la salida. Es decir, para activar las salidas conviene utilizar el direccionamiento por bit
; en lugar de por byte (utilizar instrucciones "bsf" y "bcf", en lugar de "mov..").
;
; ZONA DE DATOS **********************************************************************
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C
TeclaPulsada ; Va a guardar el contenido de la tecla pulsada.
MensajeApuntado ; Va a guarda la dirección del mensaje apuntado.
Relay_1
Relay_2
Relay_3
Relay_4
ENDC
#DEFINE SalidaR1 PORTB,3 ; Define dónde se sitúan las salidas.
#DEFINE SalidaR2 PORTB,2
#DEFINE SalidaR3 PORTB,1
#DEFINE SalidaR4 PORTB,0
TECLA_RELE_1_ON EQU 'q' ; Código de las teclas utilizadas.
TECLA_RELE_1_OFF EQU 'a'
TECLA_RELE_2_ON EQU 'w'
TECLA_RELE_2_OFF EQU 's'
TECLA_RELE_3_ON EQU 'e'
TECLA_RELE_3_OFF EQU 'd'
TECLA_RELE_4_ON EQU 'r'
TECLA_RELE_4_OFF EQU 'f'
TECLA_INICIO EQU 'z'
TECLA_PARADA EQU ' '
TECLA_INFO EQU 'i' ; Código de la tecla espaciadora, (hay un espacio,
; tened cuidado al teclear el programa).
ENTER EQU 0x0A ; Código de tecla "Enter" o "Retorno de Carro".
CAMBIO_LINEA EQU 0x0D ; Código para el cambio de línea.
ORG 0x2100 ; Corresponde a la dirección 0 de la zona EEPROM
; de datos.
DE 0x00, 0x00, 0x00, 0x00
; ZONA DE CÓDIGOS ********************************************************************
ORG 0
Inicio
call LCD_Inicializa
call RS232_Inicializa
bsf STATUS,RP0 ; Configura como salidas las 4 líneas del
bcf SalidaR1 ; del Puerto B respetando la configuración del
bcf SalidaR2 ; resto de las líneas.
bcf SalidaR3
bcf SalidaR4
bcf STATUS,RP0
call Parado ; En principio todas las salidas deben estar
Principal ; apagadas.
call RS232_LeeDato ; Espera a recibir un carácter.
call TesteaTeclado
goto Principal
; "Mensajes" ----------------------------------------------------------------------------
;
Mensajes
addwf PCL,F
MensajeParado
DT "Sistema PARADO", 0x00
Mensaje_R1_ON
DT "RELE 1 ON", 0x00
Mensaje_R1_OFF
DT "RELE 1 OFF", 0x00
Mensaje_R2_ON
DT "RELE 2 ON", 0x00
Mensaje_R2_OFF
DT "RELE 2 OFF", 0x00
Mensaje_R3_ON
DT "RELE 3 ON", 0x00
Mensaje_R3_OFF
DT "RELE 3 OFF", 0x00
Mensaje_R4_ON
DT "RELE 4 ON", 0x00
Mensaje_R4_OFF
DT "RELE 4 OFF", 0x00
Mensaje_Info
; DT 0xC9, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xBB
; DT ENTER, CAMBIO_LINEA
DT 0xBA, " FirmWare v1.00 ", 0xBA
DT ENTER, CAMBIO_LINEA
DT 0xBA, " PIC16F84A ", 0xBA
DT ENTER, CAMBIO_LINEA
DT 0xBA, " 4 MHz ", 0xBA
; DT ENTER, CAMBIO_LINEA
; DT 0xCC, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xB9
DT ENTER, CAMBIO_LINEA
DT " metaconta@gmail.com", 0x00
Mensaje_Activar
DT "Todos activos", 0x00
; Subrutina "TesteaTeclado" -------------------------------------------------------------
;
; Testea el teclado y actúa en consecuencia.
TesteaTeclado
movwf TeclaPulsada ; Guarda el contenido de la tecla pulsada.
xorlw TECLA_RELE_1_ON ; ¿Es la tecla del movimiento hacia adelante?
btfsc STATUS,Z
goto R1_ON ; Sí, se desea movimiento hacia adelante.
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_RELE_1_OFF ; ¿Es la tecla del movimiento hacia atrás?
btfsc STATUS,Z
goto R1_OFF ; Sí, se desea movimiento hacia atrás.
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_RELE_2_ON ; ¿Es la tecla del movimiento hacia la izquierda?
btfsc STATUS,Z
goto R2_ON ; Sí, se desea movimiento hacia la izquierda.
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_RELE_2_OFF ; ¿Es tecla del movimiento hacia la derecha?
btfsc STATUS,Z
goto R2_OFF ; Sí, se desea movimiento hacia la derecha.
;
movf TeclaPulsada,W
xorlw TECLA_RELE_3_ON
btfsc STATUS,Z
goto R3_ON
;
movf TeclaPulsada,W
xorlw TECLA_RELE_3_OFF
btfsc STATUS,Z
goto R3_OFF
;
movf TeclaPulsada,W
xorlw TECLA_RELE_4_ON
btfsc STATUS,Z
goto R4_ON
;
movf TeclaPulsada,W
xorlw TECLA_RELE_4_OFF
btfsc STATUS,Z
goto R4_OFF
;
movf TeclaPulsada,W
xorlw TECLA_INICIO
btfsc STATUS,Z
goto Activar
;
movf TeclaPulsada,W
xorlw TECLA_INFO
btfsc STATUS,Z
goto Info
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_PARADA ; ¿Es la tecla de parada?.
btfss STATUS,Z
goto Fin ; No es ninguna tecla de movimiento. Sale.
Parado
bcf SalidaR1 ; Como se ha pulsado la tecla de parada se
bcf SalidaR2 ; desactivan todas las salidas.
bcf SalidaR3
bcf SalidaR4
movlw MensajeParado
goto Visualiza
R1_ON
bsf SalidaR1
movlw Mensaje_R1_ON
goto Visualiza
R1_OFF
bcf SalidaR1
movlw Mensaje_R1_OFF
goto Visualiza
R2_ON
bsf SalidaR2
movlw Mensaje_R2_ON
goto Visualiza
R2_OFF
bcf SalidaR2
movlw Mensaje_R2_OFF
goto Visualiza
R3_ON
bsf SalidaR3
movlw Mensaje_R3_ON
goto Visualiza
R3_OFF
bcf SalidaR3
movlw Mensaje_R3_OFF
goto Visualiza
R4_ON
bsf SalidaR4
movlw Mensaje_R4_ON
goto Visualiza
R4_OFF
bcf SalidaR4
movlw Mensaje_R4_OFF
goto Visualiza
Activar
bsf SalidaR1 ; Como se ha pulsado la tecla de parada se
bsf SalidaR2 ; desactivan todas las salidas.
bsf SalidaR3
bsf SalidaR4
movlw Mensaje_Activar
goto Visualiza
Info
movlw Mensaje_Info
; Según el estado de las salidas visualiza el estado del sistema en el visualizador LCD y en
; el monitor del ordenador.
Visualiza
movwf MensajeApuntado ; Guarda la posición del mensaje.
call LCD_Borra ; Borra la pantalla del modulo LCD.
movf MensajeApuntado,W ; Visualiza el mensaje en la pantalla
call LCD_Mensaje ; del visualizador LCD.
call RS232_LineasBlanco ; Borra la pantalla del ordenador.
movf MensajeApuntado,W
call RS232_Mensaje ; Lo visualiza en el HyperTerminal.
call RS232_LineasBlanco
Fin return
INCLUDE <RS232.INC>
INCLUDE <RS232MEN.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <LCD_MENS.INC>
INCLUDE <RETARDOS.INC>
INCLUDE <EEPROM.INC>
END
Un cordial saludo.
EDITO:
Lo estoy intentado en esta parte:
Código:
R1_ON
clrw
call EEPROM_LeeDato
movwf Relay_1
movf Relay_1,W
call EEPROM_EscribeDato
bsf SalidaR1
movlw Mensaje_R1_ON
goto Visualiza
La idea es que si en el PORTB hay en la salida b'10100100', que se guarde ese valor del puerto B en la EEPROM. El motivo es por si se apaga la luz, se queda sin batería o cualquier otra cosa, al reiniciar el PIC de nuevo, lea los últimos valores que estaban antes de quedarse sin pilas.