Hola a todos,
Estoy intentando crear un dispositivo que cuente minutos y segundos, cuando comienze un minuto debe activar un rele durante los primeros 20 segundos del minuto, continuar hasta llegar a un nuevo minuto y volver a comenzar.
A su vez el dispositivo parpadea en cada segundo transcurrido.
Los problemas que encuentro es que no termina de funcionar correctamente, hay momentos que comienza a funcionar bien pero luego deja de hacerlo y no guarda los tiempos de espera, en otras ocasiones directamente no funciona bien, se desajustan los tiempos y en lugar de estar 20 segundos esta mas o menos, y en lugar de hacerlo cada minuto lo hace segun le parece.
Utilizo el oscilador interno a 8MHz, el TMR0 con un prescaler de 1:128 y con una carga de 131, de este modo salta cada 8ms exactos
¿Que puede estar ocurriendo?
OSCCON = %01111101 '8 MHz Oscilador Interno
AllDigital
TRISB.4 = 0
TRISB.5 = 0
Dim mseg As Word
Dim segundos As Byte
Dim seg_wait As Word
Dim minutos As Byte
Dim horas As Byte
Dim prog_e As Bit
OPTION_REG.T0CS = 0 'selecciona reloj interno
OPTION_REG.PSA = 0 'asigna el prescales al timer0
OPTION_REG.PS0 = 0 'bits de la seleccion del factor de division,prescaler 128
OPTION_REG.PS1 = 1 'bits de la seleccion del factor de division,prescaler 128
OPTION_REG.PS2 = 1 'bits de la seleccion del factor de division,prescaler 128
INTCON.GIE = 1 'habilita todas las interrupciones globales
INTCON.TMR0IF = 0 'borra el flag de desbordamiento del timer0
TMR0 = 131 'cargo el registro del tmr0 para que desborde cada 1mS
INTCON.TMR0IE = 1 'habilita las interrupciones del timer0
mseg = 0
segundos = 0
seg_wait = 0
minutos = 0
horas = 0
loop:
'SE CALCULAN LOS SEGUNDOS
If mseg = 1000 Then
Toggle PORTB.4
segundos = segundos + 1
seg_wait = seg_wait + 1
mseg = 0
Endif
'SE CALCULAN LOS MINUTOS
If segundos = 60 Then
minutos = minutos + 1
segundos = 0
Endif
'SE CALCULAN LAS HORAS
If minutos = 60 Then
horas = horas + 1
minutos = 0
Endif
'SE COMPRUEBA SI HA LLEGADO AL LIMITE
If minutos = 1 Then
mseg = 0
segundos = 0
seg_wait = 0
minutos = 0
horas = 0
PORTB.5 = 1
prog_e = 1
Endif
'COMPRUEBA SI HA PASADO EL TIEMPO EN ACTIVO
If prog_e = 1 Then
If seg_wait = 20 Then
PORTB.5 = 0
prog_e = 0
seg_wait = 0
Endif
Endif
Goto loop
End
On Interrupt
mseg = mseg + 8
TMR0 = 131
INTCON.TMR0IF = 0
Resume
Saludos