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.

nRF24L01 - Weryfikacja programu

aplov 08 Lip 2016 19:32 1752 15
  • #1 08 Lip 2016 19:32
    aplov
    Poziom 6  

    Witam,
    chciałbym was prosić o zweryfikowanie programu bo nie wiem dlaczego podczas próby pobrania rejestru z modułu uC zawieszą się w pętli.

    nRF24L01.c

    Kod: c
    Zaloguj się, aby zobaczyć kod


    nRF24L01.h
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jest jeszcze Memory-map ale raczej nie ma sensu abym to tu umieszczał.

    Mój problem polega na tym, że podczas wywołania funkcji SPI_GetREg, uC zatrzymuje się w niej.
    Głowie się nad tym dobre kilka godzin.., połączenia na płytce stykowej sprawdziłem kilka razy.

    0 15
  • #2 08 Lip 2016 19:56
    excray
    Poziom 39  

    W SPI_init po co ten OR przy zapisie do SPCR?! Dbasz o to aby nie usunąć ewentualnych śmieci z rejestru?! Poza tym, nie widzę nic co mogłoby blokować funkcję SPI_GetReg() więc problem leży w innej części kodu. Kompilator wyrzucił Ci jakieś ostrzeżenia? Jak wygląda main?

    0
  • #3 08 Lip 2016 20:00
    aplov
    Poziom 6  

    To jest praktycznie cały kod. Kompilator nie pokazuje żadnych błędów.
    Zauważyłem, że uC pozostaje w pętli while( !(SPSR & (1<<SPIF)) ); wtedy gdy funkcji SPI_WriteRead użyje więcej niż 1 raz.

    @EDIT
    TUTAJ załączam kod do memory-map, ale tam są same definicje, a cały kod już jest zamieszczony wyżej.

    0
  • #4 08 Lip 2016 20:01
    excray
    Poziom 39  

    Jak to cały kod?!? A gdzie jest main? Aha, ustaw pin SS czyli najprawdopodobniej PB2 jako wyjście. Inaczej SPI w trybie Master Ci nie będzie działać.

    0
  • #5 08 Lip 2016 20:04
    aplov
    Poziom 6  

    Tutaj:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    ale błędów czy wskazówek tutaj nie znajdziemy :D

    0
  • Pomocny post
    #6 08 Lip 2016 20:05
    excray
    Poziom 39  

    Ustaw pin SS czyli najprawdopodobniej PB2 jako wyjście. Inaczej SPI w trybie Master Ci nie będzie działać.

    0
  • #7 08 Lip 2016 20:09
    aplov
    Poziom 6  

    Zadziało :O, Nigdy bym nie wpadł na to, że ten pin musi być tak ustawiony mimo tego, że nie jest do niczego podłączony. Bardzo Ci dziękuje za pomoc :)

    0
  • Pomocny post
    #8 08 Lip 2016 20:11
    excray
    Poziom 39  

    To stary numer AVRa który co jakiś czas wpędza kogoś w maliny. Wykorzystaj ten fakt i podłącz pod niego CSN układu zamiast pod PB0.

    0
  • #9 08 Lip 2016 20:16
    aplov
    Poziom 6  

    A ja tu główkowałem, sprawdzałem wszystko co mogłem, a wystarczyło taką rzecz zrobić...No nieźle :D

    Moderowany przez tmf:

    Temat odblokowałem na prośbę autora.

    0
  • #10 09 Lip 2016 17:06
    aplov
    Poziom 6  

    Mam jeszcze kilka pytań dotyczących tego modułu:

    -Aby odebrać dane, które przechwyci odbiornik konieczne jest użycie przerwań? Czy można je odczytać tak samo jak dane z rejestrów ?

    -O co chodzi z adresem RF i jego szerokością ?

    -Aby 2 układy mogły się komunikować muszą działać na tych samych częstotliwościach, kanałach i na takich samych adresach tych kanałów?

    -Reset rejestru STATUS trzeba resetować za każdym razem gdy wysyłamy lub odbieramy dane?

    -Retransmisja danych odbywa się automatycznie między układami, czy należy to zrobić programowo ?

    0
  • Pomocny post
    #11 09 Lip 2016 18:38
    excray
    Poziom 39  

    aplov napisał:
    -Aby odebrać dane, które przechwyci odbiornik konieczne jest użycie przerwań? Czy można je odczytać tak samo jak dane z rejestrów ?

    Nie jest potrzebne. Wystarczy sprawdzić rejestr Status a w nim bit RX_DR. Jeśli jest ustawiony to znaczy, że odbiornik coś odebrał i to coś czeka na nas w FIFO.
    aplov napisał:
    -O co chodzi z adresem RF i jego szerokością ?

    ??? Rozwiń temat. Pewnie jakiś wynalazek biblioteki arduino? Napisz o jaki rejestr Ci chodzi. nRF ma rejestr RF-CH który określa częstotliwość pracy lub jak kto woli numer kanału.
    aplov napisał:
    Aby 2 układy mogły się komunikować muszą działać na tych samych częstotliwościach, kanałach i na takich samych adresach tych kanałów?

    Ta sama częstotliwość = ten sam kanał z zasady. Plus jeszcze ten sam adres "rury" musi być.
    aplov napisał:
    Reset rejestru STATUS trzeba resetować za każdym razem gdy wysyłamy lub odbieramy dane?

    Wypadałoby.
    aplov napisał:
    Retransmisja danych odbywa się automatycznie między układami, czy należy to zrobić programowo ?

    Jaka retransmisja? Chodzi Ci o automatyczne potwierdzenie? Jeśli je aktywujesz i odpowiednio skonfigurujesz to odbywa się to automatycznie. Odbiornik po odebraniu pakietu sam odsyła potwierdzenie. Wszystko dzieje się, za naszymi plecami.

    0
  • #12 09 Lip 2016 18:47
    aplov
    Poziom 6  

    Czytając ten poradnik zauważyłem, że podczas inicjalizacji nRF'a autor ustawia szerokość adresu. Możliwe też, że ja sobie źle przetłumaczyłem.

    nRF24L01 - Weryfikacja programu

    Dodano po 2 [minuty]:

    excray napisał:
    Plus jeszcze ten sam adres "rury" musi być.

    Tylko co to jest ten adres? do czego on służy, skoro już mamy wybrany kanał + czestotliwość

    0
  • #13 09 Lip 2016 18:53
    excray
    Poziom 39  

    Powiedzmy, że masz sieć. jeden nadajnik i 5 odbiorników. Nadajesz na kanale wywoławczym który muszą słuchać wszystkie odbiorniki, bo nie wiadomo do którego będziesz nadawać. Ale chciałbyś aby odebrał tylko jeden wybrany. Nadajesz więc każdemu odbiornikowi inny adres i pozamiatane. Na taki pakiet odpowie tylko ten odbiornik który ma ten sam adres mimo, że teoretycznie wszystkie go słyszą bo kanał jest cały czas ten sam. Dodatkowo zabezpiecza Ci to transmisję. jak może zauważyłeś nie da się wyłączyć weryfikacji tego adresu. A co za tym idzie jak ktoś chciałby podsłuchać Twoją transmisję to nie wystarczy, że się dostroi do kanału. Musi jeszcze wiedzieć jaki adres ustawić. A trochę możliwości to jednak jest przy 5-ciu bajtach adresu. Każdy odbiornik może słuchać jednocześnie do 6-ciu różnych adresów.

    aplov napisał:
    Czytając ten poradnik zauważyłem, że podczas inicjalizacji nRF'a autor ustawia szerokość adresu. Możliwe też, że ja sobie źle przetłumaczyłem.

    Mógłbyś tutaj przytoczyć ten fragment? Bo sam jestem ciekaw o co chodzi. Szerokość pasma zależy od prędkości transmisji i jest automatycznie regulowana. Więc być może autor zmieniał prędkość transmisji?

    0
  • #14 09 Lip 2016 19:38
    aplov
    Poziom 6  

    Ok, wydaje mi się, że mniej więcej wiem już o co chodzi więc próbuje nawiązać komunikacje atmega8(TX) -> atmega32(RX)
    Program nadajnika:
    MAIN:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    nRF24L01.C:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Program odbiornika:
    MAIN:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    w pliku nRF24L01.C różni się tym, że zamiast 0x1E wysyłam 0x1F
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Oba ukady komunikują się z modłułem, ale moduły nie komunikują sie między sobą chyba, że źle "wyciągam" dane z modułu odbiorczego.

    Dodano po 1 [minuty]:

    excray napisał:

    Mógłbyś tutaj przytoczyć ten fragment? Bo sam jestem ciekaw o co chodzi. Szerokość pasma zależy od prędkości transmisji i jest automatycznie regulowana. Więc być może autor zmieniał prędkość transmisji?


    Wysłałem zdjęcie kodu i w nim jest komentarz autora, żadnej innej wzmianki na ten temat nie poruszył.

    Dodano po 28 [minuty]:

    Po sprawdzeniu rejestru STATUS zauważyłem, że bit RX_DR nie zmienia się czyli jest prawdopodobnie problem z nadajnikiem

    0
  • #15 09 Lip 2016 20:04
    excray
    Poziom 39  

    aplov napisał:
    Wysłałem zdjęcie kodu i w nim jest komentarz autora, żadnej innej wzmianki na ten temat nie poruszył.

    Ok, to jest długość adresu. Napisałem, że adres to 5 bajtów. Ale może być krótszy. Może mieć długość 3 lub 4 bajty.

    Dodano po 4 [minuty]:

    aplov napisał:
    Po sprawdzeniu rejestru STATUS zauważyłem, że bit RX_DR nie zmienia się czyli jest prawdopodobnie problem z nadajnikiem

    Niekoniecznie. Bit jest ustawiany jak zostanie spełniony cały szereg warunków:
    - musi być ta sama prędkość transmisji i kanał
    - musi być ten adres
    - musi się zgadzać suma CRC o ile jest włączone sprawdzanie CRC

    0
  • #16 09 Lip 2016 20:07
    aplov
    Poziom 6  

    excray napisał:

    Ok, to jest długość adresu. Napisałem, że adres to 5 bajtów. Ale może być krótszy. Może mieć długość 3 lub 4 bajty.


    Tak to już wiem, ale nadal nie mam wystarczająco wiedzy aby coś wysłać.
    Widziałem w innych kodach, że ustawiają bit PWR_UP w rejestrze CONFIG, ja zrobiłem tak samo ale niestety to nie pomogło. nadal rejestr STATUS przyjmuje wartość E

    Dodano po 1 [minuty]:

    excray napisał:
    Niekoniecznie. Bit jest ustawiany jak zostanie spełniony cały szereg warunków:
    - musi być ta sama prędkość transmisji i kanał
    - musi być ten adres
    - musi się zgadzać suma CRC o ile jest włączone sprawdzanie CRC


    funkcja inicjalizacji jest praktycznie taka sama wiec adres, kanał i prędkość transmisji raczej są takie same

    0