Archiwa autora: Daria

Język C – operacje bitowe

Operacje bitowe

  • negacja bitowa (NOT)(„~”)

not

 

 

 

  • koniunkcja bitowa (AND)(„&”)

and

 

 

 

 

  • alternatywa bitowa (OR)(„|”)

or

 

 

 

  • alternatywa rozłączna (XOR)(„^”)

xor

 

 

 

Przesunięcie bitowe

  • w lewo („<<„) – przemieszczenie bitów argumentu w lewo o określoną liczbę miejsc
  • w prawo („>>”) – przemieszczenie bitów argumentu w prawo o określoną liczbę miejsc

 

Lekcja 18: Dwuprzyciskowy sterownik diod LED

Na tej lekcji chce Wam zaproponować ciekawy układ dzięki któremu po naciśnięciu jednego z przycisków zapali się określona dioda. Układ zbudujemy na tranzystorach npn i pnp.

Ryc. 1 Schemat 2-przyciskowego sterownika diod LED.

Ryc. 1 Schemat 2-przyciskowego sterownika diod LED.

Jeśli dokładnie przyjrzycie się schematowi zapewne zauważycie, że składa się on z 2 identycznych części. Potraficie prześledzić kierunek przepływu prądu? Co stanie się po naciśnięciu przycisku S1 – spróbujcie określić to sami, a potem zerknijcie poniżej aby sprawdzić czy mieliście rację :)

Ryc. 2 Schemat przedstawiający przepływ prądu (czerwona linia) po naciśnięciu przycisku S1.

Ryc. 2 Schemat przedstawiający przepływ prądu (czerwona linia) po naciśnięciu przycisku S1.

Po naciśnięciu przycisku S1 prąd dopływający do bazy tranzystora T1 włączy go, to dość oczywiste, ale co z rezystorami? Jak je dobrać? Zacznijmy od rezystora R3. Przyjmijmy, że prąd I3 to 6mA. Najważniejsze przy doborze elementów w tym konkretnym naszym obwodzie jest aby niczego nie uszkodzić. Tranzystory mają pracować w dwóch stanach: nasyconym i zatkania.

I3 = UZAS – Uce / R3, gdzie Uce w czasie nasycenia będzie bliskie 0 zatem wartość w naszych  obliczeniach pomijamy

R3 = UZAS / I3 = 6V / 0,006A = 1kΩ

Przyjmę, że współczynnik wzmocnienia BC548B  ok β = 300

IbT1 = I3 / βT1 = 0,006A / 300 = 0,00002A = 20µA

R1 = (UZAS – Ube) / (10 x IbT1) = (6V – 0,7V) / (10 x 20µA) = 26500Ω ≈ 26kΩ (użyję 2 rezystorów 10kΩ)

R2 = Ube / (10 x IbT1) = 0,7V / 200µA = 3,5kΩ (użyję rezystorów 2,2kΩ i 1kΩ)

Prąd przepływający przez tranzystor T1 włącza tranzystor T2. Uwaga! Zwróć uwagę na to, że tranzystor T1 to tranzystor npn, a tranzystor T2 to tranzystor pnp – prąd IbT2 płynie od tranzystora T2 w kierunku T1. Z uwagi na ten różny kierunek przepływu prądu w obliczeniach powinniśmy używać znaku „+” i „-„, ale to trochę zmniejszy ich czytelność, przez co świadomie zdecydowałam się je pominąć.

Wróćmy do obliczeń przyjmując, że współczynnik wzmocnienia BC557B β = 300, a prąd IT2 = 50mA:

IbT2 = IT2 / β = 0,05A / 300 = 166µA

R4 = UZAS / IbT2 = 6V / 166µA ≈ 36kΩ (użyję rezystora 47k)

R11 = UZAS /  IbT2 = 6V / 166µA ≈ 36kΩ (użyję rezystora 47k)

Po złożeniu na płytce stykowej mój układ wygląda tak:

img_0114

Ryc. 3 Zdjęcie obwodu złożonego na płytce stykowej zgodnie ze schematem z ryc. 1.

a tak działa:

Ryc. 4 Po zwarciu przełącznika S1 (tu zastąpionego zworką) świeci się dioda żółta.

Ryc. 4 Po zwarciu przełącznika S1 (tu zastąpionego zworką) świeci się dioda żółta.

Ryc. 5 Po zwarciu przełącznika S2 (tu zastąpionego zworką) świeci się dioda czerwona.

