Cyfrowy tuner stereofoniczny cz.3

Cyfrowy tuner stereofoniczny cz.3
Pobierz PDF Download icon
Prezentowane urządzenie jest propozycją wzbogacenia naszego domowego zestawu wideo o amplituner stereofoniczny, gotowy do współpracy odbiornikiem telewizyjnym i jeszcze jednym, zewnętrznym urządzeniem audio.

Program sterujący

Aby lepiej zrozumieć zamieszczony dalej opis warto wydrukować sobie program źródłowy i czytając tekst zerkać na program. Zamieszczono tu bardzo szczegółowy opis programu sterującego przeznaczony dla osób dociekliwych i zamierzających zmodyfikować program lub dodać jakieś funkcjonalności, ponieważ w pamięci procesora jest jeszcze trochę miejsca.

Program napisano w Bascom AVR. Po skompilowaniu zajmuje 28 kB.

W pętli do loop jest sprawdzana flaga "Zezw_wysw", która jest ustawiana w podprogramie obsługi przerwania od Timera1 co 115 ms. Gdy ta flaga jest ustawiona, to w pierwszej kolejności jest sprawdzany stan przycisku "POWER" dołączonego do PINA.2 procesora. Gdy przycisk przytrzymamy przez 2,3 s, nastąpi zmiana stanu bitu "power_p", zostanie wywołana procedura zapisu stanu ważnych bitów oraz zostanie wyzerowany bit "flaga", aby nie nastąpiła zmiana źródła sygnału podczas przytrzymania przycisku "POWER". Dalej, gdy zasilanie jest włączone oraz "power_p = 1" i jednokrotnie naciśniemy przycisk "POWER", to nastąpi przełączenie źródła sygnału. Bit "flaga_kasowania" jest ustawiany, aby została wykonana instrukcja aktualizacji danych na wyświetlaczu. Następna w kolejności jest sprawdzana flaga "Odebr_kod" ustawiana w podprogramie obsługi przerwania zewnętrznego, gdzie również jest odczytywany adres i komenda RC5. Gdy instrukcja RC5 jest nadawana i adres jest równy zeru, to są odczytywane komendy przycisków pilota i podejmowane odpowiednie kroki. Dodatkowo, aby zapobiec wykonywaniu tej samej czynności w czasie trzymania przycisku, została utworzona dodatkowa zmienna "Pomoc_ pilot", która "dba", aby komendy były wykonane tylko raz. Podczas odczytu kodu z pilota przerwanie INT0 jest zablokowane, a po odczycie jest zerowana flaga "Odebr_ kod" i przerwanie zostaje odblokowane. Następnie program odczytuje aktualny czas z układu PCF8563 i jest sprawdzany czas automatycznego włączania amplitunera. Teraz jest sprawdzany bit "SLEP", flaga pracy tunera w trybie stereo i dane o stanie lampek są przesyłane do układu PCF8574 sterującego diodami LED na panelu czołowym. Dalej jest sprawdzany stan bitu "power_p" gdy jest on wyzerowany zostaje zablokowane przerwanie zewnętrzne INT1, kasowany bufor wejściowy sprzętowego układu UART, wpisanie liczby 150 do timera2 generującego sygnał PWM odpowiedzialnego za jasność podświetlenia wyświetlacza.

Zostaje zwiększana zmienna "Licznik_ off" odpowiedzialna za opóźnienie wyłączeniu urządzenia. Najpierw końcówki mocy są wyciszane, wyłączone zasilanie modułu VMUSIC2, dopiero po 10 obiegach pętli zostaje wyłączone zasilanie, moduł tunera przechodzi w stan uśpienia, dane zostają przesłane do układów sterowania diodami LED i wskaźnika siły sygnału. Ostatnią czynnością jest sprawdzanie stanu zmiennej "błędy". Jeśli ta zmienna zawiera jakiś tekst, zostaje wyświetlony kod błędu, gdy nie jest wyświetlana godzina. Gdy w tym czasie "Flaga_ cls" jest ustawiona, wyświetlacz jest kasowany, zostaje wyświetlony aktualny czas w formacie BCD, flaga zostaje skasowana, a program czeka aż znowu zostanie ustawiona i czas znowu się zaktualizuje.

