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

Napisanie biblioteki dla modułu nrf24 przy użyciu atmega328P: Odczyt wartości z rejestru

biniu_2012 30 Lis 2020 11:00 645 11
  • #1 19079238
    biniu_2012
    Poziom 6  
    Witam, od kilku dni walcze z modulem nrf24 do ktorego chce sam napisac biblioteke (uzywam atmega328P)
    Jestem na etapie odczytywania wartosci wpisanej do danego rejestru.
    Ustawianie bitow w rejestrach dziala dobrze, sprawdzam to za pomoca amperomierza (przy ustawieniu odpowiednich wartosci w rejestrze CONFIG zmienia sie odpowiednio prad zgodnie wartosciami w nocie katalogowej dla poszczegolnego trybu (od 1uA - 20mA).
    Kod do ustawiania wartosci w rejestrze wyglada tak :

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


    W miejsce reg wpisuje CONFIG, w bits np. (1<<0)|(1<<1)
    I ta funkcja dziala w 100%, rejestr sie ustawia.

    Problem jest tutaj:

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


    Nie mam pojecia co tu jest zle, probowalem juz duzo inne metody, szukalem w innych bibliotekach pomocy ale nie moge znalezc.
    Z gory dzieki za podpowiedz
  • #2 19079314
    StaryVirus_e_Wiarus
    Poziom 21  
    Cześć
    Odczyt rejestru musi zawierać zapytanie o który rejestr chodzi (pierwsze SPI...). Odpowiedzią jest zawartość, stan STATUS'u (0x07). Drugie zapytanie SPI.... daje prawidłową odpowiedź, której oczekujesz. Zaglądnij do danych technicznych nRF.
    Przykład:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #3 19079446
    biniu_2012
    Poziom 6  
    StaryVirus_e_Wiarus napisał:
    Cześć
    Odczyt rejestru musi zawierać zapytanie o który rejestr chodzi (pierwsze SPI...). Odpowiedzią jest zawartość, stan STATUS'u (0x07). Drugie zapytanie SPI.... daje prawidłową odpowiedź, której oczekujesz. Zaglądnij do danych technicznych nRF.
    Przykład:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Faktycznie, pierwszy raz sie bawie z SPI. Zmienilem kod na taki :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Niestety ciagle nie dziala, teraz zwraca mi 0x04 w ascii (z tabeli opisane jako END OF TRANSMISSION).

    Czyli juz cos tam zwraca, ale nie to co trzeba :(

    Dodano po 1 [godziny] 13 [minuty]:

    Ok, udalo mi sie rozwiazac problem. Kod wyglada w ten sposob :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Musisalem podwojnie wywolac komende do odczytu, dopiero wtedy dziala poprawnie. Nie mam pojecia dlaczego, wiec jakby ktos mogl wyjasnic bylbym wdzieczny.
  • #4 19079868
    StaryVirus_e_Wiarus
    Poziom 21  
    O tym, że musisz podwójnie wywołać komendę do odczytu pisałem właśnie wyżej.

    Dodano po 48 [sekundy]:

    To pisze w opisie technicznym modułu.
  • #5 19080947
    biniu_2012
    Poziom 6  
    No tak, to juz zrozumialem. Ale z dokumentacji zrozumialem ze za pierwszym razem wywoluje sie komende z rejestrem a za drugim obojetnie co mozna wpisac zeby tylko zeby zegar wywolal kolejne 8 taktow. Ale dobra, dziala, temat do zamkniecia
  • #6 19080983
    BlueDraco
    Specjalista - Mikrokontrolery
    Może i działa, ale parę bzdur masz w tym kodzie.
    volatile w deklaracji argumentu funkcji jest bez sensu. Nikt tego argumentu nie ma szans zmienić.
    ATmega pracuje z zegarem max. 20 MHz, czyli okres 50 ns. Co ma niby robić ten delay ze ZMIENNOPOZYCYJNYM argumentem? Wykonanie jednej instrukcji przez ATmegę zajmie więcej czasu niż ma wynosić to opóźnienie. Jeśli odebrałeś bajt po SPI, to zanim go odczytasz z rejestru minie dużo więcej czasu.

    No i zapominasz odczytać dane z SPI po wysłaniu bajtu - błąd. Zawsze czekaj na gotowość do nadawania, zapisz dane do wysłania, czekaj na odbiór, odczytuj dane, nawet jeśli ich do niczego nie potrzebujesz.
  • #7 19082594
    biniu_2012
    Poziom 6  
    BlueDraco napisał:
    Może i działa, ale parę bzdur masz w tym kodzie.
    volatile w deklaracji argumentu funkcji jest bez sensu. Nikt tego argumentu nie ma szans zmienić.
    ATmega pracuje z zegarem max. 20 MHz, czyli okres 50 ns. Co ma niby robić ten delay ze ZMIENNOPOZYCYJNYM argumentem? Wykonanie jednej instrukcji przez ATmegę zajmie więcej czasu niż ma wynosić to opóźnienie. Jeśli odebrałeś bajt po SPI, to zanim go odczytasz z rejestru minie dużo więcej czasu.

    No i zapominasz odczytać dane z SPI po wysłaniu bajtu - błąd. Zawsze czekaj na gotowość do nadawania, zapisz dane do wysłania, czekaj na odbiór, odczytuj dane, nawet jeśli ich do niczego nie potrzebujesz.


    Dzieki za podpowiedzi. Volatile wiem ze troche bez sensu uzywam tutaj. Faktycznie po odczytaniu z spi po wyslaniu bajtu znika problem z koniecznoscia podwojnego wywolania komendy.
    Pzdr
  • #8 19085892
    biniu_2012
    Poziom 6  
    Odczytywanie udalo sie rozwiazac natomiast mam inny problem. Gdy zapisuje dane do rejestru TX za pomoca komendy W_TX_PAYLOAD, transmiter nie przechodzi w tryb nadawania. Resetuje sie kompletnie do trybu power down. Gdy natomiast robie wpis do tego samego rejestru w momencie gdy jest w trybie RX, wszystko dziala normalnie i po podaniu sygnalu na CE, przechodzi w tryb odbierania. Nie mam pojecia dlaczego tak sie dzieje.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #9 19085983
    StaryVirus_e_Wiarus
    Poziom 21  
    Nie czytasz i nie analizujesz opisu technicznego modułu nRF. Co to jest SPI_memory i po co? Nadawanie tez musi być wykonane podwójnie, podobnie jak odbiór. Nie masz instrukcji manipulowania CE. Więc nic nie nadałeś. Czytaj, Czytaj, Czytaj. Analizuj. Nawet angielskiego nie musisz znać, wystarczy, że zrozumiesz rysunki w instrukcji modułu.
  • #10 19086065
    biniu_2012
    Poziom 6  
    StaryVirus_e_Wiarus napisał:
    Nie czytasz i nie analizujesz opisu technicznego modułu nRF. Co to jest SPI_memory i po co? Nadawanie tez musi być wykonane podwójnie, podobnie jak odbiór. Nie masz instrukcji manipulowania CE. Więc nic nie nadałeś. Czytaj, Czytaj, Czytaj. Analizuj. Nawet angielskiego nie musisz znać, wystarczy, że zrozumiesz rysunki w instrukcji modułu.


    Spi_memory jest to zapisanie bajtu z rejestru po jego wysłaniu. Kolega wyżej dał taka radę żeby zapisywać go po wysłaniu nawet jak nie potrzebuje go do niczego. CE manipuluje komenda SS w pętli while. Czytałem dokładnie całość, patrzyłem na rysunki i niestety nie mogę do tego dojść
  • #11 19086124
    StaryVirus_e_Wiarus
    Poziom 21  
    CE to nie to samo co SS.

    Dodano po 33 [minuty]:

    SS może zastąpić instrukcję CSN, bo widzę, że używasz sprzętowe SPI.
  • #12 19086207
    biniu_2012
    Poziom 6  
    StaryVirus_e_Wiarus napisał:
    CE to nie to samo co SS.

    Dodano po 33 [minuty]:

    SS może zastąpić instrukcję CSN, bo widzę, że używasz sprzętowe SPI.


    Tak, wiem o co ci chodzi. Jednak tutaj to nie ma znaczenia, kwestia złego nazewnictwa ale zdefiniowane wszystko jest dobrze.

Podsumowanie tematu

Użytkownik pracuje nad stworzeniem biblioteki dla modułu nRF24 przy użyciu mikrokontrolera ATmega328P, koncentrując się na odczycie wartości z rejestrów. Po początkowych problemach z odczytem, które obejmowały błędne zwracanie wartości, użytkownik zrozumiał, że konieczne jest podwójne wywołanie komendy do odczytu rejestru. W trakcie dyskusji zwrócono uwagę na błędy w kodzie, takie jak niepotrzebne użycie słowa kluczowego "volatile" oraz brak odczytu danych po wysłaniu bajtu przez SPI. Użytkownik napotkał również problem z przechodzeniem modułu w tryb nadawania po zapisaniu danych do rejestru TX, co zostało częściowo rozwiązane poprzez manipulację sygnałem CE. Wskazówki dotyczące analizy dokumentacji technicznej nRF24 były kluczowe dla rozwiązania problemów.
Podsumowanie wygenerowane przez model językowy.
REKLAMA