Ryc. 5 Po zwarciu przełącznika S2 (tu zastąpionego zworką) świeci się dioda czerwona.

Na początku napisałam, że układ jest ciekawy, a widzicie że chodzi tylko o zapalenie diody… No i dlaczego jest on taki skomplikowany, jest tyle tranzystorów… Otóż, ten układ można wykorzystać podczas konstruowania robota! Wystarczy diodę zastąpić silnikiem, a uzyskamy sterownik, dzięki któremu robot może jeździć do przodu – po naciśnięciu jednego z przycisków, i do tyłu – po naciśnięciu drugiego przycisku. Zauważcie, że prąd przepływający przez pierwszy tranzystor (∼6mA) jest dużo mniejszy od tego przepływającego przez kolejny tranzystor (∼50mA), w ten sposób możemy małym prądem sterować silnikiem przez który przepływa duży prąd. Na sam koniec odpowiem co się stanie po naciśnięciu dwóch przycisków naraz. W obwodzie będzie płynął prąd zwarcia, którego wartość zależna będzie od doboru elementów.

Lekcja 17: Tester baterii

Wzmacniaczowi operacyjnemu LM358 poświęciłam lekcję 11. Dziś wykorzystamy go do zbudowania ciekawego układu – prostego testera baterii.

d1

Ryc. 1 Schemat prostego testera baterii.

Układ zasilany jest napięciem 12V. Za koszykami baterii znajduje się stabilizator napięcia, dzięki któremu do układu LM358 dociera napięcie 5V. Przypominam, że nóżka 3 to tzw. wejście nieodwracające We(+), a nóżka 2 to wejście odwracające We(-). Jeśli napięcie na We(+) > We(-) na wyjściu otrzymamy napięcie zbliżone do dostarczonego do wzmacniacza napięcia zasilania, a czerwona dioda LED zaświeci. W przeciwnym razie, tzn. gdy We(+) ≤ We(-) na wyjściu otrzymamy napięcie bliskie 0V, dioda nie zaświeci.

Nóżkę 3 wzmacniacza będziemy łączyć z jednym z biegunów baterii. Druga nóżka przez potencjometr 10kΩ łączy się z masą i plusem zasilania.  Rezystor 1MΩ jak i kondensator 100nF zapobiegają wzbudzaniu układu. Złóżcie układ na płytce stykowej,

zmontowany_uklad

Ryc.2. Widok zmontowanego układu

a następnie tak ustawcie pokrętło potencjometru, aby napięcie na woltomierzu wskazało 1,45V (ryc.3). Czemu taka wartość? Będziemy badać baterie-paluszki o napięciu znamionowym 1,5V. Gdy są nowe ich napięcie wynosi ok. 1,6V, gdy są  rozładowane ich napięcie wynosi np 1,17V lub mniej. Napięcie 1,45V oznacza, że bateria jeszcze się do czegoś nadaje, może nie do urządzeń typu aparat fotograficzny, ale do pilota do telewizora jak najbardziej :)

pomiar_ref_1_45V

Ryc. 3. Widok pomiarów napięcia na potencjometrze pomiędzy masą a środkową nóżką potencjometru.

pomiar_sprawnej_baterii

Ryc. 4. Pomiar sprawnej baterii, dioda LED świeci.

Jeśli do układu podłączymy dobrą, nową baterię napięcie na We(+) będzie wynosić np. 1,6V i będzie większe od napięcia na We(-), które wynosić będzie 1,45V. We(+) > We(-) więc dioda się zaświeci. W naszym przypadku znaleźliśmy baterię lekko rozładowaną, która ma napięcie 1,57V patrz ryc. 5

bat_1_57V

Ryc. 5. Pomiar baterii nadającej się jeszcze do użytku.

Jeśli do układu podłączymy zużytą baterię napięcie na We(+) będzie wynosić np. 1,17V, i będzie mniejsze od napięcia na We(-), które wynosić będzie 1,45V. We(+) < We(-) więc dioda się nie zaświeci.

slaba_bateria_1_17V

Ryc.6. Pomiar rozładowanej baterii.

Teraz nieco zmodyfikujemy nasz obwód dodając do niego przekaźnik.

przekazniki

Ryc. 7 Przekaźniki elektromagnetyczne: a) na 12V, b) na 5V.

