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

ATmega644PA - Szum na pinie PWM przy odtwarzaniu dźwięku w projekcie konsoli VGA

mr_fafaldo 08 Paź 2016 20:58 969 10
  • #1 15981956
    mr_fafaldo
    Poziom 9  
    Cześć wszystkim!

    Projektuję właśnie prostą konsolę do gier wykorzystującą monitor VGA i opartą na ATmedze644PA. Tak tak, wiem że generowanie sygnału VGA to zadanie dla układów typu FPGA, ale odrobina szaleństwa jeszcze nikomu nie zaszkodziła :)

    Tak więc, ATmega644 służy do generowania sygnału VGA. Klatki są przechowywane w pamięci RAM (układ AS6C1008). Jest ona sekwencyjnie odczytywana w pojawiającym się regularnie przerwaniu na Timerze. Aby wycisnąć tak wiele pikseli jak mogę mikrokontroler taktowany jest zegarem 25.175MHz (standard dla VGA). Wszystko działa świetnie, zdecydowałem się więc dodać trochę bajerów, m.in. odtwarzanie dźwięku. I tu pojawił się problem.

    Do odtwarzania dźwięku wykorzystuję PWM z Timer'a 2, który dostrajam do odpowiedniej, słyszalnej częstotliwości. Wyjście z PWM ustawione jest na OC2B, warto dodać że pin ten nie jest wykorzystywany do żadnej innej funkcji a jego wartości PORTD, PIND i DDRD nie są w żadnym miejscu zmieniane. Ze względu na złożoność przerwania wideo, jego rozmiar jest bardzo duży (w assemblerze ok. 1200 instrukcji). Wszystko powinno być jednak dobrze dobrane i żadna instrukcja nie jest bez sensu.

    Przechodząc do samego problemu:
    - jeśli wyświetlam tylko wideo, wszystko zachowuje się poprawnie
    - jeśli odtwarzam tylko dźwięk przy wyłączonym przerwaniu wideo (np/ zakomentuję SEI; jest inicjowany poza przerwaniem, w przerwaniu jest tylko ewentualnie zmieniany) brzmi on czysto
    - jeśli natomiast odblokuję przerwanie (np. odkomentuję SEI), to słychać wyraźny szum

    Żeby zilustrować problem przygotowałem krótkie nagranie, można wyraźnie rozpoznać który dźwięk jest pożądanym C, a który zniekształcony. Przygotowałem też schematy w Eagle (nic skomplikowanego) i fragmenty kodu.

    Potrzebuję waszej pomocy w stwierdzeniu co jest przyczyną problemu. Nie wydaje mi się żeby był to problem hardware'owy, jeśli po zablokowaniu przerwania (zmiana software'u) dźwięk przestaje być zakłócony. Czy może być to:
    - rzeczywiście problem hardware'u (wszystko jest robione na płytce stykowej)
    - problem zbyt długiego przerwania (jak gdzieś ktoś mi zasugerował)
    - problem z tym, że okoliczne piny są w tym przerwaniu często zmieniane (służą np. do generowania adresu pamięci SRAM, więc jeden z portów jest inkrementowany co drugą instrukcję w assemblerze) i to powoduje wygenerowanie zakłóceń na pinie buzzera.

    Kod źródłowy gdzie nastawiam Timer:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Tak jak wspomniałem, różnica występuje po zakomentowaniu/odkomentowaniu instrukcji SEI.

    Przykład dźwiękowy (pierwszy sygnał zaszumiony, drugi poprawny):
    sound.wav Download (339.11 kB)

    Schemat:
    ATmega644PA - Szum na pinie PWM przy odtwarzaniu dźwięku w projekcie konsoli VGAschemm.png Download (62.32 kB)

    Będę wdzięczny za pomoc! Oczywiście jeśli potrzeba czegoś więcej (treści przerwania, które pominąłem ze względu na długość) to wszystko dodam. Ratujcie :)
  • #2 15982052
    tmf
    VIP Zasłużony dla elektroda
    Czy szum pojawia się przy generowaniu video i przy braku zmian w szerokości PWM? Czy próbujesz odtworzyć dźwięk i wtedy pojawia się szum? Jeśli to drugie to najpewniej problemem jest zbyt długie przerwanie, w efekcie kolejne próbki są ładowane w nierównych odstępach, co słyszysz jako szum.
  • #3 15982418
    mr_fafaldo
    Poziom 9  
    Dzięki za odpowiedź!
    Szum pojawia się przy włączeniu przerwania. Kod odpowiedzialny za zmianę próbek nie jest jednak uruchamiany (jedyna inicjalizacja Timer'a następuje w przykładzie powyżej, częstotliwość nie jest później zmianiana). Jest to oczywiście bezsensowne, ale na potrzeby badania źródła problemu wystarczy do jego zreprodukowania. Czyli odpowiedź pierwsza :)
  • #4 15982655
    tmf
    VIP Zasłużony dla elektroda
    No to obstawiałbym za przesłuchy i zakłócenia przedostające się z innych linii sygnałowych lub zasilania. Czyli inne prowadzenie ścieżek i lepsze filtrowanie - btw, na twoim schemacie jest spora ubogość kondensatorów.
  • #5 15982675
    mr_fafaldo
    Poziom 9  
    Tak też właśnie myślałem. Tylko niestety moja wiedza dotycząca elektroniki jest typowo 'cyfrowa' lub 'software'owa', mógłbyś podpowiedzieć mi gdzie przydałoby się jeszcze coś odfiltrować? W szczególności czy mogę po prostu zastosować jakiś filtr przed samym buzzerem? (Niestety nie mam dostępu do oscyloskopu więc ciężko mi stwierdzić jakie komponenty sygnału są niepożądane... ;/)
  • #6 15982900
    Konto nie istnieje
    Poziom 1  
  • #7 15982946
    Konto nie istnieje
    Konto nie istnieje  
  • #8 15983259
    mr_fafaldo
    Poziom 9  
    Jest to schemat utworzony na potrzeby zadania pytania do Was, nie mam więc jeszcze projektu płytki.

    Rozumiem, że powinienem dorzucić więcej 100n na pinach zasilających wszystkich scalaków? Czy jakoś na pinach pozostałych portów? Niestety nie posiadam ferrytów, mogę się w nie zaopatrzyć jeśli miałbym pewność że to pomoże, ale najpierw chciałbym sprawdzić inne rozwiązania :).

    Czy uważacie ogólnie, że ten układ powinien działać tylko coś jest gdzieś nie tak, czy przesadzam i staram się wycisnąć z ATmegi niemożliwe rzeczy? Rozważam przerzucenie obsługi dźwięku na osobną małą ATtinę, którą mam pod ręką, ale wolałbym tego uniknąć.

    Generalnie zapomniałem dodać że płytka zasilana jest z regulatora napięcia serii 7805, z podłączonymi kondensatorami wg. noty producenta.
  • #9 15983281
    Konto nie istnieje
    Poziom 1  
  • #10 15983304
    mr_fafaldo
    Poziom 9  
    Trochę tylko nie rozumiem (aczkolwiek to pewnie moja niewiedza) czemu brak tych kondensatorów miałby zaszkodzić działaniu PWM'a. Skoro działa on w porządku przy wyłączonym przerwaniu, szumi jedynie gdy wideo jest generowane.

    Zrobiłem też błąd na schemacie, żeby go nie komplikować to oba piny zasilające ATmegi podłączyłem przez jeden 100n, natomiast ponieważ w rzeczywistości są one umiejscowione po dwóch stronach układu, oba mają kondensatory. Mój błąd.
  • #11 15983373
    Konto nie istnieje
    Poziom 1  
REKLAMA