Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ATMega8 i DS1307 - problem z komunikacją

Sh44dow 09 Wrz 2009 13:29 3973 23
  • #1 09 Wrz 2009 13:29
    Sh44dow
    Poziom 16  

    Witam po raz kolejny.
    Po nieudanych próbach uruchomienia DS18B0 próbuję włączyć DS1307.

    Niestety RTC mi również nie działa. Korzystałem z 4 gotowych przykładów, w tym 1 ze zbioru sampli Bascoma i za każdym razem to samo, czyli nic. Przeglądałem tematy o DS1307 na forum ale niestety niewiele pomogły.

    ATMega8 i DS1307 - problem z komunikacją ATMega8 i DS1307 - problem z komunikacją

    Między Vcc a GND jest 5,22V z zasilacza komputerowego AT a między Vbat a GND 3,08V z baterii. SQW wisi "w powietrzu" a SDA\SCL są połączone z PC4\5 oraz z Vcc przez R=4k7.

    Ściągnąłem z forum Elektrody 3 gotowce - http://silent.it.cx/avr/
    Za każdym razem wyświetla same "165".
    W rtcch.bas zmienna Err przyjmuje wartość 1 już po "I2cwbyte &B11010000".

    Kilka razy się zdarzyło, że przy wyłączaniu zasilacza AT przy działającym programie rtc2.bas wartości zmieniły się na 0:0:(chyba 80) jeszcze zanim całkowicie spadnie napięcie. Próbowałem więc dołączyć diodę (1N4148) przed Vcc ale niestety bez rezultatu.

    Co jeszcze można z tym zrobić?

    0 23
  • Arrow Multisolution Day
  • #2 09 Wrz 2009 14:31
    Klima
    Poziom 30  

    A próbowałeś go skonfigurować zaraz po włączeniu? Ustawić opcje i aktualny czas?

    0
  • #3 09 Wrz 2009 14:38
    Sh44dow
    Poziom 16  

    W samplu z Bascomem miałem ustawianie czasu, w rtcch.bas jest zerowaniu bitu CH. Zapewne się nie ustawił skoro Err przyjmuje wartość 1 po próbie zapisu.
    Poza tym wydaje mi się, że nieustawiony układ powinien zwrócić jakieś inne dane zamiast "165".

    0
  • Arrow Multisolution Day
  • #4 09 Wrz 2009 14:51
    Klima
    Poziom 30  

    No to sprawdź połączenia. Obstawiałbym błąd z połączeniami - do złych pinów albo coś w tym stylu. Możesz też mieć uszkodzony któryś układ. Acha, spróbuj jeszcze odłączyć baterię i połączyć Vbat z masą i zobacz, czy wtedy komunikacja pójdzie.

    0
  • #5 09 Wrz 2009 15:02
    Sh44dow
    Poziom 16  

    Sprawdzałem miernikiem - są połączenia. Zwarcie Vbat z masą też nie pomogło.
    Piny są raczej dobrze ustawione, bo odłącze RTC od zasilania lub od ATMegi to program sie zawiesza.

    0
  • #6 09 Wrz 2009 15:18
    Klima
    Poziom 30  

    To źle. Nie powinien się zawieszać. Coś jest nie tak z tym programem.

    0
  • #7 09 Wrz 2009 15:40
    Sh44dow
    Poziom 16  

    Nawet przykład załączony z bascomem się zatrzymuje na i2cwbyte aż do podłączenia układu pod piny ustawione jako sda\scl, więc to raczej nie wina programu.

    0
  • #8 09 Wrz 2009 20:38
    janbernat
    Poziom 38  

    To jest kod "in statu nascendi"
    Ale działa.
    Na podstawie helpa z bascoma nieco zmienionego.
    Uparłem się że ustawianie będzie z dwóch przycisków.
    Mądrzy ludzie mówią mi że to niemożliwe.
    Ale może kiedyś mi się uda.
    Ale Ty możesz użyć tylu przycisków ile chcesz.
    I zmienić ten kod jak chcesz.

    Code:

    '-------------------------------------------------------------------------------
    '                           DS1307.BAS
    ' shows how to use the ds1307 clock on the 2313 futurlec board
    ' it also shows the CONFIG CLOCK=USER option
    '-------------------------------------------------------------------------------
    $regfile = "m8def.dat"
    $crystal = 16000000
    '$baud = 19200
    $lib "mcsbyte.lbx"                                ' for smaller code
    $lib "ds1307clock.lib"                            ' modified lib
    $lib "i2c_twi.lib"
    $hwstack = 50
    $swstack = 20
    $framesize = 40
    'configure the scl and sda pins
    Config Sda = Portc.5
    Config Scl = Portc.4
    Config I2cdelay = 10
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portb.1 , Db5 = Portb.2 , Db4 = Portb.3 , E = Portb.4 , Rs = Portb.5
    Config Twi = 100000
    Config Adc = Single , Prescaler = Auto , Reference = Internal
    Config Pind.5 = Input
    Set Portd.5

    Const Ds1307w = &HD0                              ' Addresses of Ds1307 clock
    Const Ds1307r = &HD1
    'Config Date = Mdy , Separator = -
    Config Clock = User                               ' this will dim the bytes automatic
    Dim Weekday As Byte                               'dim other needed variables
    Dim Zmienna As Byte
    Dim Temp As Byte
    Temp = 1                                          'ustawiamy zmienną tymczasową
    Dim Dzien_tygodnia As String * 3
    Dim Temp2 As Byte
    Temp2 = 1
    Dim Lx As Byte
    Lx = 1
    Dim Ly As Byte
    Ly = 6
    Config Pind.6 = Input
    Set Portd.6
    Config Pind.4 = Output
    Set Portd.4
    Config Pind.7 = Output



    'Set Portd.7

    ' assigning the time will call the SetTime routine
    'Time$ = "10:25:30"                                ' to watch the day changing value
    'Date$ = "06-04-09"
    _day = 06
    _month = 06
    _year = 09
    Weekday = 6
    Gosub Setdate
    'Waitms 5
    '_hour = 15
    '_min = 08
    '_sec = 0
    'Gosub Settime                                     ' DMY format 13 november 2002

       I2cstart
       I2cwbyte Ds1307w                               ' send address
       I2cwbyte 0
       I2cstart                                       ' Generate start code
       I2cwbyte Ds1307r
       I2crbyte _sec , Nack                           'odczytujemy sekundy
       I2cstop
       Zmienna = &B01111111 And _sec                  'aby po resecie ustawić tylko CH

       'I2cstart
       'I2cwbyte Ds1307w
       'I2cwbyte 3
       'I2cwbyte 5
       'I2cstop

                                                       'a sekundy zapamiętać
       I2cstart
       I2cwbyte Ds1307w                               'ustawiamy sygnał prostokątny 1Hz z wyjścia RTC
       I2cwbyte 0
       I2cwbyte Zmienna
       I2cstop

       I2cstart
       I2cwbyte Ds1307w
       I2cwbyte &H07
       I2cwbyte &B00010000                            'start sqarewavawe na 7 pinie
       I2cstop                                        '1Hz

    Cls
    Cursor Off
    'Cls
    Do
      'Print "Date Time : " ; Date$ ; " " ; Time$
      Select Case Weekday
        Case 0 : Dzien_tygodnia = "sun"
        Case 1 : Dzien_tygodnia = "mon"
        Case 2 : Dzien_tygodnia = "tue"
        Case 3 : Dzien_tygodnia = "wed"
        Case 4 : Dzien_tygodnia = "thu"
        Case 5 : Dzien_tygodnia = "fri"
        Case 6 : Dzien_tygodnia = "sat"
      End Select

    If Pind.6 = 0 Then
      If Temp = 1 Then                                'przerzutnik T robimy
        Set Portd.7
        Temp = 0
         If Pind.5 = 0 Then
           If Temp2 = 1 Then
             Temp2 = 0
             Locate Lx , Ly
             Cursor On
             Incr Weekday
              If Weekday > 6 Then Weekday = 0
              Incr _day
              If _day > 31 Then _day = 0
             Gosub Setdate
           End If
          Else
          Temp2 = 1
          'Cursor Off
        End If
          'Cls
          Locate 1 , 1
          'Cursor On
          Lcd "D:" ; Date$ ; " - " ; Dzien_tygodnia   'format:; _month ; _day ; _year

          Lowerline
          Lcd "T:" ; Time$ ; " " ; Temp2
          Lx = 1
          Ly = 6
          'Cursor Off
                Locate Lx , Ly

         'Cursor On

      End If
       Else
       Temp = 1
       Reset Portd.7
    End If
    'Cursor Off
    Loop : End

                                                          'called from ds1307clock.lib
    Getdatetime:
      I2cstart                                        ' Generate start code
      I2cwbyte Ds1307w                                ' send address
      I2cwbyte 0                                      ' start address in 1307

      I2cstart                                        ' Generate start code
      I2cwbyte Ds1307r                                ' send address
      I2crbyte _sec , Ack
      I2crbyte _min , Ack                             ' MINUTES
      I2crbyte _hour , Ack                            ' Hours
      I2crbyte Weekday , Ack                          ' Day of Week
      I2crbyte _day , Ack                             ' Day of Month
      I2crbyte _month , Ack                           ' Month of Year
      I2crbyte _year , Nack                           ' Year
      I2cstop
      _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
      _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
    Return

    Setdate:
      _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
      I2cstart                                        ' Generate start code
      I2cwbyte Ds1307w
      I2cwbyte 3
      I2cwbyte Weekday                                ' send address
      I2cwbyte _day                                   ' starting address in 1307
      I2cwbyte _month
      I2cwbyte _year
      I2cstop
    Return

    Settime:
      _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
      I2cstart                                        ' Generate start code
      I2cwbyte Ds1307w                                ' send address
      I2cwbyte 0                                      ' starting address in 1307
      I2cwbyte _sec                                   ' Send Data to SECONDS
      I2cwbyte _min                                   ' MINUTES
      I2cwbyte _hour                                  ' Hours
      I2cstop
    Return

    'Ustawianie:
       'Bitwait Pind.5 , Set

          'Locate 1 , 4
          'Cursor On
          'Incr _month
          'Waitms 200
             'If _month > 12 Then _month = 0
                'Gosub Setdate
          'If Pind.5 = 0 Then
          'Waitms 20
          'If Pind.5 = 0 Then





                'Toggle Portd.4

          'End If
       'End If

    'Return

    0
  • #11 13 Wrz 2009 16:16
    Sh44dow
    Poziom 16  

    Jakie moją być inne przyczyny?
    Napięcie jest, bateria jest, kwarc jest, SDA podłączone do pinu ustawionego jako SDA w Bascomie i tak samo SCL. Kabel łączący ATMegę z RTC ma mniej niż 20cm. Mało prawdopodobne wydaje mi się uszkodzenie układu - miałem nowy, prosto ze sklepu i nie był lutowany tylko wsadzony w podstawkę.
    Ostatnio programy przestały się przywieszać w momencie wysyłania czegoś po i2c bez podłączonego układu do procesora.

    Code:
    $regfile = "m8def.dat"
    
    $crystal = 8000000
    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.2 , Rs = Portd.0
    Config Lcd = 20 * 4


    Config Sda = Portc.5
    Config Scl = Portc.4

    Cls
    I2cinit

    I2cstart
    I2cwbyte &B11010000
    I2cwbyte &H0
    I2cwbyte &B00000000
    I2cstop
    Lcd Err ; "-"

    End


    Z podłączonym DS1307 wyświetla 1 a bez - 0.
    Czy wartość oporników podciągających SDA i SCL do masy ma tutaj większe znaczenie?

    0
  • #12 13 Wrz 2009 19:30
    Wojtek75
    Poziom 23  

    Sh44dow napisał:
    Czy wartość oporników podciągających SDA i SCL do masy ma tutaj większe znaczenie?

    Przy dłuższym przewodzie ma znaczenie powinno się zmniejszyć ich wartość ale jak piszesz, że przewód ma 20cm to raczej powinno działać. Co najistotniejsze te linie ściąga się przez rezystory do plusa a nie do masy. Nie wiem czy się pomyliłeś, bo w pierwszym poście piszesz o Vcc?

    0
  • #13 13 Wrz 2009 19:57
    Balu
    Poziom 38  

    Generalnie nie chce mi się czytać całego,ale czy oby nie ma w ds1307 bitu CH?:> (O ile problemem jest stanie zegara).
    Jeśli brak komunikacji, to: -100nF na nogach zasilania DS'a jest? -rezystory na linii sda i scl po 1...5k są? jak wisi na kablach to jeszcze elektrolit 10uF przynajmniej na nogi wsadzić. musi działać;)

    0
  • #14 13 Wrz 2009 20:53
    janbernat
    Poziom 38  

    Ja mam 4.7k.
    A pind.6 jest podłączony do 7 nogi układu ds1307 (sygnał FT/OUT) aby czas był sprawdzany co sekundę.
    Tam też opornik 4.7k
    I NIE do masy tylko do +5V podciąganie!!!
    SCL, SDA, i FT/OUT DO +5V !
    edit:
    CH w programie w programie który podałem jest ustawiany.
    I to w taki sposób aby nie były zmieniane sekundy.
    Jak to nie pomoże to należy sprawdzić pod jakim adresem jest ds.
    Pisałem to z pół roku temu -mogłem o czymś zapomnieć.
    Zegar chodzi z podtrzymaniem bateryjnym ale ustawianie czasu i daty jeszcze nie działa.
    Poszukam programu do wyszukiwania układów I2C na magistrali.
    edit2:
    Używam wyświetlacza 4x20.
    Należy to zmienić w programie na taki jaki jest podpięty.

    0
  • #15 13 Wrz 2009 22:39
    Sh44dow
    Poziom 16  

    Balu: [/b]Tak, tak, wiem że trzeba ustawić CH i próboję to zrobić, lecz nie wychodzi - zmienna Err ma wartość 1 po wywołaniu I2cwbyte.

    Linie są oczywiście podłączone rpzez 4k7 do +5 - coś mi się pomieszało.

    Jak mam wstawić te kondensatory? Między Vcc a masę i między Vbat a masę? Może być to 115nF (2x230 szeregowo)?

    0
  • #16 13 Wrz 2009 23:14
    Balu
    Poziom 38  

    kondensatory muszą być przedewszystkim takie o niskiej indukcyjności:> i raczej 1 :P Tak, między masę a vcc, baterię sobie daruj tymczasowo...
    Generalnie co do capa może to być 50...200nF ale odpowiedni do tego celu:>
    Np: http://seguro.pl/sklep/?podkat=114

    0
  • #17 13 Wrz 2009 23:21
    janbernat
    Poziom 38  

    Nie widać diod przy baterii.
    Nie widać kondensatora 100nF przy ds.
    Wklejaj obrazki na elektrodę -bo się długo ładują.
    Kondensator 100nF między Vcc ds a gnd.

    0
  • #18 13 Wrz 2009 23:32
    Sh44dow
    Poziom 16  

    Dioda przy baterii też musi byc? Może to być np. 1N4148? Jak ją umiescić?

    Kondensatory mam zwykłe ceramiki z elekotrnika ;-). Od czego zależy konieczność ich stosowania? Zasilanie mam stabilne z zasilacza AT.

    0
  • #19 14 Wrz 2009 00:14
    janbernat
    Poziom 38  

    Zaraz, uporządkujmy.
    Wygrzebałem płytkę i program.
    Program został powtórnie skompilowany i wgrany w bascom1.11.9.5.
    Chodzi - spieszy się czas 3min./na pół roku.
    Wyświetlacz - dopasuj jaki jest.
    Kwarc - też.
    Pind.6 dołącz do 7 nóżki układu ds1307 podciąganej też przez opornik 4.7k do +5V.
    No jak u mnie chodzi - to u Ciebie też musi chodzić.

    Dodano po 4 [minuty]:

    To na początek nie dawaj baterii i diod.
    Czas za każdym razem będzie od zera.
    Potem się da.
    Aby odpalić.
    Ale daj połączenie pind.6 -nóżka 7 ds- bo tak napisałem program i nie będę tego na razie zmieniał.

    Dodano po 8 [minuty]:

    A, sprawdziłem- pisałem że dawno przy tym nie robiłem.
    Bateria 3V na 3 nóżkę ds, zasilanie 5V na 8 nóżkę ds.
    Między zasilanie a gnd kondensator 100nF.(47-470nF - wszystko jedno na początek.)
    żadne diody nie potrzebne.

    0
  • #20 14 Wrz 2009 20:35
    Klima
    Poziom 30  

    Przypomnę tylko, że jeśli nie daje się baterii, to trzeba zewrzeć Vbat z gnd, bo inaczej układ może nie odpowiadać. Co do diod - dokumentacja układu zaznacza wyraźnie, że diod NIE WOLNO stosować.

    0
  • #21 14 Wrz 2009 20:48
    Sh44dow
    Poziom 16  

    Dalej niestety nie działa. Próbowałem zmieniać piny SDA\SCL ale dalej niestety Err=1 przy próbie l2cbwrite. Czy jest jakis oniwersalny sposób na test urządzeń i2c?

    0
  • #22 15 Wrz 2009 09:57
    janbernat
    Poziom 38  

    Zacznij od tego:

    Code:

    'I2C poszukiwanie
    $crystal = 16000000.

    $regfile = "m32def.dat"

    Config Portc = Output
    Config Lcd = 16 * 2

    Config Lcdpin = Pin , Db7 = Portc.2 , Db6 = Portc.3 , Db5 = Portc.4 , Db4 = Portc.5 , E = Portc.7 , Rs = Portc.6
    Config Scl = Portc.0
    Config Sda = Portc.1






    Config Lcd = 16 * 2
    Dim Adres As Byte
    Cls
    Lcd "start"
    Wait 2
    Cls
    For Adres = 60 To 170 Step 2
    I2cstart
    I2cwbyte Adres
    I2cstop
          If Err = 0 Then

             Cls
             Lcd "uklad pod:" ; Adres

          Else

             Cls
             Lcd "brak ukladu" ; Adres

          End If
    Wait 1
    Next Adres
    Cls
    Lcd "koniec"


    Oczywiście procesor, częstotliwość piny na wyświetlacz i na magistralę I2C oraz zakres adresów trzeba dostosować do swojej konfiguracji.

    0
  • #23 16 Wrz 2009 14:03
    Sh44dow
    Poziom 16  

    DS1307 ma adres 0xD0 (208) więc zwiększyłem zakres pętli do 254. W momencie kiedy nie mam nic podłączone do pinów PC0\1 program wisi a przy wpięciu kabelka łączącego te piny z DS1307 i rezystorami podciągającymi nic nie znajduje.

    0
  • #24 17 Paź 2009 22:27
    dolby
    Poziom 13  

    Jeśli jeszcze nie rozwiązałeś problemu, to przy STEP 2 nigdy nie odczytasz układu, bo adres odczytu wynosi 209 dziesiętnie, a adres zapisu wynosi 208. Do odczytu bit R/W jest ustawiany na 1 i wtedy adres układu jest równy 209.

    0