TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: nandez en 01 de Febrero de 2012, 05:28:37
-
Tengo realizado el programa paraa la secuencia de el encendido de los led pero m faltaa realizar las subrutinas de largo y corto... paraaa el led rojo y el verde en largo y el cortro para el naranjaaaa y seria para el largo 3 seg y para el corto 1 seg os dejo el porgrama realizado hasta ahora aver si m podeis recomendar que datos tengo que meter en el contador para aumentar el tiempo.... Un saludooo !!!
;igualdades que designan los destinos
w equ 0 ;el resultado se guarda en W
f equ 1 ;el resultado se guarda en el registro
;igualdades que designan los registros fsr*******************
list p=16f84A ;tipo de procesador
porta equ 05h ;portA
portb equ 06h ;portB
trisa equ 05h ;registro direccionamiento portA
trisb equ 06h ;registro direccionamiento portB
status equ 03h ;registro status
rpo equ 05h ;bit rpo del registro de status
;Definición de los pines del pic*****************************
;El puerto B tiene en sus pines:*Rb0: Rojo (Semáforo 1)
; *Rb1: Amarillo (Semáforo 1)
; *Rb2: Verde (Semáforo 1)
; *Rb3: Rojo (Semáforo 2)
; *Rb4: Amarillo (Semáforo 2)
; *Rb5: Verde (Semáforo 2)
; *Rb6: Rojo (Semáforo 3)
; *Rb7: Amarillo (Semáforo 3)
;El puerto A tiene en sus pines:
; *Ra0: Verde (Semáforo 3)
; *Ra1: Rojo (Semáforo 4)
; *Ra2: Amarillo (Semáforo 4)
; *Ra3: Verde (Semáforo 4)
;igualdades de registros auxiliares**************************
conta1 equ 10h ;registro de temporización1
conta2 equ 11h ;registro de temporización2
conta3 equ 12h ;registro de temporización3
conta4 equ 13h ;registro de temporización4
conta5 equ 14h ;registro de temporización5
;CODIGO DEL RESET *********************************************
org 00h ;dirección del vector reset
goto inicio ;comienza el programa después del vector de interrupcción
org 05h ;una posición detrás del vector de interrupción
;CONFIGURACION DE LOS PUERTOS ******************************************************
inicio bsf status,rpo ;selecciona la pág. de la memoria poniendo a 1 el bit rpo porque el registro trisb esta en la pág. 1
clrf trisa ;configura el puerto a como salida borrando trisa
clrf trisb ;configura el puerto b como salida borrando trisb
bcf status,rpo ;vuelve a la pág. 0
clrf porta ;limpia porta
clrf portb ;limpia portb
clrf conta1 ;limpia el registro conta1
clrf conta2 ;limpia el registro conta2
clrf conta3 ;limpia el registro conta3
clrf conta4 ;limpia el registro conta4
clrf conta5 ;limpia el registro conta5
;INICIO DEL PROGRAMA *******************************************************
clrf conta3 ;limpia conta3
movlw b'00000010' ;carga el valor de repeticiones en w (>1)
movwf conta3 ;mueve el valor de w a conta3
movlw b'01001100' ;carga el valor '01001100' en w
movwf portb ;mueve el valor de w a portb
movlw b'00010' ;carga el valor '00010' en w
movwf porta ;mueve el valor de w a porta
call largo ;llama a subrutina largo
movlw b'01001010' ;carga el valor '01001010' en w
movwf portb ;mueve el valor de w a portb
movlw b'00010' ;carga el valor '00010' en w
movwf porta ;mueve el valor de w a porta
call corto ;llama a subrutina corto
movlw b'01100001' ;carga el valor '01100001' en w
movwf portb ;mueve el valor de w a portb
movlw b'00010' ;carga el valor '00010' en w
movwf porta ;mueve el valor de w a porta
call largo ;llama a subrutina largo
movlw b'01010001' ;carga el valor '01010001' en w
movwf portb ;mueve el valor de w a portb
movlw b'00010' ;carga el valor '00010' en w
movwf porta ;mueve el valor de w a porta
call corto ;llama a subrutina corto
movlw b'00001001' ;carga el valor '00001001' en w
movwf portb ;mueve el valor de w a portb
movlw b'00011' ;carga el valor '00011' en w
movwf porta ;mueve el valor de w a porta
call largo ;llama a subrutina largo
movlw b'10001001' ;carga el valor '10001001' en w
movwf portb ;mueve el valor de w a portb
movlw b'00010' ;carga el valor '00010' en w
movwf porta ;mueve el valor de w a porta
call corto ;llama a subrutina corto
movlw b'01001001' ;carga el valor '01001001' en w
movwf portb ;mueve el valor de w a portb
movlw b'01000' ;carga el valor '01000' en w
movwf porta ;mueve el valor de w a porta
call largo ;llama a subrutina largo
movlw b'01001001' ;carga el valor '01001001' en w
movwf portb ;mueve el valor de w a portb
movlw b'00100' ;carga el valor '00100' en w
movwf porta ;mueve el valor de w a porta
call corto ;llama a subrutina corto
decfsz conta3,f ;decremnta conta3 y si el resultado es 0 salta a la sig. instrucción
goto $ -29 ;vuelve a comenzar el ciclo
clrf conta5 ;limpia conta5
call parpadeo ;llama a subrutina parpadeo
movlw b'10010010' ;carga el valor '10010010' en w
movwf portb ;mueve el valor de w a portb
movlw b'00100' ;carga el valor '00100' en w
movwf porta ;mueve el valor de w a porta
call parpadeo ;llama a subrutina parpadeo
clrf portb ;limpia portb
clrf porta ;limpia porta
decfsz conta5,f ;decremnta conta5 y si el resultado es 0 salta a la sig. instrucción
goto $ -9 ;vuelve al comienzo del parpadeo
goto $ -38 ;da el fin a todo el programa y vuelve a empezar
;SUBRUTINA LARGO *********************************************
largo:
clrf conta1 ;limpia conta1
movlw 0XFF ;carga el valor 0ffh en w
movwf conta1 ;mueve el valor de w a conta1
decfsz conta1,f ;decremnta conta1 y si el resultado es 0 salta a la sig. instrucción
goto $ -1 ;salta a bucle1
return ;retorno a la sig. instrucción
;SUBRUTINA CORTO *********************************************
corto:
clrf conta2 ;limpia conta2
movlw 0X1F ;carga el valor 01fh en w
movwf conta2 ;mueve el valor de w a conta2
decfsz conta2,f ;decremnta conta2 y si el resultado es 0 salta a la sig. instrucción
goto $ -1 ;salta a bucle2
return ;retorno a la sig. instrucción
;SUBRUTINA DE RETARDO ******************************************
parpadeo:
clrf conta4 ;limpia conta4
movlw 0X03 ;carga el valor 03h en w
movwf conta4 ;mueve el valor de w a conta4
decfsz conta4,f ;decremnta conta4 y si el resultado es 0 salta a la sig. instrucción
goto $ -1 ;salta a bucle3
return ;retorno a la sig. instrucción
end
-
aquí tienes un programita para generar demoras.. PIC DEL (http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=5968.0;attach=378) :mrgreen:
-
Tengo el porgramaa realizadoo dee un cruce de semaforos en direccion vertical y horizontal de 4 carriles... me funcionaa bien con retardos de 15 y 3 segundoss respctivamente...
Problemaa:
Quiero que cambien los semaforos para dar paso a un autobus que se puede acercar al crucee por los carriles hporizontales o los verticaless y loo marco com la interrupcion ext del puerto b,0 que viene un autopues y luego tengo dos interruptoress para que indiquee por que lado se aproxima al cruce para cambiar la secuanciaa de el semaforo... Lo estado porbandooo con BTFSS pero no llego hacerlo correctamenteeee os dejo el porgramaa por si os interesaaa echarmee unaa manooo GRACIASS....
LIST p=16F84A ;DIRECTORIO PIC16F84A.
INCLUDE "P16f84a.inc" ;LIBRERIA PIC16F84A.
;*********************************************************************
;CONTADORES DE TEMPORIZADORES
;*********************************************************************
CONTA_1 EQU 0x10 ;DECLARAMOS CONTA_1
CONTA_2 EQU 0x20 ;DECLARAMOS CONTA_2
CONTA_3 EQU 0x30 ;DECLARAMOS CONTA_3
;*********************************************************************
;INICIO DEL PROGRAMA
;*********************************************************************
ORG 00h ;
GOTO INICIO ;SALTA A INICIO
ORG 05h ;
INICIO:
BSF STATUS,RP0 ;CONFIGURAMOS LOS PUERTOS
BCF PORTB,2 ;CONFIGURAMOS COMO SALIDA
BCF PORTB,3 ;CONFIGURAMOS COMO SALIDA
BCF PORTB,4 ;CONFIGURAMOS COMO SALIDA
BCF PORTB,5
BCF PORTB,6
BCF PORTB,7
BSF PORTA,0 ;COMO ENTRADA EL BIT 0 DEL PUERTO A
BSF PORTA,1 ;COMO ENTRADA EL BIT 1 DEL PUERTO A
BSF PORTB,0 ;COMO ENTRADAA EL PORTB,0
BCF STATUS,RP0 ;ACABADOS CON LA CONFIGURACION DE LOS PUERTOS Y NOS VAMOS AL BANCO 0
;**********************************************************************
;CONFIGURACION DEL INTCON
;*********************************************************************
MOVLW 0XB8 ;ACTIVACION DE INTERRUPCIONES
MOVWF INTCON
;**************************************************
;ENCENDIDO DEL LED ON
;****************************************************
ENCENDIDO:
BTFSS PORTB,0 ;SI HAY UN 1 EN EL PURTOB,0 ENCENDIDO DEL LED ON
GOTO INICIO
GOTO DIRECCION_1
DIRECCION_1:
BTFSS PORTA,0
GOTO DIRECCION_2
GOTO COMBINACION1
;PORCESO DE ENCENDIDO Y APAGADO PARA PASO DEL BUS HORIZONTAL
DIRECCION_2:
BTFSS PORTA,1
GOTO COMBINACION1
CLRF PORTB
BSF PORTB,4
BSF PORTB,6
CALL RETARDO1
BCF PORTB,4
BSF PORTB,3
CALL RETARDO2
BCF PORTB,3
BSF PORTB,2
BSF PORTB,5
GOTO INICIO
;PROCESO DE ENCENDIDO Y APAGADO DEL BUS EN DIRECCION VERTICAL
;========**************************===========
;========**ILUMINACIÓN SEMÁFOROS**===========
;========**************************===========
; ==========================
; ====AVENIDA HORIZONTAL====
; ==========================
COMBINACION1:
CLRF PORTB ;LIMPIA EL PORTB
;********************************************************************
;SEMAFORO 1 Y 3 HORIZONTAL
;********************************************************************
BSF PORTB,5 ;SEMÁFOROS HORIZONTAL VERDE
BSF PORTB,2 ;SEMÁFOROS VERTICAL ROJO
CALL RETARDO1 ;15 SEGUNDOS SEMÁFOROS X EN VERDE
BCF PORTB,5 ;SEMÁFOROS HORIZONTAL VERDE APAGADO
BSF PORTB,7 ;SEMÁFOROS HORIZONTAL EN AMBAR ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
BCF PORTB,7 ;SEMÁFOROS HORIZONTAL AMBAR APAGADOS
BCF PORTB,2 ;SEMAFOROS VERTICAL ROJO APAGADOS
BSF PORTB,4 ;SEMAFORO VERTICAL VERDE ENCENDIDO
BSF PORTB,6 ;SEMAFORO HORIZONTAL ROJO ENCENDIDO
GOTO COMBINACION2
; ==========================
; ==== AVENIDA VERTICAL ====
; ==========================
COMBINACION2:
CALL RETARDO1 ;15 SEGUNDOS
BCF PORTB,4 ;SEMAFOROS VERTICAL VERDE APAGADO
BSF PORTB,3 ;SEMAFOROS AMBAR VERTICAL ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
BCF PORTB,3 ;SEMAFORO VERTICAL APAGADO AMBAR
BSF PORTB,4 ;SEMAFORO VERTICAL ENCENDIDO VERDE
BSF PORTB,2 ;SEMAFORO HORIZONTAL ENCENDIDO ROJO
GOTO COMBINACION1
;===========********************===========
;===========**TIEMPOS DE LUCES**===========
;===========********************===========
; $$$$$$$$$$$$$$$$$$$$$$$
; $$RETARDO 15 SEGUNDOS$$
; $$$$$$$$$$$$$$$$$$$$$$$
RETARDO1: MOVLW 0x88
MOVWF CONTA_1
MOVLW 0xB3
MOVWF CONTA_2
MOVLW 0x21
MOVWF CONTA_3
RETAR_15S
DECFSZ CONTA_1,f
GOTO $+2
DECFSZ CONTA_2,f
GOTO $+2
DECFSZ CONTA_3,f
GOTO RETAR_15S
RETURN
; $$$$$$$$$$$$$$$$$$$$$$
; $$RETARDO 3 SEGUNDOS$$
; $$$$$$$$$$$$$$$$$$$$$$
RETARDO2: MOVLW 0x1A
MOVWF CONTA_1
MOVLW 0xE7
MOVWF CONTA_2
MOVLW 0x0B
MOVWF CONTA_3
RETAR_3S
DECFSZ CONTA_1,f
GOTO $+2
DECFSZ CONTA_2,f
GOTO $+2
DECFSZ CONTA_3,f
GOTO RETAR_3S
RETURN
END
** que me aconsejaies que modifique... creo que la onfigurancion del intcon para la interrupcion no es exactaa.... Un saludooo
-
Esto es obligatorio leerlo:
http://www.todopic.com.ar/foros/index.php?topic=24720.0
Estas activando interrupcion por TMR0, por cambio de estado en RB4-RB7 y por RB0, pero no tienes rutina de tratamiento de la interrupcion, al pulsar RB0 va a inicio. Si vas a controlar 2 pulsadores mejor interrupcion RB4-RB7, o mejor aun contar con el TMR0 y ya no necesitas interrupcion, hay mas opciones pero lee ese enlace y despues pregunta.
-
Graciasss tio ya me aclaradoo bastantee con las interrupcionesss ;)
-
Bien, si ya te has leido eso, ya puedes empezar a hacerlo.
Debes cambiar bastantes cosas, creo yo, primero cuando pongas un programa para que te lo miren debes de poner como tienes configurados los "FUSES" por ejemplo asi:
list p=16F84A
#include P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
Porque a mi la primera vez que lo simule me saltaba el WDT, igual el problema viene por ahi y quien lo simula no sabe como lo tienes configurado.
Para configurar los puertos mejor que asi:
INICIO:
BSF STATUS,RP0 ;CONFIGURAMOS LOS PUERTOS
BCF PORTB,2 ;CONFIGURAMOS COMO SALIDA
BCF PORTB,3 ;CONFIGURAMOS COMO SALIDA
BCF PORTB,4 ;CONFIGURAMOS COMO SALIDA
BCF PORTB,5
BCF PORTB,6
BCF PORTB,7
BSF PORTA,0 ;COMO ENTRADA EL BIT 0 DEL PUERTO A
BSF PORTA,1 ;COMO ENTRADA EL BIT 1 DEL PUERTO A
BSF PORTB,0 ;COMO ENTRADAA EL PORTB,0
BCF STATUS,RP0 ;ACABADOS CON LA CONFIGURACION DE LOS PUERTOS Y NOS VAMOS AL BANCO 0
Asi:
INICIO
bsf STATUS,RP0
movlw 0x01 :PORTB todas salidas excepto RBO
movwf PORTB
movlw 0x03 ;RA0, RA1 entradas resto salidas
movwf PORTA
bcf STATUS.RP0
Hacer una temporizacion de 3seg es una animalada y una de 15seg ya no te digo nada. El procesador debe estar el mayor tiempo posible en el programa principal, atendiendo a las cosas importantes y en las subrutinas el menor tiempo posible, ya que mientras esta en las subrutinas no se entera de nada, hay veces que hay excepciones a esto, pero generalmente es asi. Haz una temporizacion mas pequeña, 500ms (que es bastante grande pero en principio igual te vale) y la llamas 6 veces para hacer 3seg y 30veces para hacer 15seg. cada vez que retorna chequeas los pulsadores, de esta manera no estaras mas de 500ms sin saber lo que esta pasando.
Hace algun hicimos aqui en el foro algo parecido con unos intermitentes de una Harley, alli era 1seg, primero lo hicimos asi y despues con el TMR0 que es como se debe de hacer, esta hecho con TMRO sin interrupcion chequeando el flag INTCON,T0IF el que se enciende al desbordar TMRO.
http://www.todopic.com.ar/foros/index.php?topic=32966.0
Bueno ves haciendo y si tienes problemas pregunta, aunque despues de leer ese tutorial que te puse en el post anterior ya no debias de tener casi dudas. :lol:
-
OK sii en unaa tonteriaa que lo tengo 15 segundosss.. no consigoo que con la interruocion externa quiero que indique que viene un autobus y que sigaa manteniendo el semaforo en verde otros 15 segundos.. nose por quee.. lo que hago es:
cuando va a terminar la cuenta de los 15 segundos llamo con call autobus1 y luego;
AUTOBUS1:
BTFSS INTCON,INTF
RETURN
BTFSS PORTA,0
BCF INTCON,INTF
GOTO COMBINACION1
por que tengo 2 direccciones y primero pregunto si viene por la direccion que viene cuando esta el semaforo en verde y lo mando a combinacion 1 que es donde se encuentra el semaforo en verde y lo vuelve a repetir es mi ideaa.. como laa ves.. pero no m funcionaa bien si tiens alguna pregunta d como lo estoi haciendo.. dimela y te la explico... Muchas graciass tioo
-
¿Tu necesitas dos interrupciones no? ¿para saber si vienen autobuses por dos sitios distintos?, si es asi no te vale RB0, podria valer poniendo los dos sensores a una puerta OR, pero tienes interrupcion en RB4-RB7, si cualquiera de estes pines cambia de estado se produce una interrupcion.
Lo de la interrupcion no lo tienes claro, tu no tienes que llamarla se produce ella sola, siempre que tengas bien configurado el INTCON_REG claro, cuando se produce, en tu caso cuando cambie de estado uno de los sensores que tengas en RB4-RB7, el programa va a 0x04 QUE ES EL VECTOR DE INTERRUPCION, desde ahi tienes tienes que realizar el programa de interrupcion bien ahi mismo o mediante un GOTO ISR mandarlo a donde la tengas hecha:
Inicio_ISR
movwf W_Temp ; Copiamos W a un registro Temporario.-
swapf STATUS, W ;Invertimos los nibles del registro STATUS.-
movwf STATUS_Temp ; Guardamos STATUS en un registro temporal.-
;aqui va tu rutina de interrupcion
Fin_ISR
swapf STATUS_Temp,W ; Invertimos lo nibles de STATUS_Temp.-
movwf STATUS
swapf W_Temp, f ; Invertimos los nibles y lo guardamos en el mismo registro.-
swapf W_Temp,W ; Invertimos los nibles nuevamente y lo guardamos en W.-
retfie ; Salimos de interrupción.-
Pra que se produzca interrupcion por cambio de estado RB4-RB7 INTCON tiene que estar configurado asi: "1000 1000" chequeas RBIF para asegurarte que es po cambio en PORTB y despues chequeas cual de los dos es, supon que tienes autobus derecha PORTB,4 y autobus izquierda PORTB,5.
btfss INTCON,RBIF
retfie
btfsc PORTB,4
goto AUTOBUS_DCHA
btfsc PORTB,5
goto AUTOBUS_IZQDA
retfie
En AUTOBUS_IZQDA y AUTOBUS_DCHA haces las rutinas correspondientes de las luces del semaforo.
En el enlace que puse arriba tienes una explicacion de uso de las interrupciones, leetelo bien, es importante que sepas lo que son, como se hacen, para que sirven...
http://www.todopic.com.ar/foros/index.php?topic=24720.msg201405#msg201405
El ejemplo que pone Suki de lectura de un teclado matricial, posiblemente para ti sea un poco complicado, pero si tienes dudas pregunta, pero leetelo primero.
-
;PROYECTO SEMÁFORO CON PIC 16F84A
;Colocacion de los semaforos en los puertos
;********************************************************************
;SEMAFORO 1 Y 3:VERDE-->RA0 HORIZONTAL
; NARANJA-->RA1
; ROJO-->RA2
;
;SEMAFOROS 2 Y 4:VERDE-->RA3 VERTICAL
; NARANJA-->RB1
; ROJO-->RB2
;AUTOBUS HORIZONTAL-->RB4
;AUTOBUS VERTICAL-->RB5
;*********************************************************************
;DEFINIMOS EL PIC QUE UTILIZAMOS
;*********************************************************************
LIST p=16F84A ;DIRECTORIO PIC16F84A.
INCLUDE "P16f84a.inc" ;LIBRERIA PIC16F84A.
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;*********************************************************************
;CONTADORES DE TEMPORIZADORES
;*********************************************************************
CONTA_1 EQU 0x10 ;DECLARAMOS CONTA_1
CONTA_2 EQU 0x20 ;DECLARAMOS CONTA_2
CONTA_3 EQU 0x30 ;DECLARAMOS CONTA_3
;*********************************************************************
;INICIO DEL PROGRAMA
;*********************************************************************
ORG 00h ;
GOTO INICIO ;SALTA A INICIO
ORG 05h ;
INICIO:
BSF STATUS,RP0 ;CONFIGURAMOS LOS PUERTOS
MOVLW b'11110000' ;PORTB entradas de la interrupcion por en rb4-rb7
MOVWF TRISB
MOVLW 0x00 ;Puerto A salidas
MOVWF TRISA
BCF STATUS,RP0
;; Habilitamos GIE RBIE RB0 (interrupción RB4 a RB7 Y INTERRUPCION EXTERNA)
BCF INTCON,RBIF
MOVLW b'10001000'
MOVWF INTCON
;PROCESO DE ENCENDIDO Y APAGADO DEL BUS EN DIRECCION VERTICAL
;========**************************===========
;========**ILUMINACIÓN SEMÁFOROS**===========
;========**************************===========
; ==========================
; ====AVENIDA HORIZONTAL====
; ==========================
CLRF PORTA ;LIMPIA EL PORTA
CLRF PORTB ;LIMPIA EL PORTB
;********************************************************************
;SEMAFORO 1 Y 3 HORIZONTAL
;********************************************************************
COMBINACION1:
BSF PORTA,0 ;SEMÁFOROS HORIZONTAL VERDE
BSF PORTB,2 ;SEMÁFOROS VERTICAL ROJO
CALL RETARDO1 ;15 SEGUNDOS SEMÁFOROS X EN VERDE
BCF PORTA,0 ;SEMÁFOROS HORIZONTAL VERDE APAGADO
BSF PORTA,1 ;SEMÁFOROS HORIZONTAL EN AMBAR ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
BCF PORTA,1 ;SEMÁFOROS HORIZONTAL AMBAR APAGADOS
BCF PORTB,2 ;SEMAFOROS VERTICAL ROJO APAGADOS
BSF PORTA,3 ;SEMAFORO VERTICAL VERDE ENCENDIDO
BSF PORTA,2 ;SEMAFORO HORIZONTAL ROJO ENCENDIDO
GOTO COMBINACION2
; ==========================
; ==== AVENIDA VERTICAL ====
; ==========================
COMBINACION2:
CALL RETARDO1 ;15 SEGUNDOS
BCF PORTA,3 ;SEMAFOROS VERTICAL VERDE APAGADO
BSF PORTB,1 ;SEMAFOROS AMBAR VERTICAL ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
BCF PORTA,2 ;SEMAFORO HORIZONTAL VERDE APAGADO
BCF PORTB,1
BSF PORTA,0 ;SEMAFORO VERTICAL ENCENDIDO VERDE
BSF PORTB,2 ;SEMAFORO HORIZONTAL ENCENDIDO ROJO
GOTO COMBINACION1
;********************************************************************
;**************AUTOBUS TRATAMIENTO DE LA INTERRUPCION EXTERNA********
;********************************************************************
;********************************************************************
BTFSS PORTB,4
BTFSS PORTB,5
GOTO BUS_HORIZONTAL
GOTO BUS_VERTICAL
BUS_HORIZONTAL:
CLRF PORTB
CLRF PORTA
BSF PORTA,0 ;SEMÁFOROS HORIZONTAL VERDE
BSF PORTB,2 ;SEMÁFOROS VERTICAL ROJO
CALL RETARDO1 ;15 SEGUNDOS SEMÁFOROS X EN VERDE
BCF PORTA,0 ;SEMÁFOROS HORIZONTAL VERDE APAGADO
BSF PORTA,1 ;SEMÁFOROS HORIZONTAL EN AMBAR ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
BCF PORTA,1 ;SEMÁFOROS HORIZONTAL AMBAR APAGADOS
BCF PORTB,2 ;SEMAFOROS VERTICAL ROJO APAGADOS
BSF PORTA,3 ;SEMAFORO VERTICAL VERDE ENCENDIDO
BSF PORTA,2 ;SEMAFORO HORIZONTAL ROJO ENCENDIDO
RETFIE
BUS_VERTICAL:
CLRF PORTB
CLRF PORTA
BSF PORTA,3 ;SEMAFORO VERTICAL VERDE ENCENDIDO
BSF PORTA,2 ;SEMAFORO HORIZONTAL ROJO ENCENDIDO
CALL RETARDO1 ;15 SEGUNDOS
BCF PORTA,3 ;SEMAFOROS VERTICAL VERDE APAGADO
BSF PORTB,1 ;SEMAFOROS AMBAR VERTICAL ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
BCF PORTA,2 ;SEMAFORO HORIZONTAL VERDE APAGADO
BCF PORTB,1
BSF PORTA,0 ;SEMAFORO VERTICAL ENCENDIDO VERDE
BSF PORTB,2 ;SEMAFORO HORIZONTAL ENCENDIDO ROJO
RETFIE
;===========********************===========
;===========**TIEMPOS DE LUCES**===========
;===========********************===========
; $$$$$$$$$$$$$$$$$$$$$$$
; $$RETARDO 15 SEGUNDOS$$
; $$$$$$$$$$$$$$$$$$$$$$$
RETARDO1: MOVLW 0x88
MOVWF CONTA_1
MOVLW 0xB3
MOVWF CONTA_2
MOVLW 0x21
MOVWF CONTA_3
RETAR_15S
DECFSZ CONTA_1,f
GOTO $+2
DECFSZ CONTA_2,f
GOTO $+2
DECFSZ CONTA_3,f
GOTO RETAR_15S
RETURN
; $$$$$$$$$$$$$$$$$$$$$$
; $$RETARDO 3 SEGUNDOS$$
; $$$$$$$$$$$$$$$$$$$$$$
RETARDO2: MOVLW 0x1A
MOVWF CONTA_1
MOVLW 0xE7
MOVWF CONTA_2
MOVLW 0x0B
MOVWF CONTA_3
RETAR_3S
DECFSZ CONTA_1,f
GOTO $+2
DECFSZ CONTA_2,f
GOTO $+2
DECFSZ CONTA_3,f
GOTO RETAR_3S
RETURN
END
Lo tengo realizado de esta forma pero no m funciona al llamar la interrupcion de cambio de estado en rb4 a rb7 que tengo conectados dos pulsadores uno para bus horizontal y otro para vertical.. como me indicastess pero el porblemaa lo debo de tener por que cuando m meto en la interrupcion simpre estoi situado en un retardo y lo debo de realizar con el timer peroo estoi viendo tus apuntes que me recomendastess y no tengo ni idea como conseguir los 3 segundos y los 15 segundo con timer aver si me puedes exar unaa manoo que lo tenems yaa casi realizadooo Muchass Graciassss!!!!!! ;) espero tu respuestaaa
-
Necesitoo hacer el de 3 segundos para luego una vez exo repetirloo 5 veces!! paraa realizar el de 15 segundos como lo haria..
-
Sigues sin tener bien la interrupcion:
ORG 00h ;
GOTO INICIO ;SALTA A INICIO
ORG 05h
Tienes esto al principio, la interrupcion cuando salta va al vector de interrupcion 0X04,tienes que ponerlo asi:
Reset
org 0x00 ; Aquí comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
;**** Vector de Interrupcion ****
org 0x04 ; Atiendo Interrupcion.-
goto Inicio_ISR
; **** Programa Principal ****
;**** Configuracion de puertos ***
org 0x05 ; Origen del código de programa.-
Inicio ;aqui empieza tu programa.
Despues en cualquier parte del programa pones esto:
Inicio_ISR
movwf W_Temp ; Copiamos W a un registro Temporal.-
swapf STATUS, W ;Invertimos los nibles del registro STATUS.-
movwf STATUS_Temp ; Guardamos STATUS en un registro temporal.-
DETECTAR_AUTOBUS
btfss INTCON,RBIF ;nos aseguramos que hubo interrupcion
retfie
btfsc PORTB,4
goto AUTOBUS_DCHA
btfsc PORTB,5
goto AUTOBUS_IZQDA
retfie
AUTOBUS_DCHA
;aqui secuencia de luces para autobus derecha
AUTOBUS_IZQDA
;aqui secuencia de luces para autobus izquierda
Fin_ISR
swapf STATUS_Temp,W ; Invertimos lo nibles de STATUS_Temp.-
movwf STATUS
swapf W_Temp, f ; Invertimos los nibles y lo guardamos en el mismo registro.-
swapf W_Temp,W ; Invertimos los nibles nuevamente y lo guardamos en W.-
retfie ; Salimos de interrupción.-
No te has leido bien lo que te dije, a la interrupcion no la llamas tu, salta ella sola y va a 0x04, desde ahi la tratas.
Tambien puedes hacerlo sin interrupcion, un bus tiene sobre 12m de largo pasa ante un sensor, pongamos a 100km/h, que ya es bastante pero hay que ponerse en el peor de los casos, asi que va 27.78m/s, por lo tanto recorrer los 12m para pasar el sensor lo hace en 431.97ms, por lo tanto si chequeamos los sensores en tiempos inferiores a 432ms siempre detectaremos al bus.
Entonces para asegurarse haces una temporizacion de 250ms:
DEMORA movlw .197 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .253 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2
return ; 2+2 Fin.
Esta temporizacion la llamas 12 veces para 3s y 60 veces para 15s:
RETARDO_3S
call DEMORA
btfsc PORTB,4
goto BUS_DERECHA
btfsc PORTB,5
goto BUS_IZQUIERDA
incf CONTADOR
movlw .12
subwf CONTADOR
btfsc STATUS,Z ;comprobamos si van 12, mediante FLAG de 0 de STATUS
goto ACABO_3S ; aqui va año que haca al acabar el tiempo de 3s
clrf CONTADOR ;borramos CONTADOR
goto RETARDO_3S ; todavia no van 3s sigue aqui
Para la de 15s haces otra igual que esta y le cambias el 12 por 60, haciendolo asi cada 250ms sabras si paso un autobus, tienes que definir al principio:
PDel0 EQU 0X20
PDel1 EQU 0X21
CONTADOR EQU 0X22
Bueno tu veras como quieres hacerlo, pero por interrupciones tienes que volver a leer lo que te puse antes, si estas empezando mejor de la segunda manera, en el post de las intermitentes que tambien te puse mas arriba, viene mas o menos esta segunda manera de hacerlo y despues con tmer0. Bueno lo hice sobre la marcha, asi que puede tener algun error.
-
Ves como habia algun fallo, esta rutina estaba mal, ponla asi:
RETARDO_3S
call DEMORA
btfsc PORTB,4
goto BUS_DERECHA
btfsc PORTB,5
goto BUS_IZQUIERDA
incf CONTADOR
movlw .12
subwf CONTADOR
btfss STATUS,Z ;comprobamos si van 12, mediante FLAG de 0 de STATUS
goto RETARDO_3S ; todavia no van 3s sigue
clrf CONTADOR ;borramos CONTADOR
goto ACABO_3S ; aqui va a lo que haga al acabar el tiempo de 3s
-
Muchass Graciasss tioo estoi aprendiendoo mucho con los consejos que me estas dandoo mi fallo era que noo trataba bien la interrupcion ya lo e modificadoo y me funcionaa bien.. con los retardo que ya tengo yo realizadosssss auquee lo qu no m va bien es una vez que haya modificado el estado de autobus derecha e izquierda que se vuelva a moificar el estadooo y creo que es por que tengo que volver a limpiar la bandera de cambio de estado no?? te dejo el porgramaa modificado con tus consejoss... y m recomiendas que debo cambiar para conseguir la depuracion del porgrama...
;********************************************************************
;SEMAFORO 1 Y 3:VERDE-->RA0 HORIZONTAL
; NARANJA-->RA1
; ROJO-->RA2
;
;SEMAFOROS 2 Y 4:VERDE-->RA3 VERTICAL
; NARANJA-->RB1
; ROJO-->RB2
;AUTOBUS HORIZONTAL-->RB4
;AUTOBUS VERTICAL-->RB5
;*********************************************************************
;DEFINIMOS EL PIC QUE UTILIZAMOS
;*********************************************************************
LIST p=16F84A ;DIRECTORIO PIC16F84A.
INCLUDE "P16f84a.inc" ;LIBRERIA PIC16F84A.
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;*********************************************************************
;CONTADORES DE TEMPORIZADORES
;*********************************************************************
CONTA_1 EQU 0x10 ;DECLARAMOS CONTA_1
CONTA_2 EQU 0x20 ;DECLARAMOS CONTA_2
CONTA_3 EQU 0x30 ;DECLARAMOS CONTA_3
W_Temp EQU 0x0D ; Registro para guardar temporalmente W.-
STATUS_Temp EQU 0x0E ; Registro para guardar temporalmente STATUS
;*********************************************************************
;INICIO DEL PROGRAMA
;*********************************************************************
RESET
ORG 0x00 ; Aquí comienza el micro.-
GOTO INICIO ; Salto a inicio de mi programa.-
ORG 0x04 ; Atiendo Interrupcion.-
GOTO Inicio_ISR
ORG 0x05 ; Origen del código de programa.-
INICIO:
BSF STATUS,RP0 ;CONFIGURAMOS LOS PUERTOS
MOVLW b'11110000' ;PORTB entradas de la interrupcion por en rb4-rb7
MOVWF TRISB
MOVLW 0x00 ;Puerto A salidas
MOVWF TRISA
BCF STATUS,RP0
;; Habilitamos GIE RBIE RB0 (interrupción RB4 a RB7 Y INTERRUPCION EXTERNA)
BCF INTCON,RBIF
MOVLW b'10001000'
MOVWF INTCON
;PROCESO DE ENCENDIDO Y APAGADO DEL BUS EN DIRECCION VERTICAL
;========**************************===========
;========**ILUMINACIÓN SEMÁFOROS**===========
;========**************************===========
; ==========================
; ====AVENIDA HORIZONTAL====
; ==========================
;********************************************************************
;SEMAFORO 1 Y 3 HORIZONTAL
;********************************************************************
COMBINACION1:
CLRF PORTA ;LIMPIA EL PORTA
CLRF PORTB ;LIMPIA EL PORTB
BSF PORTA,0 ;SEMÁFOROS HORIZONTAL VERDE
BSF PORTB,2 ;SEMÁFOROS VERTICAL ROJO
CALL RETARDO1 ;15 SEGUNDOS SEMÁFOROS X EN VERDE
BCF PORTA,0 ;SEMÁFOROS HORIZONTAL VERDE APAGADO
BSF PORTA,1 ;SEMÁFOROS HORIZONTAL EN AMBAR ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
BCF PORTA,1 ;SEMÁFOROS HORIZONTAL AMBAR APAGADOS
BCF PORTB,2 ;SEMAFOROS VERTICAL ROJO APAGADOS
BSF PORTA,3 ;SEMAFORO VERTICAL VERDE ENCENDIDO
BSF PORTA,2 ;SEMAFORO HORIZONTAL ROJO ENCENDIDO
GOTO COMBINACION2
; ==========================
; ==== AVENIDA VERTICAL ====
; ==========================
COMBINACION2:
CALL RETARDO1 ;15 SEGUNDOS
BCF PORTA,3 ;SEMAFOROS VERTICAL VERDE APAGADO
BSF PORTB,1 ;SEMAFOROS AMBAR VERTICAL ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
BCF PORTA,2 ;SEMAFORO HORIZONTAL VERDE APAGADO
BCF PORTB,1
BSF PORTA,0 ;SEMAFORO VERTICAL ENCENDIDO VERDE
BSF PORTB,2 ;SEMAFORO HORIZONTAL ENCENDIDO ROJO
GOTO COMBINACION1
;********************************************************************
;**************AUTOBUS TRATAMIENTO DE LA INTERRUPCION EXTERNA********
;********************************************************************
;********************************************************************
Inicio_ISR:
MOVWF W_Temp ; Copiamos W a un registro Temporal.-
SWAPF STATUS, W ;Invertimos los nibles del registro STATUS.-
MOVWF STATUS_Temp ; Guardamos STATUS en un registro temporal.-
DETECTAR_AUTOBUS
BTFSS INTCON,RBIF ;nos aseguramos que hubo interrupcion
RETFIE
BTFSC PORTB,4
GOTO AUTOBUS_HORIZONTAL
BTFSC PORTB,5
GOTO AUTOBUS_VERTICAL
RETFIE
AUTOBUS_HORIZONTAL:
CLRF PORTB
CLRF PORTA
BSF PORTA,0 ;SEMÁFOROS HORIZONTAL VERDE
BSF PORTB,2 ;SEMÁFOROS VERTICAL ROJO
CALL RETARDO1 ;15 SEGUNDOS SEMÁFOROS X EN VERDE
BCF PORTA,0 ;SEMÁFOROS HORIZONTAL VERDE APAGADO
BSF PORTA,1 ;SEMÁFOROS HORIZONTAL EN AMBAR ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
BCF PORTA,1 ;SEMÁFOROS HORIZONTAL AMBAR APAGADOS
BCF PORTB,2 ;SEMAFOROS VERTICAL ROJO APAGADOS
BSF PORTA,3 ;SEMAFORO VERTICAL VERDE ENCENDIDO
BSF PORTA,2 ;SEMAFORO HORIZONTAL ROJO ENCENDIDO
BCF INTCON,RBIF
AUTOBUS_VERTICAL:
CLRF PORTB
CLRF PORTA
BSF PORTA,3 ;SEMAFORO VERTICAL VERDE ENCENDIDO
BSF PORTA,2 ;SEMAFORO HORIZONTAL ROJO ENCENDIDO
CALL RETARDO1 ;15 SEGUNDOS
BCF PORTA,3 ;SEMAFOROS VERTICAL VERDE APAGADO
BSF PORTB,1 ;SEMAFOROS AMBAR VERTICAL ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
GOTO COMBINACION1
BCF PORTA,2 ;SEMAFORO HORIZONTAL VERDE APAGADO
BCF PORTB,1
BSF PORTA,0 ;SEMAFORO VERTICAL ENCENDIDO VERDE
BSF PORTB,2 ;SEMAFORO HORIZONTAL ENCENDIDO ROJO
BCF INTCON,RBIF
Fin_ISR
SWAPF STATUS_Temp,W ; Invertimos lo nibles de STATUS_Temp.-
MOVWF STATUS
SWAPF W_Temp, f ; Invertimos los nibles y lo guardamos en el mismo registro.-
SWAPF W_Temp,W ; Invertimos los nibles nuevamente y lo guardamos en W.-
RETFIE ; Salimos de interrupción.-
;===========********************===========
;===========**TIEMPOS DE LUCES**===========
;===========********************===========
; $$$$$$$$$$$$$$$$$$$$$$$
; $$RETARDO 15 SEGUNDOS$$
; $$$$$$$$$$$$$$$$$$$$$$$
RETARDO1: MOVLW 0x88
MOVWF CONTA_1
MOVLW 0xB3
MOVWF CONTA_2
MOVLW 0x21
MOVWF CONTA_3
RETAR_15S
DECFSZ CONTA_1,f
GOTO $+2
DECFSZ CONTA_2,f
GOTO $+2
DECFSZ CONTA_3,f
GOTO RETAR_15S
RETURN
; $$$$$$$$$$$$$$$$$$$$$$
; $$RETARDO 3 SEGUNDOS$$
; $$$$$$$$$$$$$$$$$$$$$$
RETARDO2: MOVLW 0x1A
MOVWF CONTA_1
MOVLW 0xE7
MOVWF CONTA_2
MOVLW 0x0B
MOVWF CONTA_3
RETAR_3S
DECFSZ CONTA_1,f
GOTO $+2
DECFSZ CONTA_2,f
GOTO $+2
DECFSZ CONTA_3,f
GOTO RETAR_3S
RETURN
END
de nuevooo Un saludoo y Muchass Graciass!!!
-
El problema es que no puedes salir de la interrupcion como lo haces tienes que salir a traves de la rutina fin_ISR, para restablecer los registros W y STATUS y con el retfie volver a activar la interrupcion (setear el bit GIE) ya que la interrupcion cuando se produce lo desactiva. Cuando hace AUTOBUS_HORIZONTAL a continuacion hace AUTOBUS_VERTICAL tu no quieres eso, verdad?
AUTOBUS_HORIZONTAL:
CLRF PORTB
CLRF PORTA
BSF PORTA,0 ;SEMÁFOROS HORIZONTAL VERDE
BSF PORTB,2 ;SEMÁFOROS VERTICAL ROJO
CALL RETARDO1 ;15 SEGUNDOS SEMÁFOROS X EN VERDE
BCF PORTA,0 ;SEMÁFOROS HORIZONTAL VERDE APAGADO
BSF PORTA,1 ;SEMÁFOROS HORIZONTAL EN AMBAR ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
BCF PORTA,1 ;SEMÁFOROS HORIZONTAL AMBAR APAGADOS
BCF PORTB,2 ;SEMAFOROS VERTICAL ROJO APAGADOS
BSF PORTA,3 ;SEMAFORO VERTICAL VERDE ENCENDIDO
BSF PORTA,2 ;SEMAFORO HORIZONTAL ROJO ENCENDIDO
BCF INTCON,RBIF
goto fin_ISR ;aqui pon esto para salir si no pones esto hace AUTOBUS_VERTICAL
AUTOBUS_VERTICAL:
CLRF PORTB
CLRF PORTA
BSF PORTA,3 ;SEMAFORO VERTICAL VERDE ENCENDIDO
BSF PORTA,2 ;SEMAFORO HORIZONTAL ROJO ENCENDIDO
CALL RETARDO1 ;15 SEGUNDOS
BCF PORTA,3 ;SEMAFOROS VERTICAL VERDE APAGADO
BSF PORTB,1 ;SEMAFOROS AMBAR VERTICAL ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
GOTO COMBINACION1 ; esta eliminala no puedes salir asi de interrupcion
BCF PORTA,2 ;SEMAFORO HORIZONTAL VERDE APAGADO
BCF PORTB,1
BSF PORTA,0 ;SEMAFORO VERTICAL ENCENDIDO VERDE
BSF PORTB,2 ;SEMAFORO HORIZONTAL ENCENDIDO ROJO
BCF INTCON,RBIF
Fijate es esas dos cosas que te pongo en negrita, creo que asi ya va.
La temporizacion de 15s esta bien pero la de 3s da casi 5s. En el segundo post te pone Norberto de donde bajar un programa que te las hace automaticamente exactas a la millonesima, solo le pones la frec, el tiempo que quieres y te genera el codigo, solo copias pegas y listo.
-
Tambien te pasa una cosa curiosa pero logica y es que como usas las mismas temporizaciones y los mismos registros para decrementar, cuando la interrupcion salta en medio de la temporizacion, que es casi siempre porque el programa esta ahi el 99% del tiempo, al salir de interrupcion sale con los reg, a 0 y por tanto cuenta los segundos que le da la gana, pero siempre mas de 100s en las pruebas que yo hice.
Tienes dos soluciones, o eso creo, una es hacer dos temporizaciones de 3 y 15s pero llamandoles de otra manera por ejmplo RETARDO3 y RETARDO4 y asignarles otros reg. por ejemplo:
CONTA_1 EQU 0x10 ;DECLARAMOS CONTA_1
CONTA_2 EQU 0x20 ;DECLARAMOS CONTA_2
CONTA_3 EQU 0x30 ;DECLARAMOS CONTA_3
CONTA_4 EQU 0x11 ;DECLARAMOS CONTA_4
CONTA_5 EQU 0x12 ;DECLARAMOS CONTA_5
CONTA_6 EQU 0x13 ;DECLARAMOS CONTA_6
Y los sustituyes en las temporizaciones que llamas desde la interupcion, de modo que desde el programa principal usas unas y en la interrupcion otras.
La segunda opcion es guardar los reg. cuando entras en interrupcion y restaurarlos al salir de ella, como haces con W y STATUS., asi tambien te daras cuenta lo importante que es guardar los reg. tal y como estan antes de entrar en interrupcion y restaurarlos al salir:
Inicio_ISR:
MOVWF W_Temp ; Copiamos W a un registro Temporal.-
SWAPF STATUS, W ;Invertimos los nibles del registro STATUS.-
MOVWF STATUS_Temp ; Guardamos STATUS en un registro temporal.-
MOVF CONTA_1
MOVWF CONTA_1TEMP
MOVF CONTA_2
MOVWF CONTA_2TEMP
MOVF CONTA_3
MOVWF CONTA_3TEMP
Fin_ISR
MOVF CONTA_1TEMP
MOVWF CONTA_1
MOVF CONTA_2TEMP
MOVWF CONTA_2
MOVF CONTA_2TEMP
MOVWF CONTA_2
SWAPF STATUS_Temp,W ; Invertimos lo nibles de STATUS_Temp.-
MOVWF STATUS
SWAPF W_Temp, f ; Invertimos los nibles y lo guardamos en el mismo registro.-
SWAPF W_Temp,W ; Invertimos los nibles nuevamente y lo guardamos en W.-
RETFIE ; Salimos de interrupción.-
Bueno creo que debe funcionar de ambas formas, el fin de semana si tengo tiempo lo pruebo. Con esto no quiero decir que no lo pruebes tu tambien. :lol:
-
Ok ya lo e probadoo con tu recomendacion que le ponga diferentes contadores a cada retardos tanto 15 segundo como 3 segundoo y me funcionaa perfectamenteee Muchasss Graciass por todoo te lo agradezcooo Muchooo me as ayudadoo aprender sobre todo las interrupcioness que tenia conceptos equivocadoss de como tratrarlas... sii tengo alguna duda mass no dudare en comentartelaa Makinaa!!! Un saludoo
Ahora lo montare programare el pic y aver que tal marchaa ejeje
-
Me alegro de que funcione :-/ :-/, un par de cosas que he visto al simularlos.
DETECTAR_AUTOBUS
BTFSS INTCON,RBIF ;nos aseguramos que hubo interrupcion
;RETFIE ; aqui de debe venir nunca pero si viniera
GOTO Fin_ISR ; mejor salir asi
BTFSC PORTB,4
GOTO AUTOBUS_HORIZONTAL
BTFSC PORTB,5
GOTO AUTOBUS_VERTICAL
;RETFIE ; aqui si puede venir aunque no debe
BCF INTCON,RBIF ; si viene es por cambio de estado de 1 a 0 hay que borrar RBIF
GOTO Fin_ISR ; y restablecer REG.
Aqui me olvide de poner unos 0, joder siempre se me olvidan, :lol:
Queda asi por si a alguien le interesa:
Inicio_ISR:
MOVWF W_Temp ; Copiamos W a un registro Temporal.-
SWAPF STATUS, W ;Invertimos los nibles del registro STATUS.-
MOVWF STATUS_Temp ; Guardamos STATUS en un registro temporal.-
MOVF CONTA_1,0
MOVWF CONTA_1TEMP
MOVF CONTA_2,0
MOVWF CONTA_2TEMP
MOVF CONTA_3,0
MOVWF CONTA_3TEMP
Fin_ISR
MOVF CONTA_1TEMP,0
MOVWF CONTA_1
MOVF CONTA_2TEMP,0
MOVWF CONTA_2
MOVF CONTA_2TEMP,0
MOVWF CONTA_2
SWAPF STATUS_Temp,W ; Invertimos lo nibles de STATUS_Temp.-
MOVWF STATUS
SWAPF W_Temp, f ; Invertimos los nibles y lo guardamos en el mismo registro.-
SWAPF W_Temp,W ; Invertimos los nibles nuevamente y lo guardamos en W.-
RETFIE ; Salimos de interrupción.-
Bueno de esta manera tambien va, te lo dejo por si quieres probarlo.
Es un poco mas optimizado y algo mas elegante :lol: :lol:
;********************************************************************
;SEMAFORO 1 Y 3:VERDE-->RA0 HORIZONTAL
; NARANJA-->RA1
; ROJO-->RA2
;
;SEMAFOROS 2 Y 4:VERDE-->RA3 VERTICAL
; NARANJA-->RB1
; ROJO-->RB2
;AUTOBUS HORIZONTAL-->RB4
;AUTOBUS VERTICAL-->RB5
;*********************************************************************
;DEFINIMOS EL PIC QUE UTILIZAMOS
;*********************************************************************
LIST p=16F84A ;DIRECTORIO PIC16F84A.
INCLUDE "P16f84a.inc" ;LIBRERIA PIC16F84A.
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;*********************************************************************
;CONTADORES DE TEMPORIZADORES
;*********************************************************************
CONTA_1 EQU 0x10 ;DECLARAMOS CONTA_1
CONTA_2 EQU 0x20 ;DECLARAMOS CONTA_2
CONTA_3 EQU 0x30 ;DECLARAMOS CONTA_3
CONTA_1TEMP EQU 0X11
CONTA_2TEMP EQU 0X12
CONTA_3TEMP EQU 0X13
W_Temp EQU 0x0D ; Registro para guardar temporalmente W.-
STATUS_Temp EQU 0x0E ; Registro para guardar temporalmente STATUS
;*********************************************************************
;INICIO DEL PROGRAMA
;*********************************************************************
RESET
ORG 0x00 ; Aquí comienza el micro.-
GOTO INICIO ; Salto a inicio de mi programa.-
ORG 0x04 ; Atiendo Interrupcion.-
GOTO Inicio_ISR
ORG 0x05 ; Origen del código de programa.-
INICIO:
BSF STATUS,RP0 ;CONFIGURAMOS LOS PUERTOS
MOVLW b'11110000' ;PORTB entradas de la interrupcion por en rb4-rb7
MOVWF TRISB
MOVLW 0x00 ;Puerto A salidas
MOVWF TRISA
BCF STATUS,RP0
;; Habilitamos GIE RBIE RB0 (interrupción RB4 a RB7 Y INTERRUPCION EXTERNA)
BCF INTCON,RBIF
MOVLW b'10001000'
MOVWF INTCON
;PROCESO DE ENCENDIDO Y APAGADO DEL BUS EN DIRECCION VERTICAL
;========**************************===========
;========**ILUMINACIÓN SEMÁFOROS**===========
;========**************************===========
; ==========================
; ====AVENIDA HORIZONTAL====
; ==========================
;********************************************************************
;SEMAFORO 1 Y 3 HORIZONTAL
;********************************************************************
COMBINACION1:
CLRF PORTA ;LIMPIA EL PORTA
CLRF PORTB ;LIMPIA EL PORTB
BSF PORTA,0 ;SEMÁFOROS HORIZONTAL VERDE
BSF PORTB,2 ;SEMÁFOROS VERTICAL ROJO
CALL RETARDO1 ;15 SEGUNDOS SEMÁFOROS X EN VERDE
BCF PORTA,0 ;SEMÁFOROS HORIZONTAL VERDE APAGADO
BSF PORTA,1 ;SEMÁFOROS HORIZONTAL EN AMBAR ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
BCF PORTA,1 ;SEMÁFOROS HORIZONTAL AMBAR APAGADOS
BCF PORTB,2 ;SEMAFOROS VERTICAL ROJO APAGADOS
BSF PORTA,3 ;SEMAFORO VERTICAL VERDE ENCENDIDO
BSF PORTA,2 ;SEMAFORO HORIZONTAL ROJO ENCENDIDO
GOTO COMBINACION2
; ==========================
; ==== AVENIDA VERTICAL ====
; ==========================
COMBINACION2:
CALL RETARDO1 ;15 SEGUNDOS
BCF PORTA,3 ;SEMAFOROS VERTICAL VERDE APAGADO
BSF PORTB,1 ;SEMAFOROS AMBAR VERTICAL ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
BCF PORTA,2 ;SEMAFORO HORIZONTAL VERDE APAGADO
BCF PORTB,1
BSF PORTA,0 ;SEMAFORO VERTICAL ENCENDIDO VERDE
BSF PORTB,2 ;SEMAFORO HORIZONTAL ENCENDIDO ROJO
GOTO COMBINACION1
;********************************************************************
;**************AUTOBUS TRATAMIENTO DE LA INTERRUPCION EXTERNA********
;********************************************************************
;********************************************************************
Inicio_ISR:
MOVWF W_Temp ; Copiamos W a un registro Temporal.-
SWAPF STATUS, W ;Invertimos los nibles del registro STATUS.-
MOVWF STATUS_Temp ; Guardamos STATUS en un registro temporal.-
MOVF CONTA_1,0
MOVWF CONTA_1TEMP
MOVF CONTA_2,0
MOVWF CONTA_2TEMP
MOVF CONTA_3,0
MOVWF CONTA_3TEMP
DETECTAR_AUTOBUS
BTFSS INTCON,RBIF ;nos aseguramos que hubo interrupcion
GOTO Fin_ISR
BTFSC PORTB,4
GOTO AUTOBUS_HORIZONTAL
BTFSC PORTB,5
GOTO AUTOBUS_VERTICAL
BCF INTCON,RBIF
GOTO Fin_ISR
AUTOBUS_HORIZONTAL:
CLRF PORTB
CLRF PORTA
BSF PORTA,0 ;SEMÁFOROS HORIZONTAL VERDE
BSF PORTB,2 ;SEMÁFOROS VERTICAL ROJO
CALL RETARDO1 ;15 SEGUNDOS SEMÁFOROS X EN VERDE
BCF PORTA,0 ;SEMÁFOROS HORIZONTAL VERDE APAGADO
BSF PORTA,1 ;SEMÁFOROS HORIZONTAL EN AMBAR ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
BCF PORTA,1 ;SEMÁFOROS HORIZONTAL AMBAR APAGADOS
BCF PORTB,2 ;SEMAFOROS VERTICAL ROJO APAGADOS
BSF PORTA,3 ;SEMAFORO VERTICAL VERDE ENCENDIDO
BSF PORTA,2 ;SEMAFORO HORIZONTAL ROJO ENCENDIDO
BCF INTCON,RBIF
goto Fin_ISR ;aqui pon esto para salir
AUTOBUS_VERTICAL:
CLRF PORTB
CLRF PORTA
BSF PORTA,3 ;SEMAFORO VERTICAL VERDE ENCENDIDO
BSF PORTA,2 ;SEMAFORO HORIZONTAL ROJO ENCENDIDO
CALL RETARDO1 ;15 SEGUNDOS
BCF PORTA,3 ;SEMAFOROS VERTICAL VERDE APAGADO
BSF PORTB,1 ;SEMAFOROS AMBAR VERTICAL ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
;GOTO COMBINACION1
BCF PORTA,2 ;SEMAFORO HORIZONTAL VERDE APAGADO
BCF PORTB,1
BSF PORTA,0 ;SEMAFORO VERTICAL ENCENDIDO VERDE
BSF PORTB,2 ;SEMAFORO HORIZONTAL ENCENDIDO ROJO
BCF INTCON,RBIF
Fin_ISR
MOVF CONTA_1TEMP,0
MOVWF CONTA_1
MOVF CONTA_2TEMP,0
MOVWF CONTA_2
MOVF CONTA_2TEMP,0
MOVWF CONTA_2
SWAPF STATUS_Temp,W ; Invertimos lo nibles de STATUS_Temp.-
MOVWF STATUS
SWAPF W_Temp, f ; Invertimos los nibles y lo guardamos en el mismo registro.-
SWAPF W_Temp,W ; Invertimos los nibles nuevamente y lo guardamos en W.-
RETFIE ; Salimos de interrupción.-
;===========********************===========
;===========**TIEMPOS DE LUCES**===========
;===========********************===========
; $$$$$$$$$$$$$$$$$$$$$$$
; $$RETARDO 15 SEGUNDOS$$
; $$$$$$$$$$$$$$$$$$$$$$$
RETARDO1: MOVLW 0x88
MOVWF CONTA_1
MOVLW 0xB3
MOVWF CONTA_2
MOVLW 0x21
MOVWF CONTA_3
RETAR_15S
DECFSZ CONTA_1,f
GOTO $+2
DECFSZ CONTA_2,f
GOTO $+2
DECFSZ CONTA_3,f
GOTO RETAR_15S
RETURN
; $$$$$$$$$$$$$$$$$$$$$$
; $$RETARDO 3 SEGUNDOS$$
; $$$$$$$$$$$$$$$$$$$$$$
RETARDO2: MOVLW 0x1A
MOVWF CONTA_1
MOVLW 0xE7
MOVWF CONTA_2
MOVLW 0x0B
MOVWF CONTA_3
RETAR_3S
DECFSZ CONTA_1,f
GOTO $+2
DECFSZ CONTA_2,f
GOTO $+2
DECFSZ CONTA_3,f
GOTO RETAR_3S
RETURN
END
-
Ahoraaa como es normal m da fallos al montarlo.... tendre que revisarloooo t queriaa comentar que le voi a poner un boton de reset como puedo configurarlooo... para que m lo acepte en hadwaree??? y noo m funcionma bien los cambiso del rb4 y rb5... creo que es falloo de montajee.. tengoq eu mirarlooo que me aconsejas paraa montarloo... si kieres dimee tu correo y t envio unas fotos.. y le exass un vistaaa Un saluddooo!!
-
Ponlo mejor aqui en el foro, lo vera mas gente que te podra ayudar, pon el esquema que estas usando y el programa, prueba si quieres con ese programa que te puse arriba a ver si con ese te va.
¿Lo estas montando en protoboard?
¿Estas usando pulsadores para simular los sensores? Porque puede que te esten dando rebotes y falle a veces por eso. No pusimos en el programa antirrebotes por software, si no los pones el hardware tampoco......
-
Ok..pues estoy utilizando interruptores paraa simular los sesonres lo tengo montado en portoboar pero para comporbar y luego la paso a una placa de dircuito impresa... pero buenoo.. como see configura los antirrebotes en sofware... y como puedo hacer para colocar un pulsador como reset... te dejo ahora el proteuss.. y aver en cuanto pueda t envio unas fotoss de la placa y talll ... Un saludoo
-
¿El problema esta en los pulsadores verdad? mirate esto a ver si los tienes bien, estamos leyendo 1 cuando se pulsa.
http://picmania.garcia-cuervo.net/trucos.php#CONECTANDOCONTACTOS
Para poner un reset lo puedes poner en RB6 y cuando se pulse que vaya a 0X00 vector de reset, pero en este circuito creo que no tiene sentido resetearlo.
-
Los interruptores ya los he montadoo y me va bien.. lo que encontrado un problema al montarlo y porbarlo.. que cuando atiendo la interrupcio y se poduce el cambio de algun estado en el puerto y voi a alguna combinacion tanto horizontal como vertical... se porduce la secuencia.. pero despues no m responde si quiero volver a atender alguna interrupcion tanto el horizontal como el vertical.. por esa parte hasta que no termine la cambinacion va perfecto pero ya despues o se queda en una secuencia o no m vulve a responde con los interruptores cuando termina la secuenciaa... lo estoy intendado de estaa forma aver si encuentro la solucion.
Que seria una vez terminada la secuencia bcf intcon,rbif bajo la bandera para que vuelva atender alguna interrupcion no?? y para que la secuencia no se quede paradaa... vuelvo a enviarla en horizontal a goto combinacion1 y a horizontal la mando a goto combinacion dos t dejo el prograa...
DETECTAR_AUTOBUS
BTFSS INTCON,RBIF ;nos aseguramos que hubo interrupcion
GOTO Fin_ISR ;
BTFSC PORTB,4
GOTO AUTOBUS_HORIZONTAL
BTFSC PORTB,5
GOTO AUTOBUS_VERTICAL
BCF INTCON,RBIF ; si viene es por cambio de estado de 1 a 0 hay que borrar RBIF
GOTO Fin_ISR ; y restablecer REG.
AUTOBUS_HORIZONTAL:
CLRF PORTB ;LIMPIAMOS EL PUERTOB
CLRF PORTA ;LIMPIAMOS EL PUERTOA
BSF PORTB,1 ;SEMAFORO VERTICAL AMBAR ENCENDIDO
BSF PORTA,2 ;SEMÁFOROS HORIZONTAL VERDE
CALL RETARDO2 ;RETARDO DE 3 SEGUNDOS
BSF PORTB,2 ;SEMÁFOROS VERTICAL ROJO
BCF PORTA,2 ;SEMAFOROS VERTICAL AMBAR APAGADO
BSF PORTA,0 ;
BCF PORTB,1 ;
CALL RETARDO1 ;15 SEGUNDOS SEMÁFOROS X EN VERDE
BCF PORTA,0 ;SEMÁFOROS HORIZONTAL VERDE APAGADO
BSF PORTA,1 ;SEMÁFOROS HORIZONTAL EN AMBAR ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
BCF PORTA,1 ;SEMÁFOROS HORIZONTAL AMBAR APAGADOS
BCF PORTB,2 ;SEMAFOROS VERTICAL ROJO APAGADOS
BSF PORTA,3 ;SEMAFORO VERTICAL VERDE ENCENDIDO
BSF PORTA,2 ;SEMAFORO HORIZONTAL ROJO ENCENDIDO
BCF INTCON,RBIF
GOTO COMBINACION2
AUTOBUS_VERTICAL:
CLRF PORTB ;LIMPIAMOS PUERTOB
CLRF PORTA ;LIMPIAMOS PUERTOA
BSF PORTA,1 ;SEMAFORO HORIZONTAL AMBAR ENCENDIDO
BSF PORTB,2 ;SEMAFORO VERTICAL VERDE ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
BSF PORTA,3 ;SEMAFORO HORIZONTAL ROJO ENCENDIDO
BCF PORTA,1 ;SEMAFORO HORIZONTAL AMBAR APAGADO
BSF PORTA,2
BCF PORTB,2
CALL RETARDO1 ;15 SEGUNDOS
BCF PORTA,3 ;SEMAFOROS VERTICAL VERDE APAGADO
BSF PORTB,1 ;SEMAFOROS AMBAR VERTICAL ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
BCF PORTA,2 ;SEMAFORO HORIZONTAL VERDE APAGADO
BCF PORTB,1 ;SEMAFORO VERTICAL AMBAR APAGADO
BSF PORTA,0 ;SEMAFORO VERTICAL ENCENDIDO VERDE
BSF PORTB,2 ;SEMAFORO HORIZONTAL ENCENDIDO ROJO
BCF INTCON,RBIF
GOTO COMBINACION1
un saludo espero tu respuesta.. si no as entendido algooo preguntamelo de lo que pretendooo solucionar....
-
Bueno un problema de las interrupciones es este, que se pierde control sobre el flujo del programa:
Primero: Mientras esta haciendo una interrupcion no atiende a la otra, esto que en principio es malo (sobre todo porque estas en la interrupcion 20seg que es muchisimo) para este programa en concreto va bien, porque mientras le estas dando paso a un autobus no se lo puedes dar al otro, ni cortar una secuencia a medias para empezar otra.
Segundo: cuando se hace en la interrupcion una secuencia te puedes salir de interrupcion con la contraria. Lo que no puedes es salir a la brava como lo haces ahi, si te sales asi dejas inhabilitadas las interrupciones, ya que no ejecutas el retfie, que es el que pone a 1 el bit GIE, por lo tanto los botones ya no te haran ningun caso.
AUTOBUS_HORIZONTAL:
CLRF PORTB ;LIMPIAMOS EL PUERTOB
CLRF PORTA ;LIMPIAMOS EL PUERTOA
BSF PORTB,1 ;SEMAFORO VERTICAL AMBAR ENCENDIDO
BSF PORTA,2 ;SEMÁFOROS HORIZONTAL VERDE
CALL RETARDO2 ;RETARDO DE 3 SEGUNDOS
BSF PORTB,2 ;SEMÁFOROS VERTICAL ROJO
BCF PORTA,2 ;SEMAFOROS VERTICAL AMBAR APAGADO
BSF PORTA,0 ;
BCF PORTB,1 ;
CALL RETARDO1 ;15 SEGUNDOS SEMÁFOROS X EN VERDE
BCF PORTA,0 ;SEMÁFOROS HORIZONTAL VERDE APAGADO
BSF PORTA,1 ;SEMÁFOROS HORIZONTAL EN AMBAR ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
BCF PORTA,1 ;SEMÁFOROS HORIZONTAL AMBAR APAGADOS
BCF PORTB,2 ;SEMAFOROS VERTICAL ROJO APAGADOS
BSF PORTA,3 ;SEMAFORO VERTICAL VERDE ENCENDIDO
BSF PORTA,2 ;SEMAFORO HORIZONTAL ROJO ENCENDIDO
;BCF INTCON,RBIF
;GOTO COMBINACION2 ; si te sales asi no habilitas la interrupcion
; en vez de esto pon la secuencia contraria para que al salir ejecute la otra secuencia, saliendo a traves del Fin_ISR, solo pon el estado en que deben estar las luces para el otro sentido, como aqui es horizontal, ponlas para vertical,
Tercero: Cuando entra en interrupcion lo hace casi siempre en medio de una temporizacion, si esa temporizacion esta acabando, que le falte 2seg, por ejemplo, abrira el semaforo y a los 2 segundos lo cerrara, putearas un poco a los conductores :lol: :lol: esto va a ser lo mas dificil de solucionar, a ver que solucion le damos.
-
Se me olvidaron un par de cosas mas, al salirte como lo haces sin pasar por Fin_ISR, aparte de no habilitar las interrupciones, por lo que las interrupciones dejan de funcionar, no descargas el STACK y se va llenando con cada interrupcion, como tiene 8 niveles a la octaba vez que pase un bus estara lleno y se desbordara por lo que al hacer una llamada ira a donde quiera, haciendo fallar todo el programa.
Para simular con interruptores, tienes que pulsarlos 2 o 3seg que es lo que tardaria en pasar el bus por delante de ellos, para ponrles antirrebotes, cuando detectas un 1 haces una temporizacion de 20ms y al retornar vuelves a chequear el interruptor y confirmas que sigue a 1, si en este segundo chequeo esta a 0 te sales porque fueron rebotes.
Quedaria asi:
DETECTAR_AUTOBUS
BTFSS INTCON,RBIF ;nos aseguramos que hubo interrupcion
GOTO Fin_ISR
BTFSC PORTB,4
GOTO AUTOBUS_HORIZONTAL
BTFSC PORTB,5
GOTO AUTOBUS_VERTICAL
BCF INTCON,RBIF
GOTO Fin_ISR
AUTOBUS_HORIZONTAL:
CALL ANTIRREBOTES ;llamamos retardo de 20ms para que pasen los rebotes
BTFSS PORTB,4 ; confirmamos que es 1 y por tanto no fueron rebotes
GOTO Fin_ISR ; esta a 0 fueron rebotes, salimos de interrupcion
CLRF PORTB ; no fueron rebotes, esta a 1, se hace cambio de luces
CLRF PORTA
BSF PORTA,0 ;SEMÁFOROS HORIZONTAL VERDE
BSF PORTB,2 ;SEMÁFOROS VERTICAL ROJO
CALL RETARDO1 ;15 SEGUNDOS SEMÁFOROS X EN VERDE
BCF PORTA,0 ;SEMÁFOROS HORIZONTAL VERDE APAGADO
BSF PORTA,1 ;SEMÁFOROS HORIZONTAL EN AMBAR ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
BCF PORTA,1 ;SEMÁFOROS HORIZONTAL AMBAR APAGADOS
BCF PORTB,2 ;SEMAFOROS VERTICAL ROJO APAGADOS
BSF PORTA,3 ;SEMAFORO VERTICAL VERDE ENCENDIDO
BSF PORTA,2 ;SEMAFORO HORIZONTAL ROJO ENCENDIDO
BCF INTCON,RBIF
goto Fin_ISR ;aqui pon esto para salir
AUTOBUS_VERTICAL:
CALL ANTIRREBOTES ;llamamos retardo de 20ms para que pasen los rebotes
BTFSS PORTB,5 ; confirmamos que es 1 y por tanto no fueron rebotes
GOTO Fin_ISR ; esta a 0 fueron rebotes, salimos de interrupcion
CLRF PORTB ; no fueron rebotes, esta a 1, se hace cambio de luces
CLRF PORTA
BSF PORTA,3 ;SEMAFORO VERTICAL VERDE ENCENDIDO
BSF PORTA,2 ;SEMAFORO HORIZONTAL ROJO ENCENDIDO
CALL RETARDO1 ;15 SEGUNDOS
BCF PORTA,3 ;SEMAFOROS VERTICAL VERDE APAGADO
BSF PORTB,1 ;SEMAFOROS AMBAR VERTICAL ENCENDIDO
CALL RETARDO2 ;3 SEGUNDOS
;GOTO COMBINACION1
BCF PORTA,2 ;SEMAFORO HORIZONTAL VERDE APAGADO
BCF PORTB,1
BSF PORTA,0 ;SEMAFORO VERTICAL ENCENDIDO VERDE
BSF PORTB,2 ;SEMAFORO HORIZONTAL ENCENDIDO ROJO
BCF INTCON,RBIF
Tienes que poner esta temporizacion por cualquier sitio que no te moleste, junto a las otras temporizaciones por ejemplo.
ANTIRREBOTES ; temporizacion de 20ms antirrebotes
movlw .21 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .237 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
Y definir al principio.
PDel0 EQU 0X14
PDel1 EQU 0X15
Esta temporizacion esta hecha con el programa del enlace que te puso Todopic en el segundo mensaje, pruebalo, veras com no vuelves a hacer ninguna a mano, ¿has corregido la de 3seg? da 5 no 3 ya te lo dije.
Ya casi lo tenemos, eso si, iria mejor sin las interrupciones, por lo menos sin estas, pero como supongo que te lo mandaron hacer asi pues........Los buenos alumnos nos adaptamos a los malos profesores :lol: :lol:
-
Okkk ste finde semana lo porbareee y tenngo que irr ya montandolo.. que necesito entregarlo la semana que viene... asin que aver si podems estar en contactoo este finde Ok?? por si m salen mas dudas que seguramenteee De nuevoo Muchass Graciasss tiooo!!