Dalsza część programu jest realizowana po włączeniu urządzenia, gdy flaga "Power_p" jest ustawiona. Jako pierwszy jest zerowany licznik opóźnionego wyłączenia, wyświetlacz jest rozjaśniony na maksymalne świecenie, bit odpowiedzialny za zapalenie led zasiania i uruchamiania zasilacza zostaje ustawiony, zostaje odczytany stan bitu "Loud"(KONTUR) i podany odpowiedni stan na port procesora. Zostaje sprawdzony stan detektorów napięcia. Gdy program wykryje zanik napięcia, gdy będzie on trwał co najmniej 2,5 sekundy. Amplituner zostaje wyłączony i jest wyświetlany komunikat o błędzie. Następnie jest sprawdzany poziom na wejściu połączonym ze stykiem w wyjściu słuchawkowym. Gdy słuchawki są odłączone "Pina.0 = 0" i jest zerowany licznik opóźnionego wyciszania wzmacniaczy mocy, zwiększany licznik opóźnionego włączania wzmacniaczy słuchawkowych. Jeśli licznik nie przekracza 20, wzmacniacz słuchawkowy jest wyciszony oraz końcówki mocy są wyciszone. Po przekroczeniu 20 końcówki mocy włączają się. Zapewnia to opóźnienie włączenia końcówek mocy po włączeniu amplitunera i całkowicie niweluje stuki w głośnikach. Gdy zaś słuchawki podłączymy zerowany jest licznik opóźnienia włączania wzmacniaczy słuchawkowych, a zwiększany licznik opóźniania wyłączania wzmacniaczy. Gdy licznik jest mniejszy od 20 wzmacniacze słuchawkowe są wyciszone, końcówki mocy pozostają aktywna, gdy licznik przekroczy 20 wyciszone są końcówki, a wzmacniacze słuchawkowe są aktywne. Zapewnia to opóźnienie po dołączeniu słuchawek i niweluje drganie styków złącza słuchawkowego.

Następnie jest zwiększany "Czas_wysylania" licznik ten odpowiada za ustawienie flag odpowiedzialnych za przesyłanie danych do procesora dźwięku, modułu radia FM, wysyłane są dane konfigurujące procesor RDS-u oraz ustawiana jest flaga aktualizacji informacji na wyświetlaczu. Teraz wykonywana jest instrukcja wyboru wyjść głośnikowych gdzie są ustawiane odpowiednie bity zmiennej "Led".

Kolejna instrukcja dba o to, aby najpierw na wyświetlaczu pojawił się napis "MP3/ WMA", a po 10 obiegach pętli tekst z modułu odtwarzacza MP3. Następnie jest sprawdzana "Flaga_mp3" dba ona o kasowanie tekstu polecenia wysłanej do modułu odtwarzacza MP3. Gdy jest wykonywane polecenie "PAUSE", na wyświetlaczu jest pokazywany odpowiedni komunikat, który przestaje być wyświetlany on po wyłączeniu "PAUSE". Wtedy jest też kasowany licznik "MP3" odpowiedzialny za jednorazowe wysyłanie komend do modułu.

Jako kolejne jest wykonywane polecenie związane z tunerem, który działa tak samo, jak przy odtwarzaczu. Następnie jest sprawdzany stan "PINA.6" dołączonego do mikroprzełącznika ośki impulsatora. Gdy ośka jest wciśnięta, zostaje zwiększany licznik "Pomoc_ menu", który jest zwiększany o jeden przy każdym obiegu pętli. Gdy licznik osiągnie 5, zostaje ustawiona "flaga_kasowania" i "Menu" licznik "Auto_powrot" jest zerowany.

