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][Bascom] - Odtwarzacz *.wav z panelem dotykowym.

werewolf15 22 Wrz 2012 22:31 4482 34
  • #1 22 Wrz 2012 22:31
    werewolf15
    Poziom 14  

    Mam od dawna przetestowany i działający program do odtwarzania plików *.wav.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Ostatnio kupiłem panel dotykowy z tej strony i działa jak należy:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod



    Chciałem więc połączyć te dwa elementy w jedno aby uzyskać sterowanie odtwarzaczem za pomocą panelu dotykowego(narazie samo przemienianie kolejnych utworów do przodu i do tyłu o jeden) w taki sposób:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Niestety układ nie dzaiła tak jak powinien.W głośniku słychać tylko ciche trzaski.Próbowałem umieścić fragmęty obsłógi panelu dotykowego w różnych miejscach w programie do odtwarzania ale efekt był taki że albo nie grało wcale albo w spowolnionym tępie(pewnnie opuźniał odczyt adc).
    Wszystkie programy zamieszczone w tym poście testuję na płytce uniwersalnej.

    Proszę o pomoc jak moę połączyć te dwa powyższe programy aby uzyskać odtwarzacz sterowany przez panel dotykowy.

    0 29
  • #2 23 Wrz 2012 00:21
    Robo24
    Poziom 10  

    Witam
    Pomiar ADC trwa około 400us ale masz w podprogramie obsługi wyświetlacza dwie instrukcje waitms 20. Podciągnij zasilanie panelu do plusa (przez rezystor) na stałe i poprzez komparatory sprawdzaj moment dotknięcia panelu. wyjście z komparatorów poprzez bramkę AND podaj na dowolny pin a najlepiej niech wyzwala ona przerwanie w którym odczytasz dokładne współrzędne.

    0
  • #3 23 Wrz 2012 01:33
    werewolf15
    Poziom 14  

    Z panela mam tylko 4 kabelki które bezpośrednio podpinam pod 4 adc w atmedze i niewiem który z nich pełni rolę zasilającego.Tak dokładnie to niewiem co to są komparatory ale w helpie bascoma znalazłem kilka informacji.Jednak pisze tam o powiązaniu komparatora z timerem1, a on w moim przypadku w całości zarezerwowany jest dla odtwarzacza.Czy to niebędzie przeszkadzać w pracy jeśli go użyje do komparatora?

    0
  • #4 23 Wrz 2012 02:24
    Robo24
    Poziom 10  

    Witam.
    Nieco się pospieszyłem z poprzednią wypowiedzią. Ogólnie mikro kontroler nie powinien cały czas obliczać współrzędnych a jedynie szybko sprawdzać czy panel został dotknięty. Spróbuj podać zasilanie z dwóch pinów na jedną oś (np X ) i sprawdzaj czy na osi Y pojawi się napięcie (logiczna 1 na pinie a nie pomiar przez ADC) a jeśli tak to przejdź do właściwej procedury. W tym przypadku należy ściągnąć oś Y do masy przez rezystor o dużej wartości nie wpływający istotnie na wartość pomiaru.

    0
  • #5 23 Wrz 2012 14:53
    werewolf15
    Poziom 14  

    Spróbowałem zrobić przerwanie za pomocą timera0 jako czasomierza.Co około 100ms sprawdza stan panela.Teraz układ działała tylko na początku, tzn. program uruchamia się właściwie ,inicjuje kartę sd(z piosenkami) ,na wyświetlaczu pojawiają się odpowiednie komunikaty, zaczyna grać.
    I tu pojawia się pierwszy problem.Słychać jak piosenka jest zatrzymywana na ułamek sekundy właśnie co 100ms.W efekcie słychać takie delikatne "szarpanie" utworu.Nie brzmi to zbyt estetycznie.
    Drugi problem to przełączanie utworów.Gdy wcisnę panel w odpowiednim miejscu to na lcd prawidłowo zmienia się tytuł piosenki ale w głośniku cicho i program nieodwracalnie się wiesza.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #6 25 Wrz 2012 21:53
    Robo24
    Poziom 10  

    Witam

    Jakie wartości przyjmuje zmienna X przy odczycie nie dotkniętego panelu ? jeśli są stałe to sprawdź czy odczytujesz inną wartość i dopiero wtedy obliczaj współrzędne dotknięcia.Wartości pól "góra" i "dół" masz takie same jak pól "prawo" i "3".
    Czy procesor poprawnie odtwarza do końca plik nr 1? Co się dzieje w momencie osiągnięcia końca pliku? Kompletnie nie znam assemblera ale przyczyną może być wywołanie przerwania timera po zamknięciu pliku.
    w przerwaniu odczytu współrzędnych zamień linie

    Kod: bash
    Zaloguj się, aby zobaczyć kod

    na
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    I analogicznie dla przewijania w przód.

    Zamień ten kod:(według symulatora jest on po prostu pomijany bez względu na wartość zmiennej plik)
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    na
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    Tutaj:
    Kod: bash
    Zaloguj się, aby zobaczyć kod

    0
  • #7 29 Wrz 2012 22:19
    werewolf15
    Poziom 14  

    Robo24 przepraszam że nie odpisywałem ponieważ niemiałem za dużo czasu(robiłem instalacje c.o w domu).Zastosowałem zmiany według twoich porad ale niestety dalej program ścina się podczas zmieniania piosenek.Czy jest jakiś inny sposób żeby procek nie sprawdzał cały czas panelu?
    Sprawdziłem wartości x i y i w stanie spoczynku wahają się od 4 do 17.

    0
  • #8 30 Wrz 2012 13:50
    atom1477
    Poziom 43  

    Dodaj to:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #9 30 Wrz 2012 19:27
    werewolf15
    Poziom 14  

    Już chyba działa!
    Po wciśnięciu panela w odpowiednim miejscu zmienia się utwór, nie "siepie" piosenki jak wcześniej,ale czasem przy którejś tam próbie przełączenia piosenki zwiesza się w taki sposób że otwiera kolejne piosenki jedna po drugiej wyświetlając jej tytuł nie odtwarzając żadnej i tak w kółko.
    Może to tylko kwestia drań sytków płytki uniwersalnej na której testuję sprzęt lub coś z połączeniem.

    Program teraz wygląda tak:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dodano po 1 [godziny] 47 [minuty]:

    Jednak to wina programu.Po kilku zmianach utworu procek wiesza się i sam resetuje.
    Co może być przyczyną?

    0
  • #10 30 Wrz 2012 20:25
    atom1477
    Poziom 43  

    Może nie wyrabia się z realizacją przerwania przed nastąpieniem kolejnego przerwania.
    To może dodaj jeszcze to:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #11 30 Wrz 2012 22:06
    werewolf15
    Poziom 14  

    Teraz działa tak że jeśli przycisnę panel zbyt długo to się ścina i w kółko zmienia tytuły piosenek.Jeżeli panel dotknę szybko to zmieni utwór i odtwarza go lecz procek nie reaguje już na kolejne dotyki panelu.

    0
  • #12 30 Wrz 2012 22:25
    atom1477
    Poziom 43  

    Tak w ogóle to właśnie zauważyłem że masz błąd w podprogramie Odtwarzacz:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Chodzi o to że ta procedura ciągle wywołuje samą siebie (rekurencja).
    I przepełnia stos.
    Tam na dole trzeba po prostu wywalić:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    EDIT.
    No i drugi ogromny błąd: W przerwaniu wywołujesz podprogram z programu głównego. Czyli w ogóle nie opuszczasz przerwania (rekurencja #2 i do tego cudowana na maxa).
    Nie obrażając nikogo muszę powiedzieć że taki program jest do bani :D
    Czekają go mega przeróbki.

    Od razu podpowiem co należy zmienić.
    Ten fragment:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    należy wywalić z przerwania i umieścić w jego miejsce ustawianie jakiejś flagi.
    Np. tak:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Natomiast to co usuniesz z przerwania powinno być programie głównym w pętli odtwarzającej. Oczywiście wraz ze sprawdzaniem flagi:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Ważne jest też to że zamiast Gosub jest tam Goto.
    Nie jest to zbyt przejrzyste rozwiązanie, ale programowo poprawne i w końcu powinno Ci to zacząć działać tak jak chcesz.

    0
  • #13 01 Paź 2012 20:12
    werewolf15
    Poziom 14  

    Cytat:
    Chodzi o to że ta procedura ciągle wywołuje samą siebie (rekurencja)

    I właśnie o to mi chodziło żeby od nowa się zaczęła otwierając kolejno inne utwory.

    Program troszkę zmieniłem(przerwanie i podprogram odtwarzacz) i wygląda tak:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Teraz program działa prawie idealnie tylko że panel trzeba przyciskać bardzo szybko i idealnie w wyznaczone w programie miejsce, bo inaczej zwiesi się.

    0
  • #14 04 Paź 2012 18:34
    atom1477
    Poziom 43  

    werewolf15 napisał:
    Cytat:
    Chodzi o to że ta procedura ciągle wywołuje samą siebie (rekurencja)

    I właśnie o to mi chodziło żeby od nowa się zaczęła otwierając kolejno inne utwory.

    Nie wydaje mi się :D
    Wiesz jak w ogóle działa rekurencja?

    Teraz Twój program działa tak, że jak podczas odtwarzania dźwięku 1 przerwiesz to i zaczniesz odtwarzać dźwięk 2, a potem przerwiesz i zaczniesz odtwarzać 3, to potem przywracane będzie odtwarzanie przerwanych dźwięków 1 i 2.
    Tzn. jak zakończy się odtwarzanie dźwięku 3 to program wróci do 2 w miejscu gdzie przerwałeś jego odtwarzanie. A jak i 2 się zakończy to wróci do 1. Też tam gdzie przerwałeś odtwarzanie.
    Na pewno tak to miało działać?

    0
  • #15 06 Paź 2012 08:38
    werewolf15
    Poziom 14  

    To znaczy że muszę wyzerować wszystkie zmienne do odtwarzania i wtedy będą zapełniane nowymi danymi nowej piosenki?
    A najgorsze jest to, że ten program działał właśnie w takiej postaci bezproblemowo bez dotyku a jedynie sterowany był dwoma przyciskami :)

    0
  • #16 06 Paź 2012 12:17
    atom1477
    Poziom 43  

    werewolf15 napisał:
    To znaczy że muszę wyzerować wszystkie zmienne do odtwarzania i wtedy będą zapełniane nowymi danymi nowej piosenki?

    Nie, to nie ma nic do rzeczy.
    Chodzi o tą rekurencję.

    werewolf15 napisał:

    A najgorsze jest to, że ten program działał właśnie w takiej postaci bezproblemowo bez dotyku a jedynie sterowany był dwoma przyciskami :)

    Śmiem twierdzić ze wtedy działał tylko przez przypadek.

    0
  • #17 06 Paź 2012 22:36
    werewolf15
    Poziom 14  

    Z mieniłem program żeby podprogram nie wywoływał sam siebie:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Teraz wygląda to tak:
    -zmiana 1 na 2 piosenkę zmienia się idealnie
    -przy zmianie 2 na 3 ta trzecia przez swoje pierwsze 2 sek buczy i dalej odtwarza się prawidłowo
    -następne zmieniają się jedna po drugiej bez odtwarzania aż dojdą do którejś z kolei i zacznie ją odtwarzać

    Zauważyłem jednak że zmieniając utwory w przynajmniej 30sek odstępach czasu program działa idealnie, podobnie jest gdy piosenka kończąc się rozpoczyna nową bez problemów.Dlaczego więc muszę odczekać te 30sek i wtedy zmieniać piosenkę by procek nie świrował?

    0
  • #18 06 Paź 2012 23:14
    atom1477
    Poziom 43  

    Zapomniałeś jeszcze o tym:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #19 06 Paź 2012 23:43
    werewolf15
    Poziom 14  

    Niestety wpisanie tego nic nie zmieniło w działaniu programu.
    Może ktoś ma jeszcze jakiś pomysł co można zmienić albo dopisać ?

    0
  • #20 07 Paź 2012 10:11
    atom1477
    Poziom 43  

    Ciężko powiedzieć co tam jest nie tak.
    Spróbuj tego:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #21 07 Paź 2012 11:11
    werewolf15
    Poziom 14  

    Wielkie dzięki atom1477!
    Teraz działa idealnie!
    Niewiem tylko dlaczego program wyświetla tytuły piosenek 5 i 12 lecz ich nie odtwarza tylko je omija.Dzieje się tak każdorazowo przy zmianie piosenki ręcznie(panel) i automatycznie po zakończeniu poprzedniej.
    Reszta odtwarza się idealnie.

    0
  • #22 07 Paź 2012 13:01
    atom1477
    Poziom 43  

    Może coś z nazwami plików jest źle (polskie znaki?). Spróbuj skasować wszystkie pliki i jeszcze raz wrzucić na kartę.
    A co do kodu to głównie poprawiłem uruchamianie odtwarzania. Bo miałeś najpierw Enable Timer1 a potem Wait 1 i dopiero uruchomienie odczytu z karty. A co za tym idzie program przez ponad 1 sekundę odtwarzał śmieci. To pewnie był powód tego 2-sekundowego burczenia o którym mówiłeś. 1 sekunda to Wait 1 a druga to czas jaki program spędzał w przerwaniach (to na oko też mogła być 1 sekunda).
    Zmieniłem żeby najpierw było Wait 1 a dopiero potem Enable Timer1 i od razu odczyt z karty.

    0
  • #23 07 Paź 2012 13:29
    werewolf15
    Poziom 14  

    Pewnie faktycznie coś z nazwą albo z kartą.
    Mam takie pytanie, czy macie jakąś propozycję jak by tu zrobić zatrzymanie odtwarzanego utworu (stop) i wstrzymania (pause)?
    Chciałbym również dopisać fragment w którym procek będzie odtwarzał wszystkie pliki *.wav z karty nie podając mu konkretnych tytułów(co jest obecnie robione).
    Ale do tego pewnie jakieś skomplikowane algorytmy potrzebne będą?

    0
  • #24 07 Paź 2012 13:55
    atom1477
    Poziom 43  

    Pauzę można zrobić za pomocą Disable Timer1/Enable Timer1.
    Zatrzymanie Timera1 spowoduje również zatrzymanie odczytu z karty a więc nie trzeba dodatkowych kombinacji.
    Można to zrobić w przerwaniu.
    Np.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Stop czyli domyślam się zatrzymanie bez możliwości wznowienia to za pomocą jakiejś zmiennej którą ustawisz w przerwaniu i będziesz ją sprawdzał w programie głównym.

    0
  • #25 07 Paź 2012 14:15
    werewolf15
    Poziom 14  

    No to funkcja stop już opanowana:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Gdy panel jest dotknięty w odpowiednim miejscu odtwarzanie zatrzymuje się i przechodzi do podprogramu stopp gdzie czeka na odpowiednią instrukcję o rozpoczęciu odtwarzania, z możliwością zmiany utworu.Program działa jak należy.Teraz proszę o podpowiedź jak zrobić "pause".

    0
  • #26 07 Paź 2012 14:20
    atom1477
    Poziom 43  

    No przecież nawet Ci dałem gotowy kod w poprzednim poście.

    0
  • #27 07 Paź 2012 14:52
    werewolf15
    Poziom 14  

    Twój kod działa jak stop czyli zatrzymuje piosenkę a potem odtwarza ją od początku.Mi zależy żeby się zatrzymała i od tego samego momentu odtwarzała.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #29 07 Paź 2012 17:04
    werewolf15
    Poziom 14  

    Troszkę go przerobiłem ale w każdym razie pełni rolę włączania i wyłączania timer1 i zatrzymuje piosenkę jak funkcja stop.
    Tak sobie myślę że może na razie odpuszczę sobie tą pauzę.
    Najważniejsze teraz dla mnie jest to czy da się odtwarzać pliki z karty bez weryfikacji ich nazw w programie np. ładuje na kartę piosenki o różnych tytułach jakie chcę i procek je odtwarza w taki sposób jak to się dzieje teraz.Czy jest to możliwe?

    0
  • #30 07 Paź 2012 19:51
    atom1477
    Poziom 43  

    No trochę bardziej niż trochę :D
    Bo przerzuciłem prawie wszystko do przerwania.
    A co do odtwarzania nieznanych piosenek to jest to jak najbardziej możliwe.
    Wystarczy że będziesz wyszukiwał pliki na karcie.
    Na pewno jest jakaś funkcja do tego.

    0