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

[atmega8][BASCOM] komunikacja po I2C

grysek 01 Kwi 2009 20:00 7823 22
REKLAMA
  • #1 6363397
    grysek
    Poziom 19  
    Witam

    Napisałem taki oto program:

     $regfile "m8def.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Sda = Portc.4
    Config Scl = Portc.5
    I2cinit
    Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
    Dim Sekundy As Byte
    Dim Minuty As Byte
    Dim Godziny As Byte
    Cls
    Do
    I2cstart
    I2cwbyte 160
    I2cwbyte 2
    I2cstart
    I2cwbyte 161
    I2crbyte Sekundy , Ack
    I2crbyte Minuty , Ack
    I2crbyte Godziny , Nack
    I2cstop
    Home
    Lcd Makedec(godziny) ; ":" ; Makedec(minuty) ; ":" ; Makedec(sekundy)
    Loop
    
    End


    i zbudowałem układ jak w schemacie (+ wyswietlacz podpięty do PORTB). Problem jest taki: wyswietla mi na wyswietlaczu cały czas 165, a jak odepne szyny i2c to nic sie nie zmienia. Czy ktoś wie w czym może być problem? Dodam że na AT89C2051 układ działa ok. Juz nie wiem co robic?


    [atmega8][BASCOM] komunikacja po I2C

    pozdrawiam
  • REKLAMA
  • #2 6363427
    crazy_phisic
    VIP Zasłużony dla elektroda
    A rezystory podciągające?
    Adres ma wartość 162 i 163.
  • #3 6363436
    grysek
    Poziom 19  
    Ale te rezystory mam dac do masy? Jesli tak to juz próbowałem i nic
  • #4 6363455
    crazy_phisic
    VIP Zasłużony dla elektroda
    A dokumentację przejrzałeś?
  • #5 6363552
    grysek
    Poziom 19  
    Tak przejrzałem, lecz niestety jeszcze nie zadobrze umiem angielski
  • #7 6372612
    grysek
    Poziom 19  
    Niestety podciągnięcie do Vcc nic nie dało. Na wyświetlaczu dalej pojawia sie tylko 165. Czy to może oznaczać że PCF jest niesprawny?
  • REKLAMA
  • #8 6373269
    wader_669
    Poziom 28  
    Dales na scl i sda te rezystory?
  • REKLAMA
  • #9 6373343
    grysek
    Poziom 19  
    Tak dałem. Niestety nie pomogło
  • REKLAMA
  • #11 6375058
    slawko_k
    Poziom 35  
    grysek a adres na 162 i 163 zmieniłeś?
    dodatkowo to kondensator od kwarca powinien być do + a nie do masy podpięty.
  • Pomocny post
    #12 6375482
    qmaps
    Poziom 2  
    Podstawowa sprawa - w drugiej linijce kodu masz napisane, że
    
    $crystal = 8000000 
    

    podczas gdy na schemacie nie masz podłaczonego żadnego kwarca. Jeśli używasz wewnętrznego oscylatora (i oczywiście masz tak ustawione FuseBit'y), to ATmega pracuje na 1MHz i taką wartość powinieneś ustawić w programie, bo nic nie będzie działać, albo będzie, ale "dziwnie" :)
    C8 rzeczywiście powinien być podpięty do VCC, a nie GND. Poza tym powinieneś podpiąć AREF i AVCC do VCC, AVGN do GND. Pozostawienie tych pinów "wiszących" może spowodować na niektórych wersjach ATmegi kłopoty z portami stanowiącymi wejście ADC.
    Oczywiście, jak wcześniej pisali koledzy, musisz dać pull-up'y 3k3 na linie SDA i SCL. Dodatkowo powinieneś ustawić porty PC5 i PC6 jako wyjścia i (na wszelki wypadek, też z tym miałem problemy) ustalić na nich stan na wysoki.
    Adresy są dobre (160 i 161) ale problem tkwi w tym, że PCF8583 wysyła dane w postaci BCD, a nie wartości dziesiętnej. Powinieneś użyć funkcji przerabiającej odbierane dane. Działająca u mnie (co prawda na AT16, ale to to samo) procedura wygląda następująco:
    
    $crystal = 16000000
    $regfile = "m16def.dat"
    
    Ddra = &B11111111
    Ddrb = &B00001111
    Ddrc = &B11111000
    Ddrd = &B11111111
    
    Portc = &B00001011
    
    (...)
    
    Config Sda = Portc.1
    Config Scl = Portc.0
    I2cinit
    
    Dim Hr As Byte                'godziny
    Dim Mi As Byte                'minuty
    Dim Sc As Byte                'sekundy
    Dim Pm1 As Byte               '---Zmienne pomocnicze
    Dim Pm2 As Byte
    Dim Pm3 As Byte
    
    (...)
    
    Timeread:
      I2cstart
      I2cwbyte 160
      I2cwbyte 2
      I2cstart
      I2cwbyte 161
      I2crbyte Pm1 , Ack
      I2crbyte Pm2 , Ack
      I2crbyte Pm3 , Nack
      I2cstop
      Sc = Makedec(pm1)
      Mi = Makedec(pm2)
      Hr = Makedec(pm3)
    Return 
    
  • Pomocny post
    #13 6375784
    crazy_phisic
    VIP Zasłużony dla elektroda
    qmaps napisał:
    ...
    Adresy są dobre (160 i 161) ale problem tkwi w tym, że PCF8583 wysyła dane w postaci BCD...


    Nie wiem czy tylko mi się tak wydaje ale A0 jest podłączone do VCC zatem adresy mają postać:
    10100010/1
  • #14 6382135
    grysek
    Poziom 19  
    Dzieki :D juz wszystko działa serdecznie dziekuje i pozdrawiam
  • #15 6412082
    grysek
    Poziom 19  
    Witam
    Mam kolejny problem z tym układem. Liczba w rejesrze miesiecy zwieksza sie o 20 co 24godziny. Wtedy kiedy zwieksza sie wartość w rejestrze dni to liczba miesiecy zwieksza sie o 20 zupełnie nie wiem czemu;/ Oto fragment programu odpowiedzialny za odbieranie danych:

    Do
    I2cstart
    I2cwbyte 162
    I2cwbyte 2
    I2cstart
    I2cwbyte 163
    I2crbyte Sekundy , Ack
    I2crbyte Minuty , Ack
    I2crbyte Godziny , Ack
    I2crbyte Dzien , Ack
    I2crbyte Miesiac , Nack
    I2cstop
    
    Godziny = Makedec(godziny)
    Minuty = Makedec(minuty)
    Sekundy = Makedec(sekundy)
    Dzien = Makedec(dzien)
    Miesiac = Makedec(miesiac)
    Call Wyswietl(godziny , Minuty , Sekundy , Dzien , Miesiac , Rok)
    
    Loop

    Bardzo prosze o pomoc

    pozdrawiam
  • #16 6412110
    Szymon Tarnowski
    Poziom 27  
    Wygląda na to że ktoś nie przeczytał specyfikacji układu, w większości rejestrów tego RTC siedzą jeszcze inne dane.
  • #17 6412522
    grysek
    Poziom 19  
    Akurat specyfikacje przeczytałem i wiem o tym. Twoj post wogóle mi nie pomógł. W rejestrze miesiecy znajduje sie rejestr tygodni i dziesiątek miesiecy. Czy mogłby mi ktos pomoc bo nie wiem co robię źle?
  • #18 6564621
    jacynka84
    Poziom 26  
    A ja mam jeszcze inszy problem , otóż normalnie odczytuję sekundy minuty i godziny,
    ale gdy sekundy dochodzą do 40 to do godzin "dołącza" się "4"... na dokładnie 20 sek, aż przekroczy 59sek, po czym godzina powraca do normalnego stanu...
    Wie ktoś o co chodzi??
    Kod tak prosty że nie ma nawet co pokazywać, odczyt , konwersja 'makedec' i na LCD.
  • #19 6564773
    Konto nie istnieje
    Poziom 1  
  • #20 6564968
    jacynka84
    Poziom 26  
    Cytat:
    Po odczycie, a przed konwersją na DEC, dodaj:
    Kod:

    Godziny = Godziny And &B01111111
    Sekundy = Sekundy And &B01111111

    Niestety żadnych zmian, ale dzięki za pomoc.
  • #21 6564980
    Konto nie istnieje
    Poziom 1  
  • #22 6565287
    jacynka84
    Poziom 26  
    Dokładnie, ale sam musiałem stwierdzić na czym polegał błąd w twoim poście, jednak bezpośrednio mnie naprowadziłeś - wystarczy coś takiego
     Godzina = Godzina and &B00111111 

    Zjadłeś jedno zero, ale widzę że się poprawiłeś, ponadto nie potrzeba było tej linijki z sekundami.
  • #23 6565327
    Konto nie istnieje
    Poziom 1  
REKLAMA