logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega88][C] Odbiornik sygnału DMX, sterowanie PWM

matzog 18 Cze 2012 20:50 2593 13
REKLAMA
  • #1 11015406
    matzog
    Poziom 10  
    Wiatm!
    Chciałbym poprosić o pomoc w znalezieniu problemu. Prosty układ, sygnał DMX odbierany jest przez układ ST485 i podawany na wejście RX procesora ATmega88, który powinien wysterować odpowiedni kanał PWM(układ powinien reagować na zmiany w pierwszych trzech kanałach DMX). Program przerwania testowałem za pomocą ręcznego zapalania/gaszenia diod led podłączonych do wyjść pwm na poszczególnych etapach przerwania, co działało prawidłowo. Niestety układ nie reaguje na dane odbierane z magistrali - diody cały czas świecą nieznacznie migając (nie jednostajnym światłem).
    Chciałbym poprosić o radę, co może być przyczyną nieprawidłowego odbczytywania danych. Wykożystuję kwarc 20 Mhz, pozostałe nóżki (oprócz zasilania) układu ST485 zwarte do masy.
    Z góry dziękuję za pomoc.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 11015448
    LordBlick
    VIP Zasłużony dla elektroda
    1. Test sprzętu. Odłącz RS485, i zrób echo w µC do terminala pokazujące co odbiera. Możesz zamiennie podpiąć drugi RS485 ustawiony na nadawanie (w sumie to już będzie RS-422).
    2. Zauważone potencjalne problemy programistyczne. Powinieneś także podjąć wstępne załażenie, że transmisja nie jest idealna - odbiór do bufora w przerwaniu i dopiero po pewnym czasie analiza w pętli głównej (przydałoby się zaangażować timer).
  • REKLAMA
  • #3 11015598
    matzog
    Poziom 10  
    Dzięki za odpowiedź.
    Podejrzewam, że układ powinien odbierać dane poprawnie. Testowałem to dodając w przerwaniu przepisywanie OCR0A = data; w momencie wykrycia kanału zerowego (data również powinna wynosić zero) i dioda gaśnie.
    Testowałem również przepisywanie w przerwaniu daty do zmiennej, i wyświetlanie jej w pętli głównej programu - skutek taki sam, jak teraz...
  • REKLAMA
  • #5 11015699
    matzog
    Poziom 10  
    Dodatkowo, testowałem układ z innym procesorem (z działającym programem, napisanym w Bascomeie, procesor ATmega 8) i wszystko działa bez zarzutu.

    Dodano po 3 [minuty]:

    Ustawienia Baud Rate z noty katalogowej dla kwarcu 20 MHz i trancmisji 250kbit/sec.
  • #6 11019042
    matzog
    Poziom 10  
    Witam, kolejna mała uwaga.
    Testując układ zauważyłem, że wyjmując i wkładając kabelek do pinu RX procesora (przerywając przerwanie) diody zatrzymyją się z różną jasnością, tzn. nie jest prawidłowo odbierany jeden kanał, lub licznik nie przestaje liczyc... Nie wiem, czy na pewno dobrze rozpoznaję sygnał BREAK, chociaż w większości programów w internecie (właściwie wszystkich) robi się to w ten sposób, na fladze FE0. Licznik też powinien się prawidłowo inkrementować. Czy w takim razie ktoś dostrzega problem?
    Myślę, że ustawienie Baud Rate powinno być prawidłowa, dla inney kwarców (16 MHz i 8 MHz), przy ustawieniach z tabeli układ dla 250 kbit/sec układ zachowuje się tak samo.
  • #8 11019589
    matzog
    Poziom 10  
    Rozwiązanie z buforem, a własciwie najprostsza wersja z liczeniem "i" do 255 i wpisaniu danej do pwm nie skutkuje. Świeci co prawda jednolicie, ale dalej wyciągając kabelek z RX można złapać różne stany. A z jakimiś większymi opóźnieniami wolałbym nie robić, żeby szybko zmieniał stan.
  • #10 11019849
    matzog
    Poziom 10  
    Znaczy mam TxD podpięte do Vcc, na RxD odbieram sygnał. Wszystko powinno być ok, bo przerwania działają. Chyba, że źle cie zrozumiałem.
    W takiej konfiguracji przerwania diody już nie zmieniają stany, po kolei się zapalają, nie migają, ale wygląda jakby odbierana data cały czas była równa 255.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Może mam coś źle z inicializacją USARTA, lub PWM... Sam już nie wiem o co chodzi, bo obsługa powinna bezproblemowo śmigać, a tu już kilka dni sie męcze.
  • #11 11019924
    LordBlick
    VIP Zasłużony dla elektroda
    matzog napisał:
    Chyba, że źle cie zrozumiałem.
    Raczej tak. W 2-gim wpisie w tym temacie pisałem o rozdzieleniu zadań pomiędzy odbiór danych do bufora, a ich analizą i podjęciem stosownych akcji w pętli głównej.
  • #12 11020139
    matzog
    Poziom 10  
    Próbowałem, tak jak pisałem, liczyć "i" do 255 i potem wyświetlić, z dodatkowymii ustawieniami: wyłączeniem przerwań dla i = 1 i włączenie + wyświetlanie dla i = 255. Znacznie zwolniło miganie (stało się już normalnie dobrze widoczne),ale kanały ciągle skaczą dość losowo. podejrzewam, że średnia też nie miała by tu zastosowania (to są zmiany w zakresie od 0 - 255).
  • REKLAMA
  • #14 11037953
    matzog
    Poziom 10  
    Witam!

    Jeśli kogoś to jeszcze interesuje, program już działa bez problemów. Błędem okazała się niwłaściwa inicializacja (niewłaściwe+niepotrzebne ustawianie bitów na 0). Program wyrabia się bez problemu z wyświetlaniem w przerwaniu przy kwarcu 8MHz, bufor jest niepotrzebny. Pozdrawiam i dziękuję za pomoc!
REKLAMA