Zrobiłem sobie propeller clock na i działa prawie dobrze
Problem w tym że co jakieś 50 obrotów zegarek przestaje działać na kolejne 50 obrotów. Wiąże się to z funkcją zliczania czasu obrotu i przeliczanie na 60 pozycji na tarczy zegara.
Jeśli zmiejsze Y to czas wyświetlania i czas niewyświetlania skraca się, przy Y=1 obraz miga dość uciążliwie. Ta funkcja wykonywana jest przy przerwaniu ICP1 czyli gdy na nóżce PB.0 pojawi się stan niski z fototranzystora. Ma ktoś pomysł skąd takie coś? Wyświetlanie odbywa się przy porównaniu licznika T1 z rejestrem compare1a. Może coś przeoczyłem albo czegoś zabrakło? To tak jakby przy zliczaniu y nie odbywało się przerwanie od compare1a.
Tutaj cały kod:
Problem w tym że co jakieś 50 obrotów zegarek przestaje działać na kolejne 50 obrotów. Wiąże się to z funkcją zliczania czasu obrotu i przeliczanie na 60 pozycji na tarczy zegara.
Stop Timer1
Timer1 = 0
Start Timer1
Incr Y
If Y = 50 Then
X = Capture1
X = X / 60
Y = 0
End If
Compare1a = X
Pozycja = 60Jeśli zmiejsze Y to czas wyświetlania i czas niewyświetlania skraca się, przy Y=1 obraz miga dość uciążliwie. Ta funkcja wykonywana jest przy przerwaniu ICP1 czyli gdy na nóżce PB.0 pojawi się stan niski z fototranzystora. Ma ktoś pomysł skąd takie coś? Wyświetlanie odbywa się przy porównaniu licznika T1 z rejestrem compare1a. Może coś przeoczyłem albo czegoś zabrakło? To tak jakby przy zliczaniu y nie odbywało się przerwanie od compare1a.
Tutaj cały kod:
$regfile = "m8def.DAT"
$crystal = 8000000
$baud = 9600
Config Portc = Output
Set Portc.2
Reset Portc.1
Reset Portc.0
Config Pinb.0 = Input
Config Timer1 = Timer , Prescale = 1024 , Capture Edge = Falling , Compare A = Disconnect , Clear Timer = 1
On Icp1 C1
On Compare1a C2
Enable Compare1a
Enable Icp1
Enable Interrupts
Dim _s As Byte , _m As Byte , _h As Byte
Dim Y As Byte
Dim X As Word
Dim Pozycja As Byte
Config Sda = Portd.6
Config Scl = Portd.5
Dim _weekday As Byte
Dim _day As Byte
Dim _month As Byte
Dim _year As Byte
Dim _sec As Byte
Dim _min As Byte
Dim _hour As Byte
Dim Ds1307w As Byte
Dim Ds1307r As Byte
Ds1307w = &B11010000
Ds1307r = &B11010001
Do
Reset Portc.0
Reset Portc.1
Set Portc.2
Loop
End
C1:
Stop Timer1
Timer1 = 0
Start Timer1
Incr Y
If Y = 50 Then
X = Capture1
X = X / 60
Y = 0
End If
Compare1a = X
Pozycja = 60
' ODCZYT DATY I CZASU*********
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cstart
I2cwbyte Ds1307r
I2crbyte _sec , Ack
I2crbyte _min , Ack
I2crbyte _hour , Nack
I2cstop
_s = Makedec(_sec)
_m = Makedec(_min)
_h = Makedec(_hour)
Return
C2:
Decr Pozycja
If _s = Pozycja Then Reset Portc.2
If _m = Pozycja Then
Set Portc.1
Set Portc.0
End If
If _h = Pozycja Then Set Portc.0
Return