Opis oprogramowania


Oprogramowanie (listing1.bas) dla mikrokontrolera zostało napisane w BASCOM-ie.

Procesor jest chroniony przed zawieszeniem przez Watchdoga, który - w razie wpadnięcia programu w „martwą pętlę” - obudzi Atmegę po czasie nie dłuższym niż około 2s. Algorytm jest „taktowany” przez przerwanie od licznika/timera1, przychodzące dokładnie co 0,5ms. Taka wartość jest optymalna do wykonania wszystkich ważnych procedur: obsługi przycisków, zmiany ustawień, załączania diod sygnalizacyjnych oraz - przede wszystkim - syntezowania dźwięku w czasie rzeczywistym. Na początku, po przypisaniu zawartości licznika (skrócenie okresu zliczania Timera1) i resecie Watchdoga następuje procedura sprawdzania stanu klawisza; mamy tutaj drugą „barierę” przeciwzakłóceniową. Jeśli program odmierzy 0,125s wciśnięcia - uruchamia alarm poprzez wystawienie stanu „1” do flagi alarm. Jeżeli natomiast nie jest wciśnięty ani klawisz zewnętrzny, ani przycisk TEST, flaga jest zerowana. Wciśnięcie jednego z przycisków WSTECZ, DALEJ również zeruje zmienną, więc także powoduje chwilowe przerwanie alarmu. Potem sprawdzany jest fotorezystor, wystawiana jest flaga dzwiek, której zadaniem jest poinformowanie mikrokontrolera, czy może włączyć dźwięk, czy musi ograniczyć się do samego migania diod LED. Następnie w programie znajduje się procedura odczytu przycisków i - jeśli zostanie wykryte wciśnięcie przez użytkownika kombinacji klawiszy: TRYB lub ŚWIATŁO wraz z jednym z przycisków << lub >> - zmieniana jest zawartość jednej z głównych zmiennych „systemowych” - tryb lub swiatlo. Numer aktualnego trybu jest pokazywany na diodach LED dzięki procedurze Pokaz_tryb, a numer częstotliwości migania - dzięki procedurze Pokaz_swiatlo. Po tych czynnościach procesor przystępuje do obsługi sygnalizacji. Jeśli flaga alarm jest ustawiona w stanie wysokim, sprawdzeniu podlega flaga dzwiek. I tak, jeżeli przechowuje ona logiczną jedynkę, program wykonuje procedurę generowania dźwięku (etykieta Graj). Warto zwrócić uwagę, że - jak pisałem wcześniej - ustawienie zmiennej tryb lub swiatlo na 0 wyłącza odpowiednio dźwięk alarmu lub migania sygnalizacyjnych LED-ów.

            Następnie wykonywana jest procedura obsługi diod LED sygnalizatora, które figurują w programie pod aliasem Leds. Częstotliwość migania jest zależna od ustawianej z klawiatury zmiennej swiatlo, a generowana jest w następujący sposób: program zlicza kolejne cykle „główne” (co 0,5ms), a kiedy zawartość zmiennej mig zrówna się z przypisaną wartością T, następuje przełączenie stanu końcówki PD6 (Leds) na przeciwny. Okres migania wynosi więc 2 * T * 0,5ms. Trzeba zaznaczyć, że częstotliwości dla poszczególnych numerów światła są przypisywane w podprogramie oblicz.

            Po takim opisie pragnę przejść do zasady działania przetwornika D/C. Zacznę od pewnego problemu, który wystąpił podczas pierwszych prób i zmusił mnie do pewnej modyfikacji programu. Jak pisałem wcześniej, składa się on z drabinki rezystorowej (5 oporników z szeregu E24 - dokładność większa niż 5% nie jest potrzebna) oraz tranzystora Q4, kluczującego tranzystor wyjściowy Q2. Przetwornik jest w programie pośrednio reprezentowany w postaci zmiennej typu Byte, której 5 najmłodszych bitów odpowiada rezystorom drabinki. Do końcówek portów z tymi rezystorami przypisałem za pomocą instrukcji Alias nazwy Dac_0..Dac_4. Do nich przepisywane są wartości odpowiadających bitów ze zmiennej Dac. Taka operacja, wykonywana z każdą zmianą zawartości zmiennej Dac za pomocą podprogramu Konwersja, jest konieczna. Podczas uruchamiania programu okazało się bowiem, że sama zmiana zawartości Dac (wtedy aliasami przypisane były końcówki mikroprocesora bezpośrednio do bitów tej zmiennej) nie powoduje pożądanego rezultatu. Konieczne było zatem osobne przypisywanie wartości bitów zmiennej do końcówek portów (dla wygody nazwanych aliasami).

            Mamy więc przetwornik cyfrowo-analogowy o rozdzielczości 5 bitów, czyli mamy 32 kombinacje. Poszczególne rezystory reprezentują wagę bitów. Przykładowo, jeżeli w zmiennej Dac znajduje się liczba 3 (binarnie 00000011), to załączone zostaną dwa „najmłodsze” rezystory (stany wysokie na końcówkach PB0, PB1). Konieczne zatem jest, by rezystor na pozycji 0 dawał najmniejszy, można rzec - „jednostkowy prąd” - na bazę tranzystora Q2. Kolejny rezystor powinien dawać prąd dwa razy większy, bo w zapisie liczby binarnej na drugiej pozycji stoi bit wnoszący do liczby wartość 2. Na trzeciej pozycji rezystor 4 razy mniejszy od najmłodszego, czyli dający 4 razy większy prąd. I tak dalej, aż do rezystora reprezentującego bit 4. Otrzymujemy zatem bardzo wygodny w użytkowaniu przetwornik, sterowany liczbą typu Byte. Oczywiście, ze względu na wymaganą nie największą dokładność, można użyć wartości przybliżonych z szeregu E24. Wartości są dobrane tak, by Q2 pracował w zakresie pracy liniowej i dawał odpowiednio duży prąd kolektora na głośnik(i).

            Możemy więc już ustawić amplitudę przebiegu. Ale potrzeba jeszcze „częstotliwości nośnej”, którą możemy zmodulować. Istnieje oczywiście możliwość wygenerowania przebiegu samym przetwornikiem, np. z wykorzystaniem przerwań od timera, ale wiązałoby się to z dodatkową zmianą programu, niewykluczone również, że z pewnymi utrudnieniami. Tak więc użyjemy do tego celu licznika/timera2, pracującego w trybie generacji impulsów (porównywanie). Kluczowanie tranzystora Q2 polega na tym, że naprzemiennie zamykamy i otwieramy tranzystor Q4, dzięki czemu raz odcinamy Q2 (zwieramy jego bazę do masy), a raz zezwalamy na przepływ prądu bazy, wyznaczonego przez drabinkę przetwornika.

            Za poszczególne rodzaje dźwięku odpowiadają wartości zapisane w komórkach tablic: A(), B(), Pocz(), Konc(), Extra() i Opozn(). Są one charakterystyczne dla różnych barw tonów dzwonka. Program generuje dźwięki za pomocą procedury Graj. Działa ona niczym „wirtualna pętla For..Next”, której kolejna iteracja jest wywoływana z opóźnieniem. To opóźnienie jest wyznaczone przez zmienną licznikową W i zachowuje się tak, jak gdybyśmy w pętli For..Next umieścili polecenie Waitms. Pętla zlicza okresy główne programu przychodzące co 0,5ms i - kiedy jej zawartość zrówna się z czasem opóźnienia (komórka Opozn()) dla danego trybu - wykonuje kolejną „iterację” wirtualnej pętli z krokiem 1 lub -1, zależnie od wyniku porównania wartości początkowej i końcowej. Zmienną licznikową jest zmienna I. Te wartości krańcowe z kolei pobrane są również z odpowiednich komórek tablic, zapisanych na początku programu. Następnie do rejestru Pwm2a przypisywana jest odpowiednia wartość, potem również przetwornik D/A otrzymuje potrzebną liczbę. Zmienne Pocz, Konc, F, A, B, C, Extra i Z mogą budzić zdziwienie, jednak -jak się okazuje - są to pożyteczne „stworki”. Zmienna Z (typu Bit) jest przełączana z każdym kolejnym wykonaniem całej pętli (przypisanie do I wartości początkowej). Daje to możliwość dynamicznej zmiany częstotliwości nośnej, dzięki czemu mamy dźwięk o dwóch różnych częstotliwościach, tzw. gong dwutonowy. Zmienna C wraz wartością komórki Extra służy do zmiany częstotliwości nośnej nie tylko przy kolejnym obiegu pętli, ale cały czas, zależnie od chwilowej zawartości licznika I. Umożliwia to uzyskanie jeszcze innych, ciekawych przebiegów. Zmienna F służy do obliczeń, których wynik reprezentuje i właśnie jej zawartość jest przepisywana do rejestru Pwm2a. Zwróćmy uwagę, że jeżeli flaga Z=1, to do zmiennej F przepisywana jest wartość z komórki A zsumowana z zawartością odpowiedniej komórki tablicy B, jeśli natomiast Z=0, program wpisuje do F tylko wartość B. Te operacje wykonywane są w liniach:

