Bueno no hay muchos problemas pero se prodia reformular el programa para que sea mas legible.
Un problema que encontre la alineacion... A pesar que escribiste ADRESL al estar en el banco 0 estas accediendo a ADRESH. Asi que lo considero "correcto". pero poco claro, pienso que deberias cambiar por ADRESH
Pero para que sea correcto y bien correcto, debes justificar la salida del ADC correctamente. Si usas alineado a la derecha ( bit7 del ADCON0 en 1) vas a tener los 2 mas significativos en ADRESH y los otros 8 en ADRESL. Para poder comparar correctamente vas a tener que rotar ADRESH y ADRESL hasta que quede solo 8 bits. Otra forma de hacer esto sin complicarse es
justificarlo a la izquierda Ahora SI los valores mas importantes van a estar en ADRESH y podes compararlo directamente, sin importar lo que posea ADRESL.
Entonces tu problema era el justificado, al estar mal justificado el maximo que puede alcanzar ADRESH es 0b11 = 3, y por ende siemrpe va a ser baja tension.
Para solucionarlo solo debes cambiar el bit7 por un 0 en el ADCON0 (cuando se lo asignas al comienzo)
Cambia el ADRESL por ADRESH que es el nombre correcto, a pesar que ambos accedan al mismo lugar (Al seguir en el banco 0). Solo para que sea mas legible.
----------------------------------------------------------------------------------------------------------------------------------
Por otro lado te quiero hacer una propuesta y una posible correccion.
La propuesta es cambiar lo siguiente:
MOVLW B'11000011' ;*** COMPARACION DE REGISTROS ***
MOVWF REGISTROALTA ;PARA SABER SI EL VALOR INGRESADO
MOVF ADRESL,0 ;ES ALTA O BAJA TENSION
SUBWF REGISTROALTA,0
BTFSC STATUS,Z ;SON DIFERENTES?
GOTO ALTATENSION ;NO, VE A ALTA TENSION
BTFSS STATUS,C ;SI, PREGUNTA SI W ES MAYOR QUE REGISTROALTA
GOTO ALTATENSION ;SI, VE A ALTA TENSION
No tiene sentido hacer todo eso... El registro "REGISTROALTA" lo unico que haces es comparar con el ADRESH y depositarle siempre el mismo valor, valor que NO cambia. Entonces... para que usar un registro para eso ? Directamente hago un SUBLW 0b11000011. Me explico:
Hacer esto:
MOVLW B'11000011' ;*** COMPARACION DE REGISTROS ***
MOVWF REGISTROALTA ;PARA SABER SI EL VALOR INGRESADO
MOVF ADRESL,0 ;ES ALTA O BAJA TENSION
SUBWF REGISTROALTA,0
Es hacer:
REGISTROALTA - W, Donde W = ADRESH. Entonces el resultado total es lo mismo que hacer REGISTROALTA - ADRESH,
REGISTROALTA = 0B11000011, por lo tanto finalemente tenemos que: 0b11000011 - ADRESH
Y que es lo mismo que hacer:
MOVF ADRESH, W
SUBLW 0B11000011
Que es 0B11000011 - ADRESH
Por otro lado, estas comparando por este numero: '11000011' = 195. Y comparas por si es igual y mayor a ese numero, tenes que usar 2 comparaciones, primero usar la bandera Z y luego la bandera C... Pero si usas el valor 194 solo necesitas comparar por si es mayor nomas (Solo la bandera C ). Lo mismo ocurre para la baja tension. Entonces un solo BTFSS/C STATUS, C es suficiente para ambos casos.
Y finalmente la corrección que quería hacerte:
Luego de detectar la tension correcta, la mayoria de los protectores espera supongamos 5 segundos, hasta que este la tension normal.
Peeeeeeero.... Quiere decir que por 5 segundos la tension DEBE estar normal. Si ocurre un bajon cuando van 3 segundos y vuelve a normal, tiene que volver a iniciar los 5 segundos desde que se puso normal.
Tu codigo no hace esto, detectado el bajo voltaje, activa el led, pero a los 5s recien se fija si la tension esta normal, y puede que siga bajando y subiendo la luz en ese trayecto de los 5s y no va a tener problemas, pero si a los 5s la tension esta bien, va a mostrarte que esta normal y puede llegar a conectar un pequeño ratito.
Otro problema es que al iniciar el programa, inicias la conversion, esperas 5s, revisas la conversion.
Lo cual quiere decir que tu primera muestra en realidad es la de hace 5 segundos atras!!! Y no la actual. Las demas no hay problemas por el delay de 30us que tampoco deberia estar...