Exactamente. El oscilador interno no necesitas ningun componente externo ( cristal o RC ) Y podes usar esos pines (RB5/OSC1/CLKIN y RB4/OSC2/CLKOUT) como salidas si los configuras como tal en los fuses.
La frecuencia va a ser "fija" en el unico caso que importaria esa desviacion de la frecuencia si es que tuvieras que hacer algo en X cantidad de tiempo exacto, ejemplo hacer titilar un led a 1Hz, y que sea exactamente 0.5s apagado y 0.5s encendido. pero si no te importa que pueda ser 0.49s y 0.49s entonces dale para adelante con eso.
Por ahi vi que tenes algunos problemas, con tantos GOTO cuando usas CALL por ahi no retorna y ese direccion queda guardada en el stack que luego con la intruccion RETURN o RETLW vuelve a la direccion, en este PIC tiene 2 niveles de stack ( guarda hasta 2 direcciones) Tu programa deberia asegurarse que que cuando se llama a un CALL el fin siempre sea un RETURN y o maximo que deberia ocurrir es:
CALL
....
CALL
....
RETURN
...
RETURN
Es decir 2 call anidados.
Para que te des cuenta donde hay un error miraria en tu codigo en NIVALTO,
este hace un CALL a SUB3 aca hay 2 opciones, una produce otro call y con un return ( lo cual seguirias teniendo 1 direccion guardad del primer call )
La otra es que siga y VUELVA a NIVALTO y se produzca otro CALL, entrando en un loop continuo. ( ya tenes 2 direcciones y tu stack esta lleno si pones otra ya no hay posibilidades de retornar.
SUB3 BTFSS PORTB,2
CALL SUB1
BTFSC PORTB,1
GOTO NIVALTO
BSF PORTC,0
GOTO NIVALTO
RETLW 0
Lo que esta en negrita JAMAS se va a ejecutar, por que el GOTO lo envia a otro lado y es imposible que pase por ahi, hay otras funciones que tambien hacen lo mismo.
Otra de las cosas es que en fisico el micro va a una velocidad alta y no pausado como la simulacion en MPLAB, a 4Mhz el micro ejecuta cada instruccion a 1uS, esto lleva a tener consideracion cuando tenes una condicion como estas:
BTFSS PORTB,2
Ya que en simulacion puede pasar 1 ves por ese punto, pero en real en un abrir y cerrar de ojos paso muchas veces mas.
Para la programacion Creo por mi parte que es mejor siempre tener una funcion principal y de esta irse a otros lados segun algunas condiciones.
Principal:
PORTA,1 en 1?
Call funcion1
PORTA,0 en 1?
CALL funcion0
PORTA,3 en 0
CALL funcion3
CALL Mostrar
Goto Principal
Luego de ahi cada funcion va a realizar su codigo y va a retornar al programa principal, en estas funciones tambien se puede llamar a otra funcion sin ningun problema siempre y cuando retorne
funcion0:
Prender led1
CALL Demora
Volver del call
Demora:
Hago la demora
Volver del call
Es decir hace funciones especificas para cada cosa, obviamente si es una sola instruccion no vale la pena hacer un call ( como en tu codigo en ESENx ) sino algo que tenga muchas instrucciones o se use en varios lados ( como la demora )
Creo que es todo lo que encontre. Cualquier otra duda preguntala sin problemas
Ah y no hace falta que me quotees :3 sino se va a hacer largo, solamente responde a no ser que tengas una seccion que quiseras preguntar xD