Por ser tu primero programa te voy a decir algunas cosas que deberias ver paar que todo funcione correctamente y algunos otros errores.
- FUSES ( config ) No sabria decirte si esta correcto o no (podria, pero es mucho mas trabajo). Deberia ponerme a buscar que hace cada bits, en el .inc que incluis (al final del mismo) hay una forma facil de poder escibir los fuses y de forma legible
ejemplo:
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_OFF & _LVP_OFF & _DEBUG_OFF & _CP_OFF
En ves de un numero ahora tengo cada parte y es mas legible ya que puedo ver que tengo el watchdog deshabilitado, el oscilador configurado como XT, y etc.
- BANCOSUn error es no cambiar de bancos, la RAM tiene 4 bancos, y solo puede accederse a 1 por ves, comenzas en el banco 0 (podes verlo en memory organization del datasheet ) donde tenes los PORTx. TRISx y CMCON se encuentran en el banco 1. Para cambiar de banco podes hacerlo vos con BSF/BCF al registro STATUS, bits RP0 y RP1. O usar lo que te provee el compilador para que te lo gerene de forma automatica y es BANKSEL. Te doy 2 codigos similares:
BSF STATUS,RP0
BCF STATUS, RP1 ; Banco 1
BSF TRISE,0
CLRF TRISB
MOVLW D'7'
MOVWF CMCON
BCF STATUS,RP0
BCF STATUS, RP1 ; Banco 0
REGRESO1
BTFSS PORTE,0
GOTO corrida1
GOTO corrida2
O.. como decia usar BANKSEL
BANKSEL TRISB ; Como el TRISB se encuentra en el Banco 1, el compilador genera los BSF/BCF para el banco 1
BSF TRISE,0
CLRF TRISB
MOVLW D'7'
MOVWF CMCON
BANKSEL PORTA ; Como el PORTA se encuentra en el Banco 0, el compilador genera los BSF/BCF para el banco 0
REGRESO1
BTFSS PORTE,0
GOTO corrida1
GOTO corrida2
- Vectores de inicio e interrupcionUna buena practica es siempre definir los vectores de reset e interrupcion, por mas que no utilices el de interrupcion, los vectores se encuentran en 0x0000 y 0x0004 y te quedaria asi:
N EQU 0X22
M EQU 0X23
ORG 0x00 ;Reset, encendido
GOTO INICIO
ORG 0x04 ;Interrupcion
RETURN
INICIO
BANKSEL TRISE
BSF TRISE,0
CLRF TRISB
- PORTE y su puerto analogicoSi te vas al datasheet sobre el puerto E, al final siempre de cada seccion ( en este caso del puerto E) te aparecen los registros que involucran a este puerto, y ahi te vas a encontrar con que hay 3 , bajo el titutlo de : SUMMARY OF REGISTERS ASSOCIATED WITH PORTE.
PORTE, TRISE y ADCON1
Donde ADCON1 define si son digitales o analogicos.
Buscando ADCON1 este se encuentra en el banco 1, y se debe cargar 0x07 para que se vuelvan todos digitales. Entonces:
MOVLW D'7'
MOVWF CMCON
MOVWF ADCON1
- Cnosideraciones con el delay y la lectura del pulsadorSi seguimos la logica el camino para una de las secuencias nos queda algo asi (simplifique todo y saque la otra secuencia para ver mas facil el problema):
REGRESO1
BTFSS PORTE,0
GOTO corrida1
GOTO corrida2
corrida1
; Aca dentro tengo 5 delays
GOTO REGRESO1
Aca hay un problema, si me decis que tu delay tarda 1 segundo. Quiere decir que .. ahora sigamos el prorgama. Leo el DIP switch, entro a corrida 1, hace toda la secuencia que demora 5 segundos, salgo y leo el DIP switch, Y aca puede haber un problema o no segun lo que vos desees realizar, el problema esta en que el DIP switch se lee cada 5 segundos!, es decir que si queres cambiar de secuencia, primero debe pasar la otra por completo para que cambie. Y segun donde cambies el DIP switch el tiempo varia desde 0 a 5 segundos al cambio.
Tambien si queres agregar algo mas, quiere decir que tu micro va a estar 5 segundos haciendo la secuencia y recien ahi va a hacer eso extra que pusiste. Lo que por ahi no es tan bueno.
La solucion a esto podria ser el usar una tabla, y un Timer, pero por ser tu primer programa, solo quiero que te des cuenta de sea imposibilidad.
- Proteus y circuitoEl circuito le falta una cosa, y son las resistencias de los diodos leds, las resitencias las calculas con (le puse 10mA ya que al encender varios para no llegar al maximo del puerto):
(Vcc - Vled) / 10mA = R
Ejemplo si alimentas al PIC con 5V (Vcc) y el led tiene una caida de 2V (Vled) te quedaria:
(5V - 2V) / 10mA = R
3V/20mA = R
R = 300 ohms (330 ohms para un valor de resistencia )
- Otras consideraciones sobre proteusPrimero que nada, Proteus es un simulador asi que a veces falla y en el circuito no.
Proteus no tiene en cuenta los FUSES, asi que si alguna ves te funciona, y en el circuito no pueden ser estos.
Proteus no hace caso al cristal conectado, si haces doble click sobre el microcontrolador en el proteus te aparece para ponerle la frecuencia, es la unica frecuencia que le hace caso. El cristal que le pongas en los pines es solo para el PCB si luego lo haces.
Proteus es LENTO en la simulacion, 1s en simulacion de Proteus puede llegar a ser 5s reloj, entonces por ahi para poder ver tu secuencia mas facil, sea mejor bajarle el delay.
- Correcta sintaxisNo se, pero tal ves cuando copias y pegaste, se eliminaron todos los espacios al frente, ya que lo unico que no puede tener espacios al frente son las etiquetas como REGRESO1, corrida1, todo lo demas deberia tener minimo 1 espacio al frente. Sino te daria error, pero como decis que lo compilas bien entonces me imagino que fue en el copy/paste