Autor Tema: ayuda con retraso!!  (Leído 2880 veces)

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

Desconectado hellser

  • PIC10
  • *
  • Mensajes: 3
ayuda con retraso!!
« en: 15 de Junio de 2009, 03:53:16 »
lo que pasa esq cuando lo simuo en proteus o lo paso al pic va muy rapido y no eh podido hacer q se espere mas tiempo ya le eh movido a todo y nada me funciona espero y me ayuden a hacer q se retrase  porfavor en verdad lo necesito gracias este es el programa :




 
 LIST    p=16F628A ;
           #include "P16F628A.INC" 



    __CONFIG   _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _INTOSC_OSC_NOCLKOUT
                        ; la directiva CONFIG se usa para incluir datos de configuración
                        ; dentro del archivo .asm, las etiquetas que siguen a CONFIG estan
                        ;def dentro de PI6F628.INC

           CBLOCK 9x10   
              estados
              l1,l2
           ENDC

puertos   
           
           movwf   CMCON
           clrw                    ; cero in w
           movwf   PORTA           ; PORTA es cero antes de activarlo
           movwf   PORTB           ; PORTB es cero antes de activarlo
           bsf     STATUS,RP0      ; seleccionar  Bank 1
           clrw                    ; poner todos los bits comoi salidas
           movwf   TRISB           ; poner TRISB como regiustro
           bcf     STATUS,RP0      ; reseleccionar Bank 0.

inicio     clrw                    ; inicio de estado.
           movwf   estados           ; colocarlo.

bucle      call    semaforo         ; llamar principal
           movwf   PORTB           ; escribir en PORTB.
           incf    estados,W         ; Incrementar estado en W.
           andlw   b'00000111'     
           movwf   estados           ; regresarlo a la memoria.
           call    espera            ; espera
           goto    bucle            ; bucle

           ;  funcion para regresar a principal para puertos de salida al estado actual
           ;  los bits nibbles para el otro set. bit 1 es rojo , 2 es amarillo, y bit 3 es verde y bit 4 es el verde flecha
           
         
semaforo    movf    estados,W         ; mover estados en w
           addwf   PCL,F
           retlw   b'01000001'     ; estado==0 verde y rojo
           retlw   b'01000001'     ; estado==0 verde y rojo
           retlw   b'00100001'     ; estado==1 amarillo y rojo      0x21
           retlw   b'00010100'     ; estado==2 rojo y verde
           retlw   b'00010100'     ; estado==2 rojo y verde        0x14
           retlw   b'00010010'     ; estado==3 rojo y amarillo.          0x12
           retlw   b'10010001'     ; estado==4  verde flecha y rojo
           retlw   b'10010001'     ; estado==4  verde flecha y rojo
       

     

           ; funcion usando 2 bucles para un retraso
espera       
           movlw 5 
           movwf   l1

w1         call    espera2
           decfsz  l1
           goto    w1
           return


espera2      clrf    l2
w2         decfsz  l2
           goto    w2
          return
          end
« Última modificación: 15 de Junio de 2009, 04:37:46 por hellser »

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: ayuda con retraso!!
« Respuesta #1 en: 15 de Junio de 2009, 06:15:38 »

Mira este es el modelo tipico de un retardo hecho a mano, hay tambien un programa que se llama PDEL, lo tienes aqui en este subforo que te los hace automaticamente y perfectos ademas, en el que tu haces, no cargas el sgundo reg, l2 con ninguna variable y el l1 lo cargas con 5, eso te tiene que retardar muy poco, no?, o casi nada.
Este que pongo te retarda 196 ms, con dos bucles a 4 Mz no se puede hacer mas, si le pones otro bucle dependiendo de la variable que le pongas ya consigues bastantes segundos, aunque yo te recomendaria que bajaras el PDEL y los hicieras con el. El PDEL esta esta con chincheta al principio de esta foro



DELAY
   movlw   .255               ; cargamos 255 en W
   movwf   Contador1            ; lo cargamos en contador1   
REPITE1   
   movlw   .255                    ; cargamos 255 en W    
   movwf   Contador2            ; lo cargamos en contador2   
REPITE2   
   decfsz   Contador2,1            ; Decrementa Contador2 y se essale.-   
   goto   REPITE2   
   decfsz   Contador1,1            ; Decrementa Contador1 y si es 0 sae   
   goto   REPITE1               ; Si no es cero repetimos ciclo.-   
   return                  ; retorna de subrutina.-
   end

tapi8

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: ayuda con retraso!!
« Respuesta #2 en: 15 de Junio de 2009, 09:17:42 »
Lo pase por el MPLAB y me quede un poco flipado. La temporizacion, tiene cojones, pero funciona, temporiza muy poco eso si, 26,984 ms casi 27ms que no es poco, teniendo en cuenta que el reg l1 esta superpuesto al TMR2 y el l2 al T2CON, debes poner en CBLOCK 0X20, 0x significa que lo que va a continuacion 20 esta en hexadecimal, tu pones 9x10.
MOVWF CMCON sin saber que tienes en W no es nada ortodoxo, los clrf sobre los puertos los puedes hacer directamente y no haciendo primero clrf W pero bueno esto deberia funcionar igual.
Lo que es la parte de "bucle" si icrementa y creo que te funciona bien de hecho cada vez que se repite el programa incrementa en 1 el valor que lee de la tabla que creo que es lo que quieres no?

