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.

[Atmega32][C] - dodatkowe bity przed ramką danych

bojar10 26 Lis 2013 12:49 1455 12
  • #1 26 Lis 2013 12:49
    bojar10
    Poziom 6  

    Witam,
    od kilku dni próbuje wysłać dane za pomocą UART na moim Atmega32. Szukałem podpowiedzi w internecie, jednak bez skutku. Skonfigurowałem prędkość transmisji, ramka danych ustawiona na 8bit, 2 bity stopu, bez parzystosci. Jednak przed danymi musze wysłać 25bitów LO i 3 bity HI.

    [Atmega32][C] - dodatkowe bity przed ramką danych

    Mógłby ktoś podpowiedzieć jak to uzyskać? Proszę o pomoc

    0 12
  • #2 26 Lis 2013 13:03
    Steryd3
    Poziom 32  

    Troszkę to dziwnie wygląda na Twoim rysunku. Transmisja asynchroniczna którą zazwyczaj realizuje moduł UART w AVRach wygląda nieco inaczej gdyż zawiera jeszcze bit startu których na wykresie znaleźć nie mogłem. Co do generowanie jakiejś preambuły przed sekwencją ramek- zawsze możesz zrobić to programowo wystawiając na port żądane stany. Opisz trochę szerzej do czego to jest jak to ma działać -może po prostu tego na tym module w całości nie da się zrealizować.

    0
  • #3 26 Lis 2013 14:15
    bojar10
    Poziom 6  

    Steryd3 napisał:
    Troszkę to dziwnie wygląda na Twoim rysunku. Transmisja asynchroniczna którą zazwyczaj realizuje moduł UART w AVRach wygląda nieco inaczej gdyż zawiera jeszcze bit startu których na wykresie znaleźć nie mogłem. Co do generowanie jakiejś preambuły przed sekwencją ramek- zawsze możesz zrobić to programowo wystawiając na port żądane stany. Opisz trochę szerzej do czego to jest jak to ma działać -może po prostu tego na tym module w całości nie da się zrealizować.


    Tak przepraszam pominelem bit Startu, ale powiedzmy ze tam jest. Potrzebuje uzyskać taki sygnał do komunikacji poprzez protokoł DMX512. Chce za pomocą uC sterować urządzeniami, które wykorzystują ten protokół. Wymaga on przed rozpoczęcie transmisji 25bitów Break (LO) i 3bity Mark After Break (HI), następnie zostaje wysyłana dopiero standardowa ramka danych UART. Jest początkującym jeżeli chodzi o transmisje sygnałów.

    probowalem w ten sposob to zrobic:

    for(m=1;m<26;m=m+1)
    {
    USART_Transmit(0b00000000);//break
    }

    USART_Transmit(0b11111111);//mab
    USART_Transmit(0b11111111);
    USART_Transmit(0b11111111);

    jednak domyslam sie ze to nie tak powinno wygladac.

    Dodano po 57 [minuty]:

    Czy jeżeli wyśle na UDR "0x00" to UART wyśle mi ramke danych z bitem startu, polem danych (0000 0000) i dwoma bitami stopu? czy poprostu ustawi stan 0 na linii transmisyjnej?

    0
  • #4 26 Lis 2013 15:28
    Steryd3
    Poziom 32  

    bojar10 napisał:
    zy jeżeli wyśle na UDR "0x00" to UART wyśle mi ramke danych z bitem startu, polem danych (0000 0000) i dwoma bitami stopu? czy poprostu ustawi stan 0 na linii transmisyjnej?

    Niestety ( w Twoim przypadku) wyśle bit startu później dane czyli osiem zer a na końcu będą bity stopu. Trudno by było inaczej- z drugiej strony jak by miało wyglądać wysłanie po UART właśnie takich danych.
    Najlepszym rozwiązaniem będzie ustawienie odpowiednich stanów programowo. Znając prędkość transmisji wiesz ile poszczególne stany będą wynosić.
    Zastosuj licznik do odmierzania czasu- niech co interwał czasu odpowiadający odwrotności Baude Rate'u zgłasza przerwanie i za jego pomocą stwórz żądaną sekwencję. Możesz też całą transmisję zrealizować w oparciu o licznik ale sugerował bym, w odpowiednich momentach wykorzystać jednak moduł UART.
    Co do samego DMXa...poszukaj dobrze -w internecie pewnie krąży kilka programów napisanych na AVRa które go obsługują.

    0
  • #5 26 Lis 2013 21:49
    bojar10
    Poziom 6  

    Zastanawiam sie czy mozna użyć do tego celu timer. Predkosc transmisji wynosi 250kbps wiec czas jednego bitu to 4us. Ustawiajac timer na 100us wysle stan niski (break) przy wylaczonym TXEN , nastepnie 12us (MAB) HI, a potem ustawic ten pin mikrokontrolera jako wyjscie TX i puscic ramke po UART. Mysle w dobrą strone?

    0
  • #7 27 Lis 2013 10:11
    bojar10
    Poziom 6  

    przespalem sie z problemem i wymyslilem, że można też zmienić prędkość transmisji na początku na 83kbps (250kbps/3) wysłać jedną ramke (0x00) przy ustawionych 7 bitach danych i jednym bicie stopu. UART wysle wtedy ramke, w której kazdy bit bedzie trwal 3 bity z punktu widzenia protokołu DMX. Da nam to 24 bity LO (jest dopuszczalne w DMX) i 3 bity HI. Nastepnie zmiana prędkości na 250kbps i przesył już właściwych wartości. :-D

    0
  • #9 28 Lis 2013 12:38
    bojar10
    Poziom 6  

    Steryd3 napisał:
    Ogólna koncepcja fajna-może się udać. Daj znać jak Ci to wyszło.
    Najlepszy do tego typu zabaw jest oscyloskop-nie wiem czy dysponujesz. Jeżeli nie warto by było pożyczyć- całość pójdzie Ci o wiele sprawniej.


    Udalo mi sie uzyskac dostep do oscyloskopu, okazalo sie ze jest bledna predkosc transmisji, jednak szybko to ustawiłem. Pierwszą prędkość ustawiłem na 83kb/s wysłałem ramke danych (0x00), nastepnie prędkością 250kb/s kolejno odpowiednie wartości dla wszystkich kanałów i na końcu musiałem wyłączyć uart i wymusić stan wysoki na 50ms. W tej konfiguracji urządzenie działa :-D co mnie bardzo cieszy, jednak zauważyłem dziwne zachowanie uC, a mianowicie podczas gdy gdziekolwiek w pamieci umieszcze kod, który odpowiada za wartości wysyłanych pakietów, to urządzenie DMX nie reaguje już na sygnał. Mam nadzieje ze jakos sobie z tym poradze, chyba ze macie jakies wskazowki czemu tak sie dzieje.
    Pozdrawiam

    0
  • #10 28 Lis 2013 13:46
    Steryd3
    Poziom 32  

    bojar10 napisał:
    a mianowicie podczas gdy gdziekolwiek w pamieci umieszcze kod, który odpowiada za wartości wysyłanych pakietów, to urządzenie DMX nie reaguje już na sygnał. Mam nadzieje ze jakos sobie z tym poradze, chyba ze macie jakies wskazowki czemu tak sie dzieje.

    Trochę nie rozumiem- gdzie ty umieszczasz ten kod? W czym ty piszesz- w assemblerze??:)

    0
  • #11 28 Lis 2013 13:55
    bojar10
    Poziom 6  

    Steryd3 napisał:
    bojar10 napisał:
    a mianowicie podczas gdy gdziekolwiek w pamieci umieszcze kod, który odpowiada za wartości wysyłanych pakietów, to urządzenie DMX nie reaguje już na sygnał. Mam nadzieje ze jakos sobie z tym poradze, chyba ze macie jakies wskazowki czemu tak sie dzieje.

    Trochę nie rozumiem- gdzie ty umieszczasz ten kod? W czym ty piszesz- w assemblerze??:)


    Chodzi mi o program :)
    W tym momencie działa:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    jednak gdy chce tylko zmienic wartość któregos z kanału, urządzenie wyłącza sie i gaśnie. Nie moge sobie z tym poradzić.

    0
  • #12 28 Lis 2013 18:34
    Steryd3
    Poziom 32  

    Po tym fragmencie kodu wiele wywnioskować nie można. Rozumiem, że gdy zmienisz zawartości zmiennych ch1..ch5 to wtedy program się wysypuje. To co przedstawiłeś nie zawiera jakiegoś widocznego na pierwszy rzut oka błędu. Bardziej wskazane było by umieszczenie całości lub chociaż większej części która dała by jakiś spójny obraz.
    Używasz jakichś przerwać które mogły by zmienić relacje czasowe w tym fragmencie? Jak wygląda transmisja po zmienie wartości(wtedy gdy program nie działa=urządzenie się wyłącza) obserwowana na oscyloskopie lub na jakimś terminalu na PC?? Na terminalu powinieneś uzyskać te dane bo dodatkowe opóźnienia nic tu nie zmieniają.

    0
  • #13 28 Lis 2013 22:07
    bojar10
    Poziom 6  

    Udało mi sie to naprawic. Zastosowałem pętle, która po wysłaniu każdego pakietu danych dodawała wartość do ch1 (channel), ch2 itd. W ten sposob nie zaburzałem pracy UARTa i wartość poszczególnych danych moge zmieniać w każdej chwili. Dziekuje bardzo za pomoc, jeśli ktoś ma podobny problem to chętnie pomoge. Pozdrawiam

    0