Dalej, gdy jest ustawiona flaga "Menu", to po kolejnych naciśnięciach ośki jest zwiększany licznik odpowiedzialny za kolejne funkcje w menu. Zostaje też ustawiona flaga kasowania wyświetlacza, aby zaktualizować tekst. Teraz, gdy przycisk jest puszczony, a program tkwi w menu, jest zwiększany licznik automatycznego powrotu z menu. Gdy program nie jest w menu, a jest wyświetlana głośność lub alarm, licznik automatycznego powrotu jest zwiększany i odlicza do 20, a nie do 50, jak w wypadku "Menu". Kolejne działanie ustala odpowiednią liczbę funkcji w menu, a instrukcje wyboru "Z_sygnal" sprawdzają stan przycisków na panelu czołowym w każdym ze źródeł sygnału. Podczas gdy "Z_sygnal" jest równe 0, 1, 4 jest blokowane przerwanie od procesora RDS zerowane zmienne związane z tunerem oraz kasowany bufor wejściowy UART. Gdy "Z_sygnal" jest równy 2 lub 3, co odpowiada za wybranie jako źródła sygnału "TUNER1" lub "TUNER2", najpierw jest sprawdzana flaga "Menu". Gdy jest ona wyzerowana, to są wykonywane instrukcje związane z wyświetlaniem komunikatów "RDS" (przy dobrym sygnale z anteny). Gdy sygnał jest słaby, wyświetlacz jest kasowany i zostaje wyświetlona częstotliwość aktualnie odbieranej stacji i nazwa programu. Działania te są wykonywane, aby uniknąć przekłamywania komunikatów przy słabym sygnale. Dalej jest sprawdzany stan flagi "Programowanie". Gdy jest ona ustawiona, są sprawdzane przyciski na panelu czołowym oraz stan zmiennych bitowych "Gora" i "Dol", ustawianych podczas korzystania z pilota. Jeśli w tym momencie program wykryje naciśnięcie któregoś przycisku na panelu lub na pilocie, to najpierw jest zerowana zmienna "Prog_1 lub 2" odpowiedzialna z numer programu. Potem jest ustawiana flaga kasująca wyświetlacz, częstotliwość jest zwiększana lub zmniejszana w zależności od naciśniętego przycisku i jest wykonywana instrukcja ograniczania maksymalnej i minimalnej częstotliwości. Dopiero teraz jest ustawiana "Flaga_tea5767" odpowiedzialna za przesłanie danych do modułu radia FM.

Teraz, gdy flaga "Programowanie" jest wyzerowana, to za pomocą wspominanych wcześniej przycisków jest możliwa zmiana programu z zapamiętaną w pamięci EEPROM częstotliwością. Gdy zostanie naciśnięty któryś przycisk, zostaje zwiększona zmienna pomocnicza "Pomoc_prog", która "dba", aby program był zmieniany tylko raz podczas naciśnięcia przycisku. Gdy zmienna pomocnicza jest równa 1, jest ustawiana flaga kasowania wyświetlacza, zwiększana lub zmniejszana zmienna programu. Zostaje wykonana instrukcja ograniczenia liczby programów.

Dla "TUNERA1" i "TUNERA2" jest możliwe zapisanie po 9 programów. Na koniec są wysyłane dane do modułu radiowego i sprawdzane stany przycisków, gdy przyciski są puszczone jest zerowana zmienna pomocnicza "Pomoc_prog" i jest sprawdzany stan zmiennej "COMMAND" odpowiedzialnej za wybór programu za pomocą przycisków numerycznych na pilocie. Po wyjściu z instrukcji warunkowej "Programowanie" bufor modułu UART jest kasowany, zostaje zwiększany "Czas_tea" i gdy osiągnie 10, zostają wysłane dane do modułu radia oraz zostają odczytane dane o sygnale i flaga stereo. Teraz, gdy wybrano jako źródło odtwarzacz "MP3/WMA"(Z_sygnal = 5) to jako pierwsze jest blokowane przerwanie od modułu RDS przerwania globalne pozostają odblokowane zostaje zablokowane przerwanie od bufora wejściowego. Następuje zerowanie licznika, zerowanie flagi stereo i zerowana zmienna siły sygnału z anteny. Wszystko po to, aby wskaźniki nie świeciły, jeśli TUNER jest nieaktywny. W tym momencie są sprawdzane stany flag menu, głośności, sleep, alarm_on, mute. Jeśli są one wyzerowane, jest zwiększany licznik "Pomoc_serialin". Powoduje on wysyłanie pustego polecenia od modułu VMUSIC2 co około 3 sekundy. Bez tego polecenia odtwarzanie utworu zostało zatrzymywane po kilku sekundach.