tapi8

Desconectado hellser

  • PIC10
  • *
  • Mensajes: 3
Re: ayuda con retraso!!
« Respuesta #3 en: 15 de Junio de 2009, 13:03:53 »
le puse como me dijiste pero yo lo siento q corre igual xD algo mas q se le deba poner


mira:





 LIST    p=16F628A ;
           #include "P16F628A.INC" 



    __CONFIG   _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _INTOSC_OSC_NOCLKOUT
                        ; la directiva CONFIG se usa para incluir datos de configuración
                        ; dentro del archivo .asm, las etiquetas que siguen a CONFIG estan
                        ;def dentro de PI6F628.INC

           CBLOCK 0x20   
              estados
              Contador1,Contador2
           ENDC

puertos   
           
           
           clrw                    ; cero in w
           movwf   PORTA           ; PORTA es cero antes de activarlo
           movwf   PORTB           ; PORTB es cero antes de activarlo
           bsf     STATUS,RP0      ; seleccionar  Bank 1
           clrw                    ; poner todos los bits comoi salidas
           movwf   TRISB           ; poner TRISB como regiustro
           bcf     STATUS,RP0      ; reseleccionar Bank 0.

inicio     clrw                    ; inicio de estado.
           movwf   estados           ; colocarlo.

bucle      call    semaforo         ; llamar principal
           movwf   PORTB           ; escribir en PORTB.
           incf    estados,W         ; Incrementar estado en W.
           andlw   b'00000111'     
           movwf   estados           ; regresarlo a la memoria.
           call    DELAY           ; espera
           goto    bucle            ; bucle

           ;  funcion para regresar a principal para puertos de salida al estado actual
           ;  los bits nibbles para el otro set. bit 1 es rojo , 2 es amarillo, y bit 3 es verde y bit 4 es el verde flecha
           
         
semaforo    movf    estados,W         ; mover estados en w
           addwf   PCL,F

           retlw   b'01000001'     ; estado==0 verde y rojo
           retlw   b'01000001'     ; estado==0 verde y rojo
           retlw   b'00100001'     ; estado==1 amarillo y rojo      0x21
           retlw   b'00010100'     ; estado==2 rojo y verde
           retlw   b'00010100'     ; estado==2 rojo y verde        0x14
           retlw   b'00010010'     ; estado==3 rojo y amarillo.          0x12
           retlw   b'10010001'     ; estado==4  verde flecha y rojo
           retlw   b'10010001'     ; estado==4  verde flecha y rojo
       


DELAY
   movlw   .255               ; cargamos 255 en W
   movwf   Contador1            ; lo cargamos en contador1   
REPITE1   
   movlw   .255                    ; cargamos 255 en W   
   movwf   Contador2            ; lo cargamos en contador2   
REPITE2   
   decfsz   Contador2,1            ; Decrementa Contador2 y se essale.-   
   goto   REPITE2   
   decfsz   Contador1,1            ; Decrementa Contador1 y si es 0 sae   
   goto   REPITE1               ; Si no es cero repetimos ciclo.-   
   return                  ; retorna de subrutina.-
   end

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: ayuda con retraso!!
« Respuesta #4 en: 15 de Junio de 2009, 14:20:45 »
A mi me corre creo que bien en el MPLAB, pero esa temporizacion que te di es de 196 ms para un semaforo es muy pequeña, la que te pongo a continuacion es de 50 seg, ya te dije en el otro post que con dos bucles a 4Mz no se podia hacer mas grande, esta con tres bucles ya da 50 seg, casi 1 minuto ya empieza a parecer un semaforo,  :lol: :lol:      si le pones otro bucle y donde van lo 255 le pones un 5 te va a dar casi 5 min. Todos van a encender el mismo tiempo?, porque el ambar tendra tiempos diferentes no?, entonces habra que hacer varias temporizaciones e ir llamandolas.


DELAY   movlw   .255               ; cargamos 255 en W
   movwf   contador1            ; o cargamos en contador1   
REPITE1   
   movlw   .255                    ; cargamos 255 en W    
   movwf   contador2            ; o cargamos en contador2   
REPITE2
   movlw   .255
   movwf   contador3
REPITE3      
   decfsz   contador3,1            ; Decrementa Contador2 e se essale.-   
   goto   REPITE3   
   decfsz   contador2,1            ; Decrementa Contador1 e se e 0 sae   
   goto   REPITE2
   decfsz   contador1,1
   goto   REPITE1               ; Se non e cero repetimos ciclo.-   
   return                  ; retorna da subrutina.-
   
   end