MIKROKONTROLERY FIRMY ATMEL dr inż. Wiesław Madej

Transkrypt

MIKROKONTROLERY FIRMY ATMEL dr inż. Wiesław Madej
MIKROKONTROLERY FIRMY
ATMEL
dr inż. Wiesław Madej
Mikrokontroler
To elektroniczny układ scalony, zawierający w sobie rdzeń
procesora, pamięć oraz programowalne urządzenia
wejścia/wyjścia takie jak porty szeregowe i równoległe czy
przetworniki. Mikrokontroler pobiera z nieulotnej pamięci
wielokrotnego zapisu instrukcje, które następnie wykonuje. Za
pomocą tych małych elementów (ich wymiary sięgają
zazwyczaj kilku centymetrów) można sterować licznymi
zewnętrznymi urządzeniami: od wyświetlaczy, poprzez zamki,
silniki, czujniki, światła drogowe itp. Te złożone układy
pobierają tak mało prądu, że mogą z powodzeniem być
zasilane z przenośnych źródeł energii np. z baterii.
ATMEL
Atmel Corporation to przedsiębiorstwo wytwarzające układy scalone.
Produkuje między innymi:
• pamięci EEPROM i flash,
• 8 bitowe mikrokontrolery oparte na architekturze 8051,
• 32 bitowe mikrokontrolery oparte na architekturze ARM,
• 8 bitowe mikrokontrolery oparte na własnej architekturze AVR,
• 32 bitowe mikrokontrolery oparte na własnej architekturze
AVR32,
• Układy FPGA
Układy z rodziny AVR zostały podzielone na kilka "pod-rodzin":
• tinyAVR - oznaczenie Attiny
- od 1 do8kB pamięć programu
- obudowy o 8-32 pinach
- ograniczony zestaw zintegrowanych peryferiów
- obniżony pobór mocy
• megaAVR - oznaczenie ATmega
- od 4 do 256kB pamięci programu
- obudowy o 28-100 pinach
- rozszerzony zestaw poleceń (m. in. o polecenia do obsługi powiększonej pamięci
programu)
- liczne zintegrowane peryferia (przetworniki AC/CA, timery, liczniki itp)
• XMEGA — oznaczenie ATxmega
- od 16 do 384kB pamięci programu
- obudowy o 44-100 wyprowadzeniach
- rozszerzone możliwości, takie jak obsługa DMA i sprzętowe wsparcie dla
kryptografii (używane m. in. przy współpracy z kartami inteligentnymi)
Wyposażenie
• Poszczególne mikrokontrolery z rodziny AVR różnią się między sobą,
przede wszystkim ilością pamięci flash, RAM, liczbą portów
wejść/wyjść oraz układami dodatkowymi.
• Przykładowo: ATtiny13 ma 1kB pamięci programu (flash), 64 bajty
EEPROM, 64 B RAM + 32 rejestry, 6 wejść/wyjść, 2 kanały PWM,
SPI, 4 kanały A/D, oscylator w układzie scalonym, montowany jest w
obudowie 8 nóżkowej.
• ATmega2560 ma 256 kB pamięci programu, 4 kB EEPROMu, 8 kB
RAM, 86 wejść/wyjść, 4 liczniki/czasomierze 16 bitowe, 6 - PWM,
SPI, 2 - UART, 16 - kanałów A/D.
Podstawowe elementy AVR (nie wszystkie są w każdym układzie):
• Pamięć flash
• Pamięć EEPROM
• Pamięć SRAM
• uniwersalne porty wejścia/wyjścia
• 8 i 16 bitowe liczniki/czasomierze z możliwością generowania PWM
• wielokanałowy 10 bitowy przetwornik analogowo-cyfrowy
• TWI (Two-wire Interface), odpowiednik I²C
• interfejs szeregowy USART
• interfejs SPI
• Watchdog
• wewnętrzny oscylator
• ISP (In-System-Programming)
• JTAG, umożliwia debugowanie programu
• DebugWire, umożliwia debugowanie programu dla kontrolerów z
ograniczoną liczbą pinów.
Mikrokontrolery rodziny 8051
Mówi się, że mikrokontroler to funkcjonalny system komputerowy w
jednej kości. Taka kość to zazwyczaj to, co zwykło się nazywać (nie
do końca precyzyjnie) układem scalonym, bo mikrokontroler
wygląda zazwyczaj jak duży czarny scalak o wielu nóżkach. Zwykle
jest to standardowa obudowa dwurzędowa DIP-40 (tzn. posiada 40
nóżek, po 20 z każdej strony).
Poniżej znajduje się zdjęcie takiego typowego układu.
Mikrokontrolery z serii 8051 zostały wyprodukowane przez firmę Intel
w latXX wieku. Wbrew temu, co się uważa, układy te są wciąż
popularne. Zwłaszcza w Polsce są one często wykorzystywane w
licznych urządzeniach, a także jako układy dydaktyczne - ze względu na
ich prostą budowę i łatwość programowania ciekawych aplikacji,
zajmują się nimi nawet uczniowie szkół średnich o profilu
elektronicznym. Są to jedne z najpopularniejszych uC 8-bitowych na
świecie.
Popularne i tanie kości z wbudowaną pamięcią FLASH z serii 89c51 i
89c52, są produkowane przez firmę Atmel. Mikrokontrolery te posiadają
128/256 bajtów RAMu, 4, 8 lub więcej kB wewnętrznej pamięci ROM
(FLASH), cztery dwukierunkowe 8-bitowe porty we/wy, port szeregowy,
dwa/trzy timery i system przerwań. Wydaje się, że 128 bajtów - (!) tak,
bajtów - RAMu to bardzo mało jak na dzisiejsze czasy, ale proszę mi
wierzyć, że dla naszych najbardziej podstawowych potrzeb będzie to
wystarczająca ilość miejsca. Cztery porty wystarczają zdecydowanie do
podłączenia wielu urządzeń zewnętrznych, np. sterowania
wyświetlaczem LCD czy czytnikiem kart pamięci.
W takiej plastikowej obudowie znajdują się podstawowe
urządzenia, jakimi dysponują komputery. Zazwyczaj, jako minimum
znajdziemy w niej rdzeń procesora, pamięć (zarówno RAM, jak i pamięć
programu) oraz programowalne urządzenia wejścia/wyjścia. W
zwykłym komputerze domowym najważniejszy układ zawiera w sobie
procesor. Inne układy zajmują się innymi sprawami, oddzielnie mamy
RAM, oddzielnie np. kartę graficzną, oddzielnie kontroler karty
sieciowej. W mikrokontrolerze podobne rzeczy znajdują się razem, co
pozwala na zmniejszenie kosztów i sprawia, że mieszczą się on w bardzo
małych przestrzeniach, np. jednostkach sterujących silnikami
samochodów, urządzeniach biurowych, wielkich, ale prostych
maszynach, czy zabawkach. Mały rozmiar pozwala też na oszczędność w
zasilaniu – układy tego typu działają świetnie zasilane z baterii.
FUNKCJE NÓŻEK
Obudowa 40-nóżkowa pozwala na zasilanie całego układu, przesyłanie
danych i sterowanie podstawowymi funkcjami. Zazwyczaj pozwala
także na programowanie pamięci wewnętrznej typu EPROM lub
FLASH. 40 nóżek to standard, ale są też układy w wersjach
uproszczonych, które posiadają mniejszą ilość portów wejścia/wyjścia,
co pozwala zmieścić całość w o połowę mniejszej obudowie.
ZASILANIE.
Każdy mikrokontroler potrzebuje być zasilany z precyzyjnego źródła
napięcia. Przeważnie będziemy korzystali z napięcia o wartości 5V, ale
zdarzają się też układy i sytuacje, w których używa się mniejszych
napięć, np. 3.3V, albo 3V. Najczęściej wykorzystywane są do tego celu
dwie nóżki - na jedną podajemy +5V, a drugą zwieramy do masy.
ZEGAR I TAKTOWANIE
Oprócz zasilania potrzebne jest stabilne źródło impulsów.
Mikrokontrolery posiadają albo wewnętrzne zegary, albo specjalne
nóżki, do których podłącza się oscylator kwarcowy. Taki oscylator drga z
bardzo stabilną częstotliwością, którą dobieramy w zależności od
potrzeb. Przeważnie jest to częstotliwość w granicach 1MHz-24MHz.
STEROWANIE UKŁADEM
Niektóre układy są wyposażone w dodatkowe nóżki, które spełniają
własne określone funkcje. Często spotykana jest nóżka RESET, którą np.
możemy podłączyć do przycisku. Inne tego typu nóżki mogą służyć
wybieraniu jednego z dwóch trybów pracy albo są wykorzystywane przy
dostępie do pamięci zewnętrznej.
PORTY WEJŚCIA/WYJŚCIA.
Aby móc przesyłać dane i kontaktować się z urządzeniami
zewnętrznymi, potrzebujemy kilku osobnych "przewodów", którymi
możemy te urządzenia podłączyć do naszego mikrokontrolera. Dlatego
układy tego typu posiadają pewną ilość linii, po których możemy
odczytywać i zapisywać dane.
BUDOWA WEWNĘTRZNA
Wewnątrz mikrokontrolera wszystko działa wykorzystując komunikację
poprzez szynę danych. Taka szyna danych łączy wszystkie urządzenia,
które są do niej dołączone: procesor, pamięci, porty i inne. Urządzenie
chcąc się skomunikować z innym, robi coś, co moglibyśmy porównać do
"wybierania numeru", po czym, gdy otrzyma pozwolenie na kontakt
przesyła lub odbiera porcję danych.
Główne cechy jednych z najpopularniejszych mikrokontrolerów
z rodziny 8051 firmy Atmel
Mikrokontrolery AT89C1051, AT89C2051, AT89C4051
Układy te produkowane przez firmę Atmel, należą do najpopularniejszych
układów stosowanych w niezbyt wymagających aplikacjach. Ich główne cechy
to:
- Obudowa 20-pinowa, 15linii we/wy,
- Napięcie zasilanie od 2.7V do 6V,
- Częstotliwość taktowania od 0 do 24 MHz (możliwość zatrzymania pracy
mikrokontrolera),
- 2 tryby pracy z redukcją poboru mocy,
- 1 kB, 2kB lub 4kB pamięci programu Flash (odpowiednio dla C1051, C2051,
C4051),
- 64 bajty (C1051) lub 128 bajtów (C2051 i C4051) pamięci danych (RAM),
- Wbudowany komparator analogowy,
- Wbudowane liczniki/timery: 1 w C1051 lub 2 w C2051 i C4051,
- Wbudowany układ transmisji szeregowej (oprócz C1051).
Mikrokontroler AT89C51
Układ ten, produkowany przez firmę Atmel, jest niemal identyczny
pod względem parametrów z protoplastą 8051. Jego główne cechy
to:
- Obudowa 40-pinowa, 32 linie we/wy
- Napięcie zasilania od 4V do 6V
- Częstotliwość taktowania od 0 do 24 MHz
- 4kB pamięci Flash
- 128 bajtów pamięci danych(RAM)
- Możliwośc dołączenia zewnętrznych 64 kB pamięci programu i
64kB pamięci danych.
- 2 tryby pracy z redukcją poboru mocy
- 2 liczniki/timery
- Wbudowany układ transmisji szeregowej
Mikrokontroler AT89C52
Kolejny układ firmy Atmel o parametrach identycznych z AT89C51,
za wyjątkiem:
- 8kB pamięci programu Flash
- 256 bajtów danych (RAM)
- Dodatkowy, trzeci licznik/timer o rozbudowanych możliwościach
pracy
Mikrokontroler AT89C55
Jest to układ AT89C52 rozbudowany o następujące elementy:
- 20kB pamięci programu Flash
- Częstotliwość taktowania od 0 do 33MHz
- Podwójny rejestr DPTR
- Wbudowany układ watchdog i wykrywania włączenia napięcia
zasilania.
Mikrokontroler ATMega16
Mikrokontroler ATMega16 został stworzony na bazie wysokowydajnej architektury AVR. Jest
to procesor o zredukowanym zbiorze rozkazów (RISC), posiada 131 instrukcji, w większości
nastawionych na język C. Posiada 16kB pamięci flash programowanej o trwałości do 10k cykli
kasuj/zapisz. Dodatkowo jest to mikroprocesor posiadający 1kB pamięci danych (SRAM) oraz
512 bajtów pamięci nie ulotnej (EEPROM).
Możemy w nim znaleźć 32 rejestry ogólnego przeznaczenia (robocze) oraz 32 konfigurowalnych
linii wejścia/wyjścia. Ponadto ATMega16 posiada trzy timery/liczniki z trybami porównania,
dwa szeregowe interfejsy (USART, I2C), analogowy komparator, wewnętrzny programowalny
generator RC(1, 2, 4 lub 8MHz), 8kanałowy 10bitowy przetwornik ADC z opcjonalnym trybem
wejścia różnicowego wraz z programowalnym wzmocnieniem (tylko w wersji TQFP) oraz 6
trybów oszczędzania energii. W mikrokontrolerze ATMega16 wyróżniamy 21
zewnętrznych/wewnętrznych programowalnych przerwań o ustalonej kolejności obsługi. Układ
Power-On Reset zapewnia prawidłowy reset po włączeniu zasilania. Napięcia zasilania oraz
dopuszczalna szybkość pracy są następujące : 2,7 – 5,5 V oraz 0 – 8 MHz dla ATMega16L, 4,5
– 5,5 V oraz 0 – 16 MHz dla ATMega16.
Pobór mocy dla 3 W przy częstotliwości równej 1MHz przedstawia się następująco: W stanie
aktywnej pracy - 1,1mA, trybie Idle - 0,35mA, trybie Power-down - poniżej 1uA.
Dostępny jest w 3 rodzajach obudowy: 40 pin PDIP, 44 pin TQFP, 44 pad MLF.
Mikrokontroler ATMega16 w
obudowie PDIP40
Budowa rdzenia AVR
Głównym zadaniem centralnej jednostki liczącej (CPU) jest zapewnienie
poprawnego i szybkiego wykonywania kodu. Z tego powodu CPU musi mieć
dostęp do pamięci, wykonywać operacje, sterować układami peryferyjnymi i
obsługiwać przerwania. AVR zbudowany jest w architekturze harvardzkiej,
oznacza to rozdzielenie pamięci i szyn do programu i danych oraz zapewnia
maksymalna wydajność. Instrukcje w pamięci programu wykonywane są
potokowo co oznacza, że gdy jedna instrukcja jest już wykonywana , druga jest
pobierana z pamięci programu. Takie rozwiązanie pozwala na wykonanie całej
instrukcji w każdym cyklu zegara. 32 rejestry robocze o jedno cyklowym czasie
dostępu zawarte w bloku szybkiego dostępu pozawala aby jednostka
arytmetyczno logiczna (ALU) mogła również pracować w jednym cyklu.
Oznacza to, że w typowej operacji, dwa argumenty ALU będą wystawione z
bloku rejestrów, następnie wykonana będzie operacja, a wynik jest powrotem
umieszczony w bloku rejestrów, i to wszystko stanie się w jednym cyklu
zegara.
Rejestr SREG
SREG jest rejestrem statusowym zawierającym informacje o rezultacie
ostatnio wykonanej przez ALU operacji arytmetycznej. Dzięki temu, że
w zależności od instrukcji może być zmieniana dowolna ilość bitów (nie
zawsze cała zawartość) możliwe jest tworzenie bardziej
zoptymalizowanego kodu pod względem szybkości i objętości pracując
na pojedynczych znacznikach, którymi są flagi. Zawartość rejestru
SREG nie jest automatycznie zapamiętywana przy wejściu w kod
obsługi przerwania i odzyskiwana po jego wykonaniu. Należy to
wykonywać programowo.
Rejestr SREG
I - Globalne odblokowanie przerwań. Bit ten jest ustawiany aby
odblokować przerwania. Jeżeli flaga I jest ustawiona na 0 to nie
może wystąpić żadne z przerwań, gdyż są one blokowane. Bit I
po wystąpieniu jakiegokolwiek przerwania jest automatycznie
kasowany i za pomocą instrukcji RETI ponownie ustawiany aby
umożliwić kolejne instrukcje przerwań.
T – Flaga umożliwiająca przechowanie kopiowanego bitu.
Podczas wykonania instrukcji kopiowania BLT lub BST nit T jest
używany jako bit źródłowy lub docelowy operacji bitowej.
Rejestr SREG
H – Flaga przeniesienia połowkowego. Flaga ta jest ustawiana w
momencie, gdy nastąpi przeniesienie na 4 bit.
V – Flaga wskazująca przepełnienie uzupełnienia do dwoch.
N – Flaga wyniku ujemnego. Zostaje ustawiona w przypadku
ujemnego wyniku operacji arytmetycznej.
S – Flaga znaku. Jest on wynikiem operacji V xor N.
Z – Flaga zera. Jej ustawienie oznajmia, że wynik działania
arytmetycznego lub logicznego wyniósł zero.
C – Flaga przeniesienia. Flaga jest ustawiana w momencie gdy
następuje całkowite przeniesienie w wyniku operacji arytmetycznej lub
logicznej.
Porty wejścia/wyjścia
Wszystkie porty w mikrokontrolerów AVR są cyfrowymi portami o zmiennym
kierunku przepuszczanych danych (I/O). Dzięki instrukcjom CBI oraz SBI możemy
ustawić poszczególny pin na wejściowy lub wyjściowy. Wydajność prądowa pinów w
stanie niskim sięga 20mA, dodatkowo istnieje możliwość włączenia rezystora
podciągającego do napięcia zasilania. Każdy z portów posiada 3 rejestry
konfiguracyjne: rejestr danych – PORTx, rejestr kierunkowy – DDRx oraz port pinów
wejściowych – PINx. Rejestr DDRx określa za pomocą bitów DDxn kierunek pracy
pinów – wpisanie 1 powoduje prace pinu Pxn jako wyjściowy, 0 jako wejściowy.
Rejestr danych PORTxn w momencie gdy dany pin ustawiony jest jako wyjście
powoduje przepisanie wartości logicznej w odpowiedni stan wyjściowy pinu. Dla
jedynki - stan wysoki, dla zera – stan niski. W przypadku gdy dany pin jest ustawiony
jako wejście, jedynka podana na PORTxn włącza rezystor podciągający(PullUp),
natomiast zero spowoduje jego wyłączenie. Gdy dany pin jest skonfigurowany jako
wyjście rezystor podciągający napięcie jest automatycznie wyłączany. Dodatkowo
istnieje możliwość ustawienia pinu PUD w rejestrze SFIOR, co spowoduje włączenie
rezystorów podciągających dla wszystkich pinów bez względu na ustawienia bitów
rejestru danych i kierunkowego.
Konfiguracja pinów I/O
Źródła resetu
Podczas resetu wszystkie rejestry portów wejścia/wyjścia zostają
ustawione na ich wartości początkowe. Jeżeli włączone zostały
przerwania to pod adresem 0x0000 powinna znaleźć się instrukcja
JMP, która obsłuży procedury resetu. W przeciwnym wypadku,
program nigdy nie używa przerwań ten adres 0x0000 może być
adresem początkowym programu. Dzięki rejestrowi MCUCSR można
sprawdzić jakie źródło spowodowało reset.
ATMega16 posiada 5 rożnych źródeł resetu:
• Power-on restet
• Watchdog reset
• Reset zewnętrzny
• Brown-out reset
• JTAG AVR reset
Power-on reset jest uaktywniany gdy poziom napięcia zasilającego
zejdzie poniżej progu zasilania (4,5 lub 2,7 V). Wbudowany Power-on
reset generuje wewnętrzny impuls resetu o wymaganej długości co
zapewnia poprawne uruchomienie mikrokontrolera przetrzymując stan
resetu przez odpowiednią chwile czasu, po podłączeniu zasilania do
mikrokontrolera.
Reset zewnętrzny jest powodowany przez pojawienie się niskiego
poziomu na pinie RESET. Reset mikrokontrolera nastąpi, gdy długość
impulsu resetującego będzie nie mniejsza niż 1,5 μs.
Reset watchdog zapobiega zawieszaniu się mikrokontrolera
powstającego
w
np.
skutek
wykonywania
niepożądanych
nieskończonych pętli programu. Wygenerowanie impulsu resetującego
następuje jeżeli włączony licznik watchdog’a nie zostanie w pewnym,
określonym czasie wyzerowany. Układ watchdog pracuje z
częstotliwością 1 MHz. Włączenie i konfiguracje watchdog’a zapewnia
rejestr WDTCR.
Brown-out reset następuje gdy poziom zasilania Vcc spadnie poniżej
ustalonego poziomu detektora brown-out. Funkcję tę konfiguruje się za
pomocą bitów bezpiecznikowych.
Reset JTAG AVR wywoływany jest poprzez wstawienie logicznej
jedynki w rejestrze resetu (Reset Register) i utrzymuje się tak długo,
jak długo ustawiona jest w nim logiczna jedynka.
REJESTR WDTCR
Opis poszczególnych bitów rejestru
WDTCR
WDTOE – Bit odblokowania wyłączenia watchdog’a. Jest to bit
zabezpieczający dodatkowo wyłączenie watchdog’a. Jeżeli bit WDE
jest ustawiony na 0, wpisanie jedynki na bicie WDTOE spowoduje
wyłączenie watchdoga’a.
WDE – Bit włączenia watchdog’a. Ustawienie tego bitu na jedynkę
włącza układ watchdog’a, zero spowoduje możliwość jego
wyłączenia.
WDP 2:0 – Bity preskalera licznika watchdog’a. Za pomocą tych bitów
możemy ustawić czas jaki upłynie od wyzerowania watchdog’a do
załączenia impulsu resetującego. Czas można dobrać w zakresie od
około 16ms (000) do około 2,2s (111).
Liczniki/Timery
W układzie mikrokontrolera ATMega16 znajdują się trzy liczniki. Jeden
16 bitowy i dwa 8 bitowe: licznik z PWM oraz licznik z PWM i pracą
asynchroniczną. Jako licznik możemy zaliczyć także układ watchdog.
Obydwa liczniki 8-bitowe posiadają te same właściwości z jednym
wyjątkiem. Zegar z możliwością pracy asynchronicznej posiada
możliwość taktowania z zewnętrznego źródła niezależnie od zegara
wewnętrznego. Pozostałe cechy oraz możliwości zastosowań posiada
zarówno jeden jak i drugi licznik. Wśród nich wyróżniamy:
• Licznik jedno kanałowy.
• Automatyczne kasowanie i restart timera w trybie porównania.
• Generator częstotliwości.
• Generator przebiegu PWM.
• Licznik zdarzeń zewnętrznych.
• 10-bitowy programowalny preskaler.
• Źródło przerwań (przepełnienie, zrównanie).
Pierwszy z opisanych wyżej liczników 8 bitowych został oznaczony jako
licznik 0, licznik z możliwością pracy asynchronicznej posiada numer 2.
Obydwa te liczniki mogą być taktowane wewnętrznie poprzez układ
preskalera lub zewnętrzne źródło, które może być podłączone
odpowiednio do pinu T0 lub pinów TOSC1/2. Piny TOSC1/2 są
zaprojektowane do podłączenia zewnętrznego źródła zegara o
częstotliwości 32KHz bez dodatkowych kondensatorów. Dla obydwu
liczników możemy wybrać źródło taktowania oraz rodzaj zbocza, przy
którym licznik będzie inkrementowany bądź dekrementowany. Ustawień
tych dokonuje blok logiczny wyboru zegara. Licznik 0 oraz licznik 2
posiadają oddzielne preskalery.
Zarówno jeden, jak i drugi preskaler może być zresetowany za pomocą
odpowiedniego bitu w rejestrze SFIOR. Reset dokonywany jest w celu
synchronizacji licznika.
Licznik 16 bitowy w ATMega16 jest bardziej zaawansowanym typem
licznika.
Dostęp do jego 16 bitowych rejestrów odbywa się przez 2 operacje
odczytu bądź zapisu 8 bitowej szyny danych. Posiada on również
większą gamę właściwości i zastosowań:
• Niezależne dwie jednostki Output Compare.
• Jednostka Input Capture z układem redukcji szumów.
• Automatyczne kasowanie i restart timera w trybie porównywania.
• Generator częstotliwości.
• Generator przebiegu PWM.
• Licznik zdarzeń zewnętrznych.
• 10-bitowy programowalny preskaler.
• 4 niezależne źródła przerwań.
Działanie licznika jest identyczne do działania liczników 8 bitowych, z
wyjątkiem dodatkowych funkcji. Licznik 16 bitowy , tak jak jego 8
bitowi poprzednicy, również może być taktowany wewnętrznie za
pomocą preskalera oraz posiada tryb pracy Output Compare jak i
Normal. Jedyną różnica w działaniu wymienionych trybów pracy oraz
taktowaniu wewnętrznym jest korzystanie z innych pinów lub rejestrów.
Dodatkową funkcja jest funkcja Input Compare. Rejestr Input Compare
(ICR1) służy miedzy innymi do przechwycenia wartości licznika na
skutek zdarzenia zewnętrznego na pinie ICP1 albo wyjściu komparatora
analogowego. W celu lepszego działania moduł Input Capture został
wyposażony w układ cyfrowej filtracji szumów. Licznik rozpocznie
prace dopiero po wyborze źródła jego zegara.
Przetwornik ADC
Mikrokontroler ATmega16 wyposażony jest w 10-bitowy przetwornik
ADC z sukcesywną aproksymacją. ADC podłączony jest do 8
kanałowego multipleksera pozwalając na przyłączenie ośmiu napięć
wejściowych do każdego z pinów portu A. Możliwe jest także 16
kombinacji podłączenia napięcia różnicowego. Dwa z różnicowych
wejść (ADC1, ADC0 oraz ADC3, ADC2) są wyposażone w
programowalny stopień wzmacniający, pozwalając na wzmocnienie 0dB
(1x), 20dB (10x) i 46dB (200x) zanim sygnał wejściowy zostanie
poddany konwersji. Tryb różnicowy wspierany jest w układach
ATMega16 w obudowach innych niż PDIP40.
Do zasilania przetwornika został specjalnie wyprowadzony pin AVCC.
Napięcie zasilające ADC nie może się różnić więcej niż o ±0,3 od VCC.
Dla lepszego zabezpieczenia przed szumami z zewnątrz, możliwe jest
zasilanie przetwornika z filtra dolnoprzepustowego LC.
Interfejs USART
Obecny w mikrokontrolerach szeregowy dwukierunkowy interfejs USART (lub
UART) najczęściej służy do komunikacji z komputerem lub innym
mikrokontrolerem. Moduły do tego typu transmisji integrowane w
mikrokontrolerach, pozwalają często na zaawansowaną konfigurację i wygodną
obsługę, a przy tym odciążają CPU.
Wybrane istotne cechy modułu USART:
· Pełny duplex (dzięki niezależnym rejestrom nadawania i odbioru).
· Praca synchroniczna lub asynchroniczna.
· Precyzyjny generator szybkości transmisji.
· Obsługa różnych konfiguracji ramek i kontroli parzystości.
· Wykrywanie błędów transmisji.
· Filtrowanie przeciwzakłóceniowe.
· Trzy niezależne źródła przerwań.
· Tryb podwójnej szybkości w trybie asynchronicznym.
· Tryb komunikacji wieloprocesorowej.
USART a UART
Od układu UART, w którego często wyposażone są inne starsze
mikrokontrolery Atmela, np. AT90S9515 różni się między innymi tym,
że może pracować w trybie synchronicznym.
W większości przypadków zachowana jest zgodność ze starszym UART,
jednak dwa ulepszenia mogą zaburzyć kompatybilność. Dodany został
drugi bufor odbiorczy, a rejestr przesuwny odbiornika może pełnić rolę
trzeciego bufora. Przez to że dwa bufory odbiorcze pracują jako
obrotowy FIFO, odczyt UDR wykonuje się tylko raz na każdy nowy
odebrany pakiet danych. Bity statusu (FE, DOR) oraz 9 bit danych,
muszą być odczytywane przed odczytem UDR, gdyż potem są tracone.
Pin XCK używany jest tylko w trybie pracy synchronicznej.
Interfejs TWI
Interfejs TWI (two wire interface) jest w pełni zgodny z popularnym I2C
firmy Philips, a Atmel używa innej nazwy aby nie łamać praw
patentowych. Interfejs I2C podobnie jak SPI, został stworzony do
komunikacji między układami scalonymi w obrębie jednego urządzenia.
Komunikacja odbywa się dwuprzewodowo, linią danych SDA oraz linią
zegara SCL, które są mogą być wspólne dla wszystkich układów w
systemie. Pomimo jednej linii danych, transmisja może odbywać się
dwukierunkowo, jednak ze stosunkowo niewielką transmisją. W
większości przypadków spotyka się możliwość pracy przy częstotliwości
linii SCL do 100kHz, a rzadziej do 400kHz. Moduł TWI wbudowany w
ATmega16 umożliwia pracę w obu tych trybach. Współpraca wielu
układów po tych samych przewodach jest możliwa dzięki temu, iż
każdemu z urządzeń przypisuje się indywidualny adres. Liczba urządzeń
podłączonych jednocześnie jest ograniczona jedynie maksymalną
pojemnością linii 400pF oraz 7-bitową przestrzenią adresową dla
urządzeń podrzędnych.
Instrukcje asemblera
W estawieniu instrukcji, w argumentach używane są następujące oznaczenia:
Rd R0-R31, rejestr docelowy operacji (także źródłowy), czasem np. 16 ≤ d ≤
31,
Rr
R0-R31, rejestr źródłowy, czasem np. 16 ≤ r ≤ 31,
b stała o wartości 0-7, do oznaczania numeru lub nazwy bitu, np. OCIE0,
s stała o wartości 0-7, bit rejestru statusowego SREG, np. V, Z,
P stała (0-31/63) określająca adres z przestrzeni adresowej I/O, np. PORTA,
K
stała (0-31/63) określająca adres z przestrzeni adresowej I/O, np. R16,
PORTA,
k stała z przedziału wartości zależnego od instrukcji,
q stała (0-63) określająca wartość przesunięcia przy adresowaniu pośrednim,
X rejestr adresowania pośredniego, X=R27:26,
Y rejestr adresowania pośredniego, Y=R29:28,
Z rejestr adresowania pośredniego, Z=R31:30.
Opis oznaczeń flag rejestru statusowego SREG (przypomnienie):
 C flaga przeniesienia (carry),
 Z flaga zera,
 N flaga wyniku ujemnego,
 V wskaźnik przepełnienia uzupełnienia do dwóch,
 S S = N  V, do testów znaku,
 H flaga przeniesienia połówkowego (half carry),
 T bit transferowy, używany przez instrukcje BLD i BST,
 I globalna flaga przerwań.