Następnie są sprawdzane stany przycisków na klawiaturze lokalnej i stan flag "Nex_t" i "Bac_k", które są ustawiane podczas korzystania z pilota. Jako pierwszy jest kasowany "Licznik_pomoc_mp3" potrzebny do kasowanie tekstu. Następnie są ustawiane flagi potrzebne do wyświetlenia odpowiedniego komunikatu. Na koniec jest zwiększany licznik "MP3" i wykonywana instrukcja warunkowa odpowiedzialna za jednorazowe wysłanie danych do moduły VMUSIC2.

Najpierw jest wysłana komenda potem jest zakończona znakiem "CR", który jest znacznikiem zakończenia transmisji. Następnie są sprawdzane fagi komend "START", "STOP", "PAUSE", "RANDOM", "REPEAT", "NEXT FOLDER". Podczas działania tych funkcji dzieją się takie same rzeczy, tylko dane wysyłane do modułu są innej treści. Najpierw jest ustawiana flaga do wyświetleniu tekstu wykonywanej komendy, zwiększany licznik "MP3" i wykonywana instrukcja warunkowa jednorazowego przesłania danych do modułu. W wypadku bitu "START" zostaje ustawiona flaga "Pomoc_czas_mp3", a dla bitów "PAUSE" i "STOP" ta flaga jest zerowana. Odpowiada ona za start licznika odliczającego czas trwania utworu.

Dalej jest sprawdzany stan flag odpowiedzialnych za odtwarzanie. Jeśli są one wszystkie wyzerowane zostaje sprawdzana zmienna "Text_disk_mp3", jeśli nie zawiera żadnego tekstu, zostaje zwiększany "Licznik_text_mp3" odpowiedzialny za cykliczne wyświetlanie komunikatów o odtwarzanym utworze i czas trwania. Dalej program sprawdza czy zmienne tekstowe zawierają tekst z danymi o utworze. Jeśli nie, to program przechodzi do wyświetlania kolejnego komunikatu. Jeśli nie ma żadnego komunikatu, natychmiast zostaje wyświetlony czas trwania utworu. Jeśli komunikaty zawierają tekst, to są po kolei wyświetlane, a na końcu zatrzymują się i wyświetlany jest czas aż do kolejnego utworu. Gdy "Licznik_text_mp3" osiągnie wartość większą niż 130, zatrzymuje się on na tej wartości. Teraz gdy zmienna " Text_disk_mp3" będzie zawierać tekst licznik zostaje zwiększany i gdy osiągnie 135, tekst zostanie przepisany, zostanie ustawiona flaga czyszcząca wyświetlacz w konsekwencji czego zostanie wyświetlony tekst "NO DEVICE" informujący, że nie jest włożony nośnik pamięci. Licznik zatrzyma się na wartości 137.

Kolejna część programu jest odpowiedzialna za obsługę impulsatora i funkcji regulacji głośności. Głośność jest regulowana tylko wtedy, gdy flaga "Menu" jest wyzerowana, ponieważ poziom na doprowadzeniach dołączonych do impulsatora jest sprawdzany w podprogramie obsługi przerwania od Timera1. Podczas kręcenia pokrętłem w jedną stro nę jest ustawiana flaga "Plus", a w przeciwną "Minus". Gdy któraś z tych flag jest ustawiona, zostaje ustawiona flaga "Glosnosc", jest zerowany licznik automatycznego powrotu, zostaje ustawiona flaga kasowania wyświetlacza oraz zostaje zmieniana i jest zmniejszana zmienna "Vol_integer". Teraz jest sprawdzana flaga " Glosnosc" oraz "Flaga_kasowania". Gdy są one ustawione, zostaje obliczana zmienna "Glos" i zostaje obliczone ograniczenie basu, aby uniknąć przesterowania przy dużej głośności. Następnie wyświetlacz jest kasowany i zostaje wyświetlony aktualny stan głośności, zapamiętane wszystkie dane o poziomie głośności do pamięci EEPROM, zostaje ustawiona flaga zezwolenia wysłania danych do procesora dźwięku, oraz kasowana "Flaga_kasowania". Następnie są sprawdzane flagi "Mute", "Alarm_on". Jeśli któraś z tych flag jest ustawiona, to jest sprawdzany stan flagi kasowania wyświetlacza, co skutkuje wyczyszczeniem wyświetlacza i wyświetleniem odpowiedniego tekstu. Gdy jest wybrane "Mute", zostaje ustawiona "Flaga_tda8425" wysyłania danych do procesora audio, a jeśli "Alarm_on", wyświetlacz jest czyszczony, zostaje wyświetlony komunikat, a flaga "Sleep_ jest kasowana. Następnie jest sprawdzana flaga "Sleep"oraz "Flaga_ kasowania". Jeśli obie są ustawione, zostaje wyświetlony czas nastawiony w funkcji wyboru. Wyświetlacz jest kasowany, tekst wyświetlony, kasowana flaga "Alarm" oraz zezwolenia wyświetlenia.