Przekaźnik jest to element mechaniczny i zarazem elektryczny, który wewnątrz posiada przełączane styki (elementy łączeniowe) jak również cewkę, która wytwarza pole magnetyczne.

W swoich zestawach podzespołów możecie znaleźć przekaźnik elektromagnetyczny. Jest to typ przekaźnika, który działa jak elektromagnes. Prąd przepływający przez cewkę przekaźnika (nawinięte zwoje drutu nawojowego) powoduje wytwarzanie pola magnetycznego, które przyciąga żelazną kotwiczkę, co z kolei powoduje zamknięcie lub otwarcie odpowiednich styków. Na ryc 8. pokazano najprostszy przykład przekaźnika pokazujący jego ideę działania. W naszym przypadku żelazna kotwica jest zarazem jednym ze styków przez, który może płynąć prąd.

zasada dzial przek

Ryc. 8 Schemat działania przekaźnika elektromagnetycznego.

W zależności od tego jaki posiadasz przekaźnik: na 5V (ryc. 7b) czy na 12V (ryc. 7a)  lub inny, złóż na płytce stykowej odpowiednio obwód z ryc. 10a lub 10b. W moim układzie zastosowałam przekaźnik  HFD 23 na napięcie 12V.

hfd23_12v

Ryc. 9. Widok przekaźnika HFD23 na napięcie 12V.

Jak sprawdzić przekaźnik, którego nie znamy a chcemy się  dowiedzieć,  które wyprowadzenia do czego służą?

Bardzo pomocny w tym zadaniu będzie nasz multimetr. Ustawmy go na pomiar rezystancji na zakres np 2k om, a następnie przykładajmy sondy do poszczególnych par nóżek przekaźnika, sprawdzając jaka będzie rezystancja między nimi. W ten sposób musimy odnaleźć parę nóżek między którymi rezystancja będzie największa (np. powyżej 2 omów) oraz parę nóżek między którymi rezystancja będzie najmniejsza (rzędu 1 – 2 oma (w rzeczywistości zwarte styki przekaźnika mają rezystancję znacznie mniejszą ale nasze multimetry kiepsko sobie radzą z pomiarem małych rezystancji)).

Duża rezystancja  będzie świadczyć o tym, że znaleźliśmy cewkę, która wytwarza pole magnetyczne. Jeżeli przyłożymy napięcie do wyprowadzeń o dużej rezystancji to przez cewkę popłynie prąd zaś styki, w zależności od rodzaju przekaźnika:

  • zewrą się – taki styk przekaźnika określa się mianem normal open (normalnie otwarty, gdy nie przykładamy do cewki napięcia, styki są otwarte, nie mają ze sobą połączenia, a multimetr nic nie pokaże) – tego typu przekaźników będziemy używać,
  • rozewrą się – taki typ styków przekaźnika określa się mianem normal conection (normalnie zwarte, gdy nie przykładamy do cewki napięcia, styki są zwarte).

Mała rezystancja będzie oznaczać, że znaleźliśmy zwarte styki przekaźnika. W przypadku przekaźników typu normal open między dwoma nóżkami nie będzie w ogóle rezystancji, ponieważ gdy przez przekaźnik nie przepływa prąd pozostają one rozwarte (nie mają ze sobą połączenia).

 

d2

Ryc. 10. Schemat obwodu z przekaźnikiem: a) na 5V, b) na 12V.

zmontowany_uklad_z_przekaznikiem

Ryc. 11. Widok zmontowanego układu wraz z przekaźnikiem i dodatkową diodą LED w obwodzie styków przekaźnika.

Jeśli napięcie dopływające do wejścia nieodwracającego LM358 będzie większe od tego na wejściu odwracającym, czyli We(+) > We(-) na wyjściu otrzymamy napięcie, które spowoduje przepływ prądu w obwodzie bazy i tym samym załączy tranzystor. Przez cewkę przekaźnika i przez tranzystor (w obwodzie kolektor-emiter) zacznie płynąć prąd, który  wytworzy pole magnetyczne, a to z kolei spowoduje zamknięcie styku i przepływ prądu przez diodę LED.