Tryby adresowania
natychmiastowe: LDI R16, 3
bezpośrednie: LDS R1, 100
pośrednie: LD R1, X
pośrednie z postinkrementacją: LD R1, X+
pośrednie z predekrementacją: LD R1, -X
pośrednie z przemieszczeniem: LDD R1, Y+2
pośrednie pamięci programu: LPM R1, Z
Opis kolumn:
Mnemonik – składnia instrukcji asemblera,
Opis – skrócony opis operacji realizowanej przez instrukcję,
Operacja – logiczny zapis operacji wykonywanej przez instrukcję,
Clk – liczba taktów zegara systemowego potrzebnych na wykonanie
operacji.
Pozostałe oznaczenia używane w zestawieniu instrukcji:
SP wskaźnik stosu (stack pointer),
STACK stos adresów powrotnych i przechowywanych rejestrów.
W przypadku używania złożonych instrukcji jak np. mnożenie (MULS,
FMULS itd.), zalecane jest skorzystanie z opisu w pomocy programu
AVRStudio lub dokumentacji instrukcji mikrokontrolerów AVR
Instrukcje
organizujące
rozgałęzienia
Instrukcje
transferu
danych
Instrukcje
operacji
bitowych
Przerwania
• Kod programu rozpoczyna sie od wektora przerwan.
• Zgłoszenie przerwania powoduje sprzetowe: odłozenie na stos
- adresu powrotu (ale nie rejestru stanu!),
- zablokowanie przerwań poprzez wyzerowanie bitu I w rejestrze
stanu SREG,
- wykonanie rozkazu spod odpowiedniego adresu w pamięci
programu.
• Program obsługi przerwania zwykle kończy sie rozkazem RETI, który
włącza przerwania.
Wektor przerwań
Pierwszy program
.CSEG ; segment kodu
.ORG 0 ; przerwanie o adresie 0 = reset
JMP START
.ORG 42 ; pierwszy adres za wektorem przerwan
START:
LDI R16, 0b00001111
OUT DDRA, R16 ; nogi PA0..PA3 jako wyjscia
LDI R16, 0b00001011
OUT PORTA, R16
; nogi PA0,PA1,PA3 stan wysoki
; noga PA2 stan niski
PETLA:
RJMP PETLA ; główna pętla programu
Programowanie w języku C/C++
Podstawowe instrukcje sterujące
Pierwszą podstawową i najprostszą instrukcją jest instrukcją ustawiająca
dany port jako wejście lub wyjście. Podanie zera do rejestru portu ustawi
go jako wejściowy, podanie jedynki zdefiniuje go jako wyjściowy. Dla
przykładu aby zdefiniować wszystkie piny portu B jako wejściowe
musimy posłużyć się następującą operacją:
DDRB= 0x00;
Aby ustawić wszystkie piny portu B jako wyjściowe dokonujemy
operacji:
DDRB = 0xFF;
Kierunkowość pinów danego partu może być ustawiana w dowolny
sposób np.: DDRB = 0x3F; W tym przypadku tylko 2 najstarsze bity
rejestru będą powodowały ustawienie pinów wejściowych, reszta pinów
zostanie zdefiniowana jako wyjścia.
Odczyt i zapis danych na pinach jest wykonywany równie prosto jak
definiowanie kierunkowości portu. Musimy pamiętać tylko o jednej
rzeczy – aby zapisać informacje na dany port musi on być zdefiniowany
jako wyjściowy, aby odczytać informacje port musi być ustawiony jako
wejściowy. Zapisu przykładowej wartości na port B dokonujemy w
następujący sposób:
PORTB = 0x12;
Aby odczytać informacje z portu B wykonujemy operacje:
Informacja = PINB;
W tym wypadku wartość na porcie B została zapisana do zmiennej
Informacja.
Instrukcje warunkowe są podstawowymi instrukcjami dla każdego
rodzaju programowania. Możemy wyróżnić 3 rożne rodzaje warunków:
if, else, else if. Oto przykład:
if(warunek1)
{
instrukcja1;
}
else if(warunek2)
{
instrukcja2;
}
else
{
instrukcja3;
}
W tym przypadku jeżeli zostanie spełniony warunek1 zostanie wykonana
instrukcja1, jeżeli zostanie spełniony warunek2 zostanie wykonana
instrukcja2, natomiast jeśli żaden z powyższych warunków nie będzie
spełniony nastąpi wykonanie instrukcji3.
Kolejną grupą instrukcji sterujących są pętle. Wyróżniamy 3 rodzaje
instrukcji pętli: for, while, do-while. Pętli używa się w celu powtórzenia
danej instrukcji o zdefiniowaną przez programistę ilość razy. Poniżej
podaje przykładowe fragmentu kodu posiadającego każdy z wyżej
wymienionych instrukcji pętli:
• Pętla for
for(int i=0; i<20; i++)
{
Suma += i;
}
Pierwsze wyrażenie w nawiasie występującym po słowie „for” oznacza
początkową wartość argumentu i. Drugie wyrażenie jest warunkiem,
który póki jest spełniony gwarantuje wykonanie instrukcji Suma +=i.
Trzecie wyrażenie jest zwyczajną instrukcją wykonywaną każdorazowo,
gdy okaże się, że warunek zapisany w drugiej instrukcji jest spełniony.
Zazwyczaj instrukcja ta związana jest z warunkiem by zapewnić
skończoną ilość wykonania pętli. W powyższym przykładzie pętla
zostanie wykonana 20 razy.
Pętla while
int i=0;
while(i<20)
{
Suma += i;
i++;
}
Pętla while jest wykonywana tak długo jak długo spełniony jest warunek
opisany w nawiasie znajdującym się po słowie „while”. Wykonanie pętli
oznacza wykonanie instrukcji zawartej w nawiasie klamrowym. Po
każdorazowym wykonaniu instrukcji następuje sprawdzenie warunku.
Pętla do-while
do
{
Suma += i;
i++;
}while(i<10);
Pętla do-while nie rożni się wiele od pętli while. Jedyną różnicą jest to,
że najpierw wykonywana jest instrukcja w nawiasach klamrowych, a
dopiero potem sprawdzany warunek zawarty w nawiasach zwykłych.
Powoduje to przynajmniej jedno wykonanie instrukcji nawet przy nie
spełnionym warunku.
Operatory arytmetyczne i logiczne
W każdego typu programowaniu, a w szczególności programowaniu
mikrokontrolerów wielką role odgrywają operatory. Możemy je
podzielić na operatory arytmetyczne oraz logiczne. Mikrokontroler
ATMega16 jest w stanie wykonywać operacje arytmetyczne takie jak:
dodawanie, odejmowanie, mnożenie, dzielenie. Odpowiednio do ich
realizacji wykorzystywane są operatory: + , - , * , / oraz operator
przypisania = . Przykładowy zapis operacji:
Wynik = zmienna1 * zmienna2;
Wynik2 = Wynik + zmienna2;
Jak widać zapis kodu jest bardzo intuicyjny.
Operacje logiczne są drugim rodzajem operacji najczęściej
wykonywanych podczas programowania mikrokontrolera. ATMega16
ma możliwość wykonywania operacji: AND, OR, XOR. Do ich
realizacji wykorzystywane są odpowiednio operatory: & , | , ^.
Przykładowy zapis operacji przedstawia się niemalże identycznie jak
przy wykonywaniu operacji logicznych np.
Wynik_log = zmienna1 ^ zmienna2
Dodatkowo operacja AND jest używana do tzw. operacji maskowania.
Maskowanie polega na wyzerowaniu niepotrzebnych w dalszych
operacjach bitów. Wykonywana jest operacja –
Wynik_log = Zmienna1 & Liczba_maskujaca.
Poszczególne bity ciągu zerojedynkowego Liczba_maskujaca zerują bity
zmiennej Zmienna1 o tej samej hierarchii jeżeli ich wartość wynosi 0, a
przepisują, gdy ich wartość wyniesie 1. Najprościej to przedstawić na
przykładzie, gdzie:
Zmienna1 = 10110101;
Jeżeli teraz chcemy przenieść informacje zawartą tylko na 3 najstarszych
bitach ustawiamy:
Liczba_maskujaca = 11100000;
Da to nam wynik:
Wynik_log = 10100000;
Przesunięcie
Ostatnim rodzajem operacji jest operacja przesuwania bitów w lewo lub
w prawo. Do przesunięcia bitów w lewo służy operator <<, w prawo >>.
Przykładowo - Dana = 0xA5 >> 4.
W wyniku tej operacji zmienna dana zostanie przesunięta w prawo 4
razy. Lub też z perspektywy arytmetyki można powiedzieć, zostanie
podzielona przez 2 do potęgi 4. W zapisie binarnym wyglądać to będzie
następująco:
Dana = 10100101 - wartość początkowa
Dana = 01010010 - jedno przesunięcie w prawo
Dana = 00010100 - trzy przesunięcia w prawo
Przesuwanie w lewo działa odwrotnie do przesuwania w prawo i
analogicznie w rozumieniu arytmetycznym jest mnożeniem przez 2 do
potęgi wynoszącej ilość przesunięć.
AtMega128
To na dzisiaj tyle
Dziękuję za uwagę

Podobne dokumenty