Kolejne instrukcje są odpowiedzialne za wyświetlenie aktualnego źródła sygnału. Są one wyświetlane tylko wtedy, gdy bit "Menu" jest wyzerowany. Komendy zawarte w funkcjach wyboru są wykonywane tylko raz, gdy "Flaga_kasowania" jest ustawiona. Po wykonaniu wszystkich instrukcji w funkcji wyboru ta flaga jest zerowana i pozostaje tak aż do momentu ustawienia po wybraniu kolejnego źródła sygnału.

Każda funkcja wyboru ustawia odpowiednie stany bitów zmiennej "Led" aby ustawić odpowiednio wejścia wyboru układu elektronicznego przełącznika źródeł sygnału. Zeruje liczniki, włącza lub wyłącza zasilanie modułu MP3, wyświetla tekst i wpisuje odpowiednią liczbę do zmiennej "A". Gdy jest wybrany "TUNER1 lub 2" są także wyświetlane częstotliwości i numer programu. A podczas korzystania z odtwarzacza MP3 są wyświetlane komunikaty wysłanego polecenia do modułu oraz odebrany tekst informujący o aktualnie odtwarzanym pliku. Podczas aktualizacji wyświetlacza za każdym razem jest ustawiana flaga wysyłania informacji do procesora audio. Dalsza część programu jest wykonywana, gdy flaga "Menu" jest ustawiona. Jest wtedy możliwy dostęp do ustawień w menu amplitunera.

W każdej z instrukcji wyboru "Menu_ licznik" są sprawdzane stany zmiennych bitowych "Minus" i "Plus". Gdy któraś jest ustawiona, najpierw jest kasowany licznik "Auto_powrót", potem ustawiana flaga kasowania wyświetlacza, zostaje zwiększany lub zmniejszany stan wybranego parametru oraz zostaje sprawdzony i ewentualnie ograniczony w funkcji warunkowej. Następnie, zostają wykonane niezbędne obliczenia, aby dopasować zmienne do potrzeb procesora dźwięku.

W dalszej kolejności jest sprawdzany stan bitu "Flaga_kasowania". Gdy jest ustawiony, to wyświetlacz jest kasowany, zostaje dodany znak "+", jeśli liczby przyjmują wartość większą od zera. Następnie wartości nastaw są zapisywane do pamięci nieulotnej, jest ustawiana "Flaga_tda8425" i kasowana flaga czyszczenia wyświetlacza.

Ustawienia basu i sopranu są identyczne, różnią się tylko zmiennymi. Regulacja balansu przebiega podobnie. Zmienna "Balans_pomoc" przyjmuje zawsze wartość dodatnią, obliczenia balansu odbywają się w instrukcji warunkowej "Flaga_tda8425", opisanej w dalszej części artykułu. Trzecia instrukcja wyboru zawiera ustawianie funkcji Kontur. Podczas jej realizacji ustawienie zmiennej "Plus" lub "Minus" powoduje zmianę bitu "Loud" na przeciwny podczas przełączania jest zerowana "Pomoc_mute_on" i wpisywane 20 do "Pomoc_mute_off", aby wyciszyć wzmacniacz na czas zmiany, by pozbyć się stuku w głośnikach. Stan bitu jest zapisywany w pamięci EEPROM. Następnie możemy ustawić tzw. funkcje pozwala na to właśnie procesor dźwięku.