Jeśli napięcie na wejściach wzmacniacza ulegnie zmianie i We(+) ≤ We(-) na wyjściu otrzymamy napięcie bliskie zeru, które będzie zbyt niskie, aby wymusić przepływ prądu w obwodzie bazy – tranzystor będzie wyłączony. W konsekwencji przez przekaźnik także przestanie płynąć prąd… ale na rdzeniu na, którym nawinięta jest cewka pozostanie zmagazynowana energia która musi gdzieś zostać oddana! Dlatego właśnie w obwodzie blisko cewki przekaźnika znajduje się dioda szybka 1N4148, która zewrze przekaźnik do plusa. Gdybyśmy zapomnieli o tej diodzie projektując nasz układ (a jest to dość częsty błąd początkujących elektroników) energia z rdzenia przekaźnika spowoduje powstanie wysokiego napięcia na zaciskach cewki co spowoduje uszkodzenie tranzystora!

Po co stosuje się przekaźniki? Wyobraźmy sobie pralkę (lub jakiekolwiek inne urządzenie) podłączone do sieci zasilającej ~230V. Tak wysokie napięcie jest potrzebne do zasilenia np. silnika obracającego bębnem pralki, ale zupełnie nie nadaje się do zasilania programatora, który wymaga znacznie niższego napięcia. Dzięki przekaźnikowi niewielki prąd płynący od programatora pralki o napięciu powiedzmy 12V załącza silnik zasilany 230V.

pralka

Ryc. 12 Schematyczny rysunek przedstawiający sposób załączania silnika obracającego bębnem pralki przy pomocy niewielkiego prądu płynącego z programatora.

Abstrahując od naszego dzisiejszego tematu w schemacie z pralką pojawiły się dwa nowe oznaczenia podzespołów na schemacie:

prostownik

mostek prostowniczy (mówiliśmy o nich na lekcji 7 – jest to po prostu inny jego zapis)

transformator

transformator

Transformator przenosi energię elektryczną drogą indukcji z jednego obwodu elektrycznego do drugiego. Prąd przemienny płynący po stronie pierwotnej transformatora powoduje zmianę prądu płynącego po wtórnej stronie transformatora. Oznacza to, że zmiany pola magnetycznego w obwodzie elektrycznym przez który przepływa prąd zmienny powoduje powstanie siły elektromotorycznej. Transformator jest często wykorzystywany (tak jak w przykładzie z pralką) do zmiany napięcia  sieci ~230V na niskie napięcie potrzebne do zasilenia urządzenia elektronicznego np ~12V.

        W układach sieci zasilającej (sieci energetyki zasilającej nasze domy, mieszkania oraz zakłady pracy) również stosowane są transformatory. Mogą one obniżać  napięcie  np z 15kV na 230V lub podwyższać np z 15kV  na 110kV itp. Idąc ulicą można zauważyć wysokie słupy z długimi przewodami (tzw linie napowietrzne) w zależności od budowy takiego słupa można wywnioskować jakie napięcie na nich występuje. W żadnym wypadku nie można dotykać słupów ani na nie wchodzić gdyż grozi to porażeniem prądem. W szczególnych przypadkach nawet  przebywanie blisko linii napowietrznej może stanowić zagrożenie życia. Tak może się zdarzyć np jadąc traktorem po polu gdzie bardzo nisko jest zawieszona linia napowietrzna. Dlaczego?

Dość ciekawą dla nas informacją może być fakt, że  wytrzymałość izolacji pomiędzy dwoma przewodnikami (np. drutami bez izolacji) w przestrzeni powietrznej wynosi ok 1000V na 1mm odległości. Oznacza to, że zbliżając do siebie dwa przewodniki na odległość mniejszą od  1mm po przyłożeniu napięcia 1000V może nastąpić wyładowanie (przeskok iskry). Jeżeli natomiast odległość jest większa przeskok iskry nie powinien wystąpić (wszystko jeszcze zależy od wilgotności powietrza, zanieczyszczenia elektrod itd). Powyższa informacja jest bardzo ważna gdyż związana jest z naszym bezpieczeństwem  – nie zawsze trzeba dotknąć bezpośrednio przewodu będącego pod napięciem aby zostać porażonym prądem. Porażenie prądem może nastąpić z większej odległości.

Lekcja 16: NE555 – generator

Dziś przyjrzymy się bliżej bardzo ciekawemu i popularnemu układowi NE555.

Na tej lekcji wykorzystamy go do budowy generatora przebiegu prostokątnego. Podobny generator budowaliśmy już na lekcji 12 z układu CD40106. Teraz nasze zadanie jest o tyle łatwiejsze, że wystarczy otworzyć notę katalogową układu (dostępną tutaj) i sprawdzić co na ten temat mówi producent.

