Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Bascom][C]Atmega oraz radiowe moduły RFM01, RFM02, RFM12

ja_dzik 11 Apr 2013 20:27 236765 707
Altium Designer Computer Controls
  • #601
    nanoTECHNO
    Level 14  
    Ta zmienna "flag" jest po to żeby odbiornik był jednorazowo ustawiony w tryb oczekiwania na dane do momentu ich odebrania. Spróbuj wyłączać poszczególne podprogramy żeby sprawdzić co Ci blokuje.
  • Altium Designer Computer Controls
  • #602
    maximus22_kr
    Level 18  
    Ale jedynym program, który mogę wyłączyć jest Oblicz. I nic to nie daje. Zadeklarowałem nawet wszystkie podprogramy, dołożyłem blokowanie i odblokowanie przerwań przy inicjalizacji RFM12 ( gdzieś taki "dodatek" wypatrzyłem ).

    Nadajnik ładnie nadaje i w nocy aktualizuje z DCF77.

    Ech, już nie mam pomysłów. nSel i nIRQ mam podciągnięte przez rezystor 10K do VCC, przerwanie ustawione jako Falling. Przerwanie działa jak trzeba - sprawdzałem diodą LED przez rezystor - jest krótki błysk w momencie odbioru danych.

    Dołączam schemat
    [Bascom][C]Atmega oraz radiowe moduły RFM01, RFM02, RFM12

    Co do samego przerwania. Do tej pory zawsze używałem w przerwaniu:
    Code: basic4gl
    Log in, to see the code


    Gdzieś w programie głównym
    Code: basic4gl
    Log in, to see the code

    i nigdy nie miałem problemu z blokowaniem, zarówno przy RC5 jak i odczycie z expandera PCF8574
  • #603
    maximus22_kr
    Level 18  
    Jak podłączam diodę LED przez rezystor do VCC i:
    - katodą do INT2 to miga w momencie przyjścia danych do RFM12
    - katodą do nSEL to świeci cały czas ( czyli RFM12 cały czas aktywny ), gaśnie tylko na moment, gdy przychodzą dane do RFM12

    czy tak ma być ? czy aktywny cały czas RFM12 nie będzie blokował ?
  • #604
    nanoTECHNO
    Level 14  
    Przepraszam że nie odpisuje ale mam sporo pracy. Przyjrzałem się programowi widzę że za dużo rzeczy robisz w przerwaniu od INT2. Procedurę "Oblicz" przerzuć do pętli głównej, uwarunkuj wejście do niej tym że nastąpiło przerwanie od INT2. Na koniec procedury "Oblicz" skasuj flagę od wejścia w przerwanie od INT2 i trzeba przeniesc tam zerowanie flagi "flag" z przerwania od INT2 co pozwoli ustawić RFM w tryb czuwania po wyjsciu z procedury "Oblicz".
    Masz pewien błąd - używasz :
    Reset Licznik_rfm_lcd
    a zmienna jest zdeklarowana jako integer co może dawać nieprzewidywalne efekty.
    zmień na :
    Licznik_rfm_lcd = 0
  • #605
    maximus22_kr
    Level 18  
    Ależ nie ma problemu, ja również pracuje. Dobrze, że Kolega odpisał. Codziennie "trochę męczę" odbiornik ( czasem nadajnik, choć do niego nie mam zastrzeżeń, do ideału brakuje mi tylko uruchomienia czujnika MPL115A2 pod TWI/I2C ).

    Czy jest możliwe uruchomienie dwóch modułów RFM12 na jednej płytce z jedną Atmega ? ( np jeden na 433 MHz i jeden na 868 MHz ). W sumie może być problem z inicjalizacją.
  • Altium Designer Computer Controls
  • #607
    maximus22_kr
    Level 18  
    A czy obydwa mogą być na jednym SPI i wybór następuje przez PIN nSEL, a odbiór przez osobne dla każdego wejście INT. Czy jednak musi być tak, że jeden jest na SPI sprzętowym a drugi na programowym ?
  • #608
    maximus22_kr
    Level 18  
    U mnie akurat dość szybko "zaskoczyło". Tylko mam w odbiorniku problem z blokowaniem przerwań/timerów . W nadajniku nie ma takiego problemu. timer działa, bo odlicza czas pomiędzy "wysłaniami" oraz czas wywołania czujników DS i DHT11.

    Zakładałem, że odbiornik działa tak:
    - nasłuchuje danych
    - pojawienie się danych wywołuje przerwanie INT2 ( stan niski )
    - pojawienie się danych blokuje przerwania/timery
    - pojawienie się danych wywołuje stan niski nSEL
    - odebranie danych przez Atmega i wyczyszczenie bufora
    - INT2 i nSEL w stanie wysokim, odblokowanie przerwań/timerów
    - nasłuchuje danych

    Sygnał nSEL cały czas w stanie niskim ( aktywny ) "zaburza" nieco moje założenia. Gaśnie tylko na moment w momencie odbioru danych co powoduje odblokowanie na chwilę przerwań/timerów i po chwili ponowne zablokowanie.

    Wracając do tematu - dodałem w przerwaniu zmienną Flaga_rfm i w przerwaniu ustawiam na 1. usunąłem program Oblicz i dałem jego zawartość w pętli głównej z warunkiem wystąpienia Flaga_rfm = 1.

    Niestety nic nie pomogło

    Code: basic4gl
    Log in, to see the code
  • #609
    maximus22_kr
    Level 18  
    Przy użyciu kodu wstawionego w poprzednim poście - zaraz po uruchomieniu jest stan wysoki na nSEL. Działa jak trzeba, nic się nie blokuje. Występuje aż do momentu nadejścia pierwszych danych. Wtedy stan niski na nSEL i zablokowanie układu do momentu nadejścia następnych danych ( wtedy nSEL na chwilę stan wysoki ).

    Jest to więc kwestia ustawienia stanu wysokiego przez Atmege ( skoro Rf_nsel = Output ). Myślałem, że to może usterka RFM12, ale zaraz po starcie działa przez chwilę dobrze. Zresztą testowałem na trzech sztukach RFM12 i jest tak samo.
  • #610
    white88
    Level 12  
    Witam,
    mam skromne pytanie ponieważ robię transmisję używając RF12B na ARM cortex M3 muszę sobie przerabiać trochę wasze ustawienia z AVR i mam pytanie.Przy komunikacji SPI podczas wysyłania komendy write_cmd(0xXXXXXX) jaką wartość zwraca funkcja?Czy to jest odpowiedź RF'a z wartością rejestru czy jak?
    Poprostu nie jestem pewien mojej komunikacji po SPI i chciałem sprawdzić i w zasadzie nie wiem czego się spodziewać.Puki co po przystosowaniu do ARM'a po zrobieniu :

    Code: cpp
    Log in, to see the code


    i wyświetleniu poszczególnych tablic otrzymuje 0xFFFFFFFF w każdej komórce.

    Pozdrawiam.
  • #612
    white88
    Level 12  
    twu... pomyliłem się. Dostaję 0xFFFF bo korzystam z tego 16 bitowego SPI.
    A co w takim razie oznacza odebrane 0xFF? Że RF12 zapisał rejestry poprawnie ?Niestety całość komunikacji mogę sprawdzić dopiero w przyszłym tyg bo nie mam 2 modułu.
    Moja procedura SPI jest identyczna jak opisywane w tym temacie z tą różnicą że inaczej się w ARM'ie ustawia i kasuje bity oraz inaczej zmienia stany portów to tyle.
  • #613
    2rs232
    Level 18  
    Poprawność komunikacji SPI między modułem a procesorem, możesz przetestować włączając/wyłączając w RFM12 generowanie sygnału zegarowego na linii CLK i sprawdzać oscyloskopem jej stan.
  • #614
    white88
    Level 12  
    Witam,
    jako że mam już 2 transceivery i 2 płytki a ARM sprawdzam komunikacje i niestety niepowodzenie.
    Czytałem i korzystałem z kodu STRONA

    Posiadam moduły RF12B na 868Mhz.

    Jeżeli chodzi o płytke to jest to ARM cortex M3 SAM3U-4E z zegarem 48Mhz podzielonym na 3Mhz ale mniej też sprawdzałem.

    Może ktoś zerknie i powie co może być nie tak.W odbiorniku gdy wyświetlę wartość zmiennej data otrzymuje 255 decymalnie za każdym razem od 1-16 bitu.

    *PIO_SODR_B -> Ustawia bit w stan 1.
    *PIO_CODR_B -> ustawia bit w stan 1.

    Układ elektrycznie połączony tak:[Bascom][C]Atmega oraz radiowe moduły RFM01, RFM02, RFM12

    MAKRA
    Code: cpp
    Log in, to see the code


    inicjalizacja GPIO
    Code: cpp
    Log in, to see the code

    WRITECMD
    Code: cpp
    Log in, to see the code


    RFSEND
    Code: cpp
    Log in, to see the code


    RESET FIFO
    Code: cpp
    Log in, to see the code

    NADAJNIK
    Code: cpp
    Log in, to see the code

    ODBIORNIK
    Code: cpp
    Log in, to see the code

    odbieranie
    Code: cpp
    Log in, to see the code

    MAIN w zależnosci nadajnik/odbiorink zmieniam inicjalizacje
    Code: cpp
    Log in, to see the code

    while dla NADAJNIKA
    Code: cpp
    Log in, to see the code


    WHILE ODBIORNIK
    Code: cpp
    Log in, to see the code



    Pozdrawiam i dzięki za cenne informacje.
  • #615
    andrzej800809
    Level 9  
    Witam
    A czy moduł RMF73 można wykorzystać do transmisji audio (mono). Czy lepiej zastosować komplet (TX-AUDIO-2.4 + RX-AUDIO-2.4) ?
  • #616
    BIGJack
    Level 16  
    Mam pytanie odnośnie wyświetlania wyniku na wyświetlaczach led temperatury z czujnika DS18b20 odebranej z RMF12. Ramkę ładuję do bufora i wyświetlam na lcd;
    Code: c
    Log in, to see the code

    Następnie chcę wysłać te dane do wyświtalacza który ma wejście TWI w ten sposób
    Code: c
    Log in, to see the code

    Code: c
    Log in, to see the code

    Problem polega na tym że nie bardzo wiem jak mam wyświetlić dane ascii
  • #618
    BIGJack
    Level 16  
    Nie za bardzo wiem jak użyć itoa w moim przypadku hmm...
  • #619
    adammruk
    Level 16  
    Domyślam się że do wyświetlacza musisz wysłać kolejne znaki - funkcja itoa zamienia wartość liczbową na łańcuch znaków.
  • #620
    BIGJack
    Level 16  
    Code: c
    Log in, to see the code

    Mam tablicę znaków wyświetlacza "cyferki" a zmienną "cy1" - "cy4" wskazuje odpowiedni znak z tablicy. W buforze z RFM12 mam stringi a potrzebuje int aby wyświetlić znaki z tablicy.
  • #622
    BIGJack
    Level 16  
    Tak, zanm już te wszystkie stronki na pamięć ale gdzieś robię coś nie tak bo mi to nie dział np.
    Code: c
    Log in, to see the code

    Siedze nad tym już trzeci wieczór i już wymiękam........
  • #623
    adammruk
    Level 16  
    Rzeczywiście masz dokładnie tak w kodzie? Z tym znakiem "=" ? No i co konkretnie nie działa? Nie kompiluje się? Zły znak wyświetla?
  • #624
    BIGJack
    Level 16  
    Tak dokładnie. Kompiluje się bezbłędnie ale wyświetla dziwny znak.
  • #625
    adammruk
    Level 16  
    Nie stawia się nigdy operacji w tym miejscu, szczerze to jestem zdziwiony że to w ogóle się kompiluje. Taki zapis zaciemnia program.
    Co to jest test[3]? To tablica pojedynczego znaku, liczby? Musisz objaśnić wszystkie używane zmienne, z kapelusza nikt nic nie wywróży;)
  • #626
    BIGJack
    Level 16  
    Code: c
    Log in, to see the code

    Bufor do którego odbiornik wpisuje odebranego stringa (przesyłana jest temeperatura bez przecinka) np 234

    to tablica znaków mojego wyświetlacza
    Code: c
    Log in, to see the code


    Jak bezpośrednio wpiszę cyfrę, tu np 1 to wyświetla właściwie.
    Code: c
    Log in, to see the code
  • #627
    adammruk
    Level 16  
    Rozumiem że przy temperaturze 23,4 C tablica test wygląda tak:
    Indeks: 0 1 2 3 4
    Liczba: 0 0 2 3 4

    Teraz robisz:
    temp_dzies = atoi(test[2]);
    temp_jed = atoi(test[3]);
    temp_dziesietne = atoi(test[4]);

    I w tych zmiennych masz teraz każdą liczbę w postaci int.
  • #628
    BIGJack
    Level 16  
    Zrobiłem tak jak napisałeś, następnie przekazałem do cy1 - cy4
    Code: c
    Log in, to see the code

    no i wyswietlaczu led mam zera. Na LCD wyświetla prawidłowo;
    Code: c
    Log in, to see the code

    Wymiękam już powoli. Pewnie popełniam banalny błąd, tylko jaki.

    Dodano po 4 [godziny] 57 [minuty]:

    Problem rozwiązany, konwersja wygląda tak;
    Code: c
    Log in, to see the code
  • #629
    maximus22_kr
    Level 18  
    Witam
    Chciałem zapytać, czy jest sposób, aby odczytać siłę sygnału w odbiorniku ?
    Aby w momencie odbioru odczytać i zapisać go do zmiennej - w sumie to może to taki bajer, ale może się przydać, gdy kłopoty z zasięgiem.
  • #630
    2rs232
    Level 18  
    maximus22_kr wrote:
    Chciałem zapytać, czy jest sposób, aby odczytać siłę sygnału w odbiorniku ?

    Możesz wykorzystać RSSI i sprawdzać w rejestrze statusu czy sygnał jest powyżej progu który wybrałeś.