Sygnalizator poczty mail2led składa się z dwóch części: sprzętowej (schemat układu na rys. 1) i programowej (okno programu pokazano na rys. 2).
Budowa układu sygnalizatora jest tak prosta, że nawet ktoś, kto nie trzymał nigdy
DB9
200
Konto 1
Konto 2 Konto 3
Rys. I. Schemat elektryczny interfejsu mail2lecl
lutownicy w ręce poradzi sobie w 5 minut! Diody LED sygnalizatora możemy zamocować na wolnej zaślepce obudowy lub można obudować według własnego pomysłu. Możemy także zastosować diody dwukoloro-we, np. lubiane przez użytkowników PC niebieskie i białe. W modelowym układzie zastosowano zielone i czerwone diody LED o średnicy 5 mm.
Nadruk na zaślepce można wykonać następująco: drukujemy "naklejkę" na zwykłym papierze, przyklejamy do zaślepki, wiercimy otworki, a następnie obklejamy bezbarwną, samoprzylepną szeroką taśmą. Na koniec należy zrobić otworki w taśmie i zamocować diody. Efekt jest naprawdę zadowalający.
Rys. 2. Widok okno ustowień programu mail2lecl
RS232 w komputerze. Oczywiście, do sprawdzania stanu kont pocztowych potrzebny jest jeszcze odpowiedni program. Jest on darmowy (freeware) i można go rozpowszechniać do woli.
Po uruchomieniu programu (działa pod wszystkimi Windowsami, począwszy od Windows 95) pojawia się okno konfiguracyjne (rys. 2), umożliwiające wybranie portu, do którego podłączony jest sygnalizator. W tym oknie możemy także aktywować funkcję uruchamiania programu razem z Windows (bardzo zalecane!), a także zablokować pojawianie się okienek popup informujących o nowej poczcie lub błędzie. Na następnych zakładkach okna wpisujemy dane naszych kont pocztowych, a także ustawiamy czas, po którym program będzie sprawdzał dane konto w poszukiwaniu nowych listów.
Gdy wszystko jest dobrze, pozostaje nam tylko kliknię-cie przycisku Zapisz i zamknij. Wszystkie ustawienia programu przechowywane są w rejestrze Windows. Hasła do kont e-mail są szyfrowane algorytmem Bluefish, aby zapewnić choć odrobinę bezpieczeństwa danych.
Po zamknięciu okna ustawień program natychmiast rozpoczyna działanie. Oczywiście, w każdym momencie możemy kliknąć prawym kla-
Rys. 3. Menu podręczne przywołane prowym przyciskiem myszy
Gotowy układ należy podłączyć do wolnego gniazda
Rys. 4. Okienko popup informujące o nowej poczcie
wiszem myszy na ikonę na pasku zadań i przywołać menu podręczne (rys. 3).
Gdy ustawienia są wpisane do rejestru, program rozpoczyna odmierzanie czasu i sprawdzanie poczty. Jeśli jest nowa poczta, to program wyświetli okienko popup (rys. 4) i zaświeci się zielona dioda na interfejsie. Jeśli są jakieś nieprawidłowości, wtedy wyświetli się okienko popup z odpowiednim błędem, diody zaczną świecić na przemian, a lista błędów będzie wyświetlona w oknie błędów, które można wybrać poleceniem Błędy... z menu podręcznego.
Jeśli projekt mail2led zyska przychylność Czytelników, to powstanie wersja obsługująca dial-up (specjalnie dla modemowców!), a także różne wersje językowe.
Myślę, że po przeczytaniu tego artykułu każdy posiadacz komputera zbuduje sobie sygnalizator i będzie zawsze wiedział, czy na odległych skrzynkach pocztowych nie leży jakaś korespondencja.
Czekam na sugestie Czytelników i pytania pod adresem: biela@hot.pl. Paweł Biel a wski
WYKAZ ELEMENTÓW
Rezystory
Rl 200D Półprzewodniki
LEDl, LED3, LED5 diodo LED
zielono
LED2, LED4, LEDÓ diodo LED
czerwono
Różne
Jl: wtyk DB9 żeński + ew.
obudowo
przewód 4-żyłowy
Elektronika Praktyczna 12/2003
MINIPROJEKTY
Przetwornica do lamp Nixie
Opublikowane w EP
opisy zegarów
z gazowanymi
wyświetlaczami
lampowymi Nixie
zachęciły wielu naszych
Czytelników do
przeszukania swoich
magazynków. Okazuje
się, że najpoważniejszym
problemem zgłaszanym
nam przez Czytelników
jest zasilanie tych lamp.
Urządzenie przedstawione
w artykule ten problem
rozwiązuje.
Rekomendacje dla
projektantów urządzeń
lampowych, szczególnie
dobrze nadaje się do
zasilania wyświetlaczy
I amp o wych Nixi e.
Schemat elektryczny przetwornicy pokazano na rys. 1. Jest to klasyczna przetwornica impulsowa ze stabilizacją napięcia wyjściowego, wykonana na specjalizowanym sterowniku MC34063. Ponieważ układ ten integruje w sobie wszystkie bloki funkcjonalne poza końcówką mocy (w stopniu mocy pracuje tranzystor Ql), diodą kluczującą (Dl) i dławikiem (Li), budowa przetwornicy jest mało skomplikowana. Dzięki temu z jej wykonaniem nie będą mieli problemu także mniej wprawni elektronicy.
Jakość napięcia uzyskiwanego na wyjściu przetwornicy (tzn. współczynnik jego stabilizacji i napięcie tętnień) nie są zbyt wysokie, ale nie ma to istotnego znaczenia dla jakości działania lamp Nixie
czy magicznego oka, do zasilania którego można także zastosować tę przetwornicę.
Na rys. 2 pokazano schemat montażowy płytki drukowanej przetwornicy. Jej montaż nie wymaga posiadania specjalnego sprzętu ani szczególnych umiejętności. Uwagę należy zwrócić jedynie na sposób montażu tranzystora Ql - wyprowadzenie jego drenu jest jednocześnie radiatorem, który należy przylutować do odsłoniętego pola na płytce drukowanej. Czas lutowania należy skrócić do minimum, dbając jednocześnie o zapewnienie wysokiej jakości lutu.
Uruchomienie przetwornicy sprowadza się do ustawienia pożądanego napięcia na wyjściu. Przy zasilaniu
Rys. 1
Rys. 2
przetwornicy napięciem 12 V i obciążeniu jej wyjścia rezystorem 20 km można uzyskać na jej wyjściu stabilne napięcie o wartości 160 do 205 V. Andrzej G a wrył u k
WYKAZ ELEMENTÓW
Rezystory
Pl: 2,2kO
R2: 4,7kQ
R4: 330O
R3: ÓSOkQ
Rl: zworko
Kondensatory
Cl: 1000^F/25V
C2, C3: lOOnF
C4: lnF
CS: 47^F/350V
Półprzewodniki
Ul: MC340Ó3A
Gl: IFRS40S
Dl: BW29/400
Różne
Fl: CUAT
Jl, J2: ARK2
LI: 330^H (max. la/min. 15A)
Płytka drukowana jest dostępna wAVT- oznaczenie AYT-1385.
Wzory płytek drukowanych w formacie PDF są dostępne w Iniernecie pod adresem; pcb.ep.com.pl oraz na płycie CD-EP12/2003B w katalogu PCB.
80
Elektronika Praktyczna 12/2003
KURS
Silniki elektryczne w praktyce elektronika, część 1
Jak działa silnik elektryczny
"Na przewodnik z prądem w polu magnetycznym działa siła F równa...."
- tyle mniej więcej każdy pamięta ze szkoły. Żeby zrobić z tego silnik elektryczny, potrzebny jest nieruchomy sto-jan i osadzony na łożyskach wirnik. Każdy z tych elementów musi spełniać przynajmniej jeden warunek:
- musi umożliwić przepływ prądu,
- musi wytwarzać własne pole magnetyczne.
Żeby chciało się to jeszcze kręcić, potrzebna jest cykliczna zmiana kierunku przepływu prądu lub zmiana orientacji i natężenia (wirowanie) pola magnetycznego. Takie minimum teorii wystarczy do zrozumienia działania większości silników elektrycznych.
Podział silników elektrycznych
Istnieje ponad sto rodzajów silników, różniących się zasadą pracy, budową i właściwościami. Niektóre rodzaje występują tylko w podręcznikach i próżno ich szukać w sklepach. Poniższy podział obejmuje najważniejsze typy silników, produkowane masowo: Silniki prądu stałego
- komutatorowe, w rodzinie których są produkowane:
- silniki z magnesem trwałym;
- silniki szeregowe;
- silniki bocznikowe;
- silniki szeregowo-bocznikowe;
- z wirującym magnesem, w rodzinie których są produkowane:
- dwubiegunowe z czujnikami Halla,
- wielobiegunowe z czujnikami Halla lub enkodereni,
- krokowe, w rodzinie których są produkowane:
- unipolarne,
- bipolarne,
- liniowe.
Silniki prądu zmiennego
- komutatorowe (uniwersalne),
- asynchroniczne 1-fazowe, w rodzinie których są produkowane:
- kondensatorowe;
- ze zwartą fazą rozruchową;
- z odłączanym uzwojeniem rozruchowym;
- asynchroniczne 3-fazowe,
- synchroniczne.
Wybrane parametry silników elektrycznych
Podstawowe parametry silnika są zwykle podane na jego tabliczce znamionowej, pozostałe - np. moment rozruchowy, prąd rozruchowy, można znaleźć tylko w katalogach lub oszacować według właściwości poszczególnych rodzajów silników.
Moc znamionowa. Zazwyczaj jest podawana moc elektryczna w watach,
Na co dzień nie zdajemy sobie sprawy, jak olbrzymia liczba różnych silników elektrycznych nas otacza. Wielu elektroników budując sterowniki mikroprocesorowe, chciałoby skorzystać z tego bogactwa, ale nie zawsze wiadomo, jak to zrobić.
Dlatego postanowiłem przybliżyć Czytelnikom temat właściwości i sposobów sterowania typowych silników elektrycznych - może w sposób nienaukowy, przystępnie i bez stosowania wyższej matematyki.
tzn. moc pobierana przez silnik podczas pracy z normalną prędkością obrotową. Moc mechaniczna, tzw. moc na wale, jest mniejsza i zależy od sprawności silnika (typowo 40...80%).
Napięcie zasilania. Znamionowa wartość napięcia zasilającego (stałego lub zmiennego), przy której określane są inne parametry. Większość silników może być zasilana napięciem niższym (minimalnie od 5%UZ dla silników komutatorowych i od 70%U2. dla indukcyjnych). Nie należy stosować napięć dużo wyższych od znamionowego (maksimum +15%).
Moment obrotowy. W uproszczeniu jest to siła, z jaką silnik potrafi kręcić obciążeniem. Podawany jest w Nm (niu-ton * metr), typowe wartości dla małych silników: od 0,01 do 50 Nm.
Moment rozruchowy. Jest to bardzo ważny parametr, informujący o tym, czy silnik jest w stanie wystartować pod obciążeniem. Może być podany w Nm lub w procentach momentu obrotowego. W zależności od rodzaju silnika moment rozruchowy może być mały (do 150%), średni (150...250%) lub duży (powyżej 250%). Moment rozruchowy może być parametrem decydującym o przydatności silnika do określonych zastosowań. Najmniejsze wymagania stawia napęd wentylatorów - obciążenie startowe jest zerowe i rośnie z kwadratem prędkości obrotowej, można zastosować nawet silnik z momentem rozruchowym niższym od 100%. Najtrudniejsze warunki rozruchu występują w napędach sprężarek, dźwigów oraz pojazdów.
Obroty znamionowe. Zawsze są podawane obroty w normalnych warunkach pracy, tzn. przy znamionowym obciążeniu i napięciu zasilania. Obroty silników mogą zawierać się w granicach 100...100000 obr./min., ale najczęściej spotykane wartości to 1000...4000 obr./min.
Prąd znamionowy i prąd rozruchowy. Prąd znamionowy jest to pobór prądu w normalnych warunkach pracy. Prąd rozruchowy występuje tylko pod-
czas rozpędzania silnika i jest 2...8-krot-nie większy od prądu znamionowego (największe prądy rozruchowe mają silniki indukcyjne). Warto o tym pamiętać, projektując układ sterowania i zasilania silnika.
Silniki komutatorowe prądu stałego z magnesem trwałym (PMDC)
Konstrukcja silnika komutatorowego jest znana od 100 lat i mimo swoich wad silniki te nadal są powszechnie stosowane, głównie ze względu na łatwość regulacji obrotów i momentu obrotowego.
Konstrukcję silnika komutatorowego z magnesem trwałym przedstawiono na rys. 1. Uzwojenia wirnika umieszczone są w szczelinach żelaznego rdzenia i podłączone do komutatora. Komutator składa się z wielu płytek miedzianych umieszczonych na bocznej powierzchni walca, po którym ślizgają się węglowe szczotki zasilane prądem. Zadaniem komutatora jest przełączanie kierunku przepływu prądu w uzwojeniach, tak aby oddziaływanie z polem magnetycznym stojana wprawiło wirnik w ruch obrotowy. Obroty silnika komutatorowego zależą liniowo od napięcia zasilania, a moment obrotowy od natężenia prądu. Zmianę kierunku obrotów uzyskuje się poprzez zmianę bieguno-
Megnesy stojana
\4Uzwojenie rotora
Szczotki
Rys. 1. Budowa silnika komutatorowego z magnesem trwałym
Elektronika Praktyczna 12/2003
85
KURS
Obrót wirnika
Magnesy trwałe
Szczotki
Rys. 2. Budowa silnika z wirnikiem bez żelaza
wości zasilania. Obroty można łatwo regulować w szerokich granicach (od 5% do 110% obrotów znamionowych) z zachowaniem dużego momentu obrotowego. Istnieje też odmiana silnika komutatorowego - tzw. silnik z wirnikiem bez żelaza (rys. 2). W takim silniku wirnik nie posiada rdzenia żelaznego i jest wykonany podobnie do płytki drukowanej - uzwojenia są wykonane w postaci taśm miedzianych przyklejonych do krążka z laminatu. Ze względu na bardzo małą masę wirnika taki silnik ma małą bezwładność - może więc startować bardzo szybko i osiągać duże prędkości obrotowe. Szczotki są dociskane do obrzeża wirnika, rolę komutatora pełnią pola stykowe na jego obwodzie. Silniki tego typu używane są do napędu wirówek i do bardzo szybkich serwomechanizmów.
Dodatkową zaletą silników z magnesem trwałym jest łatwość hamowania. Wykorzystuje się tutaj odwracalność pracy takiego silnika: obracanie wirnikiem bez zasilania powoduje, że silnik staje się prądnicą. Wystarczy w chwili odłączenia zasilania zewrzeć zaciski silnika, aby powstał duży moment hamujący (zaawansowane sterowniki takich silników potrafią odzyskiwać energię hamowania silnika i zwracać ją do źródła zasilania).
Niestety silniki komutatorowe mają też wady. Najważniejsza z nich to zużywanie się szczotek i komutatora, co wymaga okresowej konserwacji silnika (trwałość komutatora jest szacowana na 2...3 tysiące godzin pracy). Poza tym iskrzenie na komutatorze wytwarza spore zakłócenia elektromagnetyczne, do tego dochodzi hałaśliwa praca i wysokie koszty produkcji.
Niskonapięciowe silniki komutatorowe z magnesem trwałym są powszechnie używane w zabawkach, starszych modelach magnetofonów, niektórych serwomechanizmach. Do niedawna były to najczęściej stosowane silniki w zakresie mocy do 20 W, obecnie są wypierane przez nowocześniejsze silniki bezszczotkowe z wirującym magnesem.
Silniki komutatorowe szeregowe i bocznikowe
Zamiast magnesu trwałego można do wytworzenia pola magnetycznego stojana użyć elektromagnesu, otrzymu-
jemy wtedy silnik z dwoma uzwojeniami: stojana i wirnika. W zależności od układu połączeń otrzymamy silnik szeregowy, bocznikowy lub szeregowo-bocznikowy (rys. 3). Silnik szeregowy ma bardzo duży moment obrotowy i rozruchowy, ale ,,miękką" charakterystykę obciążenia, tzn. obroty bardzo silnie zależą od obciążenia silnika. Bez obciążenia silnik szeregowy może rozpędzać się bez ograniczeń, aż do jego zniszczenia - tzw. ,,rozbieganie się" silnika. Wady tej jest pozbawiony silnik bocznikowy - jego obroty są stałe i prawie niezależne od obciążenia. Niestety silniki bocznikowe (poza bardzo małymi) wymagają skomplikowanych układów płynnego rozruchu ograniczających prąd rozruchowy, a moment rozruchowy jest dużo mniejszy niż w silnikach szeregowych. Silnik szeregowo-bocznikowy ma charakterystykę zbliżoną do szeregowego, dodatkowe uzwojenie bocznikowe ogranicza maksymalne obroty przy pracy bez obciążenia.
Regulacja obrotów jest możliwa poprzez zmianę napięcia zasilania. Kierunek obrotów jest stały bez względu na biegunowość zasilania, zmiana kierunku wymaga zamiany miejscami końcówek jednego z uzwojeń: wirnika lub stojana.
Szeregowe silniki prądu stałego na 12 V i 24 V są powszechnie stosowane w samochodach (dmuchawa - 120 W, wycieraczki - 50 W, rozrusznik - 1200 W) oraz w wiertarkach akumulatorowych. Silniki większej mocy spotyka się w napędach maszyn oraz - bardzo duże - w pojazdach szynowych. Silniki bocznikowe i szeregowo-bocznikowe używane są głównie w przemyśle -m.in. do napędu dźwigów.
Sterowniki silników komutatorowych
Opisane poniżej układy mogą być stosowane do wszystkich rodzajów silników komutatorowych, jednak zmiana kierunku obrotów i hamowanie jest możliwe tylko w przypadku silników z magnesem trwałym.
Najprostszym sposobem regulacji obrotów jest zastosowanie potencjometru o odpowiednio dużej mocy, trochę lepszym - regulowany stabilizator napięcia. Niestety podstawową wadą obu układów jest zamiana dużej traconej mocy w ciepło. Dlatego też powszechnie stosowane jest zasilanie silnika falą prostokątną o zmiennym współczynniku wypełnienia PWM. Całkowanie impulsów sterujących, dzięki czemu ruch wirnika jest płynny, odbywa
się w sposób naturalny - po- Silnik szeregowy Silnik bocznikowy Silnik szeregowo-bocznikowy
przez bezwładność wirnika.
Częstotliwość impulsów za- Rys. 3. W zależności od układu połączeń uzwojeń wiera się w przedziale od silniki mogą być szeregowe, bocznikowe lub 100 Hz do kilku kHz. Zbyt szeregowo-bocznikowe
niska częstotliwość może powodować skokowe zmiany momentu obrotowego a zbyt wysoka - straty indukcyjne w silniku. Należy tak dobrać częstotliwość, aby na każdy obrót silnika przypadało przynajmniej kilka impulsów.
Taki sposób sterowania jest bardzo wygodny w przypadku mikroprocesorów - generator PWM może być łatwo zrealizowany programowo (niektóre procesory mają też sprzętowy generator PWM). Przykładowy układ sterowania obrotami silnika 12 V/20 W przedstawiono na rys. 4. W układzie dodatkowo wprowadzono możliwość zmiany kierunku obrotów za pomocą przekaźnika sterowanego wyjściem DIR. Jeżeli nie ma takiej potrzeby to silnik podłącza się bezpośrednio między dren tranzystora mocy i ,,plus" zasilania. Przy doborze elementów należy zwrócić uwagę na kilka istotnych szczegółów:
- Dioda Dl jest nie tylko elementem tłumiącym przepięcia, ale umożliwia także zachowanie ciągłości przepływu prądu w indukcyjności silnika. Nie powinna to być zwykła dioda prostownicza 1N4001, lecz dioda szybka na prąd 1...3 A (np. BY299, BY397, BYT03, BYW72).
- Tranzystor kluczujący może być typu MOS lub bipolarny, powinien mieć dopuszczalny prąd drenu (kolektora) przynajmniej 3-krotnie większy od prądu znamionowego silnika. Jeżeli stosujemy tranzystor bipolarny (np. Darlington TIP122), to R1=R2 = 1,8 kD.
- Zastosowanie dwóch połączonych równolegle inwerterów 74HC04 ułatwia szybkie przeładowywanie pojemności bramki Tl. W tym celu można zamiennie użyć np. bufora mocy 74HC240 i Rl = 100D (dla częstotliwości kluczowania powyżej 1 kHz lepiej jest użyć tranzystora bipolarnego).
- Warto zastosować w układzie ogranicznik prądu obciążenia (lub bezpiecznik) dla uniknięcia uszkodzeń w przypadku przeciążenia silnika.
- W programie sterującym trzeba uwzględnić konieczność zatrzymania
86
Elektronika Praktyczna 12/2003
KURS
74HC04
Rys. 4. Układ sterowania obrotami silnika 12 V/20 W
silnika przed przełączeniem kierunku obrotów, w przeciwnym razie przez silnik popłynie bardzo duży prąd w momencie zmiany kierunku. - Iskrzenie komutatora może zakłócać pracę mikrokontrolera. Silnik może być fabrycznie wyposażony w szeregowe dławiki przeciwzakłóceniowe, jeżeli ich brak, to należy zastosować dwa dławiki 22...100 uH przystosowane do odpowiednio dużego prądu (miniaturowe dławiki w obudowach ,,rezystorowych" się nie nadają).
Na rys. 5 przedstawiono uproszczony schemat sterownika w układzie mostkowym X, umożliwiający sterowanie prędkością obrotową, kierunkiem obrotów oraz hamowanie silnika komutatorowego z magnesem trwałym. Jeżeli
Przydatne linki internetowe
Polskie:
- http://www.silniki.pl - dystrybutor silników i sterowników, doskonale opracowane informacje praktyczne i teoretyczne,
- http://www.robot.opole.pl - dużo teorii na temat silników komutatorowych i liniowych,
- http://www.mikroma.com, http:// www.elcar.com.pl, http:// www.wamel.com.pl - polscy producenci silników,
Zagraniczne:
- http://www.allegromicro.com -firma Allegro Microsystems - producent scalonych sterowników silników, ciekawe poradniki i noty aplikacyjne,
- http://us.st.com/stonline/books - karty katalogowe i noty aplikacyjne sterowników firmy ST Microelectronics,
- http://www.maxonmotor.com - strona renomowanego szwajcarskiego producenta silników DC,
- http://www.compumotor.com -strona firmy Parker Motion & Control, która opracowała doskonały poradnik "Motor Technologies" (dostępny także na stronie Allegro Microsystems).
przewodzą tranzystory T2 i T3, to prąd płynie od ,,plusa" zasilania przez T3, silnik, T2 i Rs do masy. W momencie zatkania tranzystorów prąd samoindukcji przepływa przez D2 iD3. Sterowanie T2 i T3 impulsami z generatora PWM pozwala na regulację obrotów silnika. W przypadku wysterowania tranzystorów Tl i T4 prąd płynie przez silnik w przeciwnym kierunku, czyli mamy zmianę kierunku obrotów. Jednoczesne przewodzenie tranzystorów Tl i T2 to zwarcie zacisków silnika - hamowanie. Napięcie z rezystora Rs jest podawane na wejście komparatora - ogranicznika prądu. Nazwa mostek X lub mostek H pochodzi od graficznego przedstawienia przepływu prądu, przypominającego literę X lub H.
Na rys. 6 przedstawiono schemat aplikacyjny scalonego sterownika A3953 firmy Allegro Microsystems, działającego według opisanych powyżej zasad. Na wejście /ENABLE są podawane impulsy z generatora PWM, a stan logiczny na wejściu PHASE decyduje o kierunku obrotów. Na wejście /BRAKE należy podać '1' (stan '0' na wejściu /BRAKE powoduje hamowanie silnika), wejście MODĘ powinno mieć stan '0'. Do wejścia REF dołącza się napięcie stałe z zakresu 0...0,65 V w celu ustalenia wartości ograniczania prądu silnika (maksymalny prąd wyjściowy układu 3953 wynosi 1,3 A). Układ może być zasilany dwoma różnymi napięciami: VBB (tranzystory wyjściowe) i Vcc (część cyfrowa), dzięki temu możliwe jest bezpośrednie sterowanie wejść A3953 z wyjść mikropro-
Silniki komutatorowe uniwersalne
Silniki uniwersalne występują w klasyfikacji jako silniki prądu zmiennego, jednak nie do końca jest to prawda. Jak wspomniano wcześniej, silnik komutatorowy szeregowy obraca się
Słowniczek wybranych angielskich terminów i skrótów
Armaturę, winding - uzwojenie
BLDC (Brushless DC motor) - bezszczotkowy silnik DC z wirującym magnesem
Brush motor - silnik komutatorowy
Cage motor - silnik indukcyjny AC z wirnikiem klatkowym
Capstan motor - potoczna nazwa silnika głównego w magnetowidach, magnetofonach
Clamp diodę - dioda zamykająca obwód dla prądu samoindukcji
PMDC (Permanent Magnet DC motor) - silnik komutatorowy z magnesem trwałym
REPM (Rare Earth Permanent Magnet) - magnes trwały wykonany z pierwiastków ziem rzadkich (np. neodym)
Spindle motor -1) potoczna nazwa silnika głównego w napędach dyskowych i CD, 2) silnik z elementem napędzanym zamocowanym bezpośrednio na osi wirnika
Rotor-wirnik
Stator - stojan
Torque-moment obrotowy
Torque ripple -wahania momentu obrotowego zależne od kąta obrotu wirnika
Voice Coil motor (actuator) - rodzaj silnika (siłownika) liniowego z ruchomą cewką
X-Bridge (H-Bridge) - mostek 4-tranzy sto rowy do bipolarnego sterowania uzwojeń silników
w tym samym kierunku niezależnie od biegunowości zasilania - czyli powinien prawidłowo pracować także przy zasilaniu prądem zmiennym. W praktyce często rdzeń wirnika i stojana jest wykonany z jednego kawałka metalu i straty wywołane prądami wirowymi byłyby bardzo duże. Dlatego też w silnikach uniwersalnych rdzenie wykonane są w formie pakietów z cienkich blaszek (jak w transformatorach sieciowych). Taki silnik może być zasilany prądem zmiennym lub stałym i dlatego nazywany jest silnikiem uniwersalnym. Tego typu silniki są powszechnie używane
Rys. 5. Uproszczony schemat sterownika w układzie mostkowym X
Elektronika Praktyczna 12/2003
KURS
w sprzęcie gospodarstwa domowego (roboty kuchenne, miksery, młynki, odkurzacze) oraz w elektronarzędziach. W przypadku używania silników uniwersalnych z odzysku, należy pamiętać o możliwości rozbiegania się silnika szeregowego przy braku obciążenia. Szczególnie dotyczy to silników z odkurzaczy: mają one prędkość znamionową ok. 12 000 obr./min. w warunkach obciążenia turbiną, a bez obciążenia potrafią osiągnąć kilkadziesiąt tysięcy obrotów. Przestrzegam przed próbami wykorzystania silnika z odkurzacza do budowy szlifierki - przy np. 30 000 obr./ min. rozpadająca się tarcza szlifierska powoduje efekt zbliżony do wybuchu granatu!
Elektroniczne układy regulacji obrotów silników uniwersalnych zwykle budowane są w oparciu o triaki ze sterowaniem fazowym. Schematy takich układów można bez problemu znaleźć w literaturze (np. z układem U2008 lub U2010B firmy Temic). Można też zasilić silnik uniwersalny prądem stałym o napięciu 230 V, ale zbudowanie odpowiedniego zasilacza nie jest rzeczą prostą - wyprostowanie i odfiltrowanie napięcia sieci da na wyjściu ok. 320 VDC.
brakeO
refO
470p
O MODĘ
ENABLEO
Rys. 6. Schemat aplikacyjny scalonego sterownika silników - A3953
Gdyby jednak to się udało, to uzyskamy odrobinę większą sprawność silnika (brak strat na przemagneso-wanie rdzenia) i możemy regulować obroty opisaną wcześniej metodą PWM. Do celów przemysłowych uży-
wa się czasem silników uniwersalnych, przewidzianych do pracy przy napięciu 320 VDC (wyprostowane napięcie sieci) lub 550 VDC (wyprostowane napięcie trójfazowe). Jacek Przepiórkowski
Elektronika Praktyczna 12/2003
89
KURS
Programowe interpretery poleceń w C
Na początek konwersja typów
Niektórzy z Czytelników z całą pewnością zetknęli się z językiem programowania Pascal oraz specyficznym typem zmiennych tzw. typem proceduralnym. W dużym uproszczeniu polegał on na tym, że odwołanie do zmiennej miało podobne konsekwencje jak wywołania procedury. Kompilator języka C nie oferuje podobnego typu zmiennych, a momentami byłby on bardzo przydatny. Ot chociażby do konstrukcji opisywanego w poprzedniej części kursu interaktywnego menu - wybranie w nim opcji mogłoby bezpośrednio powodować uruchomienie odpowiadającej jej funkcji. Realizacja tak pojętego typu proceduralnego jest możliwa dzięki wykorzystaniu wskaźników oraz mechanizmów przekształceń typów.
Na list. 1 umieściłem fragment programu wraz z definicjami odpowiednich typów zmiennych. Jako pierwszy zdefiniowano typ zmiennej będącej wskaźnikiem typu char, kwalifikowanym do przestrzeni adresowej zawierającej kod programu mikrokon-trolera [code). Za wskaźnikiem występuje lista argumentów, która w tym przypadku jest pusta. Następnie ten typ wykorzystywany jest do budowy tablicy zawierającej wykaz funkcji. Tablica również zakwalifikowana została do obszaru code, ponieważ zawiera wartości stałe, nieulegające zmianie w czasie wykonywania programu. Rozmiar tablicy - wykazu funkcji - nie jest ustalony. Jej koniec sygnalizuje znak o kodzie "0". Dla przykładu i dla uproszczenia funkcja command pokazana na list. 1, zwraca wartość umieszczoną w tablicy pod indeksem 0. Zgodnie z wcześniejszą definicją odpowiada to wskaza-
List. 1. Fragment programu z definicjami zmiennych -wskaźników do funkcji
//struktura na definicje komend
typedef struct
{
char (code *funkcja) (void) ;
}komendy;
//tablica z wykazem komend code komendy wykaz[] = {
test_l,
test_2,
char command() {
return(wykaz[0] .funkcja ());
Urządzenia wykonawcze podłączane do sterowników stosowane są w technice bardzo szeroko - począwszy od prostych sterowników typu włącz-wyłącz, skończywszy na bardzo skomplikowanych, umożliwiających regulację proporcjonalną. Najczęściej to wymagania aplikacji wyznaczają budowę układu wykonawczego i sposób jego sterowania.
W artykule przedstawię sposób wykorzystania języka C do b udowy prostego interpretera poleceń wysyłanych przez interfejs szeregowy, za pomocą których można będzie sterować pracą dowolnego układu wykonawczego.
niu adresu, pod którym umieszczona jest funkcja o nazwie test_l.
Funkcja zawarta w definicji struktury musi zwracać jakąś wartość. Najłatwiej, gdy jest to wartość typu char, którą można później wykorzystać do sygnalizacji np. błędów realizacji poleceń, jednak może to być również inny typ zmiennych. Jest to wymóg konieczny dla późniejszej realizacji polecenia return(wykaz[in-deks].funkcja()), ponieważ polecenie return nie może zwracać wartości typu void oraz z powodów, o których będzie mowa dalej. Funkcja command powinna być tego samego typu, jak określono to w definicji struktury. Oczywiście powinna, a nie musi. Jeśli typy będą różne, to nastąpi niejawna konwersja typu zwracanej wartości.
Przyjrzyjmy się teraz programowi pokazanemu na list. 2. Zawiera on fragment programu odpowiadający funkcji command po kompilacji do postaci języka asembler. Fragment ten opatrzyłem komentarzami w taki sposób, aby osoby niemające do czynienia z asemblerem, mogły zrozumieć, jak działa mechanizm wywołujący funkcję znajdującą się pod wskazywa-
nym adresem w pamięci programu. Kompilator wykonując konwersję wskaźnika do postaci char, wywołuje ukrywającą się pod wskazaniem funkcję. Jest to konieczne, aby funkcja zwróciła wartość, która będzie mogła ulec zamianie na typ char. A to, że funkcja umieszczona jest na liście i możliwe jest odwołanie do konkretnej pozycji tejże listy, tylko ułatwia realizację zadania postawionego jako cel artykułu - realizację implementacji interpretera poleceń.
Dla praktyków - przykład 1
Wykorzystując opisany wyżej mechanizm, wykonałem prosty interpreter poleceń odbieranych przez mikro-kontroler z wykorzystaniem sprzętowego interfejsu UART. Jako układ modelowy posłużyła mi płytka prototypowa z mikrokontrolerem AT89S8252 taktowanym zegarem 7,3728 MHz. Na płytce znalazł się również układ dopasowujący stany logiczne na wyprowadzeniach UART mikrokontrolera do portu szeregowego komputera PC -standardowy MAX232. Wykonując programy przykładowe, posługiwałem się kompilatorem RC-51 firmy Raiso-
Ust. 2. Polecenie return(wykaz(O),funkcja()) po kompilacji
0000 900000 R M0V DPTR,#wykaZ do rejestru DPTR młodszy bajt adresu funkcji z
tablicy wykaz
0003 7400 M0V A,#00 akumulator jako wartość indeksu do tablicy - tu 0
0005 93 M0VC A,@A+DPTR załaduj do akumulatora bajt spod adresu wykaz+0
0006 FA M0V R2 ,A przechowaj pobraną wartość w rej estrze R2
0007 900000 R M0V DPTR,#wykaZ ponownie do DPTR adres tablicy wykaz
0 0 0A 7401 M0V A,#l ale indeks tablicy w tym przypadku to 1
oooc 93 M0VC A,@A+DPTR do akumulatora starszy bajt adresu funkcj i
z tablicy wykaz+1
000D FB M0V R3,A przechowaj jego wartość w rejestrze R3
000E 8A83 M0V DPH,R2 przepisz R2 do rejestru DPH (starszy bajt DPTR)
0010 8B82 M0V DPL,R3 przepisz R3 do rejestru DPL (młodszy bajt DPTR)
0012 120000 R LCALL ?C_IHDCALL iwywołaj wewnętrzną procedurę RC-51 uruchamiającą
funkcję spod adresu wskazywanego przez DPTR
0015 22 RET powrót do programu głównego
Elektronika Praktyczna 12/2003
91
KURS
Ust. 3. Deklaracje zmiennych oraz łinclude interpretera poleceń z przykładu 1
#pragma DEFJ(TIMl_INIT=OxFE) //timer 1 jako prędkość transmisji (19200bps)
//dla rezonatora ll,0592MHz THl=0xFD; dla 7,3728MHz THl=0xFE #pragma SMALL //wybór modelu pamięci programu
#include "reg825 2.h" //dołączenie definicji rejestrów
#include "stdio.h" //dołączenie funkcj i wej ścia - wyj ścia
#define WORD unsigned int //definicja typu WORD
//definicje nagłówków funkcj i programu
char in(char data *bufor);
char out(char data *bufor);
char status(char data *bufor);
char on(char data *bufor);
char off(char data *bufor);
char help(char data *bufor);
//definicja typu dla tablicy - wykazu poleceń
typedef struct
{
char code *komenda;
char (code *funkcja)(char data *);
}komendy;
//tablica z wykazem poleceń
code komendy wykaz[] =
{
"IN", in,
"OUT", out,
"STATUS", status,
"ON", on,
"OFF", off,
"HELP", help,
"?", help,
"", HULL
//wykaz komend i powiązanych z nimi funkcj i
//koniec wykazu
Interpreter wykonuje następujące polecenia:
- INnp. IN 1 - odczyt portu o podanym numerze
- OUTnp. OUT 1 0x20 - zapisuje do portu o podanym numerze liczbę,
- STATUS - podaje informację o statusie urządzenia: WYŁĄCZONY/AKTYWNY,
- ON - załączenie operacji na portach, tj. poleceń IN i OUT,
- OFF - wyłączenie operacji na portach, tj. blokowanie funkcjonowania poleceń IN i OUT,
- HELP lub ? - informacja o obsługiwanych poleceniach.
Polecenia mogą być przesyłane przez aplikację sterującą lub podawane ręcznie za pomocą programu typu terminal znakowy. Każde wysyłane polecenie musi kończyć się sekwencją 0x0D-0x0A (CR-LF).
Na list. 3 pokazano najważniejsze fragmenty programu źródłowego w języku C zawierające deklaracje zmiennych i stałych oraz dyrektywy sterujące kompilacją.
Początek to właściwe dla RC-51 polecenie ttpragma DEFJ(TIMl_INIT=OxFE) definiujące wartość zapisywaną do rejestru THl Timera 1 sterującego pracą UART. Dla rezonatora 7,3728 MHz oraz podwójnej szybkości zegara sterującego pracą interfejsu szeregowego (SMOD = 1) zapis do THl wartości 0xFE wymusza transmisję szeregową asynchroniczną z prędkością 19200 bd. W następnej kolejności dołączane są definicje rejestrów mikrokontrole-ra, biblioteka funkcji wejścia-wyjścia oraz dla czytelności programu zdefi-
niowany zostaje typ WORD. W kolejnym kroku definiowane są nagłówki funkcji będących odpowiednikami poleceń realizowanych przez interpreter. Zdefiniowanie ich w tym miejscu jest konieczne, ponieważ za moment nazwy funkcji będą użyte do konstrukcji tablicy-wykazu poleceń.
Definicja struktury o nazwie komendy zawiera więcej składników niż we wcześniejszym przykładzie. Obok znanego nam już wskaźnika do funkcji pojawił się również wskaźnik do łańcucha znaków umieszczonego w pamięci programu mikrokontrolera. Jest to nazwa, po której rozpoznawane są polecenia i jednocześnie najprostsza z metod powiązania nazwy symbolicznej z odpowiadającą mu funkcją. Dla łatwiejszej analizy przykładu nazwy funkcji są niemal identyczne z odpowiadającymi im poleceniami.
Na list. 4 znajduje się fragment programu rozpoznający polecenie oraz wywołujący odpowiadającą mu funkcję. Posłużyłem się w nim konstrukcją z pierwszego przykładu, z tym że polecenie return zawiera dynamicznie wyznaczany indeks do funkcji. Dwie zmienne ;' oraz i służą (odpowiednio) jako indeksy do poszczególnych liter przekazywanego jako argument funkcji ciągu znaków oraz poszczególnych linii tablicy - wykazu poleceń. Funkcja XOR (A) służy do sprawdzenia warunku równości znaków, a bitowe AND (&) maskuje bity odpowiadające małym literom alfabetu. Dzięki temu wielkość znaków (liter) odebranych z UART nie wpływa na interpretację polecenia.
W przypadku, gdy komenda nie zostanie odnaleziona w wykazie, wartość indeksu ;' będzie równa 0 i posłuży do wysłania komunikatu o błędzie. W innym przypadku zwracany jest wskaźnik do funkcji, którego przekształcenie do typu char owocuje wywołaniem funkcji.
Główna pętla programu zawiera tylko kilka poleceń: rezerwuje miejsce w pamięci na bufor odebranych z UART znaków, ustawia bit SMOD w rejestrze PCON mikrokontrolera, wysyła znak zachęty do terminala (znak >), wywołuje funkcję gets pobierającą ciąg znaków ze standardowego urządzenia wejścia - wyjścia (dla mikrokontrolera jest to UART), a następnie przekazuje wskaźnik do bufora opisywanej wyżej funkcji com-mand rozpoznającej odebrane polecenia. Każdorazowo zakończenie realizacji komendy sygnalizowane jest napisem OK wysłanym przez mikrokon-troler do terminala.
Dla praktyków - przykład 2
Kolejny przykład bazuje na poznanych już wcześniej. Ilustruje on jednak jeden z możliwych sposobów dołączenia zdalnego wyświetlacza sterowanego przez mikro kontroler. Dla uproszczenia funkcji sterujących użyłem wyświetlacza LCD 4 linie x 20 znaków, jednak można sobie wyobrazić zastosowanie dowolnego wyświetlacza, na przykład dołączonej do mikrokontrolera tablicy pokazującej wyniki na meczu piłkarskim, dołączonego zdalnie wyświetlacza zegara itp.
Przykładowy interpreter realizuje następujące polecenia:
- CURSORnp. CURSOR 1 -zmiana wyglądu kursora, wartość powinna się zawierać w przedziale od 0 do 2 (0 = kursor wyłączony, 1 - kursor włączony, 2 -kursor włączony i migotanie na polu kursora)
- CLR - czyszczenie ekranu LCD,
- GOTOXYnp. GOTOXY 1 1 - umieszczenie kursora na pozycji (kolumna, wiersz),
- WRITEnp. WRITE Driver LCD 4x20 - wyświetlenie tekstu podanego jako parametr wywołania; uwaga: tekst nie może być dłuższy niż rozmiar bufora - 7 (w tym przypadku są to 34 znaki),
- CWRITEnp. CWRITE 0x01 -wyświetlenie znaku o kodzie ,
- FILLnp. FILL 0x01 - wypełnienie LCD znakami o kodzie ,
- DEF.. - definicja własnego znaku użytkownika np.: DEF 0x00 0xAA 0x55 0xAA 0x55 0xAA 0x55 0xAA 0x55 umieści definicję "kratki" w generatorze znaków LCD na pozycji numer 0,
92
Elektronika Praktyczna 12/2003
KURS
Ust. 4. Fragment programu odpowiedzialny za rozpoznawanie odbieranych poleceń
//wyszukiwanie komend oraz wywołanie odpowiadających im funkcj i char command(char data *bufor)
char i, 3 ;
for (i = 0; ; )
for (j = 0; ;
//256 komend o maks. długości 256 znaków
if(wykaz[i].komenda[j] != 0) //jeśli komenda różna od znaku "pustego" { //do porównania zamiana małych liter na duże
if(((wykaz[i] .komenda[j]Abufor[j] ) & 0x5F) == 0) {
D+ + ;
continue; //następny znak }
i + + ;
break; //następna komenda
}
if( 3 == 0 ) {
printf("%s\n","BLAD: Nie rozpoznano komendy!") ; //brak komendy
//W wykazie return(0);
} else return (wykaz[i] .funkcja (bufor + j)); //wykonanie funkcj i spod //wskazanego adresu
- INIT - inicjalizacja wyświetlacza w trybie interfejsu o długości słowa równej 4 bity,
- STATUS - podaje informację o statusie WYŁĄCZONY/AKTYWNY,
- ON - załączenie akceptowania poleceń przez kontroler LCD,
- OFF - wyłączenie akceptowania poleceń przez kontroler LCD,
- HELP lub ? - informacja o realizowanych poleceniach.
Program funkcjonuje identycznie jak poprzedni, różnią się one między sobą tylko liczbą realizowanych funkcji. Ten pierwszy będzie się nadawał szczególnie dobrze do sterowania urządzeń typu włącz-wyłącz, drugi realizuje także nieco bardziej zaawansowane funkcje. Do jego implementacji wykorzystałem opisywaną we wcześniejszych odcinkach kursu bibliotekę LCD4B. Została ona dołączona do pliku projektu, a nagłówki funkcji sterujących wyświetlaczem umieszczane są w programie głównym za pomocą dyrektywy ttinclude "Icd4b.h".
Program główny, oprócz omawianych wcześniej poleceń, zawiera również wywołanie funkcji inicjalizacji oraz czyszczenia ekranu modułu LCD. Użycie wymienionego na liście realizowanych poleceń INIT nie jest konieczne. Zostało ono wprowadzone na wypadek sytuacji awaryjnej.
Uwagi końcowe
Jak wspomniałem wcześniej, do wykonania programów demonstracyjnych posłużył kompilator firmy Rai-sonance RC-51. Niestety powstający w wyniku kompilacji kod przekracza 4 kB i dlatego też nie można posłużyć się wersją demonstracyjną "wprost". Bardzo dużo miejsca w pamięci programu zajmuje zwłaszcza implementacja funkcji printf i scanf wywoływanych wielokrotnie przez różne funkcje. Ta pierwsza formatuje i przesyła ciąg znaków przez UART, ta druga odbiera, odczytuje i przekształca znaki odebrane z UART na zmienne zgodnie z podanym wzorcem. Zamiast RC-51 można również
posłużyć się innym kompilatorem C. W takim przypadku polecenie ustawiające prędkość transmisji UART może wyglądać jak niżej:
void main() {
SCON = 0x50;
TMOD = 0x20;
SMOD = 1;
TH1 = 0xFE;
TLI = -1;
TRI = 1 ;
Polecenia wysyłane przez np. program hyper terminal są odbierane za pomocą zdefiniowanej przez producenta pakietu funkcji gets(). Wymaga ona, aby każdy przesłany ciąg znaków zakończony był przez sekwencję CR-LF. Niestety większość programów typu terminal wysyła na końcu linii CR nie dbając o LF. Tak też jest w przypadku hyper terminala, który to musi mieć ustawioną opcję dodawania LF na końcu linii. Należy w nim ustawić parametr Wyślij końce wierszy ze znakiem wysu wu wiersza [Plik> Właściwości, zakładka Ustawienia>Ustawie-nia ASCII). Oczywiście można również zaimplementować inną, własną funkcję działającą jak gets().
Port UART mikrokontrolera pracuje z szybkością 19200 bd. Tę samą należy wybrać w nastawach portu COM komputera PC o ile to właśnie on używany jest do przesyłania poleceń (19200, n, 8, 1). Funkcja gets() odsyła echo wysyłanych poleceń, toteż są one widoczne na ekranie terminala.
Prezentowane wyżej przykłady programów źródłowych to tylko zachęta do samodzielnego eksperymentowania. Oczywiście mają one pewną wartość użytkową, jednak bardziej służą do wskazania możliwości niż do budowy gotowego urządzenia mającego konkretne zastosowanie. Jacek Bogusz, EP jacek.bogusz@ep.com.pl
Elektronika Praktyczna 12/2003
93
BASCOMOWE PORADY
W bascomowym "kąciku" będziemy się starać w miarę przystępnie przedstawiać rozwiązania problemów napotykanych przez naszych Czytelników podczas pisania programów w Bascomie. Rubryka ta powstała z myślą o rozwiązywaniu problemów, jakie najczęściej napotykają programiści, zatem zachęcamy wszystkich Czytelników do zgłaszania problemów, na jakie się natknęli podczas tworzenia własnych programów.
Timery - to nie musi być trudne, część 1
Większość współczesnych mikro-kontrolerów jest wyposażona w co najmniej jeden licznik-timer. Mikro-kontrolery AVR w większości przypadków mają ich dwa. Pierwszy jest zazwyczaj prostym timerem 8-bitowym, natomiast drugi to 16-bi-towy timer z dodatkowymi funkcjami: compare (porównania), capture (przećhwytywania) oraz z możliwością generowania sygnałów PWM. W artykule szczegółowo opiszemy na przykładach sposób użycia time-rów 0 oraz 1 występujących w większości mikro kontroler ów AVR. Należy mieć na uwadze, że by móc dobrze stosować timery należy znać ich budowę w wykorzystywanym mi kr o kontroler ze oraz ich działanie. W każdym z mikro kontroler ów AVR funkcje timer ów mogą się różnić.
Na początek kilka słów wstępu. Moduły licznikowe w mikrokontrole-rach AVR mogą pracować w dwóch podstawowych trybach: jako timer (czasomierz) oraz jako counter (licznik). Początkujący programiści najwięcej problemów mają najczęściej problemy z określeniem, co ile czasu wywołane będzie przerwanie, a w związku z tym jaki dokładnie będzie odmierzony czas przy określonych nastawach modułów licznikowych. Występuje tu współzależność trzech parametrów:
- częstotliwości oscylatora (najczęściej kwarcu),
- konfiguracji preskalera (timery zawarte w mikrokontrolerach posiadają preskaler, dzięki któremu
możliwe jest zmniejszenie częstotliwości taktującej), - wartości początkowej załadowanej do rejestru timera.
W Bascomie TimerO można skonfigurować instrukcją config timerO. Składnia tej instrukcji jest następująca:
W trybie czasomierza:
CONFIG TIMERO = COUNTER, EDGE = RISING I FALLING
W trybie licznika:
CONFIG TIMERO = TIMER, PRESCALE = 1 I 8 I 64 I 256 I 1024
Kiedy TimerO jest skonfigurowany do pracy w charakterze licznika (parametr TIMER0= COUNTER) wtedy należy określić parametr EDGE. Określa on czy licznik będzie zwiększany wraz z pojawieniem się narastającego zbocza sygnału [RISING) lub opadającego [FALLING). Gdy TimerO jest skonfigurowany do pracy w charakterze czasomierza (parametr TIMERO=TIMER) wtedy zamiast parametru EDGE należy określić parametr PRESCALE, który wyznacza współczynnik podziału częstotliwości sygnału zegarowego.
Każdy moduł licznikowy w mikrokontrolerach AVR może być w dowolnej chwili zatrzymany instrukcją STOP TIMERx. Ponowne uruchomienie licznika nastąpi po wykonaniu instrukcji START TIMERx. Każdy z timerów może zgłaszać przerwania. W przypadku TimeraO przerwanie jest zgłaszana jedynie po jego przepełnieniu. Przerwanie to można wykorzystać do odmierzania dość
+5
o
C1
27p C2
Hh
27p
|8MHz
PC5(ADC5/SC) PC4(ADC4/SD) PC3(ADC3) PC2(ADC2) PC1(ADC1) PC0(ADC0)
GND AREF AVCC
(RST}PC6
(RXD)PD0
CTXD}PD1
(IMT0)PD2
(IWT1)PD3
(XCKA"0)PD4
VCC GND
(XT1/0S1)PB6
(XT2/0S2)PB7
(SCK}PB5
(T1)PD5 (MIS0JPB4
(AIN0)PD6 (M0SI/0C2)PB3 (AIN1)PD7 (SS/0C1B)PB2 (ICPJPBO (0C1A)PB1
28 7
+5V
O
Rys. 1
ATMEGA8
dokładnych jednostek czasowych. Dzięki temu można timery oraz generowane przez nie przerwania wykorzystać do budowy zegarów lub innych zadań, dla których precyzyjne odmierzanie czasu ma znaczenie priorytetowe (np. multipleksowania wyświetlaczy np. LED czy matrycowych).
Aby zilustrować działanie pracy timerów, na rys. 1 przedstawiono schemat prostego systemu z dołączonym do mikrokontrolera (do wyjścia PBl) diodą LED. Część przykładów w dalszej części tego artykułu będzie powodować włączanie i wyłączanie diody LED, co odmierzony przez timery czas.
Na list. 1 przestawiono przykład odmierzania przez TimerO w przerwaniu 1-sekundowych odcinków czasu. Przedstawiony program powoduje zmianę stanu na wyjściu sterującym diodę LED dokładnie co 1 sekundę. W tym przykładzie TimerO skonfigurowano jako czasomierz z ustawionym preskalerem na podział przez 64, czyli licznik będzie zliczał impulsy o częstotliwości 8 MHz/64 = 125 kHz. Aby uzyskać częstotliwość 1 Hz należy pobielić częstotliwość 125 kHz przez 250, następnie przez 500. Wartości te umożliwiają podział częstotliwości 125 kHz bez żadnych części ułamkowych, co gwarantuje odmierzenie dokładnego czasu. Ponieważ licznik TimerO jest 8-bitowy (liczy od 0 do 255), tak więc by liczył do 250 (przerwanie było wywoływane co 250 odliczonych impulsów) należy skrócić jego cykl, poprzez załadowanie do niego po każdym przepełnieniu wartość 6. Aby odliczyć 1 sekundę należy wprowadzić dodatkową zmienną, która będzie liczyć przerwania od przepełnienia TimerO. Zliczenie 500 takich przerwań będzie oznaczać odliczenie dokładnie 1 sekundy. Wartość początkową do timeraO można załadować instrukcją: TIMERO = wartość lub instrukcją COUNTERO = wartość
gdzie wartość to liczba od której timer zlicza "w górę". Przykładowo polecenie TIMERO = 16 spowoduje
Elektronika Praktyczna 12/2003
95
BASCOMOWE PORADY
List. 1. Przykład obsługi Timera Odo odmierzania 1-sekundowych odcinków czasu
1 Przykład programu odmierzającego 1 sekundowe odcinki czasu z wykorzystaniem timerO 'TimerO będzie odmierzał dokładnie 1 sekundę 8MHz/64/250/500 = 1 sekunda
$regfile = "m8def.dat1 $crystal = 8000000
1 rej estry mikrokontrolera atmega8
1 częstotliwość taktowania mikrokontrolera
Config Pinb.l = Output 'linia pbl jako wyj ście
Config TimerO = Timer, Prescale = 64 'deklaracja timera jako czasomierza 'z prescalerem 64
1 deklaracja jaka etykieta obsługuje 'przepełnienie od timerO
~)n TimerO Przerwań i e_co_2ms
Led Alias Portb . 1
Dim Licznik As Integer
Enable Enable Interrupts TimerO
TimerO = 6
Licznik = 0
Do Loop End
Przerwanie_co_2ms: wywoływanego co 2 ms
CounterO = CounterO + 6
Incr Licznik
If Licznik = 500 Then
Toggle Led Licznik = 0 End If Return
'alias dla wyjścia b.l 'zmienna licznikowa
'odblokowanie globalnych przerwań
'odblokowanie przerwania od przepełnienia timerO
'Wpisanie wartości początkowej 6 do timera, 'czyli timer będzie zliczał 250 (256-6) impulsów 'wyzerowanie zmiennej licznikowej
'pętla główna programu
'koniec programu
'podprogram przerwania od przepełnienia timerO
'ustawienie początkowej wartości timeraO poprzez
'dodanie do niego wartości 6 (odliczone zostanie
'dokładnie kolejne 250 impulsów)
'zwiększenie licznika
'jeśli zmienna licznik równa się 500 (czyli
'odliczone zostało 500*2ms=lsek), to
'zmień na przeciwny stan wyjścia led
'wyzeruj zmienną licznik
'powrót z przerwania
odliczenie 256-16=240 taktów. Obie składnie instrukcji działają podobnie. W Bascom AVR występuje także instrukcja:
LOAD TIMERX = wartość
W tym przypadku wartość oznacza liczbę impulsów jakie timer zliczy do przepełnienia. Instrukcja ta wykonuje operację matematyczną (dla TimeraO jest to 256-wartośó) oraz ładuje obliczona wartość do rejestru timera. Jeżeli potrzebne jest odliczenie 240 impulsów to instrukcja ta załaduje do timera wartość 16 (256-240). Jak widać za pomocą tej instrukcji można bezpośrednio podać liczbę impulsów które ma zliczyć licznik. Oczywiście instrukcja ta występuje dla wszystkich timerów, a x oznacza numer timera. Przy większych wartościach preskalera - np. 1024 - trudno będzie dobrać odpowiednią wartość początkową tak, żeby uzyskać "okrągły" odstęp czasowy. Tak więc, ustawiona wartość podziału preskalera przez 64 i początkowa wartość timera 6 spowodują, że przerwania będą wywoływane dokładnie co 2 ms. Tak więc zliczenie 500 takich przerwań da jedną sekundę. W programie pokazanym na list. 1 zmienna licznik użyta została do zliczania przerwań od przepełnienia TimeraO. W każdym przerwaniu od przepełnienia TimeraO należy za-
ładować do niego wartość początkowa, dzięki czemu za każdym razem zostanie odliczone 250 impulsów. W programie wartość początkowa wpisywana do rejestru TimeraO nie została wprost załadowana lecz dodana. Umożliwia to odmierzanie dokładnych czasów. W przypadku załadowania w przerwaniu wartości początkowej do TimeraO należałoby
uwzględnić czas jaki upłynął od zgłoszenia przerwania do chwili jego obsługi, gdyż TimerO pracuje cały czas. Wtedy, w celu zwiększenia dokładności, do rejestru timera należałoby załadować wartość inną niż 6. Obliczenie dokładnej wartości ładowanej zmiennej może być trudne, a dodanie wartości początkowej zamiast jej przypisania doskonale rozwiązuje ten problem. W programie z list. 1, gdy zmienna "licznik" osiągnie wartość 500 (odliczenie 1 sekundy) jest ona zerowana oraz zmieniany jest na przeciwny stan wyjścia sterującego diodę LED.
W przypadku korzystaniu z przerwań należy obowiązkowo w programie odblokować przerwania globalne oraz przerwanie uż ywane. W przypadku przerwania od przepełnienia TimeraO będzie to instrukcja ENABLE TIMERO.
Bardziej rozbudowany niż TimerO, a co za tym idzie oferujący większą liczbę funkcji jest Timerl, który jest licznikiem 16-bitowym (zlicza do 65536 impulsów). Ma on także dodatkowe funkcje i związane z nimi dodatkowe przerwania. Składnia instrukcji konfigurującej Timerl jest następująca:
W trybie licznika:
CONFIG TIMER1 = COUNTER, EDGE = RISING I FALLING, NOICE CANCEL = 0 I 1 , CAPTURE EDGE = RISING I FALLING, COMPARE A = SET I CLEAR I TOGGLE I DISCONNECT, COMPARE B = SET I CLEAR I TOGGLE I DISCONNECT, CLEAR TIMER =011
List. 2. Przykład odmierzania czasu 1 sekundy przez Timerl
1 Przykład programu odmierzającego 1 sekundowe odcinki czasu z wykorzystaniem timerl 'Timerl będzie odmierzał dokładnie 1 sekundę 8MHz/256/31250 = 1 sekunda 'Wartość 31250 wynika z 65536-342 86 - czyli zostanie odliczonych 31250 impulsów 'do przerwania
$regfile = "m8def.dat' $crystal = 8000000
1 rej estry mikrokontrolera atmega8
'częstotliwość taktowania mikrokontrolera
Config Pinb.l=Output 'linia pbl jako wyj ście
Config Timerl = Timer, Prescale =256 ' deklaracja timera 1 jako czasomierza
' z prescalerem 64
'deklaracja przerwania od przepełnienia timera 1
On Timerl Przerwańie_co_lsek
'aliasy Led Alias Portb.1
Enable Interrupts Enable Timerl
Timerl = 34286
Do
Loop
End
Przerwańie_co_lsek:
Timerl = Timerl + 34286
Toggle Led Return
' dioda obrazuje wywołanie przerwania
'Wpisanie wartości 34286 do timera 'pętla główna programu 'koniec programu
'podprogram przerwania od przepełnienia timerl
'wywoływanego co 1 sekundę
'ustawienie początkowej wartości timeral poprzez 'dodanie do niego wartości 34286 (odliczone 'zostanie dokładnie kolejne 65536-34286 = 31250 'impulsów) 'ustawienie początkowej wartości timera
'zmień na przeciwny stan wyj scia LED
'powrót z przerwania
96
Elektronika Praktyczna 12/2003
BASCOMOWE PORADY
W trybie czasomierza:
CONFIG TIMER1 = TIMER, PRESCALE =
1
256 I 1024, CAPTURE
EDGE = RISING I FALLING, COMPARE A
= SET
CLEAR
TOGGLE
DISCONNECT, COMPARE B = SET I CLEAR I TOGGLE I DISCONNECT, CLEAR TIMER = 011
W trybie generatora PWM:
CONFIG TIMER1 = PWM, PWM =8191 10, COMPARE A PWM = CLEAR UP I CLEAR DOWN I DISCONNECT, COMPARE B PWM = CLEAR UP I CLEAR DOWN I DISCONNECT
Dla Timeral można skonfigurować następujące parametry: EDGE - ma takie samo znaczenie
jak w przypadku TimeraO. CAPTURE EDGE - można określić czy zawartość licznika ma być przećhwytywana do rejestru CAP-TUREl wraz z narastającym (RISING) lub opadającym zboczem (FALLING) sygnału pojawiającego się na końcówce ICP (lub też na wyjściu komparatora analogowego). NOICE CANCEL - Można określić czy licznik ma być odporny na drobne zakłócenia sygnału wejściowego. Wpisanie 1 włącza ta opcję. CLEAR TIMER - Wpisanie "1" włącza funkcję automatycznego kasowania zawartości licznika jeśli porównanie zawartości licznika z rejestrem COMPARElA lub COMPARE1B dało wynik pozytywny.
PRESCALE - ma takie samo znaczenie jak dla TimerO. COMPAREx - określa tryb pracy rejestrów COMPARElA lub COM-PARE1B. SET - końcówka OClx zostanie
ustawiona w stan wysoki. CLEAR - końcówka OClx zostanie
ustawiona w stan niski. TOGGLE - stan końcówki OClx zostanie zmieniony na przeciwny. DISCONNECT - stan końcówki
OClx nie będzie zmieniany. PWM - określa rozdzielczość generatora w bitach. Możliwe są wartości 8, 9 i 10 bitów. COMPARE A PWM, COMPARE B PWM - określa tryb pracy generatora PWM.
CLEAR DOWN włącza tryb normalny - im mniejsza liczba w rejestrze COMPARElx tym krócej trwa stan wysoki na wyjściu impulsów PWM.
CLEAR UP włącza tryb odwrócony - im mniejsza liczba w rejestrze COMPARElx tym krócej trwa stan niski na wyjściu impulsów PWM. Podanie DISCONNECT powoduje, że odpowiednia końcówka OClA lub OClB - przestanie być wyjściem impulsów PWM.
Jak wspomniano, timery w mikro kontroler ach AVR mogą się różnić i nie wszystkie mi kr o kontrolery posiadają rejestr COMPARElB licznika TIMERl. Wykorzystanie Timerl
jako czasomierza umożliwi bezpośrednie odmierzenia czasu 1 sekundy bez udziału dodatkowej zmiennej ze względu na jego 16 bitową pojemność. Na list. 2 przedstawiono przykładowy program odmierzający 1 sekundę z wykorzystaniem Timeral.
Program ten robi to samo co poprzedni, czyli zapala i gasi co sekundę diodę LED. W tym przykładzie częstotliwość rezonatora jest dzielona (przez preskaler) przez 25 6, natomiast Timerl do wywołania przerwania zlicza 31250 impulsów. Czyli przerwanie od przepełnienia Timeral będzie wywoływane co 8 MHz/256/3125 = 1 czyli co 1 sekundę. W tym programie dla zwiększenia dokładności odmierzanego czasu wartość początkowa jest dodawana do stanu licznika a nie wpisywana bezpośrednio.
Na koniec opisu funkcji czasomierza jedna praktyczna uwaga: nie należy przesadzać z częstotliwością wywoływania przerwania, czyli należy - o ile jest to możliwe - korzystać z najwyższych współczynników podziału częstotliwości przez preskaler. Jest to istotne, by obsługa przerwania nie zajęła całej mocy obliczeniowej mi kr o kontroler a. Marcin Wiązania marcin.wiazania@ep.com.pl Artur Starz artur.starz@ep.com.pl
Elektronika Praktyczna 12/2003
97
KURS
Podstawy projektowania systemów mikroprocesorowych, część 10
Budując urządzenie wykorzystujące mikrokontroler, musimy pomyśleć również o pewnej liczbie elementów współpracujących, które realizują potrzebne nam funkcje. W niektórych sytuacjach wystarczające staje się sięgnięcie do zasobów sprzętowych wykorzystywanego mikrokontrolera, co jest bardzo korzystne zarówno ze względów komplikacji i niezawodności urządzenia, jak i jego ceny.
Chociaż omawiane modele mikro-kontrolerów '51 to jedne z uboższych reprezentantów tej rodziny, to często ich możliwości wystarczają zupełnie do zrealizowania całego urządzenia bez dodatkowych układów peryferyjnych. Szczegółowe opisy funkcjonowania układów peryferyjnych wbudowanych w mikrokontroler znajdzie Czytelnik w specyfikacjach producenta, tutaj przedstawimy pracę tych układów w najczęściej wykorzystywanych przypadkach.
Komunikacja szeregowa
W związku z ogromnym rozpowszechnieniem się komputerów klasy PC, budowane obecnie systemy mikroprocesorowe mają zazwyczaj możliwość komunikacji z komputerem nadrzędnym. Czasami zachodzi też konieczność współpracy kilku komunikujących się mikro kontroler ów. W takich wypadkach najczęściej wykorzystuje się transmisję szeregową z wykorzystaniem wbudowanego w większości mikrokontroler ów '51 układu transmisji szeregowej. Wykorzystanie takiego, a nie innego środka komunikacji ma tę zaletę, że realizacja transmisji szeregowej jest obsługiwana sprzętowo - odpada zatem konieczność pisania odpowiednich procedur obsługi, a co za tym idzie nie musimy rezerwować odpowiedniej mocy obliczeniowej procesora na obsłużenie transmisji.
W przypadku mikrokontrolerów rodziny '51 najczęściej wykorzystuje się układ transmisji szeregowej skonfigurowany do pracy w trybie 1. Tak zaprogramowany port szeregowy pracuje asynchronicznie, wykorzystując
^r do nadawania linię TxD, a do odbioru linię RxD. Dane transmitowane są w standardowym formacie 10-bitowym (bit startu - 0, osiem bitów danych, bit stopu - 1). Jeżeli żadne dane nie są przesyłane, to obydwie linie pozostają w stanie wysokim. Prędkość transmisji jest ustawiana programowo poprzez odpowiednie zaprogramowanie licznika Tl - należy zatem zwrócić uwagę na częstotliwość taktowania mikro-kontrolera, gdyż nie zawsze będzie można uzyskać standardowe prędkości transmisji. W przypadku urządzeń wykorzystujących transmisję szeregową najczęściej wykorzystuje się częstotliwość kwarcu równą 11,0592 MHz pozwalającą na uzyskanie większości standardowych prędkości do 5 7600 bd. Dla układu licznikowego Tl wykorzystywanego w trybie 2 (automatyczne przeładowywanie) zawartość rejestru THl (wartość licznika po przeładowaniu) można wyznaczyć z zależności (dla podanej częstotliwości kwarcu): THl =2 56-23300/V (dla bitu SMOD=0, V -prędkość transmisji w bodach) lub THl=256-57600/V (dla SMOD=1). Bit SMOD (rejestr PC ON) jest bitem konfiguracyjnym układu transmisji szeregowej obsługującym blokadę wewnętrznego dzielnika przez dwa częstotliwości określającej szybkość transmisji. W tab. 1 przedstawiono wartości przeładowania licznika Tl w zależności od oczekiwanej prędkości transmisji.
Do programowej obsługi układu transmisji s z er ego w ej wy kor zy sty wa -ne są rejestry: SCON - służący do konfiguracji i obsługi transmisji oraz SBUF - będący jednobajtowym buforem nadajnika i odbiornika. Dodatkowo wykorzystywany jest też omówiony wcześniej bit SMOD rejestru PCON. Znaczenie i położenie bitów
sterujących rejestru SCON można znaleźć w specyfikacji 8051. Nas interesować tutaj będą jedynie bity: SM0 i SMl - decydujące o trybie pracy - dla trybu 1 będą ustawione odpowiednio na 0 i 1. REN - bit włączający (dla REN=1) odbiornik układu transmisji szeregowej. RI - bit ustawiany sprzętowo na
1 po odebraniu bajtu. Tl - bit ustawiany sprzętowo na 1 po zakończeniu nadawania bajtu. Programowa realizacja wysłania czy odebrania bajtu z układu transmisji szeregowej jest niezmiernie prosta. Polega ona jedynie na odpowiednim skonfigurowaniu portu oraz sprawdzaniu stanu bitów RI i Tl. Przy odbiorze danych należy sprawdzać stan bitu RI i w przypadku pojawienia się stanu 1 należy odczytać odebraną informację z rejestru SBUF oraz wyzerować bit RI. W miarę bezzwłoczny odczyt odebranego bajtu jest konieczny ze względu na możliwość zamazania jego zawartości przez kolejny odebrany bajt (na odczyt mamy w najgorszym przypadku czas równy czasowi transmisji całego bajtu). W przypadku nadawania wystarczy zapisać daną do transmisji do rejestru SBUF - proces transmisji szeregowej rozpocznie się
Tab. 1
prędkość THl dla THl dla
transmisji w bodach SMOD=0 SMOD=1
120 16
150 64 -
300 160 64
600 208 160
1200 232 208
2400 244 232
4800 250 244
9600 253 250
19200 - 253
20600 255 254
57600 - 255
98
Elektronika Praktyczna 12/2003
KURS
TTL
TxD 11
RxD
12
T1IN MAX232 T1OUT
R10UT R1IN
CU-
CI-C2+
C2-
C4
Rys. 34 1M
automatycznie. Po zakończeniu transmisji zostanie ustawiony bit TI, którego sprawdzanie pozwala na stwierdzenie gotowości układu do transmisji kolejnej danej. Po programowym wyzerowaniu TI można do SBUF wpisać kolejną daną do przesłania (zerowanie TI nie jest konieczne do rozpoczęcia kolejnej transmisji, umożliwi nam jednak określenie chwili jej zakończenia). W mi kr o kontroler ach '51 ustawienie bitów RI lub TI może również być źródłem przerwania, jednak brak jest sprzętowej możliwości rozstrzygnięcia, który bit wywołał przerwanie (trzeba to sprawdzić programowo na początku procedury obsługi przerwania, również programowo trzeba wy-zerować dany bit przed opuszczeniem procedury obsługi przerwania). Na list. 13 pokazano prosty program przeznaczony do odbioru dwubajto-wych paczek danych.
Każdy z dwóch odebranych bajtów zostaje zapamiętany w odrębnej komórce pamięci. Do rozstrzygnięcia, który bajt jest odbierany, wykorzystywana jest zmienna bitowa BYLI ustawiana w chwili odebrania pierwszego bajtu i zerowana po odebraniu drugiego. Program ten mógłby zostać napisany tak, aby bezpośrednio po odebraniu pierwszego bajtu oczekiwać na nadejście kolejnego, jednak należy pamiętać o tym, że prędkość transmisji zawsze będzie dużo niższa od prędkości wykonywania programu, więc takie bezczynne oczekiwanie jest bezcelowe i marnuje moc obliczeniową mikrokontrolera.
Drugi przedstawiony program (list. 14) jest kompletnym oprogramowa-
14
RxD
RS232
TxD
C5 1M
niem przeznaczonym dla prostego układu testera portu RS-232. Realizuje on bardzo prosty algorytm polegający na odsyłaniu odebranego bajtu i pozwalający w ten sposób sprawdzić działanie komunikacji pomiędzy urządzeniami. Po włączeniu zasilania następuje wysłanie przez układ transmisji szeregowej tekstu "OK". Transmisja odbywa się z prędkością 57600 (dla kwarcu 11,0592 MHz).
Przy wykorzystywaniu portu szeregowego do połączenia z komputerem PC należy pamiętać, że standard RS-232 wykorzystuje inne po-
ziomy napięć niż stosowany przez mi kr o kontrolery standard TTL. W celu połączenia konieczne staje się wykorzystanie dodatkowego układu zapewniającego konwersję. Można do tego wykorzystać różne metody, począwszy od tranzystorów i bramek CMOS, jednak obecnie najczęściej wykorzystuje się scalony konwerter poziomów MAX23 2 (lub zamiennik), który ma tę ogromną zaletę, że zasilany standardowym napięciem +5V sam troszczy się o wytworzenie napięcia dodatniego i ujemnego zgodnego ze standardem RS-232 oraz jest stosunkowo tani i łatwo dostępny. Schemat takiego konwertera pokazano na rys. 34. Niekiedy do uzyskania komunikacji mikrokontrolera z komputerem PC należy zadbać o połączenie ze sobą od strony złącza RS-232 PC-ta wyprowadzeń RTS-CTS oraz DTR-DSR-DCD (rys. 35), informujących komputer o gotowości mikrokontrolera do odbioru/ nadawania danych (układ transmisji szeregowej '51 nie jest wyposażony w funkcję sprzętowego blokowania transmisji - transmisja może być kontrolowana jedynie na drodze programowej) . Oczywiście należy również zadbać o ustawienie identycznej prędkości transmisji, gdyż w przeciwnym wypadku prawidłowy przesył danych nie będzie możliwy. Jeżeli transmisja szeregowa będzie wykorzystywana do komunikacji pomiędzy dwoma mikro kontrole-
List. 13
i Konfiguracja
M0V TMOD,#020H i licznik TI w trybie 2
M0V PCON,#080H i ustawienie bitu SM0D = l w rej. PCON
M0V TLI,#250
M0V THl,#250 i prędkość transmisj i 9600
CLR SM0 i ustawienie
SETB SM1 ;trybu pracy 1
CLR RI i wyzerowanie flagi
SETB TRI i Włączenie licznika TI
SETB REN i Włączenie odbiornika
CLR BYLI ;wyzerowanie flagi odbioru bajtu 1
;Podprogram obsłuc i odbioru
ODBIERZ:
JB RI,JEST1 i sprawdzenie czy nadeszła dana
RET ;i powrót do programu głównego jeśli nie
JEST1:
CLR RI i wyzerowanie flagi
JB BYL1,JEST2 ;sprawdzenie czy wcześniej odebrano pierwszy bajt,
ijeśli tak to skok do odbioru bajtu 2
SETB BYLI i ustawienie flagi odbioru pierwszego bajtu
M0V PIERWSZY,SBUF i zapamiętanie zawartości bufora w komórce pamięci
;zadeklarowanej jako PIERWSZY
RET i powrót do programu głównego
JEST2:
CLR BYLI ;wyzerowanie flagi (następny będzie bajt pierwszy)
M0V DRUGI,SBUF i zapamiętanie drugiego odebranego bajtu
RET ;powrót do programu głównego
Elektronika Praktyczna 12/2003
99
KURS
rami, wówczas sposób ich połączenia zależny jest od odległości łączącego je przewodu. Jeżeli ograniczymy się do połączenia nie dłuższego niż 1...2m (zwłaszcza przy niskich prędkościach, nieprzekracza-jących 9600 bd), możemy wtedy pozostać przy standardzie TTL i bezpośrednio połączyć pomiędzy sobą wyprowadzenia RxD i TxD mikrokontrolerów (RxD jednego z TxD drugiego) oraz połączyć masy obu urządzeń. Dodatkowo należy zastosować rezystory podciągające te linie do Vcc o rezystancji 1...2kO ze względu na konieczność szybszego przeładowania stosunkowo dużej pojemności przewodu połączeniowego. Jeżeli odległość będzie większa, to nic nie stoi na przeszkodzie, aby zastosować dwa identyczne układy konwertera omówionego wyżej. Dla dużo większych odległości (powyżej 20 m) może stać się konieczne zastosowanie innego standardu - może to być np. RS-485 lub inny wykorzystujący magistralę symetryczną. Paweł Hadam, EP pawel.hadam@ep.com.pl
List. 14 ;;Program testujący i;Konfiguracja MOV TMOD,#020H port szeregowy i licznik TI w trybie 2
MOV PCON,#080H MOV TLI,#255 MOV TH1,#255 i ustawienie bitu SMOD = 1 w rej. PCON i prędkość transmisj i 57 600
CLR SMO SETB SM1 i ustawienie ;trybu pracy 1
CLR RI SETB TI SETB TRI iWyzerowanie flagi (nic nie odebrano) i ustawienie flagi (gotowy do nadawania) i Włączenie licznika TI
SETB REN i Włączenie odbiornika
i;Transmisja "OK"
MOV SBUF,#79 CLR TI JHB TI,$ MOV SBUF,#75 CLR TI iWysłanie kodu ASCII znaku "0" i wyzerowanie flagi i oczekiwanie na zakończenie transmisji i poprzedniego baj tu iWysłanie kodu ASCII znaku "K" i wyzerowanie flagi
i;Pętla główna
PĘTLA:
JHB RI,$ i sprawdzanie czy odebrano bajt, jeśli nie, to czekaj
CLR RI i wyzerowanie flagi
MOV R7,SBUF JHB TI,$ i zapamiętanie danej w rejestrze iczekaj, jeśli jeszcze nadaje
MOV SBUF,R7 CLR TI i nadanie zapamiętanej danej i wyzerowanie flagi
SJMP PĘTLA i skok na początek
100
Elektronika Praktyczna 12/2003
g';M'"l'"n'li
HIIHIKlffil ~
leiliiiiiiiiiimi
Wyszukiwarka
Podobne podstrony:
elektronika praktyczna 2003 2
elektronika praktyczna 2002
elektronika praktyczna 2000
elektronika praktyczna 1998
elektronika praktyczna 2002 2
elektronika praktyczna 2000 2
Elektronika Praktyczna W głośnikowym żywiole Cz 04
elektronika praktyczna 09 1997
elektronika praktyczna 08 1997
Elektronika Praktyczna 1997 02
elektronika praktyczna 1998 2
elektronika praktyczna 10 1997
elektronika praktyczna 2001
więcej podobnych podstron