TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: hellser 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
-
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
-
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
-
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
-
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