Gdy któraś z flag "Plus" lub "Minus" jest ustawiona, licznik automatycznego powrotu jest zerowany, flaga kasowania jest ustawiona, następuje zwiększanie lub zmniejszanie "Licznik_funkcje" i ograniczenie wartości maksymalnej i minimalnej licznika. Dalej jest sprawdzana "Flaga_kasowania" i gdy jest ustawiona, wyświetlacz jest kasowany, zostaje zapisana zmienna licznika do pamięci nieulotnej, wykonana instrukcja wyboru, w której jest wyświetlany tekst oraz ustawione zostają bity zmiennej "funkcje" przesyłanej do procesora dźwięku. Następny w kolejności jest wybór wyjść głośnikowych działanie jest podobne jak w poprzednim przypadku z tym, że zmiana licznika "Glosniki" powoduje ustawienie zmiennych wyciszenia jak w przypadku ustawiania konturu.

Zegar można ustawić tylko za pomocą klawiatury lokalnej. Gdy któryś przycisk jest wciśnięty zostaje ustawiona "Flaga_kasowania" potem "Flaga_ustaw_czas" która jeśli jest ustawiona wpisuje aktualny czas do układu PCF8563. "Auto_powrot" i "sekundy" są kasowane, i jest zwiększana "Flaga_minut". "Minuty" są zwiększane dopóki zmienna "Flaga_ minut" nie osiągnie wartości większej jak 30 wtedy zostaje zwiększana zmienna "Godziny_ pomoc", która jeśli osiągnie więcej niż 5 zostanie zwiększany licznik "Godziny" następnie jest wprowadzone ograniczenie maksymalnej liczby godzin. Instrukcje wykonywane po naciśnięciu przycisku zmniejszającego wartość czasu są identyczne do tych opisanych powyżej. Gdy żaden przycisk nie jest naciśnięty zmienne pomocnicze godzin i minut są zerowane, a do zmiennych "Godziny" i "Minuty" przepisany zostaje aktualny czas po uprzednim rozkodowaniu za pomocą "MAKEDEC". Na koniec jest sprawdzany stan bitów "Flaga_ cls" albo "Flaga_kasowania". Gdy któraś z nich jest ustawiona, wyświetlacz jest kasowany i wyświetlany zostaje czas. Na koniec flagi są kasowane.

W kolejnym kroku można ustawić czas włączania automatycznego. Parametr ten jest dostępny tylko wtedy, gdy jest włączony ALARM. Procedura ustawiania alarmu jest podobna do ustawiania czasu z tym, że jest on zapisywany w pamięci nieulotnej procesora. Następny jest czas wyłączania, również dostępny, gdy jest włączony "ALARM". Kolejne dwa parametry można ustawić tylko wtedy, gdy jako źródło sygnału wybrano TUNER1 lub TUNER2. Dotyczą one rodzaju pracy tunera w trybie stereo lub mono i aktywację lub dezaktywację wyciszenia. Ustawienia tych parametrów odbywa się w sposób identyczny, jak przy parametrze "KONTUR". Stan bitów jest zapisywany w zmiennej "konfiguracje" i zapisany w pamięci EEPROM. W ten sposób zakończyłem opis menu teraz pozostała niewielka część komunikacji z układami szyną danych I2C. Zaczyna się od tego, że program sprawdza stan poszczególnych zmiennych bitowych. Zmienne bitowe zapewniają jednorazowe wykonywanie zawartych w nich instrukcji i zapis do pamięci nieulotnej, aby niepotrzebnie nie obciążać procesora i oszczędzać pamięć nieulotną, ponieważ ma ona ograniczoną liczbę zapisów.

