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

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

Desconectado nandez

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

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
« Respuesta #1 en: 01 de Febrero de 2012, 08:28:56 »
aquí tienes un programita para generar demoras.. PIC DEL  :mrgreen:
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado nandez

  • PIC10
  • *
  • Mensajes: 25
Re: Preguntar Semafoross.. autoobus viene...
« Respuesta #2 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

Desconectado tapi8

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


Desconectado nandez

  • PIC10
  • *
  • Mensajes: 25
Re: Sub rutinas de 1 seg para la realizacion de un semaforo..
« Respuesta #4 en: 08 de Febrero de 2012, 18:56:03 »
Graciasss tio ya me aclaradoo bastantee con las interrupcionesss ;)

Desconectado tapi8

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


Desconectado nandez

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

Desconectado tapi8

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

Desconectado nandez

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

Desconectado nandez

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

Desconectado tapi8

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



   

Desconectado tapi8

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

Desconectado nandez

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

Desconectado tapi8

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

Desconectado tapi8

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