Witam. Postanowiłem wreszcie zrobić sobie zegarek do pokoju. Wybór pał na PCF8583 bo już kiedyś z niego korzystałem i wspominam bardzo pozytywnie - nie było żadnych problemów z odpaleniem i komunikacją tylko że to były czasy AT89C2051 i bascoma 8051. Teraz mam w układzie atmege8515 i są spore "jaja" co jakiś czas (godzina czasem pół czasem dwie) dostaje odczyt w postaci np godziny 44tej albo sekund w stylu 78 79 80 ... Myślałem że może to zakłócenia przenikające z reszty układu zasiliłem więc timer z samej tylko baterii i mam to samo. Wydaje mi się że nie jest to kwestia programu bo wszystko potrafi działać prawidłowo kilka godzin po czym dostaje odczyt z kosmosu :/ Zastanawiam się nad włożeniem innego timera bo nie mam pomysłu co z tym zrobić. Dołączam listing programu w wersji roboczej (tylko odczyt i wyświetlanie) nastawiony został przez pisanie odpowiednich wartości za pomocą innego programiku - nie mam po co pisać funkcji nastawiania dopóki nie będzie poprawnie działało wyświetlanie. Wyświetlacze sterowane są statycznie bo drażni mnie miganie multiplexu a koszt nie był jakiś straszny jak dla mnie a do tego mam możliwość prostego regulowania jasności wyświetlacza PWM-em
Dołączam także schematy układu.

$regfile = "m8515.dat"
$crystal = 11059200
Config Sda = Portb.3
Config Scl = Portb.2
Config I2cdelay = 50
I2cinit
Config Portb.3 = Output
Config Portb.2 = Output
Config Portc = Output
Config Portd.5 = Output
Config Porta.0 = Output
Config Porta.1 = Output
Config Porta.2 = Output
Config Porta.3 = Output
Config Porta.4 = Output '
Config Porta.5 = Output
Config Porte.2 = Input
Leddata Alias Portc
Led1 Alias Porta.1
Led2 Alias Porta.0
Led3 Alias Porta.5
Led4 Alias Porta.4
Led5 Alias Porta.3
Led6 Alias Porta.2
Dim Dat(6) As Byte
Dim Bright As Byte
Dim S As Byte
Dim M As Byte
Dim H As Byte
Dim H1 As Byte
Dim Temp As Byte
Declare Sub Sender
Declare Sub Rtcwrite
Config Timer1 = Pwm , Prescale = 1 , Pwm = 8 , Compare A Pwm = Clear Down
''
Pwm1a = 220
Dat(1) = 10 'czyszczenie wyświetlacza po właczeniu
Dat(2) = 10
Dat(3) = 10
Dat(4) = 10
Dat(5) = 10
Dat(6) = 10
Call Sender
Do
I2cstart 'odczyt PCFa
I2cwbyte 162
I2cwbyte 2
I2cstart
I2cwbyte 163
I2crbyte S , Ack
I2crbyte M , Ack
I2crbyte H , Nack
I2cstop
Wait 1
Temp = S 'rozdział danych z timera tak aby uzyskać cyfry w osobnych zmiennych do wtyswietlenia
Shift Temp , Right , 4
Dat(2) = Makedec(temp)
Temp = S
Shift Temp , Left , 4
Shift Temp , Right , 4
Dat(1) = Makedec(temp)
Temp = M
Shift Temp , Right , 4
Dat(4) = Makedec(temp)
Temp = M
Shift Temp , Left , 4
Shift Temp , Right , 4
Dat(3) = Makedec(temp)
Temp = H
Shift Temp , Right , 4
Dat(6) = Makedec(temp)
If Dat(6) = 0 Then
Dat(6) = 10
End If
Temp = H
Shift Temp , Left , 4
Shift Temp , Right , 4
Dat(5) = Makedec(temp)
Call Sender
Loop
End
Sub Rtcwrite 'podprogram zapisu danych
S = Makebcd(s)
M = Makebcd(m)
H = Makebcd(h)
I2cstart
I2cwbyte 162
I2cwbyte 2
I2cwbyte S
I2cwbyte M
I2cwbyte H
I2cstop
End Sub
Sub Sender 'wysyłanie do rejestrów sterujacych wyświetlacze
Leddata = Lookup(dat(1) , Led) 'translacja cyfry ze zmiennej dat
Reset Led1 'na kod dla wyświetlacza 7segmentowego
Set Led1
Leddata = Lookup(dat(2) , Led)
Reset Led2
Set Led2
Leddata = Lookup(dat(3) , Led)
Reset Led3
Set Led3
Leddata = Lookup(dat(4) , Led)
Reset Led4
Set Led4
Leddata = Lookup(dat(5) , Led)
Reset Led5
Set Led5
Leddata = Lookup(dat(6) , Led)
Reset Led6
Set Led6
End Sub
Led:
Data 63 , 6 , 91 , 79 , 102 , 109 , 125 , 7 , 127 , 111 , 0 'tablicza z kodami kolejnych cyfr (i zero dla wygaszonego wyświetlacza)