18
Elektronika dla Wszystkich
Do czego to służy?
Życie pokazuje, że układy sterowane pod-
czerwienią cieszą się niesłabnącą popularno-
ścią wśród Czytelników EdW. Są to zazwy-
czaj proste, zdalnie sterowane włączniki/wy-
łączniki urządzeń zasilanych z sieci energe-
tycznej np. lampek. Prezentowany układ peł-
ni bardziej skomplikowaną funkcję – oprócz
włączania i wyłączania umożliwia on przede
wszystkim płynną regulację jasności żarówki
za pośrednictwem pilota zdalnego sterowa-
nia. Nie ogranicza się przy tym, jak wszyst-
kie prezentowane dotychczas konstrukcje, do
nadajników pracujących w kodzie RC5. Nie
korzysta z gotowych procedur odbioru – są
one krok po kroku napisane. Model - zupeł-
nie przykładowo - współpracuje z pilotami
RC5 i RECS80, a napisane w języku C opro-
gramowanie umożliwia łatwe dodanie prak-
tycznie dowolnego innego pilota, na przy-
kład wysyłającego dane w kodzie SONY,
który stosunkowo często stosowany jest
przez wytwórców sprzętu RTV z Dalekiego
Wschodu, zwłaszcza Japończyków. Umożli-
wienie współpracy z pilotami pracującymi
w kilku popularnych standardach ma ogrom-
ną zaletę – niezależnie od tego, jaki nadajnik
posiadamy, najprawdopodobniej będzie on
współpracował z regulatorem. Ponadto jeśli
ktoś wykona regulator dla np. kolegi, który
nie ma pilota RC5, to nie będzie on zmuszo-
ny do kupienia takowego. Urządzenie samo
rozpoznaje, z jakim typem pilota współpra-
cuje, posiada także zabezpieczenie przed re-
akcją na sygnały podczerwone zakodowane
w standardzie innym niż kody przewidziane
przez programistę.
Jak to działa?
Na początek słówko o obsłudze regulatora.
Jest ona bardzo prosta - po włączeniu zasila-
nia układ należy poinformować o funkcjach,
jakie chcemy przypisać czterem dowolnie
wybranym przyciskom pilota. W tym celu
wciskamy w kolejności przyciski mające peł-
nić następujące funkcje: 1 - włączenie świa-
tła, 2 - zwiększenie jasności, 3 - zmniejszenie
jasności, 4 - wyłączenie światła. Wybrałem
taką kolejność, bo jak sądzę, łatwo ją zapa-
miętać – kojarzy się z przejściem od najwięk-
szej do najmniejszej jasności. To wszystko –
można teraz wygodnie zdalnie regulować ja-
sność lampki. Celowo nie zastosowałem pa-
mięci EEPROM lub mikrokontrolera zawie-
rającego ją „na pokładzie” – procedura ucze-
nia jest banalnie prosta i nieuciążliwa, a poza
tym należy sądzić, że regulator nie będzie
zbyt często wyłączany z sieci. Samo uczenie
polega na zapamiętaniu komend przypisa-
nych przyciskom. Adresy, jak i rodzaj kodu
nie są zapamiętywane – uznałem, że nie jest
to konieczne.
Schemat ideowy układu znajduje się na
rysunku 1. Wszystkie funkcje realizowane
są przez dobrze znany Czytelnikom EdW
procesor 2051 wraz z kilkoma małymi pery-
feriami. Program regulatora w całości do-
stępny jest na stronie internetowej EdW.
Regulacja jasności żarówki jest fazowa,
czyli polega na mniejszym lub większym
opóźnieniu włączenia triaka po przejściu na-
pięcia sieci przez zero. Im większe to
opóźnienie, tym jasność mniejsza. Tranzy-
stor T3 wykrywa momenty przejścia napięcia
sieci przez zero. Jest on zatkany, gdy napię-
cie to nie przekracza 11...12V, co nie jest mo-
że wartością bardzo bliską zeru, ale dla na-
szej lampki takie rozwiązanie jest zupełnie
wystarczające. Pomiary przy użyciu oscylo-
skopu i częstościomierza wykazały, że czas,
przez który na wejściu P3.2 procesora utrzy-
muje się stan wysoki, wynosi ok. 570
µs co da-
je wypełnienie równe 5,7%. Oczywiście czę-
stotliwość tego przebiegu wynosi dokładnie
µ
µ
P
P
3
3
0
0
2
2
4
4
Rys. 1 Schemat ideowy
M
M
i
i
k
k
r
r
o
o
p
p
r
r
o
o
c
c
e
e
s
s
o
o
r
r
o
o
w
w
y
y
z
z
d
d
a
a
l
l
n
n
i
i
e
e
s
s
t
t
e
e
r
r
o
o
w
w
a
a
n
n
y
y
r
r
e
e
g
g
u
u
l
l
a
a
t
t
o
o
r
r
o
o
ś
ś
w
w
i
i
e
e
t
t
l
l
e
e
n
n
i
i
a
a
100Hz. Każdy, kto teraz sądzi, że opadające
zbocze sygnału na P3.2 wywołuje procedurę
obsługi przerwania INT0, jest w błędzie – ta-
ki sposób podłączenia podyktowany został
jedynie wygodą przy projektowaniu płytki
drukowanej. Rozwiązanie polegające na wy-
korzystaniu przerwania INT0 i timera do
odmierzania opóźnienia nieco fałszowałoby
pomiary długości impulsów z pilota, gdyż -
jak sama nazwa wskazuje - przerywałoby te
pomiary dwa razy (INT0 + timer) w każdej
połówce napięcia sieci, za każdym razem, na
co najmniej kilkadziesiąt mikrosekund. Nie
jest to wiele i najprawdopodobniej nie spo-
wodowałoby to problemów, ale ja mimo
wszystko zdecydowałem się na inne rozwią-
zanie pozbawione tej wady, choć niestety
bardzo zajmujące czas procesora.
Otóż zarówno pomiar długości impulsów
z nadajnika IRED, jak i sterowanie fazowe
lampką odbywa się w jednym bardzo czę-
stym przerwaniu Timera0. Występuje ono co
50 cykli, a więc z kwarcem 11.0592MHz da-
je to czas ok. 54
µs. Procedura obsługi tego
przerwania oraz deklaracje stałych i zmien-
nych globalnych a także aliasy dla pinów
procesora znajdują się na listingu 1. Zanim
omówię program - wyjaśnienie. Po pierwsze:
nieznający języka C mogą mieć początkowo
małe problemy nie tyle ze zrozumieniem
istoty działania programu, ile z przestawie-
niem się na inny język programowania. Ze
względu na to, że w programie użyte zostały
jedynie najprostsze elementy języka C, moż-
na się go szybko nauczyć w stopniu wystar-
czającym do zrozumienia kodu, korzystając
z jakiejkolwiek niezłej książki dostępnej na
rynku. Są one nieźle napisane, popularne i ła-
two dostępne. Niewykluczone, że Czytelnicy
znajdą lepsze opracowania. Być może mój
projekt i zaznajomienie się z C stanie się za-
chętą do programowania procesorów właśnie
w tym języku. Posiada on liczne zalety. Język
C, słusznie nazywany asemblerem wysokie-
go poziomu, łączy w sobie swobodę asem-
blera z łatwością pisania i przejrzystością ję-
zyków wysokiego poziomu. Jego składnia do
minimum ogranicza pisaninę, dzięki czemu
kod jest zwięzły i logiczny oraz – co bardzo
ważne – dobrze się kompiluje. Każdy, kto
miał okazję obejrzeć kod napisany w C, po
przekompilowaniu na asembler doceni jego
zwięzłość i szybkość. Do tych wszystkich za-
let dochodzi ścisła standaryzacja C, dzięki
czemu składnia jest taka sama niezależnie od
platformy na jaką piszemy program. Warto
także wspomnieć, że zestaw instrukcji proce-
sorów AVR został przez Atmela stworzony
właśnie z myślą o programowaniu w C. Wię-
cej zachęcać chyba nie muszę... To było po
pierwsze. Po drugie: program napisałem, ko-
rzystając z kompilatora TASKING 8051 De-
mo, którego króciutki opis był w EP10/2001.
Wersję demonstracyjną pakietu można zna-
leźć m.in. na płycie CD-EP 10/2001B. Kod
napisany pod ten kompilator zawiera drobne
różnice w stosunku do np. Keila, polegające
na nieco innych słowach kluczowych okre-
ślających, w której pamięci (EEPROM,
flash, RAM, XRAM, itp.) definiowana jest
zmienna lub stała. Z tego powodu twórcy
kompilatora TASKING dostarczają wraz
z nim plik Keil.h. Plik ten dołączyłem do
programu regulatora. Należy go włączyć do
programu z Keila dyrektywą #include, aby
mógł on być kompilowany pod TASKING.
Odwracając niejako ten plik, można kompi-
lować pod Keilem programy napisane pod
TASKING. Po tej dygresji na temat języka
C wracamy do właściwego opisu regulatora
oświetlenia.
Timer0 pracuje tu w trybie 1. Procedurę
obsługi jego przerwania (listing 1) można
podzielić na dwie części. Pierwsza zajmuje
się regulacją jasności a druga zbieraniem da-
nych z pilota. Zmienna count zerowana jest,
gdy napięcie sieci jest bliskie zeru, czyli gdy
na P3.2 (in) jest stan wysoki. Przez pozosta-
łe ponad 95% czasu zmienna ta jest zwięk-
szana wraz z każdym wystąpieniem przerwa-
nia Timera0 (czyli co ok. 54
µs) i jeśli jej war-
tość przekroczy wartość zmiennej wart – na
wyjście P3.5 (out) podawany jest stan niski,
co powoduje włączenie optotriaka U2 oraz
triaka Q1, a w konsekwencji przepływ prądu
przez żarówkę. Zatem zmienna wart decydu-
je o wartości opóźnienia, po którym – od
przejścia napięcia przez zero – włączana jest
żarówka, a co za tym idzie o jasności jej
świecenia. Im większa wartość zmiennej
wart, tym żarówka świeci słabiej. Uwzglę-
dniając to, że nie 100%, ale ok. 95% czasu
wykorzystujemy do regulacji jasności, a po-
łowa okresu napięcia sieci trwa 10ms – ma-
ksymalna sensowna wartość zmiennej wart
wynosi około 0,95*10000/54=176 (z lekkim
zapasem). A więc regulacja jasności odbywa się
z rozdzielczością ok. 176 kroków (czyli dla
ludzkiego oka zupełnie płynnie). Dla wart więk-
szej lub równej 176 żarówka jest wygaszona.
W drugiej części zmienna remote_count
służy do pomiaru długości trwania kolejnych
impulsów z pilota. Wraz ze zmianą stanu na
wejściu P3.0 (tfms) długość kolejnego impul-
su wpisywana jest do tablicy tab[] oraz
zwiększana jest zmienna index. W tablicy tej
począwszy od indeksu 1 zapisane
są na przemian długości paczek
promieniowania IRED (indeksy
nieparzyste) i przerw między
paczkami (indeksy parzyste).
W komórkach o indeksach 0
i ostatni indeks+1 obecne są war-
tości większe od największej do-
puszczalnej długości paczki bądź
przerwy. Zawartość tej tablicy
analizowana jest później w proce-
durach dekodowania kodów
RECS80, RC5, SONY czy in-
nych, jakie zostaną uwzględnio-
ne. Dzięki temu oddzielamy pro-
ces zbierania danych (który powi-
nien być – i jest – przeprowadzo-
ny bez zakłóceń ze strony innych
przerwań, w czasie rzeczywi-
stym) od procesu ich dekodowa-
nia. Ten ostatni spokojnie może-
my przeprowadzić gdziekolwiek
w programie, w praktycznie do-
wolnym czasie.
Po włączeniu zasilania lub re-
secie program przechodzi do
funkcji main(). Jest to funkcja
standardowa występująca w każ-
dym programie napisanym w ję-
zyku C. Na jej początku konfigu-
rowany jest Timer0 oraz włączane są prze-
rwania. Następnie program wpada w nie-
skończoną pętlę, w której najpierw oczekuje
na pojawienie się impulsów z odbiornika
podczerwieni U3 typu TFMS5360, a po ich
wystąpieniu oczekuje z kolei na zakończenie
transmisji danych z pilota. Ponieważ tablica
tab[] uzupełniana jest automatycznie w prze-
rwaniu Timera0, w funkcji main() nie musi-
my już się o to martwić - wystarczy poczekać
na pojawienie się długiej przerwy między
paczkami impulsów przychodzących z U3,
która oznacza koniec nadawania. Listing 2
przedstawia ten fragment programu. Jak wi-
dać, za koniec transmisji uznawane jest wy-
stąpienie przerwy o długości co najmniej
250*54
µs=13,5ms. Oznacza to, że możemy
stosować piloty, w których zarówno paczki,
jak i przerwy trwają nie więcej niż 13,5ms.
19
Elektronika dla Wszystkich
Listing 1 Obsługa przerwania T0
#include <regat8x2051.sfr>
#include "Delay.h"
#define out
P3_5
#define in
P3_2
#define tfms
P3_0
#define stop
P3_1
const char code_RECS80=0;
const char code_RC5=1;
_data unsigned char wart=200,count;
_data unsigned char remote_count=0,tab[33],index,last;
_interrupt(1)
void Timer0_int(void)
{
TL0=0xDC;
TH0=0xFF;
TR0=1;
// Regulacja jasności
in=1;
if(in)
{
count=0;
out=1;
}
else
{
if(count++>wart)
out=0;
else
out=1;
}
remote_count++;
// Czytanie danych z pilota.
tfms=1;
if(tfms!=last)
{
tab[index++]=remote_count;
remote_count=0;
last=tfms;
}
Większość popularnych kodów, w tym RC5,
SONY i RECS80 spełnia to wymaganie. Wa-
runek index<1 w pętli while został dodany,
bo tab[0] zawsze ma wartość ponad 250, zaś
wyjście z pętli gdy index>30 zapobiega prze-
kroczeniu maksymalnego indeksu tablicy
(i pójściu procesora w przysłowiowe maliny)
w przypadku, gdy długa przerwa nie wystą-
piła dostatecznie szybko – w 30 pierwszych
impulsach. Stanowi to drugie wymaganie co
do kodu pilota – nie więcej niż 30 paczek
i przerw w rozkazie. Gdyby ktoś musiał za-
stosować pilota o czasach impulsów ponad
13ms, powinien zmienić typ zmiennych re-
mote_count, tab[] i innych przechowujących
dane o długości impulsów z pilota na unsi-
gned int. Przy stosowaniu pilota o liczbie im-
pulsów i przerw większej od 30, trzeba zmo-
dyfikować program, zmieniając warunek in-
dex>30 i rozmiar tablicy tab[] w jej deklara-
cji (rozmiar powinien być o 2..3 większy od
liczby w podanym warunku).
Po wyjściu z pętli (czyli zakończeniu
odbioru rozkazu z pilota) tuż za ostatnim im-
pulsem do tablicy wpisywana jest wartość
255. Jest to później wykorzystywane przy re-
alizacji zabezpieczeń przed reakcją na innego
pilota niż RC5 lub RECS80. Oprócz tego na
P3.1 (stop) podawany jest stan wysoki. Po-
woduje to wysterowanie T3 i sprzętowe za-
blokowanie impulsów z odbiornika U3.
Wszystko po to, aby w trakcie dekodowania
ewentualne impulsy podczerwone trafiające do
U3 nie zmieniały zawartości tablicy tab[], co
prowadziłoby do błędów. Wprawdzie wystar-
czyłoby w tym celu dodać jednego if-a w pro-
cedurze Timer0_int, jednak przy tak często
występującym przerwaniu każda możliwość
skrócenia czasu wykonywania tej procedury
jest cenna. Chodzi o to, że to, co jest poza
przerwaniem, nie jest wykonywane ciągle,
lecz swoistymi porcjami. Dla przykładu:
niech czas wykonywania procedury
Timer0_int wynosi 40
µs. Co 54µs procesor
będzie przerywał na 40
µs wykonywanie ca-
łości i skakał będzie do funkcji Timer0_int.
Oznacz to, że reszta programu wykonywana
będzie jedynie przez czas 14
µs w odstępach
54-mikrosekundowych. A więc średnia szyb-
kość pracy będzie prawie czterokrotnie
mniejsza niż przy braku takiego przerwania.
Płynie stąd prosty wniosek, że im krócej wy-
konywana jest funkcja Timer0_int, tym śre-
dnia szybkość wykonywania programu wzra-
sta. Sprzętowa blokada U3 pozwala zao-
szczędzić trochę czasu. Z tego samego
względu w pętli na listingu 2 (i w kilku in-
nych pętlach w programie) obecne jest wy-
wołanie funkcji Delay(1). Wprowadza to nie-
wielkie opóźnienie, co zapobiega „zatkaniu
się” procesora ze względu na bardzo częste
przerwanie Timera0.
Po ustawieniu bitu stop program rozpo-
znaje, z jakim kodem ma do czy-
nienia i - zależnie od długości
drugiego impulsu (tab[2]) - uru-
chamia odpowiednią procedurę
dekodującą – przyjąłem tu próg
2,7ms. Oprócz tego, gdy wywo-
łana zostanie procedura RC5,
następuje lekka modyfikacja
końca tablicy.
Jest tak dlatego,
że w przypadku
gdy najmłodszy
bit komendy RC5
jest równy 0 (ko-
dowany jako
paczka-przerwa),
ostatnia przerwa zlewa się
z następującą po niej długą
(ok. 100ms) przerwą między
całymi rozkazami i należy tę
ostatnią krótką przerwę
sztucznie dopisać do tablicy.
Wadą takiego „siłowego”
rozwiązania jest to, że gdy
komenda jest liczbą nieparzystą (wspomnia-
ny bit ma wartość 1), to modyfikacja tablicy
jest zupełnie niepotrzebna i wręcz pogarsza
jakość danych w niej zawartych. Nie ma to
jednak znaczenia przy dekodowaniu kodu
RC5, bo kończy się ono wraz z odczytaniem
ostatniego, jedenastego bitu rozkazu i nie jest
już analizowane to, co jest dalej. Problem ten
wystąpił, bo przyjąłem format „jeden impuls-
jedna komórka tablicy”. Jest on niejako natu-
ralny dla RECS80 i SONY, bo przekłada się
bezpośrednio na „jedna komórka-jeden bit”.
Dla RC5 jest inaczej. Zastosowana w tym
kodzie transmisja bifazowa sprawia, że dwie
następujące po sobie paczki (zmiana bitu z 1
na 0) lub przerwy (zmiana z 0 na 1) zlewają
się w jedną, dwukrotnie dłuższą paczkę bądź
przerwę zapisaną w jednej komórce tablicy.
I to sprawia, że zdekodowanie RC5 jest tutaj
trudniejsze niż RECS80 czy SONY. Transmi-
sja bifazowa posiada ogromną zaletę przy de-
kodowaniu w formie próbkowania – długość
każdego bitu jest taka sama, niezależnie czy
ma on wartość 1, czy 0. Jednak jeśli najpierw
zbieramy w pamięci dane o długościach im-
pulsów, a potem je dekodujemy, transmisja ta
stanowi utrudnienie. Pomocą w przeanalizo-
waniu podanych zależności będzie rysunek 2,
na którym przedstawiłem przykłady zakodo-
wania różnych rozkazów w kodach RC5,
SONY i RECS80. Uwaga! Dla tego ostatnie-
go podany sposób kodowania występuje tyl-
ko dla adresów z przedziału 1...7. Szczegóło-
we informacje można znaleźć w nocie apli-
kacyjnej układu SAA3008 dostępnej m.in. na
internetowych stronach Philipsa. Układ ten
jest nadajnikiem RECS80. W pilotach od te-
lewizorów pracuje zwykle z adresem 7.
Stan wysoki w przebiegach na rysunku 2
oznacza paczkę impulsów podczerwieni
o częstotliwości kilkudziesięciu kHz - naj-
częściej 36, ale bywa że stosowane są inne
częstotliwości np. w kodzie SONY często
wykorzystuje się 40kHz, a w RECS80 38 lub
33kHz, zależnie od zastosowanego kwarcu
w pilocie. Stan niski oznacza przerwę mię-
dzy paczkami. Fragmenty IN są w każdym
rozkazie takie same. W kodzie SONY jest to
impuls o długości 2,4ms a w RC5 sekwencja
impuls-przerwa-impuls lub, jak kto woli,
dwie następujące po sobie jedynki. To samo
dotyczy REF (reference time) i T0. Ten
pierwszy, mający długość odpowiadającą lo-
gicznej jedynce, czyli 7,59ms, już w samym
zamyśle twórców RECS80 służy jako czas
odniesienia i powinien być w tym celu zmie-
rzony na początku dekodowania. Czasy trwa-
nia bitów podaję zgodnie ze specyfikacjami
kodów i notami aplikacyjnymi ich nadajni-
ków, na przykład wspomnianego SAA3008
lub - nadającego kod RC5 - SAA3010. Cza-
sy te zależą od częstotliwości rezonatora ce-
ramicznego zastosowanego w pilocie – poda-
ne wartości odpowiadają pewnej konkretnej
częstotliwości tego elementu podawanej
w notach aplikacyjnych. W pilotach dostęp-
nych w handlu mogą nieznacznie odbiegać
od podanych wartości, bo producenci czasem
stosują rezonatory o innych częstotliwościach
pracy niż podawane w katalogach wspomnia-
nych kostek. Nie są to jednak duże odchyłki,
a poza tym w naszym regulatorze długości
bitów są mierzone, więc nie ma to żadnego
20
Elektronika dla Wszystkich
Listing 2 Odbieranie danych z pilota
while(remote_count<250 || index<1)
{
Delay(1);
if(index>30)
break;
}
index_mem=index;
stop=1;
last=0;
tab[index_mem]=255;
if(tab[2]<50)
{
tab[index_mem]=tab[1];
tab[++index_mem]=255;
blad=RC5(&address,&command);
}
else
blad=RECS80(&address,&command);
Rys2. Przykłady rozkazów w kodach
RC5, SONY i RECS80
znaczenia. Niezależnie od tego, zasady kodo-
wania są zawsze takie same, zgodne z rysun-
kiem 2, czyli np. w kodzie RC5 bity 0 i 1
trwają tyle samo, w SONY paczka w bicie 1
jest dwa razy dłuższa od paczki impulsów
w bicie 0, a w RECS80 długość przerwy ko-
dującej 0 stanowi 2/3 długości przerwy kodu-
jącej 1 itd. Bit PARITY w RC5 zmienia się
wraz z każdym wciśnięciem przycisku w pi-
locie, przyjmując na przemian wartości 1 i 0.
Imp to po prostu krótka paczka impulsów
podczerwieni oddzielająca w
kodzie
RESC80 przerwy, których długości kodują
kolejne bity. Czas jej trwania nie jest zbyt
istotny, wynosi kilka ms.
Każda z procedur dekodujących oprócz
odczytywania komendy i adresu (wpisywane
do zmiennych command i address) sprawdza
czy analizowany kod jest tym, dla którego
dana procedura została napisana. Jeśli tak
jest, zwraca ona wartość 0, w przeciwnym
wypadku zwraca 1, co oznacza odebranie
błędnej transmisji podczerwonej. Wartość ta
wpisywana jest do zmiennej blad. Zabezpie-
czenie przed reakcją na obcy sygnał realizuje
pomocnicza funkcja bit_correct. Opiera się
ono na sprawdzeniu czasów trwania bitów
i ich liczby. Czytelników, którzy przejrzą
kod, zaskoczy pewnie duża tolerancja dla
czasów – dopuszczalne są różnice wynoszą-
ce aż 50% wartości katalogowych. Jest tak
dlatego, że kryterium czasów jest jedynie
kryterium pomocniczym – ma ono za zadanie
z grubsza ocenić, czy analizowany kod jest
właściwy. Główną rolę pełni sprawdzenie
liczby bitów, jakie uda się odczytać w tablicy
tab[] pomiędzy komórką pierwszą i ostatnią,
zawierającą wspomnianą wcześniej wartość
255. Stanowi ona znacznik, którego pozycja
ściśle wiąże się z liczbą odebranych bitów
w odpowiednim kodzie. Ich liczba dla kodu
RC5 musi wynosić dokładnie 11, a dla
RECS80 9, nie licząc IN i PARITY oraz REF
i T0. Okazuje się, że takie zabezpieczenie
jest w praktyce zupełnie wystarczające. Jed-
nak gdyby komuś to nie wystarczało, istnieje
oczywiście możliwość zastosowania bardziej
restrykcyjnych kryteriów oceny, czy to, co
odebrał odbiornik U3 jest kodem RC5 lub
RECS80, czy też nie jest. Można na przykład
oprócz czasów trwania i liczby bitów spraw-
dzać istnienie w tablicy na właściwych miej-
scach stałych fragmentów odpowiednich ko-
dów, o których napisałem wyżej. Funkcja re-
alizująca dekodowanie RECS80 pokazana
jest na listingu 3. Jak widać, praktycznie ca-
łą pracę wykonuje prościutka pętla for.
Dekodowany jest tylko pierwszy odebrany
rozkaz. Jeśli nie było błędów (blad=0), pro-
cesor albo uczy się (tuż po włączeniu zasila-
nia), albo zmienia jasność czy też włącza/wy-
łącza światło. To ostatnie realizowane jest
przez nadanie zmiennej wart wartości 200.
Włączanie zaś - to przypisanie jej takiej war-
tości, jaką miała tuż przed wygaszeniem
lampki. Płynna zmiana jasności odbywa się
z wykorzystaniem elementów T1,C3,R3...R6.
Stała czasowa R5C3 sprawia, że podczas
trzymania przycisku w pilocie napięcie na
P1.1 jest wyższe niż na nóżce P1.0 (gdzie wy-
nosi ono ok. 1,56V), a co za tym idzie we-
wnętrzny pin P3.6 ma wartość 0. Zastosowa-
nie tych elementów upraszcza nieco program
- jeśli odebrana komenda ma np. zmniejszyć
jasność lampki to, dopóki P3.6 ma wartość 0,
zmienna wart jest inkrementowana co około
20ms. Czas ten określa szybkość zmian ja-
sności. Odmierzany jest przez zliczenie ok.
330 przerwań Timera0 (do liczenia wykorzy-
stana jest bezrobotna na razie zmienna remo-
te_count). Dobrałem go zgodnie z „zasadami
ergonomii” (czytaj: własnym wyczuciem)
i niekoniecznie musi on odpowiadać innym –
w takim wypadku wystarczy kosmetyczna
zmiana programu, z którą raczej nikt nie bę-
dzie miał problemów. Puszczenie przycisku
powoduje powrót na P3.6 stanu 1. Także po
odebraniu innych rozkazów – również nie-
ważnych – procesor czeka, aż przycisk zosta-
nie zwolniony i dopiero wtedy kontynuuje
pracę, czyli zeruje bit stop (P3.1) i czeka na
kolejne rozkazy z pilota. Cykl się zamyka.
Montaż i uruchomienie
Schemat montażowy znajduje się na rysun-
ku 3. Montaż jest klasyczny, musimy tylko
pamiętać o wlutowaniu trzech zworek, w tym
jednej w postaci odcinka izolowanego prze-
wodu łączącego „na przełaj płytki” punkty
A i B. Przed wlutowaniem transformatora
należy zdecydować, w jakiej obudowie zo-
stanie umieszczony nasz regulator. Płytka
zwymiarowana została pod obudowę
21
Elektronika dla Wszystkich
Wykaz elementów
Rezystory:
R1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47kΩ
R2,R6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10kΩ
R3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .220kΩ
R4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .100kΩ
R5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1MΩ
R7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .100Ω
R8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1kΩ
R9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .330Ω
Kondensatory:
C1,C2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33pF
C3,C5,C9 . . . . . . . . . . . . . . . . . . . . . .100nF MKT
C4,C6 . . . . . . . . . . . . . . . . . . . . . . . . .100µF/16V
C7 . . . . . . . . . . . . . . . . . . . . . . . . . . .470µF/16V
C8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1µF
Półprzewodniki:
U1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .89C2051
U2 . . . . . . . . . . . . . . . . . . . . . . . . . . . .MOC3020
U3 . . . . . . . . . . . . . . . . . . . . . . . . . . . .TFMS5360
U4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7805
T1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .BC558B
T2,T3 . . . . . . . . . . . . . . . . . . . . . . . . . . . .BC548B
D1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1N4148
D2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1N4001
Q1 . . . . . . . . . . . . . . . . . . . . . . . . . . .BT136-600
M1 . . . . . . . . . . . . . . . . . . . . . . . . . .mostek 1,5A
Inne:
TR1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .TS2/14
X1 . . . . . . . . . . . . . . . . . . . . . . . . . . .11,059MHz
CON1,CON2 . . . . . . . . . . . . . . . . . . . . . . . . .ARK2
Obudowa . . . . . . . . . . . . . . . . . . . . . . . . . .KM35
KKoom
mpplleett ppooddzzeessppoołłóóww zz ppłłyyttkkąą jjeesstt ddoossttęęppnnyy
ww ssiieeccii hhaannddlloowweejj AAVVTT jjaakkoo kkiitt sszzkkoollnnyy AAVVTT-33002244
Listing 3 Dekodowanie RECS80
char RECS80(unsigned char *adres,unsigned char *komenda)
{
_data unsigned char i,ref_time,liczba_a,liczba_k;
ref_time=tab[2];
ref_time=ref_time*5/6;
if(tab[24]!=255)
// nie 9 bitów
return 1;
*adres=0;
liczba_a=4;
*komenda=0;
liczba_k=32;
for(i=6;i<23;i+=2)
{
if(bit_correct(code_RECS80,i))
{
if(i<11)
// adres
{
if(tab[i]>ref_time)
*adres+=liczba_a;
liczba_a>>=1;
}
else
// komenda
{
if(tab[i]>ref_time)
*komenda+=liczba_k;
liczba_k>>=1;
}
}
else
return 1;
}
return 0;
}
KM35B lub KM35N. Różnią się one wyso-
kością i tym, że do KM35N trudno spotkać
filtry z przezroczystej barwionej plexi (35
x 83 mm). Bez problemu są natomiast do-
stępne filtry o wysokości 29mm idealnie pa-
sujące do KM35B. Niestety – transformator
nie zmieści się w tak niskiej obudowie. Dla-
tego przed jego wlutowaniem w płytkę nale-
ży ściąć górną część plastikowego karkasu
tego elementu. Należy to zrobić ostrożnie,
aby nie uszkodzić uzwojeń, posługując się
ostrym nożem i niewielkimi szczypcami
bocznymi. Jak dowodzi model, po takiej
przeróbce całość bez problemu wejdzie
w ciasną obudowę KM35B. Jeśli ktoś nie
chce modyfikować transformatora, może
umieścić płytkę w wyższej obudowie, na
przykład KM48N (plus filtr 42 x 83 mm), ale
jest ona ciut przyduża i mniej zgrabna niż
malutka KM35. Po zmontowaniu i włożeniu
w podstawkę zaprogramowanego procesora
układ od razu działa. Po włączeniu zasilania
wystarczy tylko nauczyć go reagować na wy-
brane przyciski pilota. I już. Moc sterowanej
żarówki spokojnie może dochodzić do
150...200W bez konieczności stosowania
(dużego) radiatora na triaku. Na koniec nale-
ży wspomnieć, że regulacja fazowa może
i w wielu przypadkach będzie powodować
powstawanie zakłóceń radioelektrycznych.
Stosunkowo niewielka skuteczność prostych
filtrów RLC (spraw-
dziłem!) i ich duże
rozmiary sprawiły, że
model nie zawiera ta-
kowego. Jeśli ktoś
chce, może taki filtr
zastosować, ale wtedy
obudowa KM35 bę-
dzie stanowczo za ma-
ła. Miłego używania
regulatora życzy
Arkadiusz
Antoniak
22
Elektronika dla Wszystkich
Rys. 3 Schemat montażowy
Ciąg dalszy ze strony 17.
Po upływie mniej więcej minuty (czas ten
potrzebny jest na rozgrzanie włókien żarze-
nia katod lamp) do wejść głównych asyme-
trycznych doprowadzamy z generatora sy-
gnał 1kHz o poziomie 0,775V. Zmierz napię-
cie na wyjściu tłumika R21 - napięcie to po-
winno być identyczne z tym, które zostało
doprowadzone do wejścia przedwzmacnia-
cza. Ślizgacz rezystora nastawnego R23 usta-
wiamy w pozycji środkowej, ale tak, aby na-
pięcie na rezystorach R21 i R23 było jedna-
kowe. Jeśli tak będzie uznajemy wówczas, że
układ mostkowy został wykalibrowany.
Sprawdźmy ponownie wartość napięcia ano-
dowego. Powinno wynosić około 300V. Jeśli
wszystko jest OK, to wtedy wciśnij przycisk
ON. Tym samym pojawi się napięcie na
transoptorach, które uaktywnią płytki mocy,
włączą się jednocześnie przekaźniki głośni-
ków. Potencjometry wejść skręcamy w lewo.
Do wyjść wzmacniacza dołączamy obciąże-
nie (np. żarówkę samochodową) i równole-
gle do niego oscyloskop. W jakim celu?
Po to, aby sprawdzić, czy wzmacniacz się
nie „wzbudza” ponadakustycznie. W przy-
padku wzbudzenia się wzmacniacza żarówka
będzie świecić niezależnie od położenia śli-
zgacza potencjometru wejściowego wzmac-
niacza. Stan taki byłby niezwykle groźny dla
zestawów głośnikowych a szczególnie części
wysokotonowych. Jeśli oscyloskop pokaże li-
nię prostą, ponownie doprowadź sygnał o po-
ziomie 0dB.Tym razem żarówka powinna się
zaświecić. Obserwuj wykres na oscyloskopie.
Kształt sinusoidy powinien być „czysty” i nie-
zniekształcony, w przypadku wzbudzenia się
pojawi się charakterystyczna obwiednia towa-
rzysząca sinusoidzie. Przyczyna wzbudzeń mo-
że leżeć w błędnym połączeniu mas. Jeśli
wszystko jest w porządku, to do wejść głów-
nych podłączamy kompakt CD a do wyjść
urządzenia głośniki i zaczynamy „ucztę”.
Jeśli chcemy słuchać muzyki czterokana-
łowo, wciskamy przycisk TRYB PRACY
(w trakcie przełączania wzmacniacz się wy-
ciszy automatycznie). Będziesz go musiał
uaktywnić przyciskiem ON (S1). Każdy mo-
duł ma swoje wyjście tzn. przewód „gorący”
i masę. Głośniki mogą być przełączane prze-
kaźnikiem sterowanym napięciem 12V
z przełącznika TRYB PRACY.
Życzę miłych wrażeń przy odsłuchiwaniu
tego wzmacniacza.
Ryszard Ronikier
ronikier@o2.pl