Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega16][Bascom][ds1307]-pomoc przy uruchomieniu

Hubold 22 Sty 2009 16:17 3383 14
  • #1 22 Sty 2009 16:17
    Hubold
    Poziom 10  

    Witam.

    Jako ,że stworzyłem płytkę pod ds'a i wszystkie elementy przylutowałem próbuję skomunikować się z ds'em. Jednak to mi nie wychodzi. Wiem ,że muszę ustawić bit CH = 0 ale nie wiem jak. W tym pytanie do mądrzejszych i bardziej doświadczonych w bascomie kolegów.

    [Atmega16][Bascom][ds1307]-pomoc przy uruchomieniu
    Oczywiście oporniki podciągające do lini scl i sda 3k3 Ohm. Kondensatora nie podłączałem.

  • #2 22 Sty 2009 16:37
    FastProject
    Poziom 28  

    Musisz za pomocą I2C zapisać do rejestru o adresie 00H wartość z najstarszym bitem(bit CH) o wartości 0.

  • #3 22 Sty 2009 17:11
    Hubold
    Poziom 10  

    Znaczy tak I2csend & H00 , I gdzie I jest byte i jest równe 0? Bynajmniej taka komenda wywoływana jest przez bascom-avr jako błędna.

  • #4 22 Sty 2009 17:25
    crazy_phisic
    VIP Zasłużony dla elektroda

    Hubold napisał:
    Znaczy tak I2csend & H00 , I gdzie I jest byte i jest równe 0? Bynajmniej taka komenda wywoływana jest przez bascom-avr jako błędna.


    Sprawdź w pliku pomocy jak wygląda składnia... i nie zapomnij o podaniu adresu do zapisu, potem adresu rejestru i na końcu dopiero wartości do zapisu.

  • #5 22 Sty 2009 18:32
    Hubold
    Poziom 10  

    A poczym będę mógł poznać ,że ds już jest uruchomiony ? Jak wygląda dalej sprawa z odczytem czasu ?

    Po wgraniu takiego programu :

    Code:

    Dim D As Byte
    Dim Mies As Byte
    Dim R As Byte
    Dim H As Byte
    Dim M As Byte
    Dim S As Byte

     I2cstart
     I2cwbyte 208
     I2cwbyte 0
     I2cstart
     I2cwbyte 209
     I2crbyte S , Ack
     I2crbyte M , Ack
     I2crbyte H , Ack
     I2crbyte D , Ack
     I2crbyte D , Ack
     I2crbyte Mies , Ack
     I2crbyte R , Nack
    I2cstop

    If S = 128 Then S = 0

    Locate 1 , 1 : Lcd Bcd(d)
    Locate 1 , 4 : Lcd Bcd(mies)
    Locate 1 , 7 : Lcd Bcd(r)
    Locate 2 , 1 : Lcd Bcd(h)
    Locate 2 , 4 : Lcd Bcd(m)
    Locate 2 , 7 : Lcd Bcd(s)


    program po kilku minutach wyświetlił mi znaki zapytania - czyli ds dalej nie jest uruchomiony ?

  • #6 22 Sty 2009 22:32
    madart
    Poziom 25  

    Mam nadzieję, że to nie cały program i konfigurujesz porty dla I2C.
    A co do sprawdzenia działania to polecam coś takiego:

    Code:

    ' 1 Hz SQW Output
    I2cstart
    I2cwbyte &B11010000
    I2cwbyte &H07
    I2cwbyte &B10010000
    I2cstop

    przed rozpoczęciem programu. Wtedy co sekunde będziesz miał generowany sygnał na wyjściu SQW/OUT czyli nóżce 7. Jest to otwarty dren czyli możesz podłączyć tam diodę z rezystorem i będziesz miał ładne migadełko.

  • #7 22 Sty 2009 22:53
    Hubold
    Poziom 10  

    Jasne ,że nie cały .

    Code:
    $regfile = "m16def.DAT"
    
    $lib "I2C.LBX"
    $lib "Ds1307clock.lib"
    $crystal = 8000000
    Config Lcd = 20 * 4
    Config Lcdmode = Port
    Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.1 , Db6 = Portb.5 , Db7 = Portb.6 , E = Portb.4 , Rs = Portb.2
    Config Sda = Portc.1
    Config Scl = Portc.0


    Dim D As Byte
    Dim Mies As Byte
    Dim R As Byte
    Dim H As Byte
    Dim M As Byte
    Dim S As Byte

    I = 0

    D = 21
    Mies = 01
    R = 09
    H = 17
    M = 50
    S = 00


     I2cstart
     I2cwbyte 208
     I2cwbyte 0
     I2cstart
     I2cwbyte 209
     I2crbyte S , Ack
     I2crbyte M , Ack
     I2crbyte H , Ack
     I2crbyte D , Ack
     I2crbyte D , Ack
     I2crbyte Mies , Ack
     I2crbyte R , Nack
    I2cstop

    If S = 128 Then S = 0

    Locate 1 , 1 : Lcd Bcd(d)
    Locate 1 , 4 : Lcd Bcd(mies)
    Locate 1 , 7 : Lcd Bcd(r)
    Locate 2 , 1 : Lcd Bcd(h)
    Locate 2 , 4 : Lcd Bcd(m)
    Locate 2 , 7 : Lcd Bcd(s)


    Ale jeżeli ds nie jest uruchomiony to nie będzie migać. Możesz podać mi pełną komendę dla wystartowania ds'a ?

    Zauważyłem też ,że programy z ds'em wykonują się znacznie wolniej niż inne programy. Na przykład w jednym programie dla ds'a jest
    waitms 100 to jest równe kilkunastu minutom.

  • #8 22 Sty 2009 23:35
    crazy_phisic
    VIP Zasłużony dla elektroda

    Jeśli to jest cały program to ... długa droga przed Tobą ;) "to" co zamieściłeś wykona się tylko raz i koniec. Przydałaby się tu pętla (np do-loop).

    Tajemnicza sprawa "spowolnienia" ukrywa się pod hasłem "fuse bity" i jest omówiona w każdą możliwą stronę na tym forum.

  • #9 23 Sty 2009 12:36
    Hubold
    Poziom 10  

    Fusy mam dobrze ustawione. Dziwi mie to ,że np. program do odczytu temperatury działa poprawnie a program do ds znacznie wolniej. Przytoczę program który znalazłem na niemieckim forum:

    Code:

    $regfile = "m16def.DAT"
    $lib "mcsbyte.lbx"                                          ' for smaller code
    $lib "Ds1307clock.lib"                                      '"ds1307rtc.lib" modified lib
    $crystal = 16000000
    $baud = 9600

    Config Lcd = 20 * 4
    Config Lcdmode = Port
    Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.1 , Db6 = Portb.5 , Db7 = Portb.6 , E = Portb.4 , Rs = Portb.2

    Config Sda = Portc.1
    Config Scl = Portc.0
    Config I2cdelay = 5


    'address of ds1307
    Const Ds1307w = &HD0                                        ' Addresses of Ds1307 clock
    Const Ds1307r = &HD1

    Config Clock = User                                         ' this will dim the bytes automatic
    'dim other needed variables
    Dim Weekday As Byte
    Locate 1 , 1
    Lcd "DS1307"
    Waitms 100
    ' assigning the time will call the SetTime routine
    Time$ = "23:58:59"                                          ' to watch the day changing value
    Date$ = "11-13-02"                                          ' 13 november 2002
    Do
    Cls
      Locate 1 , 1
      Lcd "Datum: " ; Date$ ;
      Locate 2 , 1
      Lcd "Tijd: " ; Time$
      Waitms 500
    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                                          ' send address
      I2cwbyte 4                                                ' starting address in 1307
      I2cwbyte _day                                             ' Send Data to SECONDS
      I2cwbyte _month                                           ' MINUTES
      I2cwbyte _year                                            ' Hours
      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


    Na samym początku programu gdzie wyświetlany jest napis ds1307 poniżej jest komenda waitms 100 po czym powinien wyświetlić się napisa datum. Czas do wyświetlenia jest znacznie większy niż 100 ms. Czy mógłby ktoś sprawdzić ten kod ?

  • #10 23 Sty 2009 12:55
    madart
    Poziom 25  

    Zauważ że po tym waitms 100 masz jeszcze zapisywanie daty i godziny do DSa. To też troszkę trwa. Spróbuj dać to wyświetlanie zaraz przed DO.
    Ogólnie program wygląda ok, sam korzytam z tych komend :) , ale bez udziału zewnętrznych bibliotek.
    No i jeszcze jedna mała uwaga. Jeśli nie używasz USARTa to wyrzuć komendę $baud, żebyś się potem nie dziwił że nie możesz stereować portami na których jest sprzętowy USART

  • #11 23 Sty 2009 13:17
    Hubold
    Poziom 10  

    Póki co z USART'a nie korzystam, ale piny do maxa są wyprowadzone więc to jest w planach. Ale ,żeby zapis trwał kilka minut ?

    Mógłbyś podać kawałek lub całą swoją komendę do odczytu i wyświetlania godziny bym mógł sprawdzić ostatecznie czy ds już jest uruchomiony . Ewentualnie pełną komendę do wysłania wartości 0 dla tego 7 bitu , bo mi coś to nie wychodzi.

    Dodano po 16 [minuty]:

    Program wyświetla mi kombinację pionowego e i 5. W rzędzie są 3 takie pary. Wnioskuję wobec tego ,że ds dalej nie jest uruchomiony, a czytałem gdzies na elektrodzie ,że wprowadzenie godziny wraz z sekundami do ds przestawia bit CH na 0 .

  • #12 23 Sty 2009 14:13
    madart
    Poziom 25  

    To moj program testowy :) z tym ze nie mam pewnosci, dawno nie uzywany :)

    Code:

    $regfile = "m8def.DAT"
    $crystal = 8000000


    Config Lcd = 16 * 1a
    Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.0 , Rs = Portc.1
    Cursor Off

    Config Sda = Portd.5
    Config Scl = Portd.6

    Config Pind.5 = Input
    Pind.5 = 1
    Config Pind.6 = Input
    Pind.6 = 1

    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


    _day = 29
    _month = 04
    _year = 08
    _sec = 10
    _min = 32
    _hour = 12

    Rem CZAS
    _sec = Makebcd(_sec)
    _min = Makebcd(_min)
    _hour = Makebcd(_hour)
    I2cstart
    I2cwbyte Ds1307w
    I2cwbyte 0
    I2cwbyte _sec
    I2cwbyte _min
    I2cwbyte _hour
    I2cstop

    Rem DATA
    _day = Makebcd(_day)
    _month = Makebcd(_month)
    _year = Makebcd(_year)
    I2cstart
    I2cwbyte Ds1307w
    I2cwbyte 3
    I2cwbyte _weekday
    I2cwbyte _day
    I2cwbyte _month
    I2cwbyte _year
    I2cstop

    ' 1 Hz SQW Output
    I2cstart
    I2cwbyte Ds1307w
    I2cwbyte &H07
    I2cwbyte &B10010000
    I2cstop


    Do



    ' ODCZYT DATY I CZASU*********
    I2cstart
    I2cwbyte Ds1307w
    I2cwbyte 0

    I2cstart
    I2cwbyte Ds1307r
    I2crbyte _sec , Ack
    I2crbyte _min , Ack
    I2crbyte _hour , Ack
    I2crbyte _weekday , Ack
    I2crbyte _day , Ack
    I2crbyte _month , Ack
    I2crbyte _year , Nack
    I2cstop

    ' WYSWIETLANIE****************
    Cls
    Lcd Bcd(_day) ; "/" ; Bcd(_month) ; "/" ; Bcd(_year)
    Lowerline
    Lcd Bcd(_hour) ; ":" ; Bcd(_min) ; ":" ; Bcd(_sec)

    Wait 1

    Loop

    End

  • #13 23 Sty 2009 14:30
    Hubold
    Poziom 10  

    Jeżeli dioda świeci stale i miernik wskazuje tylko stałe 5 v oraz Twój program testowy wyświetlił mi same znaki zapytania to znaczy ,że jeszcze ds'a nie uruchomiłem , prawda ?

  • Pomocny post
    #14 23 Sty 2009 14:53
    madart
    Poziom 25  

    Albo masz zamienione linie SCK i SDA :) , jeśli masz baterie włożoną, to sprawdź czy na pinie 3 masz 3V. Jak nie to podepnij go do masy. 100n ceramik na zasilaniu tuż przy układzie jest mile widziany.
    Ja bym obstawiał na hardware.

  • #15 23 Sty 2009 15:30
    Hubold
    Poziom 10  

    Na pinie 3 mam dokładnie 3,28 (bateryjka pastylka CR2032). Obyło się bez kondensatorka. I się okazało ,że zamiast na linię sda dać opornik to ten opornik dałem na linię sqw . Teraz już śliczne odlicza czas. Dzięki za pomoc. Tematu jeszcze nie zamykam , bo niewątpliwie będę miał jeszcze jakieś pytania odnośnie ds'a lub czegoś innego .:)

TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo