Título: Temporizador para insoladora Publicado por: Meta en 8 Septiembre 2010, 01:20 am Hola:
Quiero hacer un temporizador para una insoladora. Me he puesto con el famoso PIC16F84A pero tiene sus limitaciones. (http://www.pic16f84a.org/images/stories/proteus/Fig1802_Cuadradas_y_otros.GIF) Usa vez que lo usas sólo puedes ejecutar la cuenta atrás como máximo 4:15. (4 minutos, 15 segundos). Usa el Timer de 8 Bits. He pensarlo en adaptarlo del 16F84A al 16F88 ya que tiene un Timer de 16 bit que significa mejor tiempo. Quiero saber ya que saben mucho más que yo en temas de temporizadores, si el Timer de 16 bits puede lograr algo. Por ejemplo: Quiero saber cuánto tiempo máximo me deja poner en el LCD y que funcione. Prefiero algo así: 99:99. Con 20 minutos está bien. Que lo vaya a usar para insoladora es mucho tiempo, el mismo circuito lo montaré para otras cosas, por eso quiero saber lo del temporizador. Estaba pensando es unsar un reloj-calendario en tiempo real llamado DS1307. Muy preciso, pero lleva más electrónica, más caro y complicado de usar en asm. Código: ; Programa de control para un temporizador digital de precisión. La programación del tiempo Un cordial saludo. Título: Re: Temporizador para insoladora Publicado por: Tokes en 8 Septiembre 2010, 01:43 am Hola, Meta:
Una pregunta: ¿Por qué dices que sólo puedes contar de 4:15 para abajo? Espero tu respuesta. Saludos. ¡Ups!... EDITO ------------------- Acabo de leer el por qué sólo 4:15, pero eso no es por la capacidad del timer, sino porque las operaciones deben ser de 16 bits. Es decir, la rutina para convertir de binario a BCD deben manejar números de 16 bits. El decremento que realizas (decfsz TIEMPO,F) deberá ser ahora un decremento de 16 bits. Dame un poco de tiempo y te muestro unas rutinas para solucionar esto. Nos vemos luego, si Dios quiere. Título: Re: Temporizador para insoladora Publicado por: Meta en 8 Septiembre 2010, 02:41 am Buenas:
Lo leí en el libro www.pic16f84a.org o en las explicaciones de los ejemplos. No se podía por algo de que sólo era de 2556 bytes. No lo encuentro ahora pero me quedé con el problema. Por eso pregunto si con el timer de 16 bits del 16F88 es posible hacerlo. Te voy a pasar por correo el ejemplo. Saludo. Edito: Acaba de leer tu mensaje editado. No recordaba que era lo que dijiste, pensé que era lo del TIMER. Escoja el tiempo que desees mi muy distinguido amigo. Por lo que cuentas hay que hacerlos por lo menos de 32 bit para que te haga caso. Modificar la librería esa. Muchas gracias. Título: Re: Temporizador para insoladora Publicado por: Tokes en 8 Septiembre 2010, 04:03 am Mira, te hice un programa un tanto sencillo para mostrarte como debe modificarse tu programa.
Código
Bien, en el programa podrás darte cuenta que cargué un valor en las variables Tiempo_H y Tiempo_L: Código: movlw high(.1200) ; Carga el byte alto del tiempo en la variable Pero tú en tu programa quieres darle incrementos. Estos incrementos deben ser ahora un tanto diferentes: Código
Edito ------------------- Te mandé al correo la carpeta con el programa y el circuito en proteus. Nos vemos. Título: Re: Temporizador para insoladora Publicado por: Meta en 8 Septiembre 2010, 04:53 am Muchas gracias por la ayuda y si funciona lo que me enviaste.
Una curiosidad que tengo y no sabía. Código
La parte esa de (.1200) no sabía que se puede cargar más de .256. Lo de los paréntesis, encontré mirando la ayuda del MPLAB v8.56 en Arithmetic Operators and Precedence. No he visto la palabra high(.1200) en ningún sitio. No se como lograste guardar .1200 por la cara cuando aguanta sólo .256 en decimal. Vi tu ejemplo y me quedo liado todavía. Quiero implementarlo al ejemplo quete envié. Estoy leyendo paso a paso para entenderlo e implementarlo, que sea capaz de meter el tiempo que me de la gana desde el PIC con los botones, a parte de ello, poner 20 minutos que lograste o más tiempo si es posible. La librería del BCD_BIN te viene incluida. Título: Re: Temporizador para insoladora Publicado por: Tokes en 8 Septiembre 2010, 06:06 am Meta:
En realidad no cargo 1200, no se puede porque en un byte el máximo es 255. Sucede lo siguiente: Supongamos que tenemos un número, por ejemplo, 325 (decimal). Este número en hexadecimal se representa como: 0x0145. El operador high retorna el byte alto de ese valor. Entonces, poner: movlw high(.325) Es lo mismo que poner: movlw 0x01 El operador low retorna el byte bajo de ese valor. Entonces, poner: movlw low(.325) Es lo mismo qe poner: movlw 0x45 La ventaja está en que la conversión de decimal a hexadecimal la hace el propio ensamblador; tú no tienes que hacerla. Cualquier duda me avisas. Saludos Título: Re: Temporizador para insoladora Publicado por: Meta en 8 Septiembre 2010, 06:37 am Gracias por la explicación.
No me sale mucho implementar tu código al que original que te envié. ¿Puedes lograrlo? Prefiero que si lo haces eso de mostrar 99 minutos como máximo, por poner un ejemplo, puedes argumentarlo. Se te da mucho el ensamblador, si que tienes experiencias. Desde que todo me funcione bien, compraré los componentes del PCB, LCD, tubos actínicos, etc. La base lo meteré dentro de un escaner viejo grande que me regalaron. Ya pasaré fotos cuando lo acabe. Título: Re: Temporizador para insoladora Publicado por: Tokes en 8 Septiembre 2010, 20:00 pm Meta:
Te envié al correo el programa modificado. Eso es todo. Saludos y buen día. Título: Re: Temporizador para insoladora Publicado por: Meta en 8 Septiembre 2010, 22:28 pm Hello:
Muy bueno a estudiarlo paso a paso a ver que hiciste exactamente. No se como el autor no lo pudo hacer. Haciendo pruebas me sorprende que funcione en muy bien en poco tiempo. (http://www.subeimagenes.com/img/lcd-bien-1875.jpg) Probado hasta donde puede llegar el temporizador. ¿Hasta dónde llega? ¿99:99? Ocurre cosas raras como esto. Se me puso así: 045:37:015 por poner un ejemplo. Hice pruebas otra vez y ya no pasa nada. Voy a mirar las librerías a ver exactamente que has tocado, no creo que sea tan engorroso como el ejemplo de arriba. Muchísimas gracias por la ayuda, ahora si voy a montar la insoladora. Título: Re: Temporizador para insoladora Publicado por: Meta en 6 Diciembre 2010, 17:40 pm Hola:
Me dió por hacer el ejemplo del 16F84A adaptarlo al PIC16F88. No me funciona el LCD con el proteus 7.7 SP2. Dejo en descargar los ejemplos compeltos en asm del MPLAB y el proteus. Descargar (https://sites.google.com/site/metaconta/winpic800/Temporizador_Insoladora_16F88.zip?attredirects=0&d=1) Un cordial saludo. Título: Re: Temporizador para insoladora Publicado por: Meta en 20 Diciembre 2010, 16:32 pm Hola:
He estado comprobando en pareja con el 16F88 y 16F84A. Son por temas de interrupciones y hay que corregirlo, parece fácil y llevo tiempo. Capturas: * Ver paso 1 (http://www.subeimagenes.com/img/paso-1-9983.png) - Enciende los PIC. * Ver paso 2 (http://www.subeimagenes.com/img/paso-2-9985.png) - Pulsa el botón RB7. Por ahora las intrrupciones son iguales. * Ver paso 3 (http://www.subeimagenes.com/img/paso-3-9986.png) - Pulsa el botón RB6. Sigue con los mismos bits. * Ver paso 4 (http://www.subeimagenes.com/img/paso-4-9987.png) - Pulsa RB7. El bits RBIE del 16F88 está en 0 y del 16F84A en 1. * Ver paso 5 (http://www.subeimagenes.com/img/paso-5-9988.png) - Con RB7 para el 16F84A cuenta atrás bien, el 16F88 no puede contar. Eso es todo lo que he descubierto. Voy a investigar si es posible arreglar estas cosas. Cualquier auyda es bien recibida. Saludo. Título: Re: Temporizador para insoladora Publicado por: yarboclo en 31 Enero 2011, 21:29 pm Hola a todos,
yo también me estoy peleando con el temporizador de ese libro. Tokes o Meta, me podéis pasar el código original modificado para que pueda contar más tiempo? Yo solo no consigo adaptarlo. Gracias de antemano. Título: Re: Temporizador para insoladora Publicado por: Meta en 10 Febrero 2011, 03:58 am Cuando pueda te lo paso.
Título: Re: Temporizador para insoladora Publicado por: yarboclo en 17 Febrero 2011, 21:06 pm Oki, espero tu mensaje.
Gracias :rolleyes: Título: Re: Temporizador para insoladora Publicado por: f2v en 25 Septiembre 2011, 12:19 pm Hola amigos estoy intentando hacer el temporizador pero soy principiante en asm. Agradeceria me manden el asm y el hex de este temporizador.
Muchas gracias por su tiempo y Sal2.... Título: Re: Temporizador para insoladora Publicado por: markitosb en 8 Enero 2012, 14:45 pm hola me pueden paras el codigo hex del temporisador yo tengo uno con atmega
solo qe no tengo el grabador si desean subo el proyecto completo gracias ;-) Título: temporizador 24 horas Publicado por: elcerouno en 24 Septiembre 2015, 19:09 pm hola alguien me puede ayudar y principiante en pic quiero hacer un temporizador programable a 24 horas que pongas el tiempo que quieras prenda un led y al terminar ese tiempo lo apague, vi los ejemplos de un temporizador pero solo llega a 4 min 15 seg espero puedan ayudarme dejo el ejemplo
LIST P=16F84A INCLUDE <P16F84A.INC> __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC CBLOCK 0x0C TiempoDeseado Tiempo FlagsModo ENDC ORG 0x2100 DE 0x00 #DEFINE F_Temporizador_ON FlagsModo,2 #DEFINE F_Temporizador_Ajuste FlagsModo,1 #DEFINE F_Temporizador_OFF FlagsModo,0 #DEFINE SalidaTemporizador PORTB,1 #DEFINE Zumbador PORTB,2 #DEFINE AjustePulsador PORTB,7 #DEFINE IncrementarPulsador PORTB,6 ; ZONA DE CÓDIGOS ******************************************************************** ORG 0 goto Inicio ORG 4 goto ServicioInterrupcion Mensajes addwf PCL,F Mensaje_ON DT "EN FUNCION",0x00 Mensaje_Ajuste DT "TIEMPO DECEADO",0x00 Mensaje_OFF DT " RECARGAR",0x00 ;interrupcion de inicio Inicio call LCD_Inicializa movlw Mensaje_Inicio call LCD_MensajeMovimiento call Retardo_500ms call Retardo_500ms call Retardo_500ms movlw Mensaje_nollave call LCD_MensajeMovimiento call Retardo_500ms call Retardo_500ms call Retardo_500ms call Retardo_500ms call Retardo_500ms bsf STATUS,RP0 movlw b'00000111' movwf OPTION_REG bsf AjustePulsador bsf IncrementarPulsador bcf SalidaTemporizador bcf Zumbador bcf STATUS,RP0 clrw call EEPROM_LeeDato movwf TiempoDeseado call ModoTemporizador_OFF movlw b'10001000' movwf INTCON Principal goto Principal ;subrrutinasdeservicioInterrupcion------------------------------------------ ServicioInterrupcion btfsc INTCON,T0IF call Temporizador btfss INTCON,RBIF goto FinInterrupcion btfss AjustePulsador call CambiarModo btfsc IncrementarPulsador goto FinInterrupcion call Retardo_20ms btfsc IncrementarPulsador goto FinInterrupcion btfsc F_Temporizador_OFF call ModoTemporizador_ON btfsc F_Temporizador_Ajuste call IncrementarTiempoDeseado FinInterrupcion bcf INTCON,RBIF bcf INTCON,T0IF retfie ;subrrutinasCambiarModo------------------------------------------------------------ CambiarModo call PitidoCorto btfsc AjustePulsador goto EsperaDejePulsar btfsc F_Temporizador_OFF goto ModoTemporizador_Ajuste btfss F_Temporizador_Ajuste goto ModoTemporizador_OFF clrw movwf EEADR movf TiempoDeseado,W call EEPROM_EscribeDato ModoTemporizador_OFF bcf SalidaTemporizador call Pitido movlw b'00000001' movwf FlagsModo bcf INTCON,T0IE movf TiempoDeseado,W movwf Tiempo call LCD_Borra movlw Mensaje_OFF goto FinCambiarModo ModoTemporizador_Ajuste bcf SalidaTemporizador movlw b'00000010' movwf FlagsModo clrf Tiempo clrf TiempoDeseado bcf INTCON,T0IE call LCD_Borra movlw Mensaje_Ajuste goto FinCambiarModo ModoTemporizador_ON movf TiempoDeseado,W btfsc STATUS,Z goto ModoTemporizador_OFF movwf Tiempo call PitidoCorto movlw b'00000100' movwf FlagsModo movlw TMR0_Carga50ms movwf TMR0 movlw Carga_1s movwf Registro50ms bsf INTCON,T0IE call LCD_Borra bsf SalidaTemporizador movlw Mensaje_ON FinCambiarModo call LCD_Mensaje call VisualizaTiempo EsperaDejePulsar btfss AjustePulsador goto EsperaDejePulsar return ;SubrutinaTEMPORIZADOR CBLOCK Registro50ms ENDC TMR0_Carga50ms EQU -d'195' Carga_1s EQU d'20' Temporizador call Retardo_50micros call Retardo_20micros nop movlw TMR0_Carga50ms movwf TMR0 decfsz Registro50ms,F goto FinTemporizador movlw Carga_1s movwf Registro50ms btfss F_Temporizador_ON goto FinTemporizador decfsz Tiempo,F goto VisualizaContador bcf SalidaTemporizador call VisualizaTiempo call Pitido call Retardo_500ms call Pitido call Retardo_500ms call PitidoLargo call Retardo_500ms call ModoTemporizador_OFF goto FinTemporizador VisualizaContador call VisualizaTiempo FinTemporizador return ;SubrutinaVisualizaTiempo-------------------------------------------------- VisualizaTiempo movlw .5 call LCD_PosicionLinea2 movf Tiempo,W call MinutosSegundos movf TemporizadorMinutos,W call BIN_a_BCD call LCD_Byte movlw ':' call LCD_Caracter movf TemporizadorSegundos,W call BIN_a_BCD goto LCD_ByteCompleto return ;subrutinaminutossegundos---------------------------------------------------- CBLOCK TemporizadorMinutos TemporizadorSegundos ENDC MinutosSegundos movwf TemporizadorSegundos clrf TemporizadorMinutos Resta60 movlw .60 subwf TemporizadorSegundos,W btfss STATUS,C goto FinMinutosSegundos movwf TemporizadorSegundos incf TemporizadorMinutos,F goto Resta60 FinMinutosSegundos return ;subrutina incrementatiempodeseado Saltoincremento EQU .5 IncrementarTiempoDeseado call PitidoCorto movlw Saltoincremento addwf Tiempo,F btfsc STATUS,C clrf Tiempo call VisualizaTiempo call Retardo_100ms btfss IncrementarPulsador goto IncrementarTiempoDeseado movf Tiempo,W movwf TiempoDeseado return ;subrrutinapitidolargopitidocorto PitidoLargo bsf Zumbador call Retardo_500ms Pitido bsf Zumbador call Retardo_200ms PitidoCorto bsf Zumbador call Retardo_20ms bcf Zumbador return INCLUDE <RETARDOS.INC> INCLUDE <BIN_BCD.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <EEPROM.INC> END :-( Título: Re: Temporizador para insoladora Publicado por: Meta en 9 Octubre 2015, 02:38 am Hola:
No se hacerlo. Mejor funciona con Arduino UNO, es más fácil de programarlo. El que me ayudó a ponerlo a 99:99 en unos post más atrás pero no a las 24 horas. qNXp5NFDuHw http://electronicavm.net/2011/06/22/temporizador-arduino-lcd/ Saludos. Título: Re: Temporizador para insoladora Publicado por: elcerouno en 23 Octubre 2015, 16:11 pm hola, primero quiero agradecer tu ayuda, dos puedes pasarme el codigo para hacer el temporizador de 99:99 programable porfavor, quisiera darle una estudiada haber si puedo hacer el de 24 hrs te lo agradecere mucho saludos
Título: Re: Temporizador para insoladora Publicado por: elcerouno en 23 Octubre 2015, 16:23 pm hola de nuevo, mira tengo este codigo de un reloj de 24 horas, quise modificarlo pero lo que logre es q solo decremente los minutos y horas con los segundos acendentes ocea que si llega el segundero a 60 (no a cero) decrementa, tambien tengo el problema de que cuando decrmenta las horas en los minutos en lugar de iniciarce en 59 ejemplo 2:59:59 se inicia en 55 (2:55:60) espero me puedas ayudar
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC LIST P=16F84A INCLUDE <P16F84A.INC> CBLOCK 0x0C Hora ; Guarda las horas. Minuto ; Guarda los minutos. Segundo ; Guarda los segundos. MedioSegundo ; Incrementa cada medio segundo. Registro50ms ; Incrementa cada 50 ms Intermitencia ; Para lograr la intermitencia. FlagsAjuste ; Guarda los flags para establecer los ENDC ; ajustes de hora y minuto. #DEFINE REELEVADOR PORTB,1 #DEFINE ModoPulsador PORTB,7 ; Los pulsadores se conectan a estos #DEFINE IncrementarPulsador PORTB,6 ; pines del Puerto B. #DEFINE F_AjusteHora FlagsAjuste,1 ; Flags utilizados en la puesta en hora. #DEFINE F_AjusteMinuto FlagsAjuste,0 #DEFINE F_Intermitencia Intermitencia,0 ; Si es 0, apaga en intermitencia. TMR0_Carga50ms EQU -d'195' ; Para conseguir la interrupción del ; ZONA DE CÓDIGOS ******************************************************************** ORG 0 goto Inicio ORG 4 goto ServicioInterrupcion Mensajes addwf PCL,F MensajePublicitario DT "REC: H M S", 0x00 Inicio call LCD_Inicializa movlw MensajePublicitario call LCD_Mensaje bsf STATUS,RP0 ; Acceso al Banco 1. movlw b'00000111' ; Prescaler de 256 para el TMR0 y habilita movwf OPTION_REG ; resistencias de Pull-Up del Puerto B. bsf ModoPulsador ; Configurados como entrada. bsf IncrementarPulsador bcf REELEVADOR bcf STATUS,RP0 ; Acceso al Banco 0. clrf FlagsAjuste ; Inicializa todos los flags de la puesta en hora. clrf Hora ; Inicializa todos los datos del reloj. clrf Minuto clrf Segundo clrf MedioSegundo clrf Registro50ms movlw TMR0_Carga50ms ; Carga el TMR0. movwf TMR0 movlw b'10101000' ; Activa interrupción del TMR0 (TOIE), por cambio movwf INTCON ; líneas del Puerto B (RBIE) y la general (GIE). call PuestaEnHoraReset ; Puesta en hora por primera vez. ; La sección "Principal" es mantenimiento. Sólo espera las interrupciones. ; No se puede poner en modo de bajo consumo porque la instrucción "sleep" detiene el Timer 0. Principal goto Principal ; Subrutina "ServicioInterrupcion" ------------------------------------------------------ ; ; Detecta qué ha producido la interrupción y ejecuta la subrutina de atención correspondiente. ServicioInterrupcion btfsc INTCON,T0IF ; Si es una interrupción procedente del call Reloj ; desbordamiento del Timer 0, actualiza el reloj. btfss INTCON,RBIF ; Si es una interrupción RBI, lee los pulsadores. goto FinInterrupcion btfss ModoPulsador ; ¿Está presionado el pulsador de "MODO"? call PuestaEnHora ; Sí, pasa a poner en hora. btfss IncrementarPulsador ; ¿Pulsado "INCREMENTAR"?. call Incrementar ; Sí, pasa a incrementar el registro de tiempo FinInterrupcion ; correspondiente. bcf INTCON,RBIF bcf INTCON,T0IF retfie ; Subrutina "Reloj" --------------------------------------------------------------------- ; ; Esta subrutina actualiza los contadores Horas, Minutos, Segundos y Registro50ms. ; Se ejecuta debido a la petición de interrupción del Timer 0 cada 50 ms. ; ; Como el PIC trabaja a una frecuencia de 4 MHz, el TMR0 evoluciona cada µs y se desborda cada ; 195 x 256 = 49920 µs. Sumádole el retardo de 71 µs y el pequeño tiempo de los saltos ; iniciales y de carga del contador, resulta un total de 50000 µs exactos. Es decir, el ; TMR0 producirá una interrupción cada 50 ms exactos, comprobado experimentalmente con la ; ventana Stopwatch del simulador del MPLAB. Reloj call Retardo_50micros ; Retardo de 71 microsegundos para call Retardo_20micros ; ajustar a 50 milisegundos exactos. nop movlw TMR0_Carga50ms ; Carga el Timer 0. movwf TMR0 call IncrementaRegistro50ms btfss STATUS,C ; ¿Ha contado 10 veces 50 ms = 1/2 segundo? goto FinReloj ; No. Pues sale sin visualizar el reloj. ; Si está en "ModoAjusteHora", o "ModoAjusteMinuto" conmuta el flag de intermitencia y ; salta a visualizar el reloj. ; movf FlagsAjuste,F btfsc STATUS,Z goto IncrementaReloj movlw b'00000001' ; Conmuta el flag F_Intermitencia cada 500 ms. xorwf Intermitencia,F goto ActualizaReloj ; Visualiza el reloj y sale. IncrementaReloj bsf REELEVADOR bsf F_Intermitencia ; Se mantendrá siempre encendido durante call IncrementaMedioSegundo ; el funcionamiento normal. btfss STATUS,C ; ¿Ha pasado 1 segundo? goto ActualizaReloj ; No. Pues sale visualizando el reloj. call IncrementaSegundos ; Sí. Incrementa el segundero. btfss STATUS,Z ; ¿Han pasado 60 segundos? goto ActualizaReloj ; No. Pues sale visualizando el reloj. call Decrementamin ; Sí. Incrementa el minutero. btfss STATUS,Z ; ¿Han pasado 60 minutos? goto ActualizaReloj ; No. Pues sale visualizando el reloj. call Decrementahr ; Sí. Incrementa las horas. ActualizaReloj call VisualizaReloj ; Visualiza el reloj. FinReloj return ; Subrutina "VisualizaReloj" ------------------------------------------------------------ ; ; Visualiza el reloj en la segunda línea en formato: " 8:47:39". ; Cuando se ajusta una variable, ésta debe aparecer en intermitencia. Para ello, utiliza ; el flag F_Intermitencia que conmuta cada 500 ms en la subrutina Reloj. ; VisualizaReloj movlw .4 ; Para centrar visualización call LCD_PosicionLinea2 ; en la segunda línea. btfss F_AjusteHora ; ¿Está en la puesta en hora? goto EnciendeHoras ; No. Visualización normal. btfss F_Intermitencia ; Sí. Intermitencia si procede. goto ApagaHoras ; Apaga las horas en la intermitencia. EnciendeHoras movf Hora,W ; Va a visualizar las horas. call BIN_a_BCD ; Lo pasa a BCD. call LCD_Byte ; Visualiza rechazando cero de las decenas. goto VisualizaMinutos ApagaHoras call LCD_DosEspaciosBlancos ; Visualiza dos espacios en blanco. ; VisualizaMinutos movlw ':' ; Envía ":" para separar datos. call LCD_Caracter btfss F_AjusteMinuto ; ¿Está en la puesta en hora?. goto EnciendeMinutos btfss F_Intermitencia goto ApagaMinutos EnciendeMinutos movf Minuto,W ; Visualiza minutos. call BIN_a_BCD ; Lo pasa a BCD. call LCD_ByteCompleto goto VisualizaSegundos ApagaMinutos call LCD_DosEspaciosBlancos ; Visualiza dos espacios en blanco. ; VisualizaSegundos movlw ':' ; Envía ":" para separar datos. call LCD_Caracter movf Segundo,W ; Visualiza segundos. call BIN_a_BCD ; Lo pasa a BCD. call LCD_ByteCompleto return ; ; Subrutina "Incrementar" --------------------------------------------------------------- ; ; Subrutina de atención a la interrupción por cambio de la línea RB6 al cual se ha conectado ; el pulsador "INCREMENTAR". Incrementa según corresponda una sola de las variables. Incrementar call Retardo_20ms ; Espera se estabilicen niveles de tensión. btfsc IncrementarPulsador ; Si es un rebote sale fuera. goto FinIncrementar bsf F_Intermitencia ; Visualiza siempre mientras incrementa. btfsc F_AjusteHora call IncrementaHoras btfsc F_AjusteMinuto call IncrementaMinutos call VisualizaReloj ; Visualiza mientras espera que deje call Retardo_200ms ; de pulsar. btfss IncrementarPulsador ; Mientras permanezca pulsado, goto Incrementar ; incrementa el dígito. FinIncrementar return ; Subrutina "IncrementaRegistro50ms" ---------------------------------------------------- ; ; Incrementa el valor de la variable Registro50ms. Cuando llega a 10, lo cual supone ; medio segundo (50 ms x 10 = 500 ms), lo resetea y sale con el Carry a "1". ; IncrementaRegistro50ms incf Registro50ms,F movlw .10 subwf Registro50ms,W ; (W)=(Registro50ms)-10. btfsc STATUS,C ; ¿C=0?, ¿(W) negativo?, ¿(Registro50ms)<10? clrf Registro50ms ; Lo inicializa si ha superado su valor máximo. return ; Subrutina "IncrementaMedioSegundo" -------------------------------------------------------- ; ; Incrementa el valor de la variable MedioSegundo. Su bit de menor peso se pondrá a "1" una ; vez por segundo. IncrementaMedioSegundo incf MedioSegundo,F ; Incrementa. bsf STATUS,C ; Supone que ha llegado al segundo. btfss MedioSegundo,0 ; El bit 0 se pondrá a uno cada segundo. bcf STATUS,C return ; Subrutina "IncrementaSegundos" ----------------------------------------------------------- ; ; Incrementa el valor de la variable Segundo. Si es igual al valor máximo de 60 lo resetea ; y sale con el Carry a "1". IncrementaSegundos incf Segundo,F ; Incrementa los minutos. movlw .60 subwf Segundo,W ; ¿Ha superado su valor máximo?. (W)=(Minuto)-60. btfsc STATUS,C ; ¿C=0?, ¿(W) negativo?, ¿(Minuto)<60? clrf Segundo ; Lo inicializa si ha superado su valor máximo. return ; Subrutina "IncrementaMinutos" ----------------------------------------------------------- ; ; Incrementa el valor de la variable Minuto. Si es igual al valor máximo de 60 lo resetea ; y sale con el Carry a "1". ; IncrementaMinutos incf Minuto,F ; Incrementa los minutos. movlw .60 subwf Minuto,W ; ¿Ha superado su valor máximo?. (W)=(Minuto)-60. btfsc STATUS,C ; ¿C=0?, ¿(W) negativo?, ¿(Minuto)<60? clrf Minuto ; Lo inicializa si ha superado su valor máximo. return ; Subrutina "IncrementaHoras" ----------------------------------------------------------- ; ; Incrementa el valor de la variable Hora. Si es igual al valor máximo de 24 lo resetea ; y sale con el Carry a "1". ; IncrementaHoras incf Hora,F ; Incrementa las horas. movlw .24 subwf Hora,W ; ¿Ha superado su valor máximo?. (W)=(Hora)-24. btfsc STATUS,C ; ¿C=0?, ¿(W) negativo?, ¿(Hora)<24? clrf Hora ; Lo inicializa si ha superado su valor máximo. return Decrementamin decf Minuto,1 return Decrementahr decf Hora,1 return PuestaEnHora call Retardo_20ms ; Espera a que se estabilicen niveles. btfsc ModoPulsador ; Si es un rebote sale fuera. goto FinPuestaEnHora PuestaEnHoraReset ; Al pulsar "MODO" se apaga la variable de bcf REELEVADOR bcf F_Intermitencia ; tiempo que se va a ajustar. movf FlagsAjuste,F ; Si antes estaba en funcionamiento normal, ahora btfss STATUS,Z ; pasa a ajustar la hora. goto AjustaSiguiente ; Si no pasa a ajustar la variable de tiempo siguiente. bsf F_AjusteHora ; Pasa a ajustar la hora. clrf Segundo ; Inicializa contador de segundos y el resto. clrf MedioSegundo clrf Registro50ms goto FinPuestaEnHora AjustaSiguiente ; Desplaza un "1" a la derecha del registro bcf STATUS,C ; FlagsAjuste para ajustar secuencialmente rrf FlagsAjuste,F ; cada uno de los registros de tiempo: FinPuestaEnHora ; hora y minuto. call VisualizaReloj btfss ModoPulsador ; Ahora espera deje de pulsar. goto FinPuestaEnHora return INCLUDE <RETARDOS.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <BIN_BCD.INC> END |