TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: dsotelo74 en 10 de Febrero de 2003, 11:32:00
-
Que tal!!
Me da gusto integrarme a esta comunidad y hacer esta pregunta a tantas personas que se ve que les apasiona el tema de la programacion de pics. La preguntas es: como puedo hacer un retardo de una hora en ensablador??
-
Existen varias formas de hacerlo :
1ª.- Utilizando el timer que lleva incorporado el pic, en el caso del 16F628, uno de 16bits. Habilitas la interrupción por timer1, cuando se produzca el desbordamiento del timer (dependiendo de los valores de los registros TIMER1L y TIMER1H) decrementas una variable ( por ejemplo cuenta1) miras si es cero,si no lo es sales de la rutina de irq, si lo es vuelves a recargar cuenta1 y decrementas cuenta2, y mira lo mismo que para cuenta1, cuando sea cero se recargan cuenta1 y cuenta2, y asi vas poniendo variables y decrementandolas hasta que consigas el tiempo deseado, y cuando eso se cumple haces lo que quieras.Un ejemplo practico :
TIMER1 BTFSS PIR1,0 ;se ha producido por overflow de tmr1?
GOTO FINRSI ;no --> mira si es por cambio en portb?
DECFSZ COUNTER1,1 ;si --> decrementa counter1 y mira si es 0?
GOTO FINTMR1 ;no --> termino irq
DECFSZ COUNTER2,1 ;si --> decrementa counter2 y mira si es 0?
GOTO FINTMR1 ;no --> termino irq
BSF ALARMA,0 ;activo la alarma
BCF PIR1,0 ;borro flag por timer1
CLRF TMR1L
CLRF TMR1H ;cargo el timer1 para 65536 cuentas
MOVLW B"00110101" ;prescale 1:8, internal clock, timer1 habilitado
MOVWF T1CON
RETURN
CLRF COUNTER1 ;inicializo el counter1 para timer1
MOVLW 0X17
MOVWF COUNTER2 ;inicializo el counter2 para timer1 para 10.35min ******************************************
FINTMR1 BCF PIR1,0 ;borro flag de timer1
BSF STATUS,RP0 ;BANK 1
BSF PIE1,0 ;habilito interrupcion por timer1
BCF STATUS,RP0 ;BANK 0
FINRSI SWAPF STATUS_TEMP,0
MOVWF STATUS ;restauro STATUS
SWAPF W_TEMP,1
SWAPF W_TEMP,0 ;restauro W sin modificar STATUS
RETFIE
2ª forma : es utilizando un pulso externo con una frecuencia de por ejemplo 1Hz (1segundo) y meterlo por la entrada de contador o por INT, de forma que cuando cuentes 3600 pulsos habra pasado una hora.
No te recomiendo que utilizes un delay de 1hora porque el micro no podra hacer nada mientras este contando y por lo tanto es mejor utilizar los timer o cualquier otra forma pero siempre utilizando irq, de forma que el micro puede estar haciendo cualquier otra cosa mientras cuenta.
Bueno, pues esto es todo amigos.
-
Creo que el amigo Adolfo lleva toda la razón. Una rutina de una hora... nada bueno.
Usa un integrado para eso. En la tienda micropik tienes uno, exactamente "PCF8583P-F5 Clock Calendar with 240 * 8bit RAM 3,24€". Y lo mejor, funciona mediante I2C.
La dirección:
http://www.micropik.com/pagmicro.htm
Por cierto, trabajan muy bien y rápido.
Suerte.
Ups! No me fijé que no eres de España. Bueno por lo menos te servirá de referencia.