Autor Tema: Sub rutinas de 1 seg para la realizacion de un semaforo..  (Leído 6436 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado nandez

  • PIC10
  • *
  • Mensajes: 25
Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
« Respuesta #15 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

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
« Respuesta #16 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

Desconectado nandez

  • PIC10
  • *
  • Mensajes: 25
Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
« Respuesta #17 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!!

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
« Respuesta #18 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......

Desconectado nandez

  • PIC10
  • *
  • Mensajes: 25
Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
« Respuesta #19 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



Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
« Respuesta #20 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.

Desconectado nandez

  • PIC10
  • *
  • Mensajes: 25
Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
« Respuesta #21 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....

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
« Respuesta #22 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.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
« Respuesta #23 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:

Desconectado nandez

  • PIC10
  • *
  • Mensajes: 25
Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
« Respuesta #24 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!!


 

anything