piątek, 1 czerwca 2012

Mikrokontrolery od strony technicznej, systemy zapisu liczb i operatory logiczne

    
      Język BASCOM nie wymaga od programisty szczególnej znajomości budowy mikroprocesora. Jednak aby móc skutecznie pisać programy należy zapoznać się przynajmniej z podstawami tego zagadnienia. Mikrokontrolery AVR są to procesory 8 bitowe. Oznacza to ,że w jednym cyklu potrafią przetworzyć 8 bitów danych czyli jeden bajt.  Bit jest to najmniejsza jednostka informacji dla mikrokontrolera. Może ona przyjąć stan wysoki (1) lub niski (0).  Cykle w pracy mikrokontrolera generuje rezonator kwarcowy. Każdy z takich generatorów ma określoną częstotliwość np. 8Mhz.  Liczba Mhz oznacza ilość milionów cykli wykonywanej w jednostce czasu ( w tym wypadku sekundzie). Wcześniej wspomniana częstotliwość 8Mhz oznacza ,że kwarc wytwarza 8000000 cykli na sekundę. Czym szybszym  kwarcem dysponuje mikrokontroler tym dokładniej potrafi działać.  Do bezproblemowego działania kwarcu niezbędne są również kondensatory ceramiczne o pojemności rzędu kilkudziesięciu bądź kilkunastu pF (zazwyczaj uC działa także bez tych kondensatorów ja jednak dla bezpieczeństwa stosuje 2x kondensator 15pF) . Jednak istnieje możliwość rezygnacji  z zewnętrznego rezonatora i korzystania z wewnętrznego taktowania (w wypadku attiny2313 domyślnie jest to 1Mhz , można wykorzystać także większe częstotliwości jednak w porównaniu do zewnętrznego kwarcu dokładność wewnętrznego oscylatora pozostawia wiele do życzenia). Wówczas poza kwarcem nie podłączamy także kondensatorów.

Kolejnym zagadnieniem dotyczącym obsługi mikrokontrolera jest funkcja reset, będąca jedną z nóżek naszego procesora. Reset pozwala na natychmiastowe przerwanie działania programu i uruchomienie go od początku. Aby uruchomić funkcje reset należy połączyć nóżkę reset z potencjałem masy. Aby mikrokontroler poprawnie działał jednocześnie nóżka reset powinna być połączona z plusem zasilania za pomocą rezystora o oporze 10kohm. Dodatkowo dla pewności nóżkę reset można połączyć z masą za pomocą kondensatora ceramicznego 10nF. Poprawne połączenie kwarcu wraz z kondensatorami oraz resetu do mikroprocesora przedstawia poniższy rysunek:




Na powyższym schemacie uwzględniłem kondensator filtrujący napięcie - powinien być ceramiczny o pojemności przynajmniej 10nF (najlepiej więcej - nawet do 100nF). Ulokować należy go jak najbliżej zasilania. Jest to bardzo istotne jednak często pomijane przez początkujących. Bez użycia tego kondensatora mikroprocesor może przejawiać dziwne zachowania - np. czasem układ uruchamia się , innym razem nie. Niekiedy występuje efekt "palucha" :) polegający na samoistnym restarcie uC pod wpływem dotknięcia jego obudowy. Wiele osób przygląda się wówczas ze zdziwieniem jak za sprawą dotknięcia czarodziejskiej różdżki układ się wyłącza. Kierunek podłączenia tego rodzaju kondensatora (ceramicznego) jest dowolny.
Ponad to wyżej zamieściłem także rezonator kwarcowy. Podobnie jak kondensator ceramiczny możemy podłączyć go w dowolnym kierunku. Dodatkowo obie nogi kwarcu odciągamy do masy 2 kondensatorami - czasem działa bez tych kondensatorów ale nie warto ryzykować. Dokładna wartość tych kondensatorów zamieszczona jest w nocie katalogowej konkretnego układu (zależy ona od częstotliwości kwarcu i modelu uC). Ja zazwyczaj stosuje ok. 15 pF - nie można użyć zbyt dużych pojemności bo wówczas sygnał z kwarcu będzie "ścianny" i nie dotrze do procesora. Warto wziąść także pod uwagę ,iż procesor taktowany wyższą częstotliwością wymaga większego napięcia zasilania (np. Atmega8A może być zasilana napięciem 2,7v - 5v jednak jeśli użyjemy kwarcu 16Mhz minimalne napięcie zasilania wynosi 4,5v).
Aby zmusić procesor do współpracy z zewnętrznym kwarcem (domyślnie jest wewnętrzny) należy zmienić ustawienie fusebitów - bitów konfiguracyjnych. Można dokonać tego np. za pomocą wcześniej opisanego programu - AVR studio.  Po połączeniu się z programatorem (co opisałem w poprzednim artykule) należy wybrać zakładkę "Fuses" i z rozwijanej listy "SUT_CKSEL" wybrać opcje odpowiednią dla danego kwarcu.