Gdy jest ustawiona "Flaga_tda8425" zostaje obliczony balans. Po obliczeniach do zmiennych głośności prawego i lewego kanału zostają wpisane liczby z uwzględnieniem balansu. Zmienne balansu prawego i lewego kanału są zapisane w pamięci nieulotnej. Następnie są ustawione bity zmiennej "funkcje", w której 5 bit jest odpowiedzialny z wyciszenie. Bity 3 i 4 są odpowiedzialne za funkcje. Zmienna ta jest zapisana w pamięci nieulotnej. Dalej do układu TDA8425 są wysyłane nastawy, a na koniec flaga jest kasowana i funkcja czeka na ponowne ustawienie flagi, gdy zostanie zmieniony jakiś parametr. Następnie jest sprawdzana "Flaga_ tea5767", która wpisuje do zmiennej "Czas_tea" liczbę 10, aby dane były od razu wysyłane do modułu radia FM. Dalej dane o częstotliwość i programie są zapisywane do pamięci. Na koniec flaga jest kasowana. "Flaga_ustaw_czas" wywołuje procedurę zapisu do zegara czasu rzeczywistego, po czym jest kasowana. Na koniec, przed zakończeniem głównej pętli programu, jest wywołana procedura komunikacji z układem PCF8574. Zerowane są też zmienne bitowe, resetowany jest licznik układu watchdog i zerowana flaga "Zezw_wysw".

W ten oto sposób omówiliśmy pętlę główną programu. Teraz nadeszła pora na podprogramy oczywiste działania zostaną pominięte opiszę tu tylko te najbardziej zawiłe. Pierwsza jest procedura "Serial0charmatch()", która jest ona wywoływana wtedy, gdy pojawi się jakiś znak lub znaki w buforze wejściowym zakończone znakiem "CR". Podczas obsługi podprogramu zostają zablokowane przerwania od timera1, zewnętrzne oraz od bufora wejściowego. Dalej dane są odbierane i zostaje kasowany licznik watchdog. Następnie odebrany tekst jest obcinany. Następnie jest sprawdzana zmienna "Text" i gdy zawiera napis "Playing" liczniki zostają zerowane, zmienne czasu też są wyzerowane. Zostaje wyzerowana flaga "Pomoc_czas_mp3". "Playing" moduł VMUSIC wysyła zawsze, gdy zaczyna odtwarzanie nowego utworu, tekst ten stanowi znacznik początku utworu. Za napisem znajduje się tekst z nazwą utworu, dlatego jest on obcinany za pomocą funkcji "MID". Kolejne wysyłane teksty nie zawierają w nazwie "Playing", więc zostaje zwiększany "Licznik_odczytu_ mp3", który w instrukcji wyboru przepisuje odebrany tekst do zmiennych tekstowych, które dalej w pętli głównej są wyświetlane jako komunikaty o odtwarzanym utworze.

Licznik zostaje zwiększany do wartości 6. Nie oznacza to, że nie dzieje się nic więcej. Moduł cały czas przesyła kody ASCII, które po zdekodowaniu zawierają czas trwania utworu. Lecz ja w swoim programie ich nie wykorzystuje gdyż dekodowanie powodowałoby zawieszanie programu. Gdy nie włożymy nośnika danych do modułu zostaje przesłany tekst "NO DISK". Przed wyjściem z procedury wszystkie zablokowane wcześniej przerwania zostają z powrotem odblokowane. Kolejnymi wymagającymi omówienia procedurami są związane z przesyłaniem i odbieraniem danych z modułu radia FM oraz dekodera RDS. Myślę, że nie trzeba omawiać znaczenia danych wysyłanych do modułu radia, gdyż znaczenie ich jest bardzo szczegółowo opisane w karcie katalogowej. Dodam tylko, że aby odczytać dane z układu radia, takie jak poziom sygnału i bit stereo, należy cyklicznie wysyłać do modułu wszystkie dane zawarte w procedurze "Wyslij_tea5767". Po cyklicznym przesłaniu danych jest możliwy odczyt za pomocą procedury "Odczyt_tea5767".

