Autor
|
Tema: Temporizador para insoladora (Leído 24,642 veces)
|
Meta
|
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 - Enciende los PIC. * Ver paso 2 - Pulsa el botón RB7. Por ahora las intrrupciones son iguales. * Ver paso 3 - Pulsa el botón RB6. Sigue con los mismos bits. * Ver paso 4 - Pulsa RB7. El bits RBIE del 16F88 está en 0 y del 16F84A en 1. * Ver paso 5 - 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.
|
|
|
En línea
|
|
|
|
yarboclo
Desconectado
Mensajes: 2
|
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.
|
|
|
En línea
|
|
|
|
Meta
|
Cuando pueda te lo paso.
|
|
|
En línea
|
|
|
|
yarboclo
Desconectado
Mensajes: 2
|
Oki, espero tu mensaje. Gracias
|
|
|
En línea
|
|
|
|
f2v
Desconectado
Mensajes: 1
|
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....
|
|
|
En línea
|
|
|
|
markitosb
Desconectado
Mensajes: 1
|
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
|
|
|
En línea
|
|
|
|
elcerouno
Desconectado
Mensajes: 5
|
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
|
|
|
En línea
|
|
|
|
|
elcerouno
Desconectado
Mensajes: 5
|
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
|
|
|
En línea
|
|
|
|
elcerouno
Desconectado
Mensajes: 5
|
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
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Hacer temporizador para relé
Electrónica
|
Meta
|
0
|
5,547
|
15 Enero 2011, 06:18 am
por Meta
|
|
|
Sleep Timer, temporizador automático para Windows
Noticias
|
wolfbcn
|
2
|
3,014
|
11 Marzo 2012, 00:30 am
por Kase
|
|
|
Dudas para crear temporizador en ensamblador
« 1 2 »
Electrónica
|
Fox_Neo
|
12
|
24,028
|
20 Abril 2013, 00:00 am
por Meta
|
|
|
Ayuda con Temporizador para archivo .Bat
Scripting
|
joaquinrekpo
|
2
|
8,857
|
7 Noviembre 2014, 17:28 pm
por joaquinrekpo
|
|
|
Temporizador en menú para cerrar venta.
Scripting
|
MaX2
|
3
|
2,628
|
10 Febrero 2022, 22:56 pm
por .xAk.
|
|