Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Zegar na PCF8583 problemy.

KJ 18 Nov 2007 19:37 1799 5
  • #1
    KJ
    Level 31  
    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 :D 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)
  • #3
    KJ
    Level 31  
    Problem chyba rozwiązany powodem było zwarcie jednej ścieżki na płytce do magistrali i2c efekt taki że przy pewnych specyficznych wartościach na wyświetlaczu dostawałem krzaczki po i2c :-). Mam jeszcze pytanie jak należy ustawić fusebity w medze8515 aby pracowała z zewnętrznym kwarcem 11MHz ? Ustawiłem na same 1ki i niby działa ale mam wrażenie że powinna szybciej śmigać.
  • #4
    Ch.M.
    Level 27  
    A co ma szybciej śmigać w zegarku?
    jesli chodzi o szybkośc odświerzania i migotanie to podnoszenie częstotliwości nic Ci nie da, bo czas zapalenia segmentu nie ulegnie zmianie. nie znam sie na Bascomie, ale na pewno da sie odpowiednimi zmiennymi regulować czas wypełnienia (świecenia segmentu)
  • #5
    arturt134
    Level 27  
    11MHz po to żeby odczytać RTC i wyświetlić wynik? To nie lepiej puścić go na 1MHz i drastycznie zmniejszyć pobór prądu? Mocy obliczeniowej i tak bedzie wystarczająco.
  • #6
    KJ
    Level 31  
    Nie tylko po to jeszcze do obsługi RS232 i RC5 :) Pobór prądu procka w porównaniu z wyświetlaczami które mam można pominąć.