Aquí estoy otra vez!
Este es el código en ASM que encontré en internet y utilicé en su dia. Sólo hay un problema y es que... no se que versión de programa es, es decir, no se si funcionará bien o no. De todas formas, fijándote en esto y con el datasheet no tienes por que tener ningún problema en dejarlo perfecto.
; DETECTAMOS LA Cusa del reset !!!!
bsf STATUS,RP0
bcf STATUS,RP1
btfss PCON,0
goto BOR_0
goto BOR_1
BOR_0
btfss PCON,1
goto BOR_0_POR_0
goto BOR_0_POR_1
BOR_1
btfss PCON,1
goto BOR_1_POR_0
goto BOR_1_POR_1
BOR_0_POR_0
bcf STATUS,RP0
bcf STATUS,RP1
bcf PORTD,0
bcf PORTD,1
goto fin_BOR_POR
BOR_0_POR_1 ; BROWN-OUT RESET, FALLO EN LA ALIMENTACION (si apagamos y encendemos rapidamente)
bcf STATUS,RP0
bcf STATUS,RP1
bcf PORTD,0
bsf PORTD,1
goto fin_BOR_POR
BOR_1_POR_0
bcf STATUS,RP0
bcf STATUS,RP1
bsf PORTD,0
bcf PORTD,1
goto fin_BOR_POR
BOR_1_POR_1 ; FALLO EN MCLR
bcf STATUS,RP0
bcf STATUS,RP1
bsf PORTD,0
bsf PORTD,1
goto fin_BOR_POR
fin_BOR_POR
bsf STATUS,RP0
bcf STATUS,RP1
bsf PCON,0 ; BOR = 1
bsf PCON,1 ; POR = 1
bcf STATUS,RP0
bcf STATUS,RP1
; DETECTAMOS LA Cusa del reset !!!!
btfss STATUS,3
goto PD_0
goto PD_1
PD_0
btfss STATUS,4
goto PD_0_TO_0
goto PD_0_TO_1
PD_1
btfss STATUS,4
goto PD_1_TO_0
goto PD_1_TO_1
PD_0_TO_0
bcf PORTD,2
bcf PORTD,3
goto fin_PD_TO
PD_0_TO_1 ; BROWN-OUT RESET, FALLO EN LA ALIMENTACION (si apagamos y encendemos rapidamente)
bcf PORTD,2
bsf PORTD,3
goto fin_PD_TO
PD_1_TO_0
bsf PORTD,2
bcf PORTD,3
goto fin_PD_TO
PD_1_TO_1 ; FALLO EN MCLR
bsf PORTD,2
bsf PORTD,3
goto fin_PD_TO
fin_PD_TO
Vamos a ver un poco por encima que es lo que hace esto.
Yo utilicé el PIC16F877 para este proyecto, entonces, cogemos el datasheet y miramos en la página 127. Ahí podremos ver la tabla que nos dice cual ha sido la causa del RESET en función de los bits POR, BOR, TO y PD.
Los bits POR y BOR se encuentran en los bits 1 y 0 del registro PCON (si miras en la página 13 verás que este registro se está en el banco 1).
Los bits TO y PD se encuentran en los bits 4 y 3 del registro STATUS.
Pues bien, lo que este programa hace (en teoría) es ir testeando esos bits e ir encendiendo unos leds para que el usuario pueda ver la causa del reset. Lo que yo hacía era conectar unos leds en las patillas 0, 1, 2 y 3 del PORTD. Entonces, viendo que leds se encendían me daba cuenta del tipo de reset.
Bueno, está todo un poco enfollonado pero... si leyendo esto te ahorras unos cuantos minutos de calentura de cabeza, buenos son, ¿no? jeje
Un saludo desde Alicante.