TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: nandez en 01 de Febrero de 2012, 05:28:37

Título: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado 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
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: todopic en 01 de Febrero de 2012, 08:28:56
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:
Título: Re: Preguntar Semafoross.. autoobus viene...
Publicado por: nandez en 07 de Febrero de 2012, 17:47:57
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
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: tapi8 en 08 de Febrero de 2012, 15:48:22
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.

Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: nandez en 08 de Febrero de 2012, 18:56:03
Graciasss tio ya me aclaradoo bastantee con las interrupcionesss ;)
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: tapi8 en 10 de Febrero de 2012, 05:34:48
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:

Código: [Seleccionar]
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:

Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: nandez en 20 de Febrero de 2012, 10:03:07
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
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: tapi8 en 22 de Febrero de 2012, 06:33:46
¿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.
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: nandez en 29 de Febrero de 2012, 05:04:50
;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
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: nandez en 29 de Febrero de 2012, 05:12:32
Necesitoo hacer el de 3 segundos para luego una vez exo repetirloo 5 veces!! paraa realizar el de 15 segundos como lo haria..
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: tapi8 en 29 de Febrero de 2012, 07:01:22
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.



   
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: tapi8 en 29 de Febrero de 2012, 07:14:50
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
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: nandez en 01 de Marzo de 2012, 12:16:59
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!!!
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: tapi8 en 01 de Marzo de 2012, 14:42:46
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.
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: tapi8 en 02 de Marzo de 2012, 14:04:06
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:

Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: nandez en 05 de Marzo de 2012, 09:18:27
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
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: tapi8 en 05 de Marzo de 2012, 14:41:31
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:


Código: [Seleccionar]
;********************************************************************
;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
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: nandez en 09 de Marzo de 2012, 08:22:55
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!!
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: tapi8 en 10 de Marzo de 2012, 14:39:09
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......
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: nandez en 11 de Marzo de 2012, 07:56:21
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


Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: tapi8 en 11 de Marzo de 2012, 15:52:07
¿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.
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: nandez en 13 de Marzo de 2012, 14:28:08
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....
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: tapi8 en 14 de Marzo de 2012, 06:54:35
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.
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: tapi8 en 14 de Marzo de 2012, 14:09:43
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:

Código: [Seleccionar]
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.


Código: [Seleccionar]
  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:
Título: Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
Publicado por: nandez en 16 de Marzo de 2012, 04:44:42
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!!