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

obsluga eeproma i RTC po I2C

maly_ZE 28 Kwi 2011 18:53 3314 21
  • #1 9448565
    maly_ZE
    Poziom 14  
    Witam serdecznie;
    Mam pewien problem z magistrala i2c.
    Mianowicie mam podłączony pod atmege32 zegar RTU(ds1307) oraz zewnętrzną pamięć eeprom(24c32) komunikujące sie z atmega po i2c.
    Pamięć i zegar oddzielnie działają poprawnie tzn np: wyświetlam sobie aktualną godzinę i datę na LCD czy tez zapisuje dane z termometra(ds18b20) do eeprom i później przesyłam je sobie za pomocą rs232 na pc.
    Domyślnie chciałem zapisywać pomiar temperatury wraz z godziną kiedy ten pomiar został wykonany i tu pojawia się problem. Tzn zegar zaczyna wariować i wpisuje mi jakieś bzdury.
    Wie ktoś w czym jest problem.?
    Z góry dziękuje za pomoc.
    Pozdrawiam serdecznie
  • #2 9448938
    piotrva
    VIP Zasłużony dla elektroda
    pokaż schemat - o to chodzi
    też wróżę z fusów, ale jakie masz adresy bazowe pamięci i zegarka?
    czy nie ma tu konfliktu i kolizji?
  • #3 9449112
    maly_ZE
    Poziom 14  
    Załączam schemat
    obsluga eeproma i RTC po I2C

    Adresy sa raczej ok tzn:
    eeprom - W=160, R=161
    rtu - W=208,R209
    Dzięki za zainteresowanie:)
  • #4 9449157
    piotrva
    VIP Zasłużony dla elektroda
    a testowałeś to w "realu"?
    czy tylko w proteusie?
    i jaka to wersja proteusa?
  • #5 9449255
    maly_ZE
    Poziom 14  
    Ten schemat zamiescilem tylko tak pogladowo. Mam plytke drukowana, wszystko chodzi, tak jak napisalem zapis i odczyt z eepromu chodzi poprawnie, czas z rtu takze jest poprawnie wyswietlany. Problem jest w tym gdy chce zapisac do eeprom informacje o godzinie tzn problem jest gdy chce jednoczesnie obsluzyc eeprom i rtu po magistrali i2c...
  • #6 9449645
    michalko12
    Specjalista - Mikrokontrolery
    Dział o AVR, schemat na PICu (poglądowo), jakieś rtu (unit?), brak kodu.
    Ty sobie pisanki robisz?
  • #7 9449754
    maly_ZE
    Poziom 14  
    Chodzi oczywiscie o zegar RTC, sorki za literowke.
    Moge zamiescic kod nie ma problemu, tyle ze program jest dość rozbudowany, wiec chyba to troche bez sensu, bo i tak nikt pewnie nie bedzie analizował.
    Problem tkwi w tym: zapis i odczyt danych do eeproma po i2c dziala bezproblemowo, zegar RTC po i2c takze chodzi, ale gdy chce zapisać dane o czasie(godzine,minuty,sekundy) do eeproma, czyli tak jakby kozystac z szyny i2c rownolegle przez eeprom i RTC zapisywane sa zupełnie przypadkowe liczby.
  • #8 9449800
    piotrva
    VIP Zasłużony dla elektroda
    No bo trzeba pierwsze zakończyć komunikację z zegarem a potem znów zacząć transmisję od warunku i2c start
  • #9 9449941
    maly_ZE
    Poziom 14  
    Zamieszczę wiec kawałek kodu. Pominę wcześniejsze deklaracje zmiennych, inicjalizację rtc i lcd, myślę ze to nie ma znaczenia, zamieszczam wiec for-a w ktorym chce odczytac 2-razy czas(godzine, minuty, sekundy) i zapisać je w kolejnych rejestrach eeproma.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    po przeslaniu na pc przez rs232 wyswitlane jest cos takiego:
    45.160.85
    45.160.85
  • #10 9450136
    Brutus_gsm
    Poziom 25  
    Czemu używasz raz i2c_start(); 2c_stop(); a innym razem twistart(); twistop();?
  • #11 9450174
    maly_ZE
    Poziom 14  
    Bo ma napisane oddzielne procedury startu i stopu do obslugi eepromu i rtc...
  • #12 9450187
    dondu
    Moderator na urlopie...
    maly_ZE napisał:
    Bo ma napisane oddzielne procedury startu i stopu do obslugi eepromu i rtc...


    No i prawdopodobnie tutaj leży problem co potwierdza taki objaw:

    maly_ZE napisał:
    Pamięć i zegar oddzielnie działają poprawnie ...
    ... chciałem zapisywać pomiar temperatury wraz z godziną kiedy ten pomiar został wykonany i tu pojawia się problem. Tzn zegar zaczyna wariować i wpisuje mi jakieś bzdury.


    Wygląda na to, że posklejałeś program z 2 różnych źródeł (raz I2C a raz TWI w nazwach funkcji). To często kończy się właśnie tak.

    Gdzieś jest prawdopodobnie jakiś konflikt. Aby temu zaradzić powinieneś:
    - albo załączyć cały program,
    - albo załączyć wszystko co dotyczy komunikacji TWI(I2C) i obsługi eeprom i RTC
  • #13 9450221
    maly_ZE
    Poziom 14  
    Załaczam więc kody poszczególnych podprogramow:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #15 9450245
    maly_ZE
    Poziom 14  
    Prosze bardzo, zmenne oraz main. Zakomentowane linie sluza do odczytu temperatury z ds1820, wyswietlania jej na LCD czy tez zapiswanie do eepromu.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Nie przerwania nie maja zadnego zwiazku z eepromem i rtc.
    Dziekuje za zaiteresowanie:)
  • #16 9450261
    dondu
    Moderator na urlopie...
    Sporo tego. Jeszcze pytanie jak mam rozumieć , że działały OK gdy osobno ich używałeś.
    To znaczy, że np eeprom był niepodłączony, a RTC tak i odwrotnie,
    czy raczej przypadek , gdy oba były podłączone, ale program komunikował się tylko z jednym z nich?

    A następnym razem nie obrażaj się tylko czytaj dokładnie link, który podsyłam :)
    Ja nie mam tendencji do pokazywania swojej wyższości nad innymi, bo sam nie uważam się za eksperta i na wielu tematach się nie znam.
  • #17 9450277
    maly_ZE
    Poziom 14  
    Nie obrażam się:, i naprawdę jestem wdzięczny za zainteresowanie i pomoc:)

    Tak jak pisałem wcześniej. RTC działa bez problemów- wyświetlam sobie czas na lcd,
    zapis na eepromie po I2c tez działa, w kodzie jest nawet kawałek do zapisu temperatury z czujnika ds1820 eeprom z wykorzystaniem szyny I2C.

    Problem pojawił sie gdy chciałem zapisać czas w podobny sposob jak temperature czyli dzielac na godzine minuty i sekundy zapisywane w oddzielnych rejestrach. Wtedy I2C używana jest przez rtc jak i eeprom i pewnie w tym jest problem.
    Poczatkowo w ogole zapomnialem ze trzeba wystopowac i2c i pozniej ja wystartowac, ale nawet dotanie tego nic nie polepszylo:|
  • #18 9450283
    dondu
    Moderator na urlopie...
    Na razie to zaledwie chęć pomocy - zobaczymy czy moja wiedza wystarczy :)
    Zrobię herbatkę i zagłębię się w Twój kod.
    Wysłałem Ci PW.
    Ale jeszcze jedno pytanie? Ten RTC (nie znam) wymaga danych w postaci BCD czy nie?
  • #19 9450300
    maly_ZE
    Poziom 14  
    dondu napisał:
    Ten RTC (nie znam) wymaga danych w postaci BCD czy nie?


    Nie rozumiem do końca co masz na myśli. Jeśli chodzi o to czy należy podać mu początkowe ustawiania czasu i daty w BCD to nie, można to zrobic normalnie dziesietnie.
  • Pomocny post
    #20 9450303
    dondu
    Moderator na urlopie...
    Sorry pisałem w 2 tematach na raz i się pomyliłem :)

    Dodano po 29 [minuty]:

    nie widzę definicji funkcji: i2c_wait()



    Dodano po 10 [minuty]:

    Strasznie masz to napisane pod kątem analizy kodu.
    Znalezienie tego błędu może zająć wiele czasu.

    Ja na twoim miejscy zacząłbym od wybrania do obsługi I2C tylko tych funkcji zaczynających się od twi....() i przerobił kod pod tym kątem.

    Ujednolicenie znacznie uprości Twój kod, a jeżeli problem nie zniknie, to przynajmniej będzie łatwiej go analizować.


    A przy okazji możesz podglądnąć funkcje i2c w projektcie z tym układem RTC, który podałem tutaj:
    http://mikrokontrolery.blogspot.com/2011/04/zegary-stopery-rtc.html
  • #21 9450363
    krru
    Poziom 33  
    Czy dobrze widzę? Funkcję i2c_xxx działają na 'ręcznym sterowaniu pinami' poprzez GPIO a twi_xxx korzystają ze sprzętowego kontrolera? Nieco hardkorowe rozwiązanie. Nie mówię, że tak się nie da, ale w sumie daje to jedynie podwojenie kodu.
    Podejrzewam problem podczas przełaczania pinów pomiędzy sterowanie sprzętowym a GPIO.
  • #22 9452363
    maly_ZE
    Poziom 14  
    Zrobilem to w taki sposob:
    dane o czasie pomiaru i sam pomiar zapisuje w tablicy, która pozniej kopiuje do eeproma;)
    Może nie najbardziej elegancki sposob ale dziala, jak bede mial wiecej czasu to pomysle nad ujednoliceniem kodu:)
    tak czy siak dziekuje za zaiteresowanie i pomoc:)
    Pozdrawiam
REKLAMA