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

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

Hubold 22 Sty 2009 16:17 3842 14
  • #1 6037422
    Hubold
    Poziom 11  
    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 6037509
    FastProject
    Poziom 28  
    Musisz za pomocą I2C zapisać do rejestru o adresie 00H wartość z najstarszym bitem(bit CH) o wartości 0.
  • #3 6037690
    Hubold
    Poziom 11  
    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 6037771
    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 6038185
    Hubold
    Poziom 11  
    A poczym będę mógł poznać ,że ds już jest uruchomiony ? Jak wygląda dalej sprawa z odczytem czasu ?

    Po wgraniu takiego programu :
    
    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 6039800
    madart
    Poziom 26  
    Mam nadzieję, że to nie cały program i konfigurujesz porty dla I2C.
    A co do sprawdzenia działania to polecam coś takiego:
    
    ' 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 6039909
    Hubold
    Poziom 11  
    Jasne ,że nie cały .
    $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 6040116
    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 6041490
    Hubold
    Poziom 11  
    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:
    
    $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 6041565
    madart
    Poziom 26  
    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 6041583
    Hubold
    Poziom 11  
    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 6041887
    madart
    Poziom 26  
    To moj program testowy :) z tym ze nie mam pewnosci, dawno nie uzywany :)

    
    $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 6041970
    Hubold
    Poziom 11  
    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 6042080
    madart
    Poziom 26  
    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 6042266
    Hubold
    Poziom 11  
    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 .:)
REKLAMA