Poniżej przedstawiam wariant z ustawieniem dla zewnętrznego rezonatora 16 Mhz 
Ext.Crystal/Resonator High Freq- oznacza że mówimy o zewnętrznym kwarcu
Start-up time: 16K CK  - oznacza ,że uruchamiamy kwarc o częstotliwości 16Mhz
+ 64ms - oznacza ,że procesor uruchomi się po czasie 64ms od włączenia zasilania. Można ustawić większą szybkość, ale wówczas procesor będzie działać mniej stabilniej. Następnie klikamy "Program".

Przy ustawianiu fusebitów należy zachować ostrożność ponieważ przypadkowe ustawienie jakiegoś innego fusebita może zablokować procesor. Możemy np. wyłączyć wejście RESET co spowoduje uniemożliwienie programowania uC normalnym programatorem. Co więcej jeśli zaprogramujemy dany kwarc ,ale nie podłączymy go ,albo podłączymy inny kwarc (lub np. generator częstotliwości) procesor także nie będzie działać.


Ostatnia kwestia dotyczy odciągnięcia RESETU. Zawsze, nawet gdy go nie używamy należy odciągnąć go rezystorem 10kohm do VCC. Jeśli chcemy w naszym układzie uwzględnić przycisk reset to dodatkowo odciągamy wejście RESET przez ten przycisk do plusa.


Teraz przejdę do omówienia pamięci. Mikroprocesor  posiada jej 3 rodzaje:

Pamięć FLASH W niej zapisywany jest program ,a więc instrukcja działania mikrokontrolera. Pamięć ta ulega zmianie jedynie wówczas ,gdy zdecydujesz się zaprogramować procesor. Podczas zaniku zasilania pamięć FLASH nadal pozostaje niezmieniona.  Jest to pamięć najmniej wytrzymała na przeprogramowanie (zazwyczaj możemy wykonać ok. 1000 przeprogramowań). Informacje w niej zawarte można porównać do BIOSU komputera.

Pamięć RAM (Inna nazwa SRAM)Jest to pamięć w której zapisywane są informacje wybierane przez mikroprocesor na podstawie programu zapisanego w pamięci FLASH (np. wartości zmiennych). Informacje zawarte w pamięci RAM bardzo często ulegają zmianie podczas działania programu a w wyniku zaniku zasilania wszystkie informacje w niej zawarte ulegają utraceniu. Pamięć RAM jest w stanie dużo więcej razy zmieniać zapisane w sobie informacje niż inne rodzaje pamięci.

Pamięć EEPROMPamięć ta zapisuje informacje wybrane przez mikrokontroler na podstawie danych zebranych przez procesor podczas działania programu. Nie ulega ona utracie podczas zaniku napięcia zasilania. Jest bardziej wytrzymała na przeprogramowywanie niż pamięć FLASH ,jednak mniej odporna pod tym względem od pamięci RAM. 

