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

Atmega8 BASCOM Manchester - Komunikacja bezprzewodowa 433MHz Manchester Kłopot

25 Wrz 2013 21:55 4530 10
  • Poziom 17  
    Witam,

    W żadnym temacie na elektrodzie z komunikacją bezprzewodowa nikt nigdy nie udostępnia kodów (nie wiem dlaczego). Męczę się od kilku dni z przesłaniem ramki. Mam moduły 433 MHz, te najprostsze, ale na razie próbuje to zrobić po kablu. Dane są kodowane w manchester, funkcja kodująca działa poprawnie, ale nie mogę się poprawnie zsynchronizować. Prosiłbym o zerknięcie w kody i ew. sugestie. Połączenia są wykonane w następujący sposób:
    Pin TXD Atmegi nadajnika połączony przewodem do pinu RXD Atmegi odbiornika. Zasilanie to samo, masa ta sama. Częstotliwość zegara odbiornika to 12MHz, a nadajnika to 8MHz.

    Jak uda mi się to poprawnie uruchomić po kablu to wepnę moduły i zobaczymy, niżej kody:

    Nadajnik:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Odbiornik:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Wysyłam dane poleceniem printbin, a odbieram inputbin. Są to Zmienne typu WORD. Sekwencja synchronizująca jest stała, jest to wartość 0 zakodowana w Menchester, dziesiętnie to 21845. Nie dekoduje jej tylko sprawdzam od razu w odbiorniku. Dopiero wartości TEMP1 i 2 są poddawane dekodowaniu. Cały czas otrzymuje wartości 3 i 0. Co jakiś czas 130 i 0. Czasami w ogóle nic się na wyświetlaczu nie pokazuje. Już nie mam pojęcia co jest nie tak. Proszę o ew. sugestie.
  • Moderator na urlopie...
    Hmm, a po co wysyłasz dane jako manchester?
    I skąd taki dziwny pomysł na realizację tego poprzez UART?
    Bo to chyba tak nie działa...
    Jeśli masz te najprostsze moduły na 433MHz, jednokierunkowe, to po prostu nadajnik podepnij pod TxD jednego uC, odbiornik pod RxD drugiego i wysyłaj dane jakbyś miał procesory połączone kablem. Tylko Baud ustaw na jakiś niski, typu 200-300.
    Ostatnio robiłem prostą radiolinię jako zdalna sygnalizacja do alarmu i właśnie tak to wykonałem. Kontrolę poprawności danych wykonywałem już na poziomie przesyłanej ramki danych (CRC i te sprawy)
  • Poziom 17  
    Cytat:
    Jeśli masz te najprostsze moduły na 433MHz, jednokierunkowe, to po prostu nadajnik podepnij pod TxD jednego uC, odbiornik pod RxD drugiego i wysyłaj dane jakbyś miał procesory połączone kablem. Tylko Baud ustaw na jakiś niski, typu 200-300.


    Tak, tylko że wtedy są straszne zakłócenia i bardzo mała przepływność. Po to stosuje się kodowanie żeby zwiększyć efektywność transmisji. Po drugie teoretycznie ono nic nie zmienia, to tylko inna (lepsza) reprezentacja danych. Mimo to odbiornik nie do końca poprawnie odbiera dane, i nie wiem dlaczego...
  • Moderator na urlopie...
    No to stosuj kodowanie w takim razie - bo teraz wysyłając dane poleceniem Printbin i tak nadawane są one jako ramka transmisji szeregowej (UART) i występują tu takie same problemy jak w rozwiązaniu przedstawionym przeze mnie.

    Jeśli chcesz robić manchester to musisz ręcznie sterować pinem i ręcznie próbkować pin w odbiorniku - a nie kombinować z UART bo jak napisałem wyżej i tak nic z całego trudu na zakodowanie danych, skoro najsłabsze ogniwo pozostaje niezmienne.

    Dalej 9600 które podajesz jako Baud leży imho na granicy możliwości tych układów transmisyjnych.

    Po wtóre, skoro przy normalnym UART masz zakłócenia to czy zakodujesz manchester, czy co innego to i tak zakłócenia będą niszczyć transmisję - może problem trzebna zbadać od drugiej strony, czyli sprawdzić same układy nadawczo-odbiorcze, czy nie są one zbyt daleko od siebie, czy mają prawidłowo dobrane i usytuowane względem siebie anteny, ...

    Pamiętaj też, że zasięg podawany przez producenta to zasięg w warunkach idealnych i w terenie otwartym - w rzeczywistych warunkach wszechobecnych zakłóceń zasięg ten jest znacznie gorszy.

    Poza tym powiedz jakieś to duże ilości danych chcesz przesyłać i czy nie warto rozważyć innych układów (np. z serii RFM)
  • Poziom 17  
    Cytat:
    bo teraz wysyłając dane poleceniem Printbin i tak nadawane są one jako ramka transmisji szeregowej (UART) i występują tu takie same problemy jak w rozwiązaniu przedstawionym przeze mnie.


    Myślałem, że jak dane będą zakodowane wewnątrz ramki to będzie lepsza jakość łącza.

    Cytat:
    Jeśli chcesz robić manchester to musisz ręcznie sterować pinem i ręcznie próbkować pin w odbiorniku - a nie kombinować z UART bo jak napisałem wyżej i tak nic z całego trudu na zakodowanie danych, skoro najsłabsze ogniwo pozostaje niezmienne.


    Możesz mi jakoś pomóc w tym aby wystawiać poszczególne bity ze zmiennej na pin w określonych odstępach czasu? Bo nie bardzo wiem jak to ugryźć.

    Na razie w ogóle nie używam tych układów. Odbiornik i nadajnik jest połączony ze sobą przewodem, czyli problem jest w sofcie.

    Skasowałem poprzednie poprawki bo chyba ostatecznie poprawiłem kod nadajnika. Teraz nadajnik cały czas wysyła sekwencje synchronizującą &B0101010101...., a w momencie naciśnięcia przycisku S1 wysyła najpierw 3 ostatnie bity zmiennej Naglowek które są jedynkami 111, a następnie Zmienne Dane1 i Dane2 czyli łącznie 4 bajty. Pomyślałem że tak będzie łatwiej rozpoznać w odbiorniku kiedy przyjdzie paczka danych bo sekwencja 111 w kodzie manchester się nie powtórzy. Timer jest na razie tak skonfigurowany żebym mógł widzieć miganie diody, docelowo ma być troche szybciej. Niżej kod:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Nadal proszę o pomoc w rozwiązaniu problemu z odbiorem, bo nie mam pomysłu jak zsynchronizować odbiornik i jak rozpoznać naglowek. Będę wdzięczny za wszelkie sugestie.
  • Moderator na urlopie...
    Poczytaj conieco o RC5 - to Ci powinno nieco rozjaśnić sprawę i pomóc w budowie ramki.
    Tylko do nadawania nie próbuj wykorzystać funkcji bascomowej, bo ona generuje nośną.
  • Poziom 17  
    Cytat:
    Poczytaj conieco o RC5


    RC5 mam ogarnięte, Tam występują dwa bity startu "11", toggle bit, adres i komenda. Problem polega na tym, że adres zapisany jest na 5 bitach, a komenda na 6 bitach. Na żadnej z nich nie zapiszę nawet bajta danych, musiałbym łączyć. Po drugie nie mogę powiększyć tej ramki, musiałbym złożyć ją z kilku. Po drugie to jest również Manchester, a ja już mam dane zakodowane w manchester. Mój problem polega na tym, że nie za bardzo wiem jak dosynchronizować odbiornik.

    Myślałem o tym, żeby w pierwszej kolejności ustawić przerwanie zewnętrzne na zbocze narastające i zmierzyć Timerem czas pomiędzy dwoma takimi zboczami (bo do odbiornika cały czas będzie docierać sekwencja synchro 010101..) wtedy podzielę ten czas na dwa i będę miał czas trwania impulsu, ustawie tak timer i w przerwaniu od przepełnienia będe sprawdzał jakiej wartości bit doszedł. I będe sprawdzał czy po zerze jest jedynka i czy po jedynce jest zero. Jeśli tak to będzie zestawiona synchronizacja, a jak przyjdą trzy jedynki to zapisze kolejnych kilkadziesiąt bajtów do zmiennych i będę miał otrzymane dane.

    Chyba, żeby nie nadawać w ogóle synchronizacji tylko od razu nagłówek z danymi ale wtedy będzie dużo śmieci pomiędzy ramkami w odbiorniku.
  • Moderator na urlopie...
    Ja bym tu przyjął nieco inną filozofię - mianowicie nie odbierał robiąc polling, ale mierzył szerokość impulsu.
    Jeśli jest ona zbliżona do czasu trwania całego bitu to właśnie zaczynamy odbierać inny niż poprzednio bit, jeśli zaś jest zbliżona do czasu trwania połowy bitu to jest to stale ten sam bit.
    No i do tego zrobić rozpoznawanie preambuły i gotowe.

    Ogólnie o mojej metodzie poczytaj sobie tu - co prawda odniesienie nieco inne, ale o sam algorytm chodzi:
    http://mikrokontrolery.blogspot.com/2011/03/rfid-avr-emulator-odbiornik-em4095-125kHz.html
  • Poziom 17  
    Rozumiem Twoją ideę, ale nie za bardzo wiem jak ją zaimplementować w Bascomie.

    Na razie mam coś takiego:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Generalnie najpierw jest wykonywany pomiar timerem1 z wykorzystaniem przerwania zewnętrznego na zbocze narastające. Mając czas pomiędzy zboczami dzielę go na dwa aby uzyskać czas trwania pojedynczego impulsu. Do drugiej zmiennej Czas2 zapisuje 1/10 czasu trwania impulsu, potem przekonfiguruje Timer1 tak aby generował przerwanie co czas trwania impulsu i sprawdzał stan pinu odbiorczego. Z tym, że pierwsze przerwanie jest wykonywane po 1/10 czasu trwania, dzięki temu nie sprawdzam stanu na zboczu co mogłoby prowadzić do przekłamań. Podłączyłem dwie diody, jedna do nadajnika, a druga do odbiornika. Migają ładnie razem, z tym, że ta od odbiornika jest troszeczkę opóźniona, to wynika z tej 1/10 czasu. Działą to mniej więcej tak:
    Atmega8 BASCOM Manchester - Komunikacja bezprzewodowa 433MHz Manchester Kłopot

    Nie wiem czy coś takiego się sprawdzi przy większej prędkości pracy i transmisji radiowej, czy tam nie będzie zbyt dużych rozbieżności w czasie trwania?

    Co do Twojego pomysłu spróbuje coś jutro, ale chciałbym, żebyś rozważył mój pomysł, i napisał czy ma to prawo działać
  • Moderator na urlopie...
    Ogólnie Twoja metoda ma szansę działać - czasem tak się właśnie realizuje ten odbiór - analizować kodu w Bascom nie mam teraz czasu niestety.
  • Poziom 17  
    Napisałem program nadajnika i odbiornika, dla długich czasów trwania impulsu, np 1s wszystko jest w porządku. Odbiornik się synchronizuje, odbiera dane i dekoduje. Natomiast gdy impuls trwa 10ms już jest problem. Albo wyświetla się out of synchro, czyli brak synchronizacji, a jak już ma odebrać dane to błędnie je odbiera i wyświetla wartości dziwne i nieprawdziwe. Przecież 10ms przy taktowaniu zegarem 12 MHz to kupa czasu. Może gdzieś jest błąd w kodzie? Prosiłbym o jakieś sugestie.

    Nadajnik:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Odbiornik:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod