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

atmega8,c - i2c(TWI) jak połączyć się z urządzeniem slave

04 Gru 2014 10:06 1737 12
  • Poziom 6  
    Witam. Mój mikrokontroler (atmega8) odbiera dane z czujnika analogowego poprzez pin ADC3, a następnie przetwarza je i wysyła przez RS232 do mojego komputera. Tu wszystko działa :) Pojawia się problem gdy do układu podłączam minIMU-9 v2. Składa się on między innymi z żyroskopu z którego chcę pobrać dane. Mam problem ze znalezieniem urządzenia slave(l3gd20). Na początku włączam interfejs i2c nadając mu częstotliwość (w moim przypadku 760hz), pojawia się błąd przy starcie. Następnie wysyłam adres urządzenia (7bitów + 1bit zapisu)i tu mi wyskakuje kolejny błąd (nie może się połączyć z układem).
    Dodam, że wyskakują mi cały czas takie same dane z l3gd20 jak na załączonej fotografii. Czyli -1,-515,ciag danych, a potem same zera.
    Taktowane kwarcem 16MHz. Rezystory podciągające do SCL oraz SDA (10k).
    Jeżeli chodzi o adres l3gd20, to (z datasheet):110101+SDO(jeżeli jest podłączone do Vin to "1", a ze schematu minIMU wynika, że jest)+R/W(u mnie WRITE, więc"0") więc = 11010110
    Wiem, że I2C_Init(); oraz initL3GD20i2c(); powinno się wykonać tylko raz, a więc po za pętlo "WHILE" to ma być, ale dla testów robię to w pętli. Próbowałem po za pętlą, ale było bez zmian.
    Załączam mój cały kod(i2c) oraz schemat.
    Kod: c
    Zaloguj się, aby zobaczyć kod
    atmega8,c - i2c(TWI) jak połączyć się z urządzeniem slave
    atmega8,c - i2c(TWI) jak połączyć się z urządzeniem slave
  • Poziom 39  
    megatron1 napisał:
    ...Jak ktoś jest wstanie powiedzieć co jest ... NA PEWNO źle, to był bym wdzięczny za odpowiedź, bo cały czas stoję w miejscu.

    Na początek, sprawdź ten fragment:
    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod
  • Poziom 6  
    Nie wiem jak sprawdzić tylko ten fragment, ale spróbowałem po tym fragmencie (po podaniu częstotliwości dla magistrali i2c) wysłać sygnał start i nie poszło :(
    Na terminalu cały czas mam dwa błedy: 1.I2C_WaitForComplete 2.if (TW_STATUS != TW_START)
    czyli :

    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod
  • Poziom 28  
    Mógł by ktoś mi wytłumaczyć dlaczego "I2C_SetBusSpeed(760/100);" się kompiluje jeżeli "void I2C_SetBusSpeed()" jest bez bezparametrowe?
  • Poziom 6  
    Nawet to nic nie daje, cały czas bez zmian:

    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod
  • Poziom 28  
    Nie znam sie na mikrokontrolerach ale 760/100 == 7(niewiem co tu powinno być).

    Dodano po 2 [minuty]:

    I czy w ogóle o to chodzi.
  • Poziom 6  
    W książce Tomasza Francuza było I2C_SetBusSpeed(I2CBUSCLOCK/100); więc tak zrobiłem. Dodam, że I2C_SetBusSpeed(760); nic nie daje :(
    Może nie można używać I2C i USART na tym samym mikrokontrolerze, bo częstotliwości ze sobą się "kłócą"?
  • Pomocny post
    Poziom 39  
    megatron1 napisał:
    Nie wiem jak sprawdzić tylko ten fragment...

    Tu masz "byka".
    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod

    Po pierwsze:
    Ten fragment czeka na ustawienie flagi :idea:
    Po wtóre:
    Powinien wyglądać np. tak:
    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod
  • Moderator Mikrokontrolery Projektowanie
    megatron1 napisał:
    Może nie można używać I2C i USART na tym samym mikrokontrolerze, bo częstotliwości ze sobą się "kłócą"?

    Nie ma takiego problemu.

    Co to za urządzenie?
  • Poziom 6  
    A więc tak:
    1. Jak zamieniłem złą linijkę na tą:

    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod

    to już nie wyskakuje żaden błąd :)

    Mam jakieś wyniki z żyroskopu, ale nie wiem czy są one dobre, bo muszę się temu bliżej przyjrzeć. W ciągu kilku dni postaram się napisać czy już wszystko jest okey.
  • Poziom 6  
    Chyba źle odczytuję dane z żyroskopu, bo mam dziwne wyniki :(
    Żyroskop jest nieruchomy a cały czas mam inne wyniki, do tego dla wszystkich osi mam ten sam wynik. Załączam zdjęcie oraz kod jak odczytuję dane.

    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod

    Dodam, że adres dla OUT_X_L to 28 hex, dla OUT_X_H to 29 hex itd.
    atmega8,c - i2c(TWI) jak połączyć się z urządzeniem slave
  • Poziom 6  
    Problem jest we funkcji: "read_gyroscope()". Jak napiszę ten fragment kodu:
    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod

    , to na 10 przypadków mam 3 błędy, więc według mnie jest wszystko dobrze.
    Jak już napiszę całą funkcje:
    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod

    to mam masę błędów. Wyskakuje mi błąd przy wysłaniu sygnału START, NACK i ACK. A na dodatek w x_gyro, y_gyro oraz z_gyro są te same liczby. Wygląda to tak jak by ACK nie działało, albo coś przed nim nie działa. Dodam, że funkcja: "initL3GD20i2c();" działa bez żadnego błędu, a tam przecież wysyłam sygnał START,STOP oraz podaję adres urządzenia.
  • Poziom 6  
    Znalazłem rozwiązanie tego problemu. Problem był przy podaniu częstotliwości dla i2c/TWI :
    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod

    do tego podanie danych na odpowiednie rejestry urządzenia były złe:
    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod

    oraz w odczycie podawałem zły adres:
    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod

    Temat uważam za zamknięty :D