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

L3G4200D - Odczyt danych z osi X przez TWI(I2C) nie odświeża się

MacGyver123 02 Mar 2014 18:28 2121 6
REKLAMA
  • #1 13362818
    MacGyver123
    Poziom 10  
    Witajcie, mam dość dziwny problem, próbuje odczytywać dane przez TWI(I2C) z żyroskopu(gotowy moduł), płytka ewaluacyjna(także w postaci gotowego modułu):

    chcąc odczytać wartość z którejś z osi np X, dostaje daną, lecz nie zostaje ona odświeżana, co oznacza, że cały czas wysyłana jest ta sama liczba(do PC przez UART);

    Sama komunikacja moim zdaniem przebiega poprawie, ponieważ wysyłając zapytanie o wartość rejestru 0x0F(Who I Am) otrzymuje poprawną wartość.
    Odczyt Poniżej program:
    Domyślam się, że mogę robić błąd w konfiguracji
    konfiguracja TWI:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Program Główny:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Za wszelką pomoc dziękuje :)
  • REKLAMA
  • #2 13362912
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 13362990
    MacGyver123
    Poziom 10  
    Nadal nie działa. Pragnę nadmienić, że pobierając temperaturę(rejestr jest 8bitowy), nadal wyświetla tylko jedną wartość.
  • REKLAMA
  • #4 13363105
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #5 13363171
    MacGyver123
    Poziom 10  
    Po prostu zrobiłem błąd w komentarzu. Rejestr temperatury ma adres 0x26, masz rację, ale to nie zmienia faktu, że nadal nie działa :( Zależy mi na tym żyroskopie, a nie na żadnych innych :P
  • #6 13363232
    Konto nie istnieje
    Poziom 1  
  • #7 13370523
    MacGyver123
    Poziom 10  
    Znalazłem źródło problemów, ale nie potrafię w żaden sposób się z nim uporać
    Rejestry TWI:
    TWBR= 200;
    TWPS=4;
    Odczyt wartości rejestrów żyroskopu, które uprzednio konfiguruje:
    KOD PROGRAMU:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Dla pewności odczytałem jeszcze inne rejestry, ale jak widać wszystko jest poprawnie

    *CTRL_REG1 = 0x15 - czyli jak jak powinno być;

    *CTRL_REG2= 0x00; - także jest OK;

    *CTRL_REG3= 0x00 -ok

    *CTRL_REG4= 0x00- tutaj popranie

    *WHO_I_AM= 0xD3; <-- i tutaj OK

    //EDIT:
    Zrobiłem odczyt wszystkich osi ze sprawdzeniem rejestru statusu(0x27):
    i tutaj widać, że powarzenie odczytu jest spowodowany brakiem gotowości odczytu danych XYZ (4bit rejestru STATUS_REGISTER)
    Może to przez źle dobraną prędkość transmisji danych ?
    
    ramka ma postać: 
    XL 
    XH 
    YL 
    YH 
    ZL 
    ZH 
    STATUS_REGISTER 
    
    219 
    251 
    24 
    252 
    6 
    246 
    255 
    
    218 
    254 
    196 
    1 
    127 
    255 
    255 
    
    218 
    254 
    196 
    1 
    127 
    255 
    0 
    
    218 
    254 
    196 
    1 
    127 
    255 
    0
    
REKLAMA