W rozdziale „Application information” znajdziemy przykłady wykorzystania tego układu. Na tej lekcji zbudujemy generator na podstawie danych zawartych w podrozdziale „Astable operation”.

Schemat 13 na stronie 7 pokazuje jak należy poprawnie podłączyć układ.

ryc1

Ryc. 1. Schemat ideowy układu generatora na NE555 zaczerpnięty z karty katalogowej producenta.

Napięcie jakie należy doprowadzić do układu ma mieścić się w przedziale od 5 do 15V. Nasze szeregowo połączone koszyki baterii  dają napięcie 12V. Dodatkowo aby mieć stabilną wartość napięcia zasilającego układ  wykorzystamy stabilizator napięcia +5V.

Mój schemat układu wygląda następująco:

ryc2

Ryc 2. Schemat ideowy układu generatora zbudowanego w oparciu o układ NE555

Przyjrzyjmy się zasadzie działania układu.

Kondensator C jest ładowany przez prąd przepływający przez rezystory RA i RB. Gdy się naładuje, 7 nóżka układu NE555 zostaje zwarta do masy (na schemacie przedstawiającym budowę wewnętrzną NE555 widać, że jest ona połączona do masy za pomocą tranzystora), i to właśnie

ryc3b

Ryc. 3. Schemat ideowy wnętrza układu NE555

przez nią następuje rozładowanie kondensatora C. Gdy rozładuje się on do pewnego poziomu prąd przestaje płynąć przez nóżkę 7 NE555 i znów kondensator ładuje się przez prąd przepływający przez rezystory RA i RB.

Cykl ładowania i rozładowywania kondensatora C wpływa na przebieg napięcia jakie otrzymujemy na wyjściu (nóżka 3), co obrazuje schemat 14 noty katalogowej:

ryc5

Ryc. 4. Przebieg napięcia wyjściowego oraz napięcia na kondensatorze

Gdy kondensator się naładuje na wyjściu układu NE555 otrzymujemy napięcie, które powoduje przepływ prądu przez tranzystor BC547B oraz przepływ prądu przez diodę LED, a tym samym jej świecenie. Podczas rozładowywania kondensatora na wyjściu napięcie ok 0V zatem  tranzystor jak i dioda pozostają wyłączone.

Zasada działania naszego układu obrazują poniższe schematy:

ryc4

Ryc. 5. Schematy ideowe przedstawiające przepływ prądu w wybranych punktach obwodu podczas a) ładowania; b) rozładowywania kondensatora C.

Jak dobrać wartości poszczególnych podzespołów w naszym układzie? Zacznijmy od rezystora Rd. Załóżmy, że spadek napięcia na diodzie LED to 2V, a natężenie przepływającego przez nią prądu to 20mA.

Rd = (Vcc – Ud) / Id

Rd = (5V – 2V) / 20mA

Rd = 150Ω

Zanim przejdziecie do obliczenia rezystancji Rb zmierzcie współczynnik wzmocnienia. U mnie wynosi on 330.

Ib = Ic / β

Ib = 20mA / 330

Ib = 60μA

Rb = Vcc / Ib

Rb = 5V / 60μA

Rb = 83kΩ

Dobieramy dostępny w naszym zestawie rezystor o wartości Rb = 100kΩ. Prąd kolektora minimalnie się zmieni (zmniejszy się) jednak nie przeszkadza to w właściwym działaniu układu i dioda LED nadal pozostanie dobrze widoczna.

Jak dobrać rezystory RA i RB? Pomoże nam w tym nota katalogowa – pod schematem naszego układu (figure 13) znajdziemy takie oto wzory:

- na częstotliwość otrzymywanego na wyjściu przebiegu prostokątnego:

f = 1 / T = 1,44 / (RA + RB) C

- na czas ładowania kondensatora C (w tym czasie na wyjściu sygnał jest wysoki)

tH = 0,693 (RA + RB) C

- na czas rozładowywania kondensatora C (w tym czasie na wyjściu jest niski)

tL = 0,693 (RB) C

Skoro znamy wzory, trzeba przyjąć pewne założenia: kondensator C będzie miał pojemność 100uF, będzie się ładował 4 sekundy, a rozładowywał w ciągu 1 sekundy.

tL = 0,693 (RB) C

1s = 0,693 x RB x 0,0001F

RB = 1s / (0,693 x 0,0001F)

RB = 14430Ω

tH = 0,693 (RA + RB) C

