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

ATmega 32A - Problem z akcelerometrem BMA220 (problem z I2C?)

twojstary11 01 Cze 2015 15:37 729 2
  • #1 01 Cze 2015 15:37
    twojstary11
    Poziom 11  

    Witam
    Zakupiłem sobie moduł z akcelerometrm Bosch BMA220.

    Korzystając z tego kodu:
    http://www.dfrobot.com/wiki/index.php/Triple_Axis_Accelerometer_BMA220(Tiny)_SKU:SEN0168

    urządzenie działa na platformie arduino. Jako że programuję w C, chcę używać tego w swoim kodzie.

    Bazując na kodzie dla Arduino, stworzyłem swoje funkcje do obsługi akcelerometru:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod


    Niestety program wisi już na etapie init_BMA220(), a tak nie powinno być. Oczywiście nie dostaję żadnych danych.

    Prostym kodem:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zdebugowałem sobie, że ACK nie dociera do uC..

    Akcelerometr zasilany 3.3V, ale sygnał leci z i do atmegi (zasilanej 5V) prosto bez konwertera (wg. schematu wyżej). Na arduino działa, a na atmedze 32A nie :/

    Korzystam z tej biblioteki do obsługi I2C:
    https://github.com/devthrash/I2C-master-lib

    Z modułem RTC DS1307 wszystko działa.

    Czy jest ktoś w stanie pomóc ? W internecie nie ma żadnego info dot. tego modułu i AVR. Mi już ręce opadają.. :(

    Dzięki i pozdrawiam

    0 2
  • Pomocny post
    #2 01 Cze 2015 23:32
    olelek
    Poziom 24  

    Pierwsza sprawa, to czy dałeś rezystory Pull-up na liniach SDA i SCL?
    Możesz zastosować półśrodek i włączyć pull-up na pinach:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Generalnie powinieneś użyć konwertera.

    1
  • #3 01 Cze 2015 23:56
    twojstary11
    Poziom 11  

    Pull-upy są w BMA220. Teoretycznie konwerter powinien być, i jest już zamówiony, ale to nie może być powód. Dziś uruchomiłem sobie jeszcze ten sam kod na płytce Arduino (zaprogramowałem układ w języku C przez złącze ISP na płytce), gdzie w języku arduino na tej płytce ten akcelerometr działa.

    Próbowałem z adresami, bo trzeba go przesunąć w lewo i dopisać 0 bądź 1 w zależności od operacji i dalej nic. Slave nie wysyła ACK.. Stoję w miejscu dalej..

    Dzięki za pomoc :)
    Liczę na dalsze sugestie.
    Pzdr

    EDIT:
    PORTC |= _BV(PC0)|_BV(PC1); pomogło ! Dziwne bo inny układ działał.
    Pzdr

    0