Istotnymi elementami budowy mikroprocesora są także rejestry danych ,czyli tak jakby komórki pamięci procesora. Najważniejszymi rejestrami dla początkującego programisty BASCOMA są porty (w przypadku attiny2313 to portd i portb). Porty składają się z pojedynczych bitów ,których fizycznymi odpowiednikami są określone nóżki mikrokontrolera. Mogą one być wejściami procesora i służyć do zbierania przez niego informacji lub wyjściami w celu generowania sygnału zwrotnego.W bardziej zaawansowanych językach np. assemblerze programiści pisząc program uruchamiają wszystkie rejestry bezpośrednio co wymaga ogromnej wiedzy na ich temat. Pisząc w BASCOM’ie nie musisz się jednak oto martwić ,bo podczas kompilacji program ten zamienia dyrektywy języka na polecenia odpowiedzialne za uruchamianie bądź wyłączanie poszczególnych rejestrów.

Na co dzień używamy dziesiętnego systemu zapisu liczb. Jednak w informatyce znacznie częściej wykorzystuje się dwójkowy system zapisu liczb (tzw. system binarny). Dwójkowy system zapisu liczb musisz dobrze poznać i zrozumieć dlatego też postaram  Ci się go w prosty sposób wytłumaczyć.Przykładem liczby dwójkowej jest np. „1010”.W systemie tym cyfra będąca pierwszą od lewej symbolizuje wartość  1, cyfra stojąca na drugim miejscu od lewej oznacza wartość dwukrotnie większą czyli 2 , trzecia cyfra od lewej wartość  4 , czwarta cyfra od lewej wartość 8 itd. Aby obliczyć wartość liczby zapisanej w systemie zero-jedynkowym należy zsumować wartości miejsc na których zapisane są cyfry 1. A więc pierwsze miejsce od lewej zajmuje cyfra zero czyli wartość przypisaną do tego miejsca należy pominąć, kolejna liczba to 1 dlatego też należy uwzględnić wartość zajmowanego przez nią miejsca ,a więc jest to 2, kolejna cyfra to 0 czyli możemy ją pominąć , a ostatnia cyfra to 1 ,symbolizująca wartość 8. Wartość szukanej liczby to 10 ,bo 2 + 8 =10.

Poniżej przedstawiam dodatkowe przykłady liczb zapisanych w systemie dwójkowym i ich dziesiętne odpowiedniki:
1011 = 11
1111 = 15
11 = 3
1 = 1
0 = 0
10101 = 21
101 =  5
10000000 = 128
10000001 = 129
10000011 = 131

W informatyce często używa się także systemu szesnastkowego w którym do zapisu liczb wykorzystuje się właśnie 16 znaków. Są to cyfry od 0 do 9 i litery od A do F. Na razie znajomość tego systemu nie jest Ci potrzebna. Przykłady liczb zapisanych w systemie szesnastkowym to : AA , 1A , 3 , BF ,9F ,G, 2C , CD , CCC , 659 .

Przy pisaniu programów często będziesz miał do czynienia z operatorami logicznymi. Określają one, w jaki sposób dane warunki muszą zostać spełnione aby zdanie zostało uznane jako prawdziwe. Istnieją cztery podstawowe operatory logiczne. 

AND – Aby zdanie zostało uznane jako prawda oba warunki muszą zostać spełnione.

OR – Aby zdanie zostało uznane jako prawda przynajmniej jeden warunek musi zostać spełniony

XOR – Aby zdanie zostało uznane jako prawda dokładnie jeden warunek musi zostać spełniony

NOT – Zmienia wartość warunku na przeciwną. Prawdę na fałsz natomiast fałsz na prawdę.

W tej części to już wszystko.

1 komentarz:

  1. Dobrze opisane. Teraz nie powinienem mieć problemów szczególnie z tymi fusebitami :/

    OdpowiedzUsuń