Hola
Aca esta el codigo, pero sinceramente no creo que sea eso, pero nunca se sabe
saludos
; **** Encabezado ****
list p=16f628A ; directiva para indicar el micro a utilizar
#include <p16f628A.inc> ; archivo con definiciones de variables especificas del micro
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
;sentencia para configurar los fuses del micro
;**** Definicion de variables ****
Segundos equ 0x22 ; contador para los segundos
Minutos equ 0x23 ; contador de minutos
tiempo equ 0x24 ; donde guardare el tiempo a contar
addr equ 0x25 ;mantiene direccion del daro en eprom
Cont_parp equ 0x27 ; cuenta cuantos parpadeos han ocurrido
flagP equ 0x28
;variables asociadas a puerto serie
Dato_Dec equ 0x20 ; Dato recibido desde PC
Dato_Uni equ 0x32
Flag equ 0x21 ; Bandera que me indicara si llego un dato unidad o decena
flagS equ 0x26 ; Bandera que dice que tiempo debo guardar (addr2)
Sleep_temp equ 0x29
ON_temp equ 0x30
OFF_temp equ 0x33
Temp equ 0x34
Write equ 0x35
;**** Inicio del Micro ****
Reset.
org 0x00 ; Aquí comienza el micro
goto Inicio ; Salto a inicio de mi programa
;**** Vector de Interrupcion ****
org 0x04 ; Atiendo Interrupcion
goto ISR
; **** Programa Principal ****
org 0x05
Inicio
;configuracion puertos
bsf STATUS,RP0 ; Paso al Banco 1
movlw 0x02
movwf TRISB ; Configuro pines para Usart
movlw 0x00
movwf TRISA ; Configuro todo PORTA como salidas
bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
movlw 0x07 ; desabilitamos comparadores del puerto A.-
movwf CMCON
bsf STATUS,RP0 ; Paso al Banco 1
;config USART
movlw 0x04
movwf TXSTA ; Configura modo asincrono, baud rate de alta velocidad
movlw 0x19 ; Configura velocidad a 9600 baudios con cristal de 4 Mhz
movwf SPBRG
bsf PIE1,RCIE ; Habilita interrupcion de puerto serie para recepcion
bsf PIE1,TMR1IE ; Seteo bit Habilitacion interrupción por TMR1.
bsf INTCON,GIE ; Habilitacion general interrupciones
bsf INTCON,PEIE ; Habilitacion de interrupciones por perifericos
; Activar recepcion, transmision.-
;bsf TXSTA,TXEN ; Habilita transmision
bcf STATUS,RP0 ; Banco 0
bsf RCSTA,SPEN ; Habilitacion puerto serie
bsf RCSTA,CREN ; Habilita recepcion
bcf Flag,0 ; Limpiamos bandera.
;**** Configuracion Timer 1 *****
movlw b'00110001' ; Se activa TMR1 y preescaler de 1/8, modo temporizador.-
movwf T1CON
movlw 0x0B ; Cargamos 3035 en TMR1 para lograr 500ms aprox
movwf TMR1H ; Byte alto de TMR1.-
movlw 0xDB
movwf TMR1L ; Byte bajo de TMR1.-
;inicializacion de variables
clrf Segundos
clrf Minutos
clrf PORTA
clrf PORTB ; limpio puertos
clrf addr ; dejo direccion en cero
clrf Cont_parp
clrf Flag
clrf flagS
clrf flagP
clrf Write
movfw addr ; cargo direccion en W
bsf STATUS, RP0 ; Bank 1
movwf EEADR ; Address to read
bsf EECON1, RD ; EE Read
movf EEDATA, W ; W = EEDATA
bcf STATUS, RP0 ; Bank 0
movwf tiempo ; paso valor a variable tiempo
;movwf PORTB ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
incf addr,f ; incremento contador de memoria
; ciclo principal del programa
Bucle
btfss Write,0 ; programa se mantiene preguntando si debe o no escribir en memoria
goto Bucle ; esto ocurre cuando se ha recivido un set de valores nuevos para
; los contadores y luego se reinicia el programa
;movlw b'00100000'
;xorwf PORTB,f
clrf addr ; limpio la direecion
movfw addr ; cargo direccion en W
bsf STATUS, RP0 ; Bank 1
movwf EEADR ; Address to write
bcf STATUS, RP0 ; Bank 0
movfw Sleep_temp ; cargo dato a escribir en W
call Escribir ; llamo a rutina de escritura en eprom
incf addr,f ;incremento direccion
movfw addr ; cargo direccion en W
bsf STATUS, RP0 ; Bank 1
movwf EEADR ; Address to write
bcf STATUS, RP0 ; Bank 0
movfw ON_temp ; cargo dato a escribir en W
call Escribir ; llamo a rutina de escritura en eprom
incf addr,f ;incremento direccion
movfw addr ; cargo direccion en W
bsf STATUS, RP0 ; Bank 1
movwf EEADR ; Address to write
bcf STATUS, RP0 ; Bank 0
movfw OFF_temp ; cargo dato a escribir en W
call Escribir ; llamo a rutina de escritura en eprom
bcf PIR1,RCIF ; Limpiamos bandera de interrupcion por recepcion serie
bcf PIR1,TMR1IF ; Borro bandera de control de Interrupcion por timer
goto Inicio ; reinicio el programa
;subrutina de escritura
Escribir
BSF STATUS, RP0 ; Bank 1
movwf EEDATA ; mover dato a escribir
BSF EECON1, WREN ; Enable write
BCF INTCON, GIE ; Disable INTs.
MOVLW 0x55 ;
MOVWF EECON2 ; Write 55h
MOVLW 0xAA ;
MOVWF EECON2 ; Write AAh
BSF EECON1,WR ; Set WR bit
; begin write
btfsc EECON1,WR ;esperar a que termine (10 ms)
goto $-1
BCF EECON1, WREN ; Disable write
BSF INTCON, GIE ; Enable INTs.
bcf STATUS, RP0 ; Bank 0
return
Parpadear
incf Cont_parp,f
movlw b'00000011'
xorwf PORTA,f ; hago togle para prender o apagar salidas
movlw d'6'
subwf Cont_parp,w
btfsc STATUS,Z
bsf flagP,0
goto Load_Timer
; actualizacion contadores
Timer
btfss flagP,0
goto Parpadear
Load_Timer
movlw 0x0B ; recargo timer con 500 seg
movwf TMR1H
movlw 0xDB
movwf TMR1L
incf Segundos,f ; incremento segundos
movlw d'120' ;120 debe ser en realidad
subwf Segundos,w
btfss STATUS,Z
goto Fin_ISR ;vuelvo de interrupcion
clrf Segundos
;movlw b'10000000'
;xorwf PORTB,f
incf Minutos,f ;incremento minutos
movfw tiempo ;muevo el tiempo que debe pasar a W
subwf Minutos,w
btfss STATUS,Z
goto Fin_ISR ;vuelvo de interrupcion
clrf Minutos
; tengo que cargar nuevo temporizador en tiempo usando addr
; en este punto addr vale 01 o 10
movfw addr ; cargo direccion en W
bsf STATUS, RP0 ; Bank 1
movwf EEADR ; Address to read
bsf EECON1, RD ; EE Read
movfw EEDATA ; W = EEDATA
bcf STATUS, RP0 ; Bank 0
movwf tiempo ; paso valor a variable tiempo
;movwf PORTB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movlw b'00000011'
xorwf addr,f ; hago togle para pasar de 01 a 10 en addr
xorwf PORTA,f ; hago togle para prender o apagar salidas
goto Fin_ISR
;**** Rutina de atencion de Interrupcion ****
;**** Interrupcion por Usart (Recepcion de Dato)****
ISR
btfss PIR1,TMR1IF ; Consultamos si es por timer 1
goto ISR2 ; vamos a preguntar si es por usart
goto Timer
Fin_ISR
bcf PIR1,TMR1IF ; Borro bandera de control de Interrupcion por timer
retfie
ISR2
btfss PIR1,RCIF ; Consultamos si es Usart.-
retfie ; No, Salimos de interrupción.-
movfw RCREG ; Llego dato, lo guardamos en registro W
movwf Temp ; rescato el dato
movlw 0x30 ; resto 30 al ascii del numero para quedar con numero
subwf Temp,w ; dejo resultado en w
;movwf PORTB ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
btfss Flag,0 ; pregunto si flag vale 1
goto $+4 ; si vale 1 recibo unidad, si vale 0 recibo decena
movwf Dato_Uni ; recivo unidad y proceso datos
bcf Flag,0
goto $+4 ; voy a procesar datos
movwf Dato_Dec ;recibo decena y termino interrupcion
bsf Flag,0
goto Fin_ISR2
;comienzo operacion sobre decena
bcf STATUS,C ;limpio carry
rlf Dato_Dec,w ; roto una vez y guardo en W (multx2)
rlf Dato_Dec,f ;roto 3 veces y guardo en f(multx8)
rlf Dato_Dec,f
rlf Dato_Dec,f
addwf Dato_Dec,w ; sumo multx2 y multx8 = multx10 y resultado en w
addwf Dato_Uni,f ; sumo decena con unidad y tengo valor ingresado
;busco que dato fue el que llego
movlw d'0'
subwf flagS,w
btfss STATUS,Z
goto $+5 ;5 sin portB
movfw Dato_Uni
;movlw d'5'
movwf Sleep_temp
;movwf PORTB ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
incf flagS,f
goto Fin_ISR2
movlw d'1'
subwf flagS,w
btfss STATUS,Z
goto $+5
movfw Dato_Uni
;movlw d'2'
movwf ON_temp
incf flagS,f
goto Fin_ISR2
movfw Dato_Uni
;movlw d'3'
movwf OFF_temp
bsf Write,0
;goto Fin_ISR2
Fin_ISR2
bcf PIR1,RCIF ; Limpiamos bandera de interrupcion por recepcion serie
retfie ; Salimos de interrupción.-
;...............................................
end