logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

BASCOM / M168 / PCF8583. Układ czasami działa, a czasami nie

arktik1 13 Paź 2010 07:43 1610 6
REKLAMA
  • #1 8613510
    arktik1
    Poziom 27  
    Witam.
    Przeczytałem kilka tematów z ELEKTRODY odnośnie podłączenia zegara PCF do Uc.
    Przetestowałem też kilka schematów połączeń tego układu i nadal mam problem.
    Zdarza się że układ po włączeniu zasilania wyświetla cały czas 165:165.
    Nie daje się zaprogramować i nie daje się odczytać.
    Po jakimś czasie zaczyna pracować normalnie ,zdarza się że trzeba kilka razy wyłączyć mu zasilanie by działał.
    Nie mam już pomysłów czego to może być wina, mam 2 takie układy i obydwa działają tak samo.
    Obecnie układ jest podłączony W/G noty katalogowej.
  • REKLAMA
  • #2 8613535
    kundzios
    Poziom 19  
    Nie wiem jak masz wykonany prototyp, ale spróbuj lepiej odfiltrować PCF8583, miałem przypadek że układ przyśpieszał lub zwalniał(znacznie), a czasem pokazywał złe dane. Może być to wina źle napisanego programu, ale musiałbyś go tu umieścić, najlepiej razem ze schematem.
    Pozdro
  • REKLAMA
  • #3 8613538
    FastProject
    Poziom 28  
    Po 1: Jaki procesor-schemat podłączenia jednak by się przydał.
    2. Po jakim czasie (w programie) zaczynasz zczytywać godzinę?
    3. Po jakim czasie układ zaczyna działać normalnie?

    Być może za szybko zaczynasz odczytywać dane z PCF-a a jego oscylator jeszcze ni wystartował, stąd błędne dane. Daj może jakieś Waitms na starcie programu w Bascomie.
  • REKLAMA
  • #4 8613916
    arktik1
    Poziom 27  
    Oto wycinek kodu odpowiadający za odczyt i zapis zegara:
    
    Config Sda = Portc.4
    Config Scl = Portc.5
    Declare Sub Odczyt_rtc(sekunda As Byte , Minuta As Byte , Godzina As Byte)
    Declare Sub Zapis_rtc
    ...
    do
    
    Call Odczyt_rtc(sekunda , Minuta , Godzina)
    if Pind.3 = 0 Or Pind.2 = 0 Then Gosub Menu
    ...
    
    loop
    
    Menu:
    
    Call Odczyt_rtc(sekunda , Minuta , Godzina)
    Licznikmenu = 0
    if Pind.3 = 0 Or Pind.2 = 0 Then Gosub Czekaj1
    Minuta1 = Minuta
    Godzina1 = Godzina
    
    Do
    
    If Licznikmenu < 40 Then Incr Licznikmenu
    If Pind.2 = 0 Then
    Incr Godzina1 : Licznikmenu = 0
    If Godzina1 = 24 Then Godzina1 = 0
    Waitms 250
    End If
    
    If Pind.3 = 0 Then
    Incr Minuta1 : Licznikmenu = 0
    If Minuta1 = 60 Then Minuta1 = 0
    Waitms 250
    End If
    
    Locate 1 , 1
    Lcd " USTAWIANIE ZEGARA  "
    Locate 2 , 1
    Lcd "                    "
    Locate 3 , 1
    Lcd "AKTUALNY CZAS-"
    If Godzina < 10 Then
    Lcd "0" ; Godzina
    Else
    Lcd Godzina
    End If
    Lcd ":"
    If Minuta < 10 Then
    Lcd "0" ; Minuta ; " "
    Else
    Lcd Minuta ; " "
    End If
    Locate 4 , 1
    Lcd " USTAW   CZAS-"
    If Godzina1 < 10 Then
    Lcd "0" ; Godzina1
    Else
    Lcd Godzina1
    End If
    Lcd ":"
    If Minuta1 < 10 Then
    Lcd "0" ; Minuta1 ; " "
    Else
    Lcd Minuta1 ; " "
    End If
    If Licznikmenu = 40 Then
    Call Zapis_rtc
    Return
    End If
    Loop
    End
    
    
    
    Sub Odczyt_rtc(sekunda As Byte , Minuta As Byte , Godzina As Byte)
       I2cstart                                                 'INICJALIZACJA MAGISTRALI I2C.'
       I2cwbyte 162                                             'PODANIE ADRESU DLA PCF 8583; ZAPIS.'
       I2cwbyte 2                                               'WYBÓR DRUGIEGO REJESTRU, REJESTR SEKUND.'
       I2cstart                                                 'POWTÓRNA INICJALIZACJA MAGISTRALI I2C.'
       I2cwbyte 163                                             'PODANIE ADRESU DLA PCF 8583; ODCZYT.'
       I2crbyte Sekunda , Ack                                   'ODCZYT SEKUND Z POTWIERDZENIE TRANSMISJI.'
       I2crbyte Minuta , Ack                                    'ODCZYT MINUT Z POTWIERDZENIE TRANSMISJI.'
       I2crbyte Godzina , Nack                                  'ODCZYT GODZIN BEZ POTWIERDZENIA TRANSMISJI.'
       I2cstop                                                  'KONIEC TRANSMISJI I2C.'
    Sekunda = Makedec(sekunda)                                  'KONWERSJA SEKUND Z LICZBY W FORMACIE BCD NA DEC.'
    Minuta = Makedec(minuta)                                    'KONWERSJA MINUT Z LICZBY W FORMACIE BCD NA DEC.'
    Godzina = Makedec(godzina)
    End Sub
    
    
    
    
    Sub Zapis_rtc
    Sekunda1 = Makebcd(sekunda1)                                'KONWERSJA SEKUND Z LICZBY W FORMACIE DEC NA BCD.'
    Minuta1 = Makebcd(minuta1)                                  'KONWERSJA MINUT Z LICZBY W FORMACIE DEC NA DEC BCD.'
    Godzina1 = Makebcd(godzina1)                                'KONWERSJA GODZIN Z LICZBY W FORMACIE DEC NA BCD.'
       I2cstart                                                 'INICJALIZACJA MAGISTRALI I2C.'
       I2cwbyte 162                                             'PODANIE ADRESU DLA PCF 8583; ZAPIS.'
       I2cwbyte 0                                               'WYBRANIE PIERWSZEGO KONTROLNEGO REJESTRU.'
       I2cwbyte 8
       I2cstop
       I2cstart
       I2cwbyte 162                                             'USTAWIENIE TRYBU ZAPISU.'
       I2cwbyte 2                                               'WYBÓR DRUGIEGO REJESTRU, REJESTR SEKUND.'
       I2cwbyte Sekunda1                                        'ZAPIS SEKUND.'
       I2cwbyte Minuta1                                         'ZAPIS MINUT.'
       I2cwbyte Godzina1                                        'ZAPIS GODZIN.'
       I2cstop                                                  'KONIEC TRANSMISJI I2C.'
    Cls
       Locate 1 , 1
       Lcd Spc(20)
       Locate 2 , 1
       Lcd "       ZEGAR        "
       Locate 3 , 1
       Lcd "     USTAWIONY      "
       Wait 2
    
    

    Najgorsze jest to że nie można określić czasu startu.
    Nieraz zaczyna działać po 2 min. nie raz po 1,a nie raz po kilku restartach.
    W każdym razie jak zacznie działać to później nie ma żadnych problemów.
    Co do schematu to jest tak jak w nocie PCF :
    Zasilanie 5V z kondensatorem 100uF.
    BASCOM / M168 / PCF8583. Układ czasami działa, a czasami nie
  • #5 8677360
    J_Bravo
    Poziom 27  
    A może zmień kwarc i kondensatorek na inny. Może tu masz problem. Czy dodałeś oporniki podciągające do plusa na I2C ??
  • REKLAMA
  • #6 8677440
    Jaca
    Poziom 31  
    1. Daj zewnętrzne rezystory podciągające SDA i SCL do VCC jak już kolega wcześniej napisał
    2. Dodaj przed pętlą główną komendę I2cinit
    3. Nie zapomnij maskować nieużywanych bitów odczytanych wartości
  • #7 8686808
    arktik1
    Poziom 27  
    Było to robione na płycie testowej, może była to wina długości przewodu, może PCF, nie wiem. Po zlutowaniu układu i założeniu nowego PCF wszystko działa jak należy.
REKLAMA