Teraz omówię procedury odczytu danych z dekodera RDS. Aby odczytać z dekodera cokolwiek należy najpierw wysłać do niego dane konfiguracyjne zawarte w "Wyslij_saa6588". Są one wysyłane tylko raz podczas przełączenia na funkcję odbiornika radiowego. Po wysłaniu tych danych jest możliwe czytanie komunikatów RDS. Cała procedura odczytu jest zawarta w "Odczyt_saa6588" po odczytaniu zmiennych od "0_saa" do "6_saa" następuje przepisanie interesujących nas bitów do zmiennej "Rds_d1" i "Rds_d2" oraz "Rds_wybor". Dalej w instrukcjach wyboru komunikaty są formatowane i łączone w całość z pojedynczych znaków. Należy zwrócić uwagę, że nie wykorzystałem wszystkich możliwości, które ma procesor SAA6588. Ograniczyłem się do niezbędnego minimum, ponieważ uważam, że w odbiorniku stacjonarnym jest to wystarczające. Przedstawiony program wyświetla nazwę stacji radiowej, częstotliwość, w zależności od stacji, godzinę oraz nazwę wykonawcy i nazwę programu radiowego. Komunikaty są wyświetlane i formatowane w całość tylko przy dobrym poziomie sygnału, aby uniknąć przekłamywania przy słabym sygnale. Wyświetlanie komunikatów odbywa się w procedurze odczytu danych z dekodera. Zmienna bitowa "Flaga_zezwolenia" służy do tego, aby tekst o tej samej treści nie był ciągle wyświetlany. Jest ona stawiana tylko wtedy, gdy jest nowy komunikat w "Ps_name". W ten oto sposób zakończyliśmy omawianie procedur. Należy zwrócić uwagę na to, że na początku procedur, gdzie jest wykorzystana komunikacja z układami przez I2C lub UART, są blokowane przerwania. Ma to na celu zapobieżenie zapętlaniu się programu. Bez tego podczas komunikacji z jakimś układem następują błędy i procesor by się zawieszał. Tu uwaga dla czytelników ingerujących w oprogramowanie – należy zwracać szczególną uwagę na komunikację tymi magistralami, bo choć język BASCOM ma miano prostego, to kompilator nie zrobi wszystkiego za nas i trzeba uważać z przerwaniami w odpowiednich momentach je blokować i odblokowywać.

Koszta i uwagi końcowe

Koszt wykonania prezentowanego amplitunera wyniósł około 720 złotych, licząc razem z zakupem pilota zdalnego sterowania. Wszystkie podzespoły można kupić w sklepie AVT. Wyjątkiem jest moduł radia FM i VMUSIC2. Moduł radia można nabyć na aukcji internetowej, a VMUSIC2 w TME. Jak widać, koszty są dość spore, porównywalne z używanym sprzętem z górnej półki. Nasuwa się więc pytanie czy warto? Moim zdaniem warto ze względu na to, że mało który nowy sprzęt ma efekt podbicia basu, a jak nawet, to jego działanie jest mało zadowalające. A poza tym, większość urządzeń fabrycznych urządzenia nie ma wbudowanego odtwarzacza MP3. A ponadto, dla każdego elektronika wykonanie funkcjonalnego sprzętu audio jest swego rodzaju wyzwaniem i powodem do dumy, że zrobiło się coś użytecznego, co parametrami nie odbiega od sprzętu fabrycznego.

W artykule nie napisałem nic o obsłudze urządzenia. Uznałem to za zbędne, gdyż obsługa jest intuicyjna. Amplituner jest przeznaczony do współpracy z czterema kolumnami po 8 V lub dwiema po 4 V, tak aby łączna rezystancja na kanał była równa 4 V. Minimalna moc kolumny głośnikowej powinna wynosić 60…70 W. Jako dodatkowe, zewnętrzne źródło analogowego sygnału akustycznego można wykorzystać telewizor i odtwarzacz DVD.

Rafał Wasiak
fabian_wasiak@interia.pl

Artykuł ukazał się w
Elektronika Praktyczna
marzec 2014
DO POBRANIA
Pobierz PDF Download icon
Materiały dodatkowe
Zobacz też
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik maj 2020

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio czerwiec 2020

Świat Radio

Magazyn użytkowników eteru

APA - Automatyka Podzespoły Aplikacje maj 2020

APA - Automatyka Podzespoły Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna maj 2020

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Praktyczny Kurs Elektroniki 2018

Praktyczny Kurs Elektroniki

24 pasjonujące projekty elektroniczne

Elektronika dla Wszystkich maj 2020

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów