ATNEL tech-forum https://forum.atnel.pl/ |
|
NRF24L01 - problem z czytaniem rejestru z modułu https://forum.atnel.pl/topic21977.html |
Strona 1 z 1 |
Autor: | Irrehaare [ 18 lut 2019, o 14:00 ] |
Tytuł: | NRF24L01 - problem z czytaniem rejestru z modułu |
Hej, Po otrzymaniu porad na forum w wątku "Komunikacja radiowa dwóch ATmeg przez FS100A" dobrałem się do wspomnianych modułów nRF. W oparciu o poradnik, który pojawia się na pierwszym miejscu w google po wpisaniu "nrf24l01 avr tutorial" zacząłem próbować coś z nimi zrobić. Linków nie zamieszczę, bo mi nie wolno. Próbowałem tylko, z tego co rozumiem, odczytać rejestr STATUS z modułu. Pracuję na ATmega328P. Korzystam z tego kodu: język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Piny są podłączone tak jak w poradniku: CE do PB1 CSN do PB2 SPI Clock do PB5 MOSI i MISO do odpowiednio PB3 i PB4 IRQ do PD2 Dzięki diodom potrafiłem wskazać gdzie program się zawiesza (wstawiłem komentarza w kodzie wyżej), ale nie mogę znaleźć przyczyny. Pin SS jest ustawiony jako wyjście, więc ustawić SPIF na 1 powinno tylko zakończenie transmisji. Oczywiście nRF jest grzecznie podpięty do 3.3V, co sprawdziłem dwa razy przed włożeniem go do płytki stykowej. Wiem, że Mirek zrobił fajne biblioteki i nawet kupiłem tą z SPI, jednak potrzebuję raczej wyjaśnienia niż gotowej biblioteki, którą musiałbym mozolnie badać linijka po linijce, gdy sam potrzebuję bardzo ograniczonej funkcjonalności: ja tylko chcę przesyłać po jednym bajcie kilka metrów dalej! Do tego dochodzi jeszcze szczera niechęć do poradników, tłumaczeń na YT. Jeśli ktoś może mi pomóc i wskazać co robię źle, to będę szczerze wdzięczny. |
Autor: | Szofer [ 18 lut 2019, o 15:31 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
SPIF (SPI Interrupt Flag) bit: This is a read only bit. It is set by hardware when a serial transfer is complete. SPIF is cleared by hardware when the SPI interrupt handling vector is executed, or when the SPIF bit and the SPDR register are read. |
Autor: | Irrehaare [ 18 lut 2019, o 15:39 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
Szofer napisał(a): / Wait for transmission complete while(!(SPSR & (1<<SPIF))); //tutaj kod sie zatrzymuje, tylko żółta dioda się świeci PORTB |= (1<<PB0); Literówka w kodzie? Nie powinno byc while(!(SPDR & (1<<SPIF))); ? SPIF to bit 7 rejestru SPSR, przynajmniej wg dokumentacji. Dlaczego miałoby być SPDR? Poz tym, w praktyce też nie zadziałało po takiej zmianie |
Autor: | Szofer [ 18 lut 2019, o 15:52 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
Poprawiłem się. |
Autor: | Irrehaare [ 18 lut 2019, o 16:04 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
Niestety, przeczytałem wszystko z dokumentacji ATmegi o SPIF co tam było i zacytowanie jej niestety niewiele mi pomoże. Skoro zapis w SPDR powoduje rozpoczęcie transmisji, a jej koniec ustawienie bitu SPIF, to w momencie zakończenia transmisji !(SPSR & (1<<SPIF)) powinno być równe 0 i pętla while powinna się skończyć. |
Autor: | Irrehaare [ 18 lut 2019, o 17:16 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
Po zmianach w funkcji: język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Po zrestartowaniu: Najpierw zgodnie z oczekiwaniami wszystkie trzy diody zaświecają się na krótko, potem gasną i żółta zostaje zapalona. Jedyne wyjaśnienie, to zatrzymanie się w pętli język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. Wspomniany if jest w pętli while(1), więc wykonywałby się co 200ms, więc jakbym cokolwiek czytał z tego nRF to któraś dioda by migała. Obecnie żółta, czyli PD7 świeci bez przerwania. |
Autor: | Irrehaare [ 18 lut 2019, o 18:37 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
Zastosowałem się do rady, PD7 po zainicjowaniu jest ruszane tylko wewnątrz funkcji WRByteSPI. Main teraz to: język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Efekt wciąż ten sam (program zatrzymuje się na świeceniu żółtej diody), poza tym że po restarcie żółta nie mruga razem z resztą na starcie. Program z całą pewnością zatrzymuje się na while(!(SPSR & (1<<SPIF))); - jest ono otoczone włączeniem i wyłączeniem żółtej diody i jest to jedyne miejsce, gdzie zmieniam stan tego pinu. |
Autor: | Irrehaare [ 18 lut 2019, o 20:44 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
Ok, bo się tu pogubimy. Cały kod, jeszcze raz. język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Dioda żółta (PD7) jest włączana TYLKO na czas while(!(SPSR & (1<<SPIF))). W razie poprawnego działania programu powinna się zapalać na niezauważalnie krótkie momenty czasu, przez obecność _delay_ms(200) w main. W moim rozumieniu fakt, że świeci się ona i tylko ona przez cały czas stabilnym światłem sugeruje, że program zatrzymuje się na while(!(SPSR & (1<<SPIF))) - w przeciwnym razie jej miganie nie byłoby zauważalne. To z kolei oznaczałoby, że SPIF nie jest ustawiane, z jakiegoś nieznanego mi powodu. Dioda zielona (PB0) jest potencjalnie przełączana co 200ms wewnątrz maina. Działoby się tak, gdyby program działał w sposób zamierzony. Dioda czerwona (PC3) podobnie jak zielona wyżej, ale w wypadku gdy z rejestru będzie odczytana inna wartość niż oczekiwana. |
Autor: | Wirnick [ 18 lut 2019, o 20:58 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
Takie pytanie! Includujesz stdio.h - korzystasz z consoli? |
Autor: | Irrehaare [ 18 lut 2019, o 21:06 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
Wirnick napisał(a): Takie pytanie! Includujesz stdio.h - korzystasz z consoli? Ach, to mi zostało z poprzedniego projektu, gdzie mierzyłem odległość US-015 i wrzucałem wynik na konsolę właśnie. Do wywalenia jako zbędne, dzięki. #include <avr/interrupt.h> też poszło. Niestety, kłopotów to nie rozwiązuje. |
Autor: | Irrehaare [ 18 lut 2019, o 22:28 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
Więc JarekK wysłał mi na PW link do gotowych bibliotek na forum, ale dla ATmegi32, nie 328P. Zasugerował od razu potrzebne zmiany: JarekK napisał(a): Może warto spróbować gotową bibliotekę z tego forum kolegi Nefarious19. topic11377.html Jedyny kłopot to przeportowanie z atmegi 32 na atmege 328p. ****************************************************** Jeśli nic nie pomyliłem to wystarczy: w pliku nRF24L01.c poprawić: void Initialize_INTERRUPT_For_nRF(void) { //JKA dla ATmega32: GICR |= (1<<INT2); //enable INT2 intterupt source in GICR register //JKA zmieniamy na przerwanie INT0 w atmega328p bo INT2 zwyczajnie nie maa EIMSK |= (1<<INT0); //enable INT0 intterupt source in EIMSK register //JKA dla ATmega32: MCUCSR |= (0<<ISC2); //set intterupt active on falling edge EICRA |= (1<<ISC01); //The falling edge of INT0 generates an interrupt request. } //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' // Here is external intterupt handler, if you are using interupts change the name of the vector interrupt ore live the same if you are using the same //................................................................................................................................................... ISR(INT0_vect) //JKA wazne ma byc w tym przypadku INT0 w pliku nRF24L01.h poprawić: //JKA dla Atmegi 32: #define IRQ PB2 //IRQ PIN #define IRQ PD2 //IRQ PIN JKA dla Atmega328p -> INT0 Powodzenia bo sam nie mam nRF24L01 by to sprawdzić. Co też zrobiłem. Niestety, linku do wątku z bibliotekami nie wolno mi zamieścić, jako nowemu użytkownikowi. Osobny program, który powinien wypisać rejestr STATUS na konsolę wygląda tak: język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
I na konsoli pojawia się: Przypomnę, że skoro STATUS wynosi 0x0E to spodziewałbym się na konsoli linii typu "Test it! x=155, y=14". Twórca bibliotek sugerował podłączenie zasilania nRFa przez tranzystor, jutro za dnia pewnie tego spróbuję. Byłbym też super wdzięczny, jeśli ktoś dałby radę potwierdzić, że ten program powinien działać. |
Autor: | Szofer [ 18 lut 2019, o 22:35 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
Radio nie odbiera danych z SPDR i dlatego nie zeruje bitu SPIF, Dobrze sterujesz bitem CE bo caly czas jest w low, a żeby odczytać przez radio powinjen być high wiecej jak 10us. |
Autor: | Irrehaare [ 19 lut 2019, o 01:11 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
Nie rozumiem, ja tu nic nie próbuję odczytać przez radio z innego modułu, tylko z tego który mam w danej chwili podpięty za pomocą SPI. CE jest używany przy wysyłaniu lub odbieraniu sygnałów, jak to ma się do mojej sytuacji? |
Autor: | Szofer [ 19 lut 2019, o 02:28 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
Jeśli z bufora nie odbierasz danych to jak flaga ma się kasować sprzętowo? |
Autor: | Irrehaare [ 19 lut 2019, o 08:43 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
@zubik mógłbyś wyjaśnić, jak jeszcze miałbym odpalić spi? Jest to pierwsza rzecz w kodzie po deklaracjach. |
Autor: | JarekK [ 19 lut 2019, o 09:45 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
Faktycznie, przeportowanie z atmegi32 na 328p wymaga wiekszych modyfikacji w pliku nRF24L01.h zmiana na #define IRQ PD2 to za mało |
Autor: | Irrehaare [ 19 lut 2019, o 10:49 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
@zubik Wgrałem i najpierw dioda zaczęła mrugać bez ładu i składu. Po chwili kombinowania kabelkami zauważyłem, że dioda mruga regularnie, gdy nRF nie jest podłączony. Jeśli jest, to po resecie dioda zapala się raz i tak już zostaje. W tym programie z tego co rozumiem nic go nie uruchamia, czyli może problem polega na tym, że tam też jest coś nie tak w tej kwestii? Szczerze wątpię, żeby coś było nie tak w ustawieniach projektu: zrobiłem ich dość sporo, przy ustawianiu wszystkiego szedłem grzecznie kroczek po kroczku jak Mirek mówił na blogu i przede wszystkim: jak dotąd wszystko działało, wliczając trochę bardziej skomplikowany pomiar odległości z US-015 z wyświetleniem go na konsolę na komputerze przez USART. Co ciekawe, w czasie jak pisałem to wyżej dioda zaczęła mrugać przez sekundę. Dla pewności, kod jaki wrzuciłem: język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
EDIT: Dioda mruga, gdy podpięty jest USBasp, który korzysta z SPI, nie mruga jak podpięty jest nRF lub obydwa. Czyli moduł w którymś momencie zepsułem...? |
Autor: | JarekK [ 19 lut 2019, o 11:58 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
Czy przeportowanie w pliku nRF24L01.h pinów dla SPI odpowiednio do atmega328p coś pomogło? |
Autor: | Irrehaare [ 19 lut 2019, o 19:04 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
@JarekK dopiero wieczorem będę miał czas, żeby to posprawdzać. Pamiętam o tej opcji, napiszę jak tylko spróbuję. |
Autor: | micky [ 26 lut 2019, o 18:45 ] |
Tytuł: | Re: NRF24L01 - problem z czytaniem rejestru z modułu |
Nie tylko dobry kontakt ale i długość kabli może mieć wpływ na działanie. Stykówki potrafią napsuć krwi... |
Strona 1 z 1 | Strefa czasowa: UTC + 1 |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |