uff no me anduvo, me quedaron las luces de peatones prendidas, en algun lugar se quedo trabado el programa lo voy a ir revisando con el mplab
aca esta el codigo entero.
;Programa para cruce de semaforos
;version modificada
list p=16f84, r=dec
#include <p16f84.inc>
__CONFIG _CP_OFF & _PWRTE_OFF & _WDT_ON & _XT_OSC
;Comienzo de la escritura
org 0x00
goto PRINCIPAL ;salto al programa principal
;Lugar del programa luego de la interrupcion
org 0x04
goto IRQ ;salto a la rutina de interrupción
;Definicion de constantes
CUENTA equ 16
RP2 equ 7
RP1 equ 6
VP2 equ 1
VP1 equ 0
;declaracion de variables (posiciones de memoria que usan)
CONTADOR equ 0x10
RETARDO equ 0x11
;******************
;Programa principal
;inicializacion del micro: registros de control, puertos e interrupciones.
;se queda en espera en un bucle infinito
PRINCIPAL
;programacion del registro OPTION
movlw b'10000111' ;cargar los valores en W para option
bsf STATUS, RP0 ;banco 1
movwf OPTION_REG ;se escriben los bits deseados al registro
bcf STATUS, RP0 ;banco 0
;Programacion de los puertos
bsf STATUS, RP0 ;banco 1
clrf TRISB ;puerto B como salida
clrf TRISA ;puerto A como salida
bcf STATUS, RP0 ;banco 0
;Inicializacion de contador y puerto
clrf CONTADOR ;contador=0
movlw b'10011110' ;S2 rojo, S1 verde. Peatones, Rojo para S1
movwf PORTB ;lo saca por el puerto
bcf PORTA, VP2 ;peatones, verde para S2
bsf PORTA, VP1
;Programacion del temporizador
movlw CUENTA
movwf TMR0 ;cuenta inicial del temporizador, lanza la cuenta
;Programacion de interrupciones
movlw b'10100000'
movwf INTCON
ESPERA
clrwdt
goto ESPERA
;Rutina de atencion a la interrupcion del temporizador
;La interrupcion se producira cada 0,05s.
;Se contaran 5 llamadas
;Se incrementa un contador de segundos para controlar la temporizacion del semaforo
;y se modificara el estado de los semaforos, escribiendo en el puerto segun el tiempo pasado
;no se comprueba cual es la fuenta de la interrupcion porque solo esta habilitada
;la interrupcion del temporizador
IRQ
;Se reprograma el temporizador para empiece a contar ahora ya que las lineas
;anteriores del programa producirian un retardo en la temporizacion
movlw CUENTA
movwf TMR0 ;reprogramacion del timer
incf RETARDO
movwf 5
subwf RETARDO, W ;resta el contenido de RETARDO con w, si es 0, Z en STATUS vale 1
btfss STATUS, Z ;verifica el estado del bit Z en el registro
goto FINSWITCH ;si es 0 viene aca
clrf RETARDO ;si es 1 viene aca
;este codigo se ejecutara cada 0,5s. El contador cuenta medios segundos
incf CONTADOR, F ;contador=contador+1
;Implementacion de sentencias switch-case
CASO20 ;contador < 20?
movlw 40
subwf CONTADOR, W ;resta el contenido de CONTADOR con W y pone en 0 el bit C en STATUS
btfsc STATUS, C ;si hubo acarreo del 7mo bit
goto FINCASO20 ;viene aca si C=1, no hay acarreo, contador >,= a 40
;CONTADOR < 40
movlw b'10011110' ;Coches S2 Rojo, S1 Verde, peatones RP2 OFF, RP1 ON
movwf PORTB ;lo escribe en el puerto
bcf PORTA, VP2 ;Peatones, verde para S2
bsf PORTA, VP1
goto FINSWITCH
FINCASO20
CASO25 ;contador < 25?
movlw 50 ;carga 50 al registro W
subwf CONTADOR, W ;resta el contenido de contador con W
btfsc STATUS, C ;comprueba si hubi acarreo del 7mo bit
goto FINCASO25 ;Si no hubo acarreo, contador >, = 50
;CONTADOR < 25 (no hay acarreo)
movlw b'10011110' ;coches: S2 rojo, S1 verde. peatones: RP2 OFF, RP1 ON
movwf PORTB ;lo escribe en el puerto
btfsc CONTADOR, 0 ;si contador par (1 segundo)
goto FINSWITCH
movlw b'10' ;mascara XOR para conmutar VP2 sin modificar el resto
xorwf PORTA, F ;conmuta VP2 (CADA 1SEG)
goto FINSWITCH
FINCASO25
CASO30 ;25 <= contador < 30
movlw 60
subwf CONTADOR, W ;compara contador con 60
btfsc STATUS, C ;comprueba hubo acarreo del 7mo bit
goto FINCASO30 ;si no hubo viene aca, contador > = 60
;contador <30 (no hay acarreo
movlw b'00010010' ;prende ambar S2 junto con rojo
movwf PORTB ;prende luz ambar sin parpadear
bsf PORTB, 0 ;APAGA S1 VERDE
btfsc CONTADOR, 0 ;comprueba el bit 0 del registro CONTAOR
goto FINSWITCH ;si es 1 viene aca
movlw b'10' ;si es 0 salta aca
xorwf PORTA, F ;conmuta VP2 cada 1 segundo
goto FINSWITCH
FINCASO30
CASO50 ;30 <= contador < 50?
movlw 100
subwf CONTADOR, W ;compara contador con w
btfsc STATUS, C ;comprueba si hubo acarreo
goto FINCASO50 ;si no lo hubo viene aca
;contador < 50 (no hay acarreo)
movlw b'01110011' ;coches: s2 verde, s1 rojo. peatones: rp2 on, rp1 off
movwf PORTB ;lo escribe en el puerto
bsf PORTA, VP2 ;peatones verde para s1
bcf PORTA, VP1
goto FINSWITCH
FINCASO50
CASO55
movlw 110
subwf CONTADOR, W ;compara contador con 110
btfsc STATUS, C ;comprueba si hubo acarreo
goto FINCASO55 ;no hay acarreo, contador > = 110
;contador <55
movlw b'01110011' ;s2 verde, s1 rojo. peatones: rp2 on , rp1 off
movwf PORTB ;lo escribe en el puerto
btfss CONTADOR, 0 ;CONTADOR PAR?
goto FINSWITCH
movlw b'01' ;mascara xor para conmutar vp1 sin modificar el resto
goto FINSWITCH
FINCASO55
CASO60 ;55 <= contador < 60
movlw 120
subwf CONTADOR, W ;compara contador con w
btfsc STATUS, C ;comprueba si hubo acarreo
goto FINCASO60 ;si no hubo viene aca, contador > = 120
;contador<60 no hay acarreo
movlw b'00010010' ;prende ambar de s2 con verde, y con rojo de s1
btfss CONTADOR, 0 ;si contador es par
bsf W, VP1
movwf PORTB
bsf PORTB, 3
btfsc CONTADOR, 0
goto FINSWITCH
movlw b'01'
xorwf PORTA,F
goto FINSWITCH
FINCASO60
OTHERWISE ;LLEGO A 60
movlw b'10011110' ;coches s2 rojo s1 verde, peatones rp2 off rp1 on
movwf PORTB ;lo escribe en el puerto
bcf PORTA, VP2 ;peatones verde para s2
bsf PORTA, VP1
clrf CONTADOR ;empieza el ciclo de nuevo
FINSWITCH ;FIN DE LA SENTENCIA SWITCH-CASE
movlw b'10100000'
movwf INTCON
retfie ;retorno a la interrupcion
end
voy a seguir probando y lo voy a ir simulando paso a paso con el mplab a ver donde se quedo trabado.
...mmm me parece que se va al joraca este programa, si no anda en esta empiezo programando tmr0 desde 0... haciendo otra base de tiempo y otros casos para los semáforos.