4s = 0,693 (RA + 14430Ω) 0,0001F

RA = 43290Ω

W miejsce RA przyjmiemy rezystory: 47kΩ, , a w miejsce RB rezystory: 10kΩ, 4,7kΩ.

Częstotliwość otrzymanego na wyjściu układu NE555 przebiegu prostokątnego:

f = 1,44 / (RA + RB) C

f = 1,44 / (47kΩ + 14,7kΩ) 0,0001F

f = 0,18Hz

A oto mój układ na płytce stykowej.

ne555_foto_pcb_blog

Ryc. 6. Widok zmontowanego układu na płytce stykowej

Dodatkowo dołączam link do przydatnego prostego programu, który parametry układu  obliczy za nas. Należy jedynie podać wartości czasów jakie nas interesują aby układ generował impulsy według naszych potrzeb. Można  również zadać wartości rezystancji a obliczone zostaną czasy impulsów oraz częstotliwość. Program dodatkowo oblicza elementy potrzebne do  obwodu z tranzystorem można go ściągnąć tu

program_Ne555_screen

Ryc. 7. Zrzut ekranu z programu do obliczania elementów do układu NE555

Program jest bardzo prosty w obsłudze, wystarczy wpisać wartości w odpowiednie pola a otrzymamy wynik. Warto podczas wpisywania wartości pamiętać aby nie wprowadzać np liter gdyż program w obecnej wersji nie jest zabezpieczony na taką ewentualność. Wpisanie litery spowoduje błąd, który wyłączy program.

Objaśnienia instrukcji użytych w lekcji 1

W tym miejscu chciałam Wam wyjaśnić pewne kwestie, które są niezbędne do pełnego zrozumienia lekcji 1 dot. programowania. Postanowiłam ująć to w osobnym poście, aby nie wprowadzać zbyt wielu informacji na początek w obawie, że pierwsza lekcja stałaby się zbyt skomplikowana.

We „wstępie…” pisałam, że oprócz podstaw elektroniki do nauki programowania będzie Wam potrzebna znajomość systemów liczbowych, o których pisałam tutaj. Teraz nieco rozwinę tą kwestię wyjaśniając zapis:

DDRD |= 1<<0;

Jak już wiemy rejestr DDRD określa czy nóżki należące do portu D mają być wejściami czy wyjściami.

piny atmegi8 z rejestrami

Nóżek ATmegi8 należących do portu D jest 8, są to nóżki: PD0, PD1, PD2, PD3, PD4, PD5, PD6, PD7 (na schemacie powyżej są one oznaczone kolorem niebieskim).

Domyślnie wszystkie nóżki mikrokontrolera są wejściami, co możemy zapisać w ten sposób:

DDRD = 0b00000000

(0b to specyficzne dla kompilatora AVR-GCC oznaczenie, które niejako tłumaczy mikrokontrolerowi, że oto teraz użyjemy liczby zapisanej w postaci binarnej)

Każde z zer występujących po przedrostku „0b” oznacza inną nóżkę portu D. Zero leżące maksymalnie po prawej stronie oznacza nóżkę PD0, a zero maksymalnie po lewej nóżkę PD7.

dod1

W lekcji pierwszej programowania diodę LED podłączaliśmy pod nóżkę drugą ATmegi8, oznaczoną jako nóżka PD0. Dlatego zależało nam, aby nóżka PD0 była wyjściem, a nie wejściem. W tym celu wystarczy zmienić odpowiednie zero na jedynkę:

DDRD = 0b00000001

W tym miejscu możecie zarzucić mi, że przecież w lekcji 1 programowania nie stosowaliśmy takiego zapisu! To prawda, zapisaliśmy to w ten sposób:

DDRD |= 1<<0;

Skąd taki zapis? W tak prostym i krótkim programie jak nasz, może rzeczywiście łatwiej i prościej byłoby użyć „DDRD = 0b00000001″, ale celowo użyłam „trudniejszego” zapisu, ponieważ jest on bardziej przydatny podczas pisania dłuższych, skomplikowanych programów, a poza tym „prostszego” zapisu „nie rozumieją” inne kompilatory oprócz AVR-GCC. Dlatego wydaje mi się, że lepiej od razu przyzwyczaić się do takiego zapisu.

