TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: electronico39 en 20 de Octubre de 2011, 16:59:29
-
Hola a todos, que haría yo sin vosotros, muchas gracias a todos.
Os cuento mi problema. He hecho ya varios programas y todos me han funcionado muy bien, pero en este estoy atascado y no se donde está en fallo. Se trata de un reloj digital que a su vez me marca dos temperaturas, con el LM335. Lo estoy haciendo con unos displays de doble led rojo y verde. Cuando arranca el programa lo primero que marca es la hora, despues de 10 sg marca la temperatura de un LM335 y a los 5 sg marca la otra temperatura de otro LM335, y despues vuelve a marcar la hora. Y así sucesivamente.
Bueno pues el problema que me encuentro cuando lo pongo a correr en el simulador de MPLAB, pongo un breakpoint para comprobar el tiempo en un minuto, y para correctamente en el breakpoint. Veo el tiempo y va de lujo, se para a los 60.0002 segundos, que ya es muy exacto. Hasta aquí todo bien, pero cuando le doy al run para comprobar el segundo minuto se para en otra dirección del programa a los 49 segundos mas o menos, y no encuentro el fallo.
Me gustaría saber porque motivos se para el programa antes del punto de ruptura como en mi caso. Esto lo tengo montado en la protoboard y no funciona bien por que se adelanta bastante.
muchas gracias a todos y un saludo.
-
Hola electronico39,
mas que un problema con el simulador parece mas un problema con tu codigo, ya que en el protoboard tampoco funciona correctamente, si el programa se detiene en otro lado, adivinado podria ser que no estes volviendo a iniciar correctamente las variables, o talvez estas usando interrupciones para generar la demora y no las estes manejando apropiadamente, si estas usando mas de una pagina de memoria de programa talvez no estas manejando los saltos correctamente, en fin pueden ser varias cosas, seria mejor si dijeras el micro que estas usando y si es posible postees el codigo o parte del codigo que estes usando.
Saludos
-
Hola sander, gracias por contestar.
El micro que utilizo es el 16f876, y el codigo no lo puedo postesar porque no estoy en mi ordenador, cuando pueda lo postearé para que lo veas y ver posibles errores que hay en él, para corregirlos y tambien si alguien le interesa lo puede montar.
Un saludo.
-
Bueno, aquí os dejo el código para que le echeis un vistazo y ver lo errores que tengo. Seguro que tengo muchos por que he hecho pocos programas y no tengo mucha soltura en ellos, pero poco a poco iré aprendiendo y corregir muchos errores y realizar los programas mas completos y sin errores.
El programa funciona mas o menos bien a pesar del adelanto que lleva el reloj, por que me hace bien los cambios a temperatura y a volver a marcar la hora. Si pudiera, os ponía un pequeño video donde se puede ver como funciona.
Bueno aquí os dejo el codigo entero:
;***************************
;*** RELOJ DIGITAL CON DISPLAYS DE 7 SEGMENTOS Y DOS TERMOMETROS ***
;***************************
LIST P=16F876
#INCLUDE <P16F876.INC>
INDO EQU 0X00
TMR0 EQU 0X01
PCL EQU 0X02
FSR EQU 0X04
ESTADO EQU 0X03
PTOA EQU 0X05
PTOB EQU 0X06
PTOC EQU 0X07
TRISA EQU 0X85
TRISB EQU 0X86
TRISC EQU 0X87
OPCION EQU 0X81
INTCON EQU 0X0B
ADCON0 EQU 0X1F
ADCON1 EQU 0X9F
ADRESH EQU 0X1E
ADRESL EQU 0X9E
BINARIO EQU 0X20
CENTENA EQU 0X21
DECENA EQU 0X22
UNIDAD EQU 0X23
DIG1 EQU 0X24
DIG2 EQU 0X25
DIG3 EQU 0X26
DIG4 EQU 0X27
ROTA EQU 0X28
REG1 EQU 0X29
REG2 EQU 0X2A
REG3 EQU 0X2B
REG4 EQU 0X2C
REG5 EQU 0X39
REG6 EQU 0X3A
REG7 EQU 0X3B
REG8 EQU 0X3C
DIVIDENDO EQU 0X2D
DIVISOR EQU 0X2E
COCIENTE EQU 0X2F
AUXILIAR EQU 0X30
DATO EQU 0X31
MULTIP EQU 0X32
PRODUCTO EQU 0X33
RESULTADO EQU 0X34
RESTADO EQU 0X35
RESTADO2 EQU 0X36
LETRA EQU 0X37
MULTIPH EQU 0X38
MULTIPL EQU 0X3D
CONTA EQU 0X3E ;CONTADOR DE SEGUNDOS
CONTB EQU 0X3F
CONTC EQU 0X40
TEMP1 EQU 0X41 ;REGISTROS TEMPORALES PARA GUARDAR DATOS Y DESPUES DE
TEMP2 EQU 0X42 ;LAS INTERRUPCIONES RECUPERARLOS
TEMP3 EQU 0X43
TEMP4 EQU 0X44
TEMP5 EQU 0X45
TIEMPO EQU 0X46
RESET ORG 0X00
GOTO INICIO
ORG 0X04 ;AQUI ES DONDE EMPIEZA LA INTERRUPCION
hayint movwf TEMP5
btfss INTCON,2 ;se ha activado la interrupcion por el TMR0?
goto inicia ;si no es por TMR0 comprueva si es por el puerto B
nop
nop
bien decfsz REG5,1 ;registro que decrementa cada vez que se desborda el TMR0
goto borra
goto compr
inicia btfsc PTOB,0
goto sal
call RETARDO2
Phora btfsc PTOB,0
goto inicia
clrf CONTA ;reseteamos el contador de segundos, para que empiece cuando soltemos
btfsc PTOB,1 ;pulsador de incrementar minutos
goto hora
call RETARDO
btfss PTOB,1
goto Phora
incf TEMP1,1
movf TEMP1,w
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
xorlw 0x0a
btfsc ESTADO,2
goto decena
goto comien
goto inicia
decena clrf TEMP1
call RETARDO
incf TEMP2,1
movf TEMP2,w
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
xorlw 0x06
btfsc ESTADO,2
clrf TEMP2
goto comien
goto inicia
hora btfsc PTOB,2 ;pulsador de incrementar horas
goto comien
call RETARDO
btfss PTOB,2
goto hora
incf TEMP3,1
movf TEMP3,w
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
xorlw 0x04
btfsc ESTADO,2
goto son24
movf TEMP3,w
xorlw 0x0a
btfsc ESTADO,2
goto no24
goto comien
goto inicia
sal bcf INTCON,1 ;borra la bandera de interrupcion del puerto B
borra bcf INTCON,2 ;borra la bandera de interrupcion del TMR0
bcf INTCON,0 ;borra la bandera de interrupcion por cambio de RB4 A RB7
movlw 0x3C
movwf REG6
movlw 0xd7
movwf TMR0
movf TEMP5,W
retfie
INICIO
BSF ESTADO,5
MOVLW 0X0F ;PUERTO A (AN0 Y AN1 ENTRADAS) EL RESTO SALIDAS
MOVWF TRISA
MOVLW 0X07
MOVWF TRISB ;PUERTO B TRES ENTRADAS Y EL RESTO SALIDAS
CLRF TRISC ;PUERTO C COMO SALIDAS
MOVLW 0X80
MOVWF OPCION
MOVLW 0X0D
MOVWF ADCON1
BCF ESTADO,5
MOVLW 0XB0
MOVWF INTCON ;HABILITA LAS INTERRUPCIONES POR PTOB Y TMR0
MOVLW 0X41
MOVWF ADCON0
BCF ESTADO,0
BCF ESTADO,1
BCF ESTADO,2
CLRF PTOA
CLRF PTOB
CLRF PTOC
CLRF ADRESH
CLRF ADRESL
MOVLW 0X20
MOVWF FSR
OTRO CLRF INDO
INCF FSR
MOVF FSR,W
XORLW 0X47
BTFSS ESTADO,2
GOTO OTRO
MOVLW 0X64
MOVWF REG5
MOVLW 0X3C
MOVWF REG6
MOVLW 0Xd7
MOVWF TMR0
MOVLW 0X8E
MOVWF RESTADO
MOVLW 0X8E
MOVWF RESTADO2
MOVLW 0x64
MOVWF ROTA
MOVLW 0X32
MOVWF CONTB
MOVLW 0X09
MOVWF CONTC
GOTO comien
MARCAT MOVLW 0X45
MOVWF ROTA
MOVLW 0X03
MOVWF CONTC
BCF PTOA,5
CALL CONFIG_ADC
BSF ADCON0,0
CALL RETARDO2
CALL ADQUISICION1
RETURN
;========================== rutina que cuenta los milisegundos hasta llegar a un segundo=======================
compr
movlw 0x64 ;carga con 100 el registro reg5
movwf REG5
mas decfsz CONTB,1
goto borra
movlw 0x32 ;carga con 50 el registro CONTB
movwf CONTB
incf REG7,1
movf REG7,w
xorlw 0x01
btfsc ESTADO,2
goto LED
goto noleds
return
noleds movf REG7,W
xorlw 0x02
btfsc ESTADO,2
goto segundo
btfsc INTCON,2
goto borra
RETURN
LED movf DIG3,W ;comprueva si esta marcando temperatura
xorlw 0x0A ; si es asi, no enciendas los leds
btfsc ESTADO,2
GOTO borra
BSF PTOA,5
goto borra
return
;=========================rutina que cuenta los segundos hasta llegar a 60s======================
segundo
BCF PTOA,5
clrf REG7
incf CONTA,1
movf CONTA,w
xorlw 0x3c ;COMPARA SI LLEGA A 60
btfsc ESTADO,2
goto minuto
goto borra
return
comien CLRF DIG3
MOVLW 0XF0
MOVWF PTOC
BSF PTOC,7 ;APAGA EL PUNTO DE GRADOS
movf TEMP4,w
xorlw 0x00
btfsc ESTADO,2
goto tres
cuatro movlw 0xF0
movwf PTOB
movf TEMP4,W
movwf PTOC
BSF PTOC,7
BSF PTOC,6
BSF PTOC,5
BSF PTOC,4
movlw 0x70
movwf PTOB
call RETARDO
tres movlw 0xF0
movwf PTOB
movf TEMP3,w
movwf PTOC
BSF PTOC,7
BSF PTOC,6
BSF PTOC,5
BSF PTOC,4
movlw 0xB0
movwf PTOB
call RETARDO
movlw 0xF0
movwf PTOB
movf TEMP2,w
movwf PTOC
BSF PTOC,7
BSF PTOC,6
BSF PTOC,5
BSF PTOC,4
movlw 0xD0
movwf PTOB
call RETARDO
movlw 0xF0
movwf PTOB
movf TEMP1,w
movwf PTOC
BSF PTOC,7
BSF PTOC,6
BSF PTOC,5
BSF PTOC,4
movlw 0xE0
movwf PTOB
call RETARDO
movlw 0xF0
movwf PTOB
btfsc PTOB,0 ;si se pulsa el pulsador de puesta en
goto TEMP ;en hora, se produce una interrupcion
goto hayint ;por RB0.
TEMP btfsc INTCON,1
goto sal
btfsc INTCON,2
goto sal
decfsz ROTA
goto comien
movlw 0x64
movwf ROTA
decfsz CONTC
goto comien
call RETARDO
goto MARCAT
return
minuto
clrf CONTA
incf TEMP1,1
movf TEMP1,w
movwf PTOC
xorlw 0x0a
btfsc ESTADO,2
goto decen
goto borra
return
decen clrf TEMP1
movf 0x00
movwf PTOC
incf TEMP2,1
movf TEMP2,w
movwf PTOC
xorlw 0x06
btfsc ESTADO,2
goto cente
goto borra
return
cente clrf TEMP1
clrf TEMP2
movf 0x00
movwf PTOC
incf TEMP3,1
movf TEMP3,w
movwf PTOC
xorlw 0x04
btfsc ESTADO,2
goto compru
movf TEMP3,w
xorlw 0x0a
btfsc ESTADO,2
goto dech
goto borra
return
compru movf TEMP4,w
xorlw 0x02
btfsc ESTADO,2
goto cero
goto borra
goto comien
return
cero clrf CONTA
clrf TEMP1
clrf TEMP2
clrf TEMP3
clrf TEMP4
goto borra
goto comien
return
son24 movf TEMP4,w
xorlw 0x02
btfsc ESTADO,2
goto si24
goto comien
return
si24 clrf TEMP3
clrf TEMP4
goto inicia
no24 clrf TEMP3
call RETARDO
incf TEMP4,1
movf TEMP4,w
movwf PTOC
goto comien
return
dech clrf TEMP1
clrf TEMP2
clrf TEMP3
bcf ESTADO,0
movf 0x00
movwf PTOC
incf TEMP4,1
movf TEMP4,w
movwf PTOC
goto borra
goto comien
return
;************************RUTINA PARA CONVERTIR BINARIO A BCD**************************
Binario_BCD1
movwf BINARIO
movwf UNIDAD
clrf DECENA
clrf CENTENA
BCD_01
movlw d'10'
subwf UNIDAD,W
btfss STATUS,C
goto BCD_Fin1
BCD_1
movwf UNIDAD
incf DECENA,f
movlw d'10'
subwf DECENA,W
btfss STATUS,C
goto BCD_01
BCD_Fin1
movf UNIDAD,W
movwf DIG1
movf DECENA,W
movwf DIG2
movlw 0X0A
movwf CENTENA ;LETRA C
movf CENTENA,W
movwf DIG3
movlw 0x0F
movwf LETRA
movf LETRA,W
movwf DIG4
goto MULTIPLEXADO1
return
;*********************************RUTINA PARA CONVERTIR DE BINARIO A BCD**************************************
Binario_BCD2
movwf BINARIO
movwf UNIDAD
clrf DECENA
clrf CENTENA
BCD_02
movlw d'10'
subwf UNIDAD,W
btfss STATUS,C
goto BCD_Fin2
BCD_1A
movwf UNIDAD
incf DECENA,f
movlw d'10'
subwf DECENA,W
btfss STATUS,C
goto BCD_02
;BCD_2 clrf DECENA
; incf CENTENA,f
; goto BCD_0
BCD_Fin2
movf UNIDAD,W
movwf DIG1
movf DECENA,W
movwf DIG2
movlw 0X0A
movwf CENTENA ;LETRA C
movf CENTENA,W
movwf DIG3
movlw 0X0F
movwf LETRA
movf LETRA,W
movwf DIG4
goto MULTIPLEXADO2
return
;*******************************MULTIPLEXADO DE LOS DISPLAYS ROJOS***************************************************
MULTIPLEXADO1
BCF PTOA,5
CALL RETARDO
movlw 0XF0
movwf PTOC
movf DIG4,w
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
bcf PTOC,7
call RETARDO
btfsc PTOB,3
goto ACTIVA
goto posit
ACTIVA movlw 0xE8
movwf PTOB
call RETARDO
movlw 0xF8
movwf PTOB
movf DIG3,W
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
bcf PTOC,7
movlw 0xD8
movwf PTOB
call RETARDO
movlw 0xF8
movwf PTOB
movf DIG2,W
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
bcf PTOC,7
movlw 0xB8
movwf PTOB
call RETARDO
movlw 0xF8
movwf PTOB
movf DIG1,W
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
bcf PTOC,7
movlw 0x78
movwf PTOB
call RETARDO
movlw 0xF8
movwf PTOB
goto sigo
posit movlw 0x70
movwf PTOB
call RETARDO
movlw 0xF0
movwf PTOB
movf DIG3,w
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
bcf PTOC,7
movlw 0xD0
movwf PTOB
call RETARDO
movlw 0xF0
movwf PTOB
movf DIG2,w
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
bcf PTOC,7
movlw 0x70
movwf PTOB
call RETARDO
movlw 0xF0
movwf PTOB
movf DIG1,w
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
bcf PTOC,7
movlw 0xB0
movwf PTOB
call RETARDO
movlw 0xF0
movwf PTOB
sigo decfsz ROTA,1
goto NO1
movlw 0x7F
movwf ROTA
decfsz CONTC,1
goto MULTIPLEXADO1
call RETARDO
movlw 0x02
movwf CONTC
goto ADQUISICION2
NO1 btfsc PTOB,0
goto MULTIPLEXADO1
goto INICIO
return
;******************************MULTIPLEXADO DE LOS SEGUNDOS DISPLAYS VERDES*******************************
MULTIPLEXADO2
BCF PTOA,5
call RETARDO
BTFSC PTOB,3
BSF PTOB,3 ; SI ES TEMPERATURA NEGATIVA, DEJA EL LED ENCENDIDO
movlw 0xF0
movwf PTOC
bcf PTOC,7
movf DIG3,W
movwf PTOC
BSF PTOC,4
BSF PTOC,5
bcf PTOC,6
bcf PTOC,7
call RETARDO
bSf PTOC,6
movf DIG2,W
movwf PTOC
BSF PTOC,4
bCf PTOC,5
BSF PTOC,6
bcf PTOC,7
call RETARDO
bSf PTOC,5
movf DIG1,W
movwf PTOC
bCf PTOC,4
BSF PTOC,5
BSF PTOC,6
bcf PTOC,7
call RETARDO
bSf PTOC,4
decfsz ROTA,1
goto NO2
movlw 0x64
movwf ROTA
decfsz CONTC,1
goto MULTIPLEXADO2
movlw 0x0A
movwf CONTC
goto comien
NO2 btfsc PTOB,0
goto MULTIPLEXADO2
goto INICIO
return
;*****************************RUTINA DE RETARDO****************************
RETARDO
RETARDA MOVLW .249
MOVWF REG1
MOVLW .249
MOVWF REG2
MOVLW .250
MOVWF REG3
TRES clrwdt
DECFSZ REG3,1
GOTO TRES
DOS DECFSZ REG2,1
GOTO DOS
UNO
DECFSZ REG1,1
GOTO UNO
RETURN
;*******************************RETARDO PARA LA CONVERSION****************************************************
RETARDO2
nop
movlw .240
movwf REG4
ciclo
nop
decfsz REG4,1
goto ciclo
return
;*********************************RUTINA PARA LA CONFIGURACION DE MODULO ADC*************************************
CONFIG_ADC
bsf ESTADO,5
movlw b'00001101' ;activamos el AN0 y AN1 como canal analogico,AN2 Y AN3 como Vref+ y Vref- y justificacion a la izquierda
movwf ADCON1
bcf ESTADO,5 ;VOLVEMOS AL BANCO 0
movlw b'01000001' ;elegimos la frecuencia de reloj de Fosc/8 para la conversion
movwf ADCON0
bsf ADCON0,0 ;ENCIENDE EL ADC
return
;*********************************RUTINA DE ADQUISICION***********************************************************
ADQUISICION1
movlw b'01000001'
movwf ADCON0 ;ACTIVAMOS EL CANAL AN0 Y Fosc/8
bsf ADCON0,2 ;ACTIVA EL BIT DE LA CONVERSION
ESPERA btfsc ADCON0,2 ;HA TERMINADO LA CONVERSION?
goto ESPERA ;ESPERA A QUE TERMINE
call RETARDO2
bcf ESTADO,2
movf ADRESH,W ;SI, CARGA EN W LOS 8 LBS
goto MULTIPLICACION1 ;CONVIERTELO A ESCALA
bsf ESTADO,5 ;PASAMOS AL BANCO 1
movf ADRESL,W ;CARGA EN W LOS 2 LBS MENOS SIGNIFICATIVOS
bcf ADCON0,2 ;DESACTIVA EL BIT DE LA CONVERSION
bcf ESTADO,5 ;PASAMOS AL BANCO 0
movwf PTOC ;LOS ENVIAS AL PUERTO C
return
;********************************RUTINA DE ADQUISICION2 PARA LA ENTRADA AN1********************************
ADQUISICION2
movlw b'01001001' ;FRECUENCIA DE RELOJ Fosc/8 Y ACTIVAMOS EL AN1
movwf ADCON0
bsf ADCON0,0 ;ENCIENDE EL ADC
call RETARDO2
bsf ADCON0,2 ;ACTIVA EL BIT DE LA CONVERSION
ESPERA2 btfsc ADCON0,2 ;HA TERMINADO LA CONVERSION?
goto ESPERA2
call RETARDO2
movf ADRESH,W ;SI, CARGA EN W LOS 8 LBS
goto MULTIPLICACION2
bsf ESTADO,5 ;PASAMOS AL BANCO 1
movf ADRESL,W ;CARGA EN W LOS 2 LBS MENOS SIGNIFICATIVOS
bcf ADCON0,2 ;DESACTIVA EL BIT DE LA CONVERSION
bcf ESTADO,5 ;PASAMOS AL BANCO 0
movwf PTOC ;LOS ENVIAS A LOS DISPLAYS
return
;*******************************RUTINA PARA DIVIDIR EL VALOR ANALOGICO POR ? DEL PRIMER SENSOR *******************************
DIVISION
movwf AUXILIAR ;CARGAMOS EL REGISTRO AUXILIAR CON EL VALOR DE ADRESH
movlw 0x01 ;Y LO DIVIDIMOS POR 25
movwf DIVISOR
clrf COCIENTE ;BORRAMOS EL REGISTRO DEL RESULTADO Y RESULTADOS ANTERIORES
DIV1
incf COCIENTE,1
movf DIVISOR,w
subwf AUXILIAR,1
btfsc STATUS,C
goto DIV1
decfsz COCIENTE,1
goto SEGUIMOS
movf MULTIPH,W
xorlw 0x00
btfsc ESTADO,2
goto FIN
decf MULTIPH,1
incf COCIENTE,1
goto DIV1
FIN addwf AUXILIAR,W
movwf AUXILIAR
movf COCIENTE,W
goto RESTA
SEGUIMOS
movf MULTIPH,W
xorlw 0x00
btfsc ESTADO,2
goto FIN
decf MULTIPH,1
goto DIV1
return
;****************************RUTINA DE RESTA****************************
RESTA2 movf RESTADO2,W
subwf COCIENTE,W
btfss ESTADO,0 ;SI HAY CARRY, ES QUE EL VALOR ES NEGATIVO
goto NEGATIVO2
movwf RESULTADO
movf RESULTADO,W
bcf PTOB,3 ;APAGA EL LED DE NEGATIVO
goto Binario_BCD2
return
NEGATIVO2
movf COCIENTE,W ;CARGA EN W EL VALOR DEL RESULTADO DE LA DIVISION
subwf RESTADO2,W ;Y LO RESTAMOS CON EL VALOR QUE TENEMOS CARGADO EN RESTADO
movwf RESULTADO
movf RESULTADO,W
bsf PTOB,3 ;ACTIVA LE LED DE NEGATIVO
goto Binario_BCD2
return
RESTA movf RESTADO,W
subwf COCIENTE,W
btfss ESTADO,0 ;SI HAY CARRY, ES QUE EL VALOR ES NEGATIVO
goto NEGATIVO
movwf RESULTADO
movf RESULTADO,W
bcf PTOB,3 ;APAGA EL LED DE NEGATIVO
goto Binario_BCD1
return
NEGATIVO
movf COCIENTE,W ;CARGA EN W EL VALOR DEL RESULTADO DE LA DIVISION
subwf RESTADO,W ;Y LO RESTAMOS CON EL VALOR QUE TENEMOS CARGADO EN RESTADO
movwf RESULTADO
movf RESULTADO,W
bsf PTOB,3 ;ACTIVA LE LED DE NEGATIVO
goto Binario_BCD1
return
;******************************RUTINA PARA LA DIVISION DEL SEGUNDO SENSOR************************
DIVISION2
movwf AUXILIAR ;CARGAMOS EL REGISTRO AUXILIAR CON EL VALOR DE ADRESH
movlw 0x01 ;Y LO DIVIDIMOS POR ?
movwf DIVISOR
clrf COCIENTE ;BORRAMOS EL REGISTRO DEL RESULTADO Y RESULTADOS ANTERIORES
DIV2
incf COCIENTE,1
movf DIVISOR,w
subwf AUXILIAR,1
btfsc STATUS,C
goto DIV2
decfsz COCIENTE,1
goto SEGUIMOS2
movf MULTIPH,W
xorlw 0x00
btfsc ESTADO,2
goto FIN2
decf MULTIPH,1
incf COCIENTE,1
goto DIV2
FIN2
addwf AUXILIAR,W
movwf AUXILIAR
movf COCIENTE,W
goto RESTA2
SEGUIMOS2
movf MULTIPH,W
xorlw 0x00
btfsc ESTADO,2
goto FIN2
decf MULTIPH,1
goto DIV2
return
;*********************************RUTINA PARA MULTIPLICAR POR 10 EL RESULTADO DE LA DIVISION1 *********************
MULTIPLICACION1
clrf MULTIP
movlw 0x01
movwf PRODUCTO
MULTI0 movf ADRESH,W
movwf COCIENTE
MULTI1 addwf MULTIP,1
decfsz PRODUCTO,1
btfsc ESTADO,0
goto FIN_MULTIP1
goto MULTI1
FIN_MULTIP1
btfsc ESTADO,0
incf MULTIPH,1 ;SI HAY ACARREO ES POR QUE EL NUMERO ES MAYOR DE 255
movf PRODUCTO,W
xorlw 0x00
btfsc ESTADO,2
goto TERMINO
bcf ESTADO,0
goto MULTI0
TERMINO movf MULTIP,W
goto DIVISION
;**********************************RUTINA PARA MULTIPLICAR POR ? EL RESULTADO DE DIVISION2************************
MULTIPLICACION2
clrf MULTIP
movlw 0x01
movwf PRODUCTO
MULTI3 movf ADRESH,W
movwf COCIENTE
MULTI2 addwf MULTIP,1
decfsz PRODUCTO,1
btfsc ESTADO,0
goto FIN_MULTIP2
goto MULTI2
FIN_MULTIP2
btfsc ESTADO,0
incf MULTIPH,1 ;SI HAY ACARREO ES POR QUE EL NUMERO ES MAYOR DE 255
movf PRODUCTO,W
xorlw 0x00
btfsc ESTADO,2
goto TERMINO2
bcf ESTADO,0
goto MULTI3
TERMINO2
movf MULTIP,W
goto DIVISION2
END
-
¿En qué parte del programa se para la simulación? ¿en el mismo breakpoint? ¿en otro?.
Por las dudas, borrá todos los breakpoint y volvé a crear los que necesitas. A mi me ha pasado que, he modificado el programa en donde tenía un breakpoint, este desaparecía pero seguía activo. Me causó más de un dolor de cabeza.
Una de las causas por la que para la simulación, es por desborde de la pila. Chequea que no te esté pasando eso.
-
Gracias Leon Pic por contestar, ya realicé lo de desactivar y borrar todos los breakpoint y poner nuevos, y sigue parandose en el mismo sitio, y lo que si creo, es que puede ser por desborde de la pila, pero ahora mismo no se como se chequea. Lo miraré y probaré a ponerlo en marcha y os comento.
Por cierto, este programa funciona mal ya que hice varias modificaciones para probar si lo solucionaba, y cuando grabé en el Pic no funciona bien. Cuando lo resuelva os paso el bueno.
Un saludo
-
Bueno, parece ser que lo tengo corregido, y efectivamente era la pila que se desbordaba. Lo tengo rulando mas de tres horas y sin ningún error y todo correcto. Primero lo probé en el simulador de MPLAB, y muy bien, podía simularlo perfectamente con breakpoint en cualquier punto, que se paraba en el breakpiont. Para probar el tiempo puse un breakpoint para cuando llegase a 60 minutos y perfecto.
Así es que lo grabé en el PIC, y al protoboard. Que MARAVILLA, cuando ves que funciona correctamente.
Aquí os dejo el código para el que quiera y pueda montárselo, un saludo y muchas gracias. Estaré en contacto para ayudaros en lo que yo pueda. Mi correo electronico es: jm1polan@hotmail.com
EL CÓDIGO:
;*******************************************************************
;*** RELOJ DIGITAL CON DISPLAYS DE 7 SEGMENTOS Y DOS TERMOMETROS ***
;*** CON DOS SENSORES LM335 DE -50ºC A 100ºC ***
;*******************************************************************
LIST P=16F876
#INCLUDE <P16F876.INC>
INDO EQU 0X00
TMR0 EQU 0X01
PCL EQU 0X02
FSR EQU 0X04
ESTADO EQU 0X03
PTOA EQU 0X05
PTOB EQU 0X06
PTOC EQU 0X07
TRISA EQU 0X85
TRISB EQU 0X86
TRISC EQU 0X87
OPCION EQU 0X81
INTCON EQU 0X0B
ADCON0 EQU 0X1F
ADCON1 EQU 0X9F
ADRESH EQU 0X1E
ADRESL EQU 0X9E
BINARIO EQU 0X20
CENTENA EQU 0X21
DECENA EQU 0X22
UNIDAD EQU 0X23
DIG1 EQU 0X24
DIG2 EQU 0X25
DIG3 EQU 0X26
DIG4 EQU 0X27
ROTA EQU 0X28
REG1 EQU 0X29
REG2 EQU 0X2A
REG3 EQU 0X2B
REG4 EQU 0X2C
REG5 EQU 0X39
REG6 EQU 0X3A
REG7 EQU 0X3B
REG8 EQU 0X3C
DIVIDENDO EQU 0X2D
DIVISOR EQU 0X2E
COCIENTE EQU 0X2F
AUXILIAR EQU 0X30
DATO EQU 0X31
MULTIP EQU 0X32
PRODUCTO EQU 0X33
RESULTADO EQU 0X34
RESTADO EQU 0X35
RESTADO2 EQU 0X36
LETRA EQU 0X37
MULTIPH EQU 0X38
MULTIPL EQU 0X3D
CONTA EQU 0X3E ;CONTADOR DE SEGUNDOS
CONTB EQU 0X3F
CONTC EQU 0X40
TEMP1 EQU 0X41 ;REGISTROS TEMPORALES PARA GUARDAR DATOS Y DESPUES DE
TEMP2 EQU 0X42 ;LAS INTERRUPCIONES RECUPERARLOS
TEMP3 EQU 0X43
TEMP4 EQU 0X44
TEMP5 EQU 0X45
TIEMPO EQU 0X46
RESET ORG 0X00
GOTO INICIO
ORG 0X04 ;AQUI ES DONDE EMPIEZA LA INTERRUPCION
hayint movwf TEMP5
btfss INTCON,2 ;se ha activado la interrupcion por el TMR0?
goto inicia ;si no es por TMR0 comprueva si es por el puerto B
nop
nop
bien decfsz REG5,1 ;registro que decrementa cada vez que se desborda el TMR0
goto borra
goto compr
inicia btfsc PTOB,0
goto sal
call RETARDO
Phora btfsc PTOB,0
goto inicia
clrf CONTA ;reseteamos el contador de segundos, para que empiece cuando soltemos
btfsc PTOB,1 ;pulsador de incrementar minutos
goto hora
call RETARDO
btfss PTOB,1
goto Phora
incf TEMP1,1
movf TEMP1,w
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
xorlw 0x0a
btfsc ESTADO,2
goto decena
goto comien
goto inicia
decena clrf TEMP1
call RETARDO
incf TEMP2,1
movf TEMP2,w
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
xorlw 0x06
btfsc ESTADO,2
clrf TEMP2
goto comien
goto inicia
hora btfsc PTOB,2 ;pulsador de incrementar horas
goto comien
call RETARDO
btfss PTOB,2
goto hora
incf TEMP3,1
movf TEMP3,w
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
xorlw 0x04
btfsc ESTADO,2
goto son24
movf TEMP3,w
xorlw 0x0a
btfsc ESTADO,2
goto no24
goto comien
goto inicia
sal bcf INTCON,1 ;borra la bandera de interrupcion del puerto B
borra bcf INTCON,2 ;borra la bandera de interrupcion del TMR0
bcf INTCON,0 ;borra la bandera de interrupcion por cambio de RB4 A RB7
movlw 0x3C
movwf REG6
movlw 0xd7
movwf TMR0
movf TEMP5,W
clrwdt
retfie
INICIO
BSF ESTADO,5 ;PASAMOS AL BANCO 1
MOVLW 0X0F ;PUERTO A (AN0 Y AN1 ENTRADAS) EL RESTO SALIDAS
MOVWF TRISA
MOVLW 0X07
MOVWF TRISB ;PUERTO B TRES ENTRADAS Y EL RESTO SALIDAS
CLRF TRISC ;PUERTO C COMO SALIDAS
MOVLW 0X80
MOVWF OPCION
MOVLW 0X0D
MOVWF ADCON1
BCF ESTADO,5
MOVLW 0XB0
MOVWF INTCON ;HABILITA LAS INTERRUPCIONES POR PTOB Y TMR0
MOVLW 0X41
MOVWF ADCON0
BCF ESTADO,0
BCF ESTADO,1
BCF ESTADO,2
CLRF PTOA
CLRF PTOB
CLRF PTOC
CLRF ADRESH
CLRF ADRESL
MOVLW 0X20
MOVWF FSR
OTRO CLRF INDO
INCF FSR
MOVF FSR,W
XORLW 0X47
BTFSS ESTADO,2
GOTO OTRO
MOVLW 0X64
MOVWF REG5
MOVLW 0X3C
MOVWF REG6
MOVLW 0Xd7
MOVWF TMR0
MOVLW 0X8E
MOVWF RESTADO
MOVLW 0X8E
MOVWF RESTADO2
MOVLW 0x64
MOVWF ROTA
MOVLW 0X32
MOVWF CONTB
MOVLW 0X09
MOVWF CONTC
GOTO comien
RETURN
MARCAT MOVLW 0X45
MOVWF ROTA
MOVLW 0X03
MOVWF CONTC
BCF PTOA,5
CALL CONFIG_ADC
BSF ADCON0,0
CALL RETARDO2
goto ADQUISICION1
RETURN
;========================== rutina que cuenta los milisegundos hasta llegar a un segundo=======================
;========================== encendemos y apagamos los leds que marcan los segundos cada =======================
;========================== 500ms por el bit 5 del puerto A ===================================================
compr
movlw 0x64 ;carga con 100 el registro reg5
movwf REG5
mas decfsz CONTB,1
goto borra
movlw 0x32 ;carga con 50 el registro CONTB
movwf CONTB
incf REG7,1
movf REG7,w
xorlw 0x01 ;si es uno, son 500ms
btfsc ESTADO,2
goto LED
goto noleds
noleds movf REG7,W
xorlw 0x02
btfsc ESTADO,2
goto segundo
goto borra
return
LED movf DIG3,W ;comprueva si esta marcando temperatura
xorlw 0x0A ; si es asi, no enciendas los leds
btfsc ESTADO,2
GOTO noleds
BSF PTOA,5
goto borra
return
;=========================rutina que cuenta los segundos hasta llegar a 60s======================
segundo
BCF PTOA,5
clrf REG7
incf CONTA,1
movf CONTA,w
xorlw 0x3c ;COMPARA SI LLEGA A 60
btfsc ESTADO,2
goto minuto
goto borra
return
;=========================COMENZAMOS EL MULTIPLEXADO DE LOS DISPLAYS DEL RELOJ===================
comien CLRF DIG3
MOVLW 0XF0
MOVWF PTOC
BSF PTOC,7 ;APAGA EL PUNTO DE GRADOS
movf TEMP4,w
xorlw 0x00
btfsc ESTADO,2
goto tres
cuatro movlw 0xF0
movwf PTOB
movf TEMP4,W
movwf PTOC
BSF PTOC,7
BSF PTOC,6
BSF PTOC,5
BSF PTOC,4
movlw 0x70
movwf PTOB
call RETARDO
tres movlw 0xF0
movwf PTOB
movf TEMP3,w
movwf PTOC
BSF PTOC,7
BSF PTOC,6
BSF PTOC,5
BSF PTOC,4
movlw 0xB0
movwf PTOB
call RETARDO
movlw 0xF0
movwf PTOB
movf TEMP2,w
movwf PTOC
BSF PTOC,7
BSF PTOC,6
BSF PTOC,5
BSF PTOC,4
movlw 0xD0
movwf PTOB
call RETARDO
movlw 0xF0
movwf PTOB
movf TEMP1,w
movwf PTOC
BSF PTOC,7
BSF PTOC,6
BSF PTOC,5
BSF PTOC,4
movlw 0xE0
movwf PTOB
call RETARDO
movlw 0xF0
movwf PTOB
btfsc PTOB,0 ;si se pulsa el pulsador de puesta en
goto TEMP ;en hora, se produce una interrupcion
goto hayint ;por RB0.
TEMP btfsc INTCON,1
goto sal
btfsc INTCON,2
goto borra
decfsz ROTA
goto comien
movlw 0x64
movwf ROTA
decfsz CONTC
goto comien
call RETARDO
goto MARCAT
return
minuto
clrf CONTA
incf TEMP1,1
movf TEMP1,w
movwf PTOC
xorlw 0x0a
btfsc ESTADO,2
goto decen
goto borra
return
decen clrf TEMP1
movf 0x00
movwf PTOC
incf TEMP2,1
movf TEMP2,w
movwf PTOC
xorlw 0x06
btfsc ESTADO,2
goto cente
goto borra
return
cente clrf TEMP1
clrf TEMP2
movf 0x00
movwf PTOC
incf TEMP3,1
movf TEMP3,w
movwf PTOC
xorlw 0x04
btfsc ESTADO,2
goto compru
movf TEMP3,w
xorlw 0x0a
btfsc ESTADO,2
goto dech
goto borra
return
compru movf TEMP4,w
xorlw 0x02
btfsc ESTADO,2
goto cero
goto borra
goto comien
return
cero clrf CONTA
clrf TEMP1
clrf TEMP2
clrf TEMP3
clrf TEMP4
goto borra
goto comien
return
son24 movf TEMP4,w
xorlw 0x02
btfsc ESTADO,2
goto si24
goto comien
return
si24 clrf TEMP3
clrf TEMP4
goto inicia
no24 clrf TEMP3
call RETARDO
incf TEMP4,1
movf TEMP4,w
movwf PTOC
goto comien
return
dech clrf TEMP1
clrf TEMP2
clrf TEMP3
bcf ESTADO,0
movf 0x00
movwf PTOC
incf TEMP4,1
movf TEMP4,w
movwf PTOC
goto borra
goto comien
return
;************************RUTINA PARA CONVERTIR BINARIO A BCD**************************
Binario_BCD1
movwf BINARIO
movwf UNIDAD
clrf DECENA
clrf CENTENA
BCD_01
movlw d'10'
subwf UNIDAD,W
btfss STATUS,C
goto BCD_Fin1
BCD_1
movwf UNIDAD
incf DECENA,f
movlw d'10'
subwf DECENA,W
btfss STATUS,C
goto BCD_01
BCD_Fin1
movf UNIDAD,W
movwf DIG1
movf DECENA,W
movwf DIG2
movlw 0X0A
movwf CENTENA ;LETRA C
movf CENTENA,W
movwf DIG3
movlw 0x0F
movwf LETRA
movf LETRA,W
movwf DIG4
goto MULTIPLEXADO1
return
;*********************************RUTINA PARA CONVERTIR DE BINARIO A BCD**************************************
Binario_BCD2
movwf BINARIO
movwf UNIDAD
clrf DECENA
clrf CENTENA
BCD_02
movlw d'10'
subwf UNIDAD,W
btfss STATUS,C
goto BCD_Fin2
BCD_1A
movwf UNIDAD
incf DECENA,f
movlw d'10'
subwf DECENA,W
btfss STATUS,C
goto BCD_02
BCD_Fin2
movf UNIDAD,W
movwf DIG1
movf DECENA,W
movwf DIG2
movlw 0X0A
movwf CENTENA ;LETRA C
movf CENTENA,W
movwf DIG3
movlw 0X0F
movwf LETRA
movf LETRA,W
movwf DIG4
goto MULTIPLEXADO2
return
;*******************************MULTIPLEXADO DE LOS DISPLAYS EN ROJO***************************************************
MULTIPLEXADO1
BCF PTOA,5
CALL RETARDO
movlw 0XF0
movwf PTOC
movf DIG4,w
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
bcf PTOC,7
call RETARDO
btfsc PTOB,3
goto ACTIVA
goto posit
ACTIVA movlw 0xE8
movwf PTOB
call RETARDO
movlw 0xF8
movwf PTOB
movf DIG3,W
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
bcf PTOC,7
movlw 0xD8
movwf PTOB
call RETARDO
movlw 0xF8
movwf PTOB
movf DIG2,W
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
bcf PTOC,7
movlw 0xB8
movwf PTOB
call RETARDO
movlw 0xF8
movwf PTOB
movf DIG1,W
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
bcf PTOC,7
movlw 0x78
movwf PTOB
call RETARDO
movlw 0xF8
movwf PTOB
goto sigo
posit movlw 0x70
movwf PTOB
call RETARDO
movlw 0xF0
movwf PTOB
movf DIG3,w
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
bcf PTOC,7
movlw 0xD0
movwf PTOB
call RETARDO
movlw 0xF0
movwf PTOB
movf DIG2,w
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
bcf PTOC,7
movlw 0x70
movwf PTOB
call RETARDO
movlw 0xF0
movwf PTOB
movf DIG1,w
movwf PTOC
BSF PTOC,4
BSF PTOC,5
BSF PTOC,6
bcf PTOC,7
movlw 0xB0
movwf PTOB
call RETARDO
movlw 0xF0
movwf PTOB
sigo decfsz ROTA,1
goto NO1
movlw 0x7F
movwf ROTA
decfsz CONTC,1
goto MULTIPLEXADO1
call RETARDO
movlw 0x02
movwf CONTC
goto ADQUISICION2
NO1 btfsc PTOB,0
goto MULTIPLEXADO1
goto INICIO
return
;******************************MULTIPLEXADO DE LOS SEGUNDOS DISPLAYS EN VERDE*******************************
MULTIPLEXADO2
BCF PTOA,5
call RETARDO
BTFSC PTOB,3
BSF PTOB,3 ; SI ES TEMPERATURA NEGATIVA, DEJA EL LED ENCENDIDO
movlw 0xF0
movwf PTOC
bcf PTOC,7
movf DIG3,W
movwf PTOC
BSF PTOC,4
BSF PTOC,5
bcf PTOC,6
bcf PTOC,7
call RETARDO
bSf PTOC,6
movf DIG2,W
movwf PTOC
BSF PTOC,4
bCf PTOC,5
BSF PTOC,6
bcf PTOC,7
call RETARDO
bSf PTOC,5
movf DIG1,W
movwf PTOC
bCf PTOC,4
BSF PTOC,5
BSF PTOC,6
bcf PTOC,7
call RETARDO
bSf PTOC,4
decfsz ROTA,1
goto NO2
movlw 0x64
movwf ROTA
decfsz CONTC,1
goto MULTIPLEXADO2
movlw 0x0A
movwf CONTC
goto comien
NO2 btfsc PTOB,0
goto MULTIPLEXADO2
goto INICIO
return
;*****************************RUTINA DE RETARDO PARA EL MULTIPLEXADO****************************
RETARDO
RETARDA MOVLW .249
MOVWF REG1
MOVLW .249
MOVWF REG2
MOVLW .250
MOVWF REG3
TRES clrwdt
DECFSZ REG3,1
GOTO TRES
DOS DECFSZ REG2,1
GOTO DOS
UNO
DECFSZ REG1,1
GOTO UNO
RETURN
;*******************************RETARDO PARA LA CONVERSION****************************************************
RETARDO2
nop
movlw .240
movwf REG4
ciclo clrwdt
nop
decfsz REG4,1
goto ciclo
return
;*********************************RUTINA PARA LA CONFIGURACION DE MODULO ADC*************************************
CONFIG_ADC
bsf ESTADO,5
movlw b'00001101' ;activamos el AN0 y AN1 como canal analogico,AN2 Y AN3 como Vref+ y Vref- y justificacion a la izquierda
movwf ADCON1
bcf ESTADO,5 ;VOLVEMOS AL BANCO 0
movlw b'01000001' ;elegimos la frecuencia de reloj de Fosc/8 para la conversion
movwf ADCON0
bsf ADCON0,0 ;ENCIENDE EL ADC
return
;*********************************RUTINA DE ADQUISICION***********************************************************
ADQUISICION1
movlw b'01000001'
movwf ADCON0 ;ACTIVAMOS EL CANAL AN0 Y Fosc/8
bsf ADCON0,2 ;ACTIVA EL BIT DE LA CONVERSION
ESPERA btfsc ADCON0,2 ;HA TERMINADO LA CONVERSION?
goto ESPERA ;ESPERA A QUE TERMINE
call RETARDO2
bcf ESTADO,2
movf ADRESH,W ;SI, CARGA EN W LOS 8 LBS
goto MULTIPLICACION1 ;CONVIERTELO A ESCALA
bsf ESTADO,5 ;PASAMOS AL BANCO 1
movf ADRESL,W ;CARGA EN W LOS 2 LBS MENOS SIGNIFICATIVOS
bcf ADCON0,2 ;DESACTIVA EL BIT DE LA CONVERSION
bcf ESTADO,5 ;PASAMOS AL BANCO 0
movwf PTOC ;LOS ENVIAS AL PUERTO C
return
;********************************RUTINA DE ADQUISICION2 PARA LA ENTRADA AN1********************************
ADQUISICION2
movlw b'01001001' ;FRECUENCIA DE RELOJ Fosc/8 Y ACTIVAMOS EL AN1
movwf ADCON0
bsf ADCON0,0 ;ENCIENDE EL ADC
call RETARDO2
bsf ADCON0,2 ;ACTIVA EL BIT DE LA CONVERSION
ESPERA2 btfsc ADCON0,2 ;HA TERMINADO LA CONVERSION?
goto ESPERA2
call RETARDO2
movf ADRESH,W ;SI, CARGA EN W LOS 8 LBS
goto MULTIPLICACION2
bsf ESTADO,5 ;PASAMOS AL BANCO 1
movf ADRESL,W ;CARGA EN W LOS 2 LBS MENOS SIGNIFICATIVOS
bcf ADCON0,2 ;DESACTIVA EL BIT DE LA CONVERSION
bcf ESTADO,5 ;PASAMOS AL BANCO 0
movwf PTOC ;LOS ENVIAS A LOS DISPLAYS
return
;*******************************RUTINA PARA DIVIDIR EL VALOR ANALOGICO POR ? DEL PRIMER SENSOR *******************************
DIVISION
movwf AUXILIAR ;CARGAMOS EL REGISTRO AUXILIAR CON EL VALOR DE ADRESH
movlw 0x01 ;Y LO DIVIDIMOS POR 25
movwf DIVISOR
clrf COCIENTE ;BORRAMOS EL REGISTRO DEL RESULTADO Y RESULTADOS ANTERIORES
DIV1
incf COCIENTE,1
movf DIVISOR,w
subwf AUXILIAR,1
btfsc STATUS,C
goto DIV1
decfsz COCIENTE,1
goto SEGUIMOS
movf MULTIPH,W
xorlw 0x00
btfsc ESTADO,2
goto FIN
decf MULTIPH,1
incf COCIENTE,1
goto DIV1
FIN addwf AUXILIAR,W
movwf AUXILIAR
movf COCIENTE,W
goto RESTA
SEGUIMOS
movf MULTIPH,W
xorlw 0x00
btfsc ESTADO,2
goto FIN
decf MULTIPH,1
goto DIV1
return
;****************************RUTINA DE RESTA****************************
RESTA2 movf RESTADO2,W
subwf COCIENTE,W
btfss ESTADO,0 ;SI HAY CARRY, ES QUE EL VALOR ES NEGATIVO
goto NEGATIVO2
movwf RESULTADO
movf RESULTADO,W
bcf PTOB,3 ;APAGA EL LED DE NEGATIVO
goto Binario_BCD2
return
NEGATIVO2
movf COCIENTE,W ;CARGA EN W EL VALOR DEL RESULTADO DE LA DIVISION
subwf RESTADO2,W ;Y LO RESTAMOS CON EL VALOR QUE TENEMOS CARGADO EN RESTADO
movwf RESULTADO
movf RESULTADO,W
bsf PTOB,3 ;ACTIVA LE LED DE NEGATIVO
goto Binario_BCD2
return
RESTA movf RESTADO,W
subwf COCIENTE,W
btfss ESTADO,0 ;SI HAY CARRY, ES QUE EL VALOR ES NEGATIVO
goto NEGATIVO
movwf RESULTADO
movf RESULTADO,W
bcf PTOB,3 ;APAGA EL LED DE NEGATIVO
goto Binario_BCD1
return
NEGATIVO
movf COCIENTE,W ;CARGA EN W EL VALOR DEL RESULTADO DE LA DIVISION
subwf RESTADO,W ;Y LO RESTAMOS CON EL VALOR QUE TENEMOS CARGADO EN RESTADO
movwf RESULTADO
movf RESULTADO,W
bsf PTOB,3 ;ACTIVA LE LED DE NEGATIVO
goto Binario_BCD1
return
;******************************RUTINA PARA LA DIVISION DEL SEGUNDO SENSOR************************
DIVISION2
movwf AUXILIAR ;CARGAMOS EL REGISTRO AUXILIAR CON EL VALOR DE ADRESH
movlw 0x01 ;Y LO DIVIDIMOS POR ?
movwf DIVISOR
clrf COCIENTE ;BORRAMOS EL REGISTRO DEL RESULTADO Y RESULTADOS ANTERIORES
DIV2
incf COCIENTE,1
movf DIVISOR,w
subwf AUXILIAR,1
btfsc STATUS,C
goto DIV2
decfsz COCIENTE,1
goto SEGUIMOS2
movf MULTIPH,W
xorlw 0x00
btfsc ESTADO,2
goto FIN2
decf MULTIPH,1
incf COCIENTE,1
goto DIV2
FIN2
addwf AUXILIAR,W
movwf AUXILIAR
movf COCIENTE,W
goto RESTA2
SEGUIMOS2
movf MULTIPH,W
xorlw 0x00
btfsc ESTADO,2
goto FIN2
decf MULTIPH,1
goto DIV2
return
;*********************************RUTINA PARA MULTIPLICAR POR 10 EL RESULTADO DE LA DIVISION1 *********************
MULTIPLICACION1
clrf MULTIP
movlw 0x01
movwf PRODUCTO
MULTI0 movf ADRESH,W
movwf COCIENTE
MULTI1 addwf MULTIP,1
decfsz PRODUCTO,1
btfsc ESTADO,0
goto FIN_MULTIP1
goto MULTI1
FIN_MULTIP1
btfsc ESTADO,0
incf MULTIPH,1 ;SI HAY ACARREO ES POR QUE EL NUMERO ES MAYOR DE 255
movf PRODUCTO,W
xorlw 0x00
btfsc ESTADO,2
goto TERMINO
bcf ESTADO,0
goto MULTI0
TERMINO movf MULTIP,W
goto DIVISION
;**********************************RUTINA PARA MULTIPLICAR POR ? EL RESULTADO DE DIVISION2************************
MULTIPLICACION2
clrf MULTIP
movlw 0x01
movwf PRODUCTO
MULTI3 movf ADRESH,W
movwf COCIENTE
MULTI2 addwf MULTIP,1
decfsz PRODUCTO,1
btfsc ESTADO,0
goto FIN_MULTIP2
goto MULTI2
FIN_MULTIP2
btfsc ESTADO,0
incf MULTIPH,1 ;SI HAY ACARREO ES POR QUE EL NUMERO ES MAYOR DE 255
movf PRODUCTO,W
xorlw 0x00
btfsc ESTADO,2
goto TERMINO2
bcf ESTADO,0
goto MULTI3
TERMINO2
movf MULTIP,W
goto DIVISION2
END
-
Felicitaciones por que lograste corregirlo, y gracias por compartirlo
Saludos
-
Gracias sander por la felicitación, intentaré aportar ayuda en lo que pueda, soy muy novato en esto y la verdad no se mucho, aprendo poco a poco.
Saludos
-
Me alegro que lo hayas solucionado. Y gracias por compartir el programa. :-/ :-/
-
Gracias por compartirlo.
-
Gracias por el aporte electronico39.
Saludos.
-
Gracias a todos, ahora voy a modificar el programa para que grave en la memoria eeprom la hora, minutos y segundos para que en los cortes eléctricos no pierda mucho tiempo, solo tenga un ligero retraso.