F = Z * A(tryb)

F = F + B(tryb)

Widzimy, że mamy tutaj wpływ na ustalanie tych dwóch częstotliwości; wpływamy więc równocześnie na ich różnicę. Można więc uzyskać dwutonowy sygnał, który będzie miał jeden ton niski, drugi bardzo wysoki, mogą również różnić się niewiele - wszystko zależy od naszej inwencji twórczej i przeprowadzonych prób. Te dwie częstotliwości są „nakładane” na zmiany amplitudy sygnału. Potem do F może zostać dopisana aktualna zawartość licznika pętli - tylko, jeśli odpowiednia dla wybranego trybu komórka tablicy Extra jest różna od 0. Wirtualna pętla zmienia bez przerwy stan zmiennej Dac, która w liniach:

Dac = I

Gosub Konwersja

jest podawana na drabinkę rezystorową.



Wyszukiwarka

Podobne podstrony:
Opis oprogramowania wspomagające analizę komponentów systemu komputerowego, Prace kontrolne
linux Opis oprogramowania?u
Opis oprogramowania wspomagające analizę komponentów systemu komputerowego, Prace kontrolne
Opis Skrótów do ASUSA, Kompyutery Oprogramowania i Biosy
W4 Proces wytwórczy oprogramowania
Proces tworzenia oprogramowania
BYT 2005 Pomiar funkcjonalnosci oprogramowania
Analiza pracy Opis stanowiska pracy
opis techniczny
oprogramowanie uzytkoweCz1 Zarzadzanie2011
Opis taksacyjny
Lec04 PL Oprogramowanie fin
OPIS JAKO ĆWICZENIE W MÓWIENIU I PISANIU W ppt
2 Opis RMDid 21151 ppt
08 Prototypowanie oprogramowaniaid 7587 ppt
Bliższy opis obiektów Hauneb
opis techniczny
Opis zawodu Sprzedawca

więcej podobnych podstron