Teraz wyobraźmy sobie, że jesteśmy w trakcie pisania dłuższego programu, w którym zdefiniowaliśmy już część nóżek należących do portu D, a teraz chcemy tylko zdefiniować nóżkę PD0 jako wyjście. Gdybyśmy użyli zapisu: „DDRD = 0b00000001″ wszystkie zaprogramowane dotychczas nóżki portu D zmieniłyby się w wejścia, a tylko ostatnia nóżka PD0 byłaby wyjściem. Dzieki zapisowi „DDRD |= 1<<0″ nóżka PD0 zmieni się w wyjście, a wszystkie pozostałe nóżki pozostaną niezmienione, niezależnie czy wcześniej zaprogramowaliśmy je jako wejścia, wyjścia czy może, tak jak to ma miejsce w naszym przypadku, pozostawiliśmy je domyślnie wejściami.

Co właściwie oznacza zapis „|= 1<<0″?

Dwa znaki „<<” oznaczają przesunięcie w lewą stronę. W naszym przypadku logiczne „1” przesuwamy o zero miejsc, więc jedynka pozostanie na miejscu ostatnim, czyli oznaczającym nóżkę PD0.

Gdyby w lekcji 1 dioda LED została podłączona np. do nóżki PD2, nasz zapis wyglądałby następująco:

DDRD |=1<<2

Logiczne jeden przesunęłoby się o dwa miejsca i znalazło na trzecim miejscu od prawej (DDRD = 0b00000100).

Ta pionowa kreska „|” oznacza funkcję logiczną OR, czyli sumę. Każemy naszemu programowi dodać te logiczne zera i jedynkę do domyślnych ustawień nóżek rejestru portu D:

dod2

Jak wyglądałby wynik dodawania gdyby zamiast domyślnych ustawień dla portu D, mielibyśmy inne, np. takie: DDRD = 0b10101100?

dod3Jak widzicie w wyniku dodawania poprzednie ustawienia dla portu D nie uległy zmianie za wyjątkiem ostatniej nóżki PD0, która z logicznego zera (wejścia) zmieniła się w logiczne 1 (wyjście).

Na marginesie dodam, że w standardzie w języku C nie ma możliwości zapisania liczby systemem binarnym (wyjątkiem są tu niektóre kompilatory, np. AVR-GCC, które umożliwiają wprowadzenie liczby binarnie z przedrostkiem 0b, np. 0b00000001), ale jak najbardziej można użyć zapisu heksadecymalnego, czyli szesnastkowego. W tym celu taką liczbę należy poprzedzić przedrostkiem „0x”, np. 0x01.

Teraz przyjrzyjmy się bliżej instrukcji wpisanej w pętle „while”:

PORTD |=_BV(PD0);

Znów mamy tu do czynienia z operatorem „|”, czyli sumą, ale co oznacza: „_BV(PD0)”? Otóż „_BV(numer_bitu)” to pomocnicze makro, czyli swoiste polecenie rozumiane przez kompilator. „_BV(numer_bitu) oznacza to samo co omawiane przed chwilą „1<<(numer_bitu)”. Który zapis wybierzecie zależy od Was.

W nawias następujący po „_BV” możecie wpisać zarówno nazwę nóżki mikrokontrolera (PD0) lub odpowiadający jej numer bitu (1), pamiętając, że bity numerujemy odpowiednio: PD0 to bit 1, PD1 to bit 2, …, PD7 to bit 8.

Instrukcja „PORTD |=_BV(PD0)” oznacza, że do domyślnie ustawionych lub zdefiniowanych przez nas wcześniej w programie wartości logicznych na poszczególnych nóżkach mikrokontrolera program ma dodać logiczne 1 do nóżki PD0 (bit 1).

dod4Na nóżce PD0 pojawi się logiczne 1, co spowoduje wyłączenie diody LED.

Kolejna instrukcja zawarta w pętli „while” to:

PORTD &=~_BV(PD0);

Znak „&” to operator oznaczający iloczyn (AND), a „~” to negacja.

Makrodefinicję  „_BV(PD0)” możemy zapisać jako 0b00000001. Po jej zanegowaniu (znak ~ na przedzie) otrzymamy 0b11111110. Operator „&” każe nam to pomnożyć z ustawieniami portu D (wprowadzonymi uprzednio instrukcją „PORTD |=_BV(PD0)”), przez co w konsekwencji otrzymamy 0b00000000.

dod5Na nóżce PD0 pojawi się logiczne 0, co spowoduje włączenie diody LED.

Więcej o operacjach bitowych znajdziecie tutaj.