Charakterystyka mikrokontrolerów 1. Historia powstania Historia mikroprocesora zaczyna się wraz z narodzinami procesora Intel 4004 w 1971 roku. Rok później wydano pierwszy 8-bitowy układ Intel 8008 stanowiący fundament dla kolejnych projektów. 8008 zaprojektowano w 10-mikronowej technologii PMOS (MOS with p-type transistors) i zawierał około 3500 tranzystorów. Miał rozmiar 4,9mm x 6,7mm, był to 18-pinowy dwustronny układ, taktowany częstotliwością 200kHz i mógł wykonywać do 60000 instrukcji na sekundę. Na architekturę 8008 składały się: pojedynczy 8-bitowy akumulator (A), sześć 8- bitowych rejestrów ogólnego przeznaczenia (B, C, D, E, H, L). Procesor zapewniał 14-bitowe adresownie, posiadał instrukcje logiczne oraz przerwania. Pierwszym mikrokontrolerem (a nie mikroprocesorem) był wyprodukowany pod koniec roku 1972 przez Texas Instruments procesor TMS1000. Łączył on w sobie prosty 4-bitowy mikroprocesor, 1KB pamięci ROM i 32B pamięci RAM w jednym chipie. Układ był niedrogi i pokazał liczne zastosowania w systemach łączonych. W 1974 roku wypuszczono na rynek konkurencyjny układ Intel 8080. Projektanci układu 8080 zawarli w nim kilka kluczowych cech zarówno procesora 8008 jak i 4004. Ulepszenia obejmowały większą ilość instrukcji, 64KB przestrzeń adresową, 256 portów we/wy, 16-bitowe instrukcje arytmetyczne, i wektorowe przerwania. Został zaprojektowany w 6-mikronowej technologii NMOS (MOS with n-type transistors) i zawierał 6000 tranzystorów. 40-pinowa kość pozwalała na oddzielne adresy i szynę danych. Pierwszy 8080 był taktowany zegarem 2Mhz. //pewnie do poprawki 2. Co to jest mikrokontroler (skład, architektury) Jest to pojedynczy układ scalony, w którego skład wchodzi mikroprocesor, pamięć RAM i pamięć programu oraz układy Wejścia/Wyjścia. Określenie mikrokontroler pochodzi od głównego obszaru zastosowań, jakim jest sterowanie urządzeniami elektronicznymi. Mikrokontroler stanowi użyteczny i całkowicie autonomiczny system mikroprocesorowy, który z reguły nie musi współpracować z układami zewnętrznymi. Wśród wbudowanych w mikrokontroler bloków funkcjonalnych można znaleźć: procesor (CPU), pamięć danych (RAM, EEPROM), programu (EPROM, EEPROM, Flash), liczniki, kontrolery przerwań, kontrolery transmisji równoległej lub szeregowej (UART, SPI, I2C, USB, CAN, 1-Wire itp.), przetworniki A/C lub C/A oraz zegar czasu rzeczywistego RTC itp. Czyli w skrócie 3 kluczowe rzeczy: procesor, pamięci i peryferia. ARCHITEKTURA VON NEUMANA Odznaczała się wspólną magistralą dla danych i instrukcji. Wszystko dostępne jest w jednej przestrzeni adresowej, tak więc bez dokładnej analizy zawartości nie jesteśmy w stanie określić co dane zawiera konkretny obszar pamięci. Program wykonywalny może zmienić sam siebie jeżeli potraktuje obszar instrukcji jako dane, a po przetworzeniu zacząć je wykonywać.
Dzięki odpowiedniemu skonfigurowaniu linkera, możliwe jest wykonywanie skompilowanego kodu z pamięci Flash lub RAM (w celu przyspieszenia działania lub w trakcie projektowania). Architektura zastosowana w układach z rdzeniem ARM7. ARCHITEKTURA HARVARDZKA Była odpowiedzią na w.w. architekturę i w odróżnieniu od niej zakładała oddzielenie pamięci danych od pamięci rozkazów. Dodatkowo prostsza budowa gwarantuje lepszą wydajność. Zmodyfikowana architektura harwardzka, znana również jako architektura mieszana, łączy w sobie cechy architektury harwardzkiej i architektury von Neumanna. Oddzielone zostały pamięci danych i rozkazów, lecz wykorzystują one wspólne magistrale danych i adresową. Przykładem rodziny w architekturze Harvardzkiej są 8 bitowe układy AVR. Zmodyfikowana architektura Harvardzka obecna jest w układach z rdzeniem ARM9. Oprócz mikrokontrolerów ogólnego przeznaczenia produkowane są specjalizowane układy do określonych zastosowań z dodatkowymi blokami analogowymi, cyfrowmi lub cyfrowoanalogowymi. Przykładem są układy integrujące dodatkowo tor radiowy wykorzystywany w bezprzewodowych modułach np. ZigBee, układy analogowe w zaawansowanych bateriach, układy sterujące napędami w przemyśle, czy oświetleniem. Oprócz tego spotkać możemy bardzo złożone układy nazywane SoC (System-on-a-Chip) zawierające wydajne jednostki centralne (lub nawet wiele rdzeni, dodatkowy np. DSP do dekodowania wideo w HD - MPSoC (Multiprocessor System-on-Chip)), wraz z zewnętrznymi magistralami danych do pamięci SDRAM lub DDR/DDR2 SDRAM czy Mobile SDRAM (LPDDR), interfejsy USB, Ethernet, czy interfejs do wyświetlaczy LCD. Przykładami takich układów są: rodzina OMAP (TI), Tegra (nvidia), Snapdragon (Qualcomm). 3. Procesory Dostępne w sprzedaży rodziny mikrokontrolerów zawierające rdzenie własnościowe firm je produkujących lub rdzenie ogólnodostępne jak np. ARM czy 8051 to: Freescale 68HC11 (8-bit) STMicroelectronics (8-bit), ST10 (16-bit) and STM32 (32-bit) Atmel AVR (8-bit), AVR32 (32-bit), and AT91 (32-bit), 8051 (8-bit) Freescale ColdFire (32-bit) and S08 (8-bit) Hitachi H8, Hitachi SuperH (32-bit) Infineon Microcontroller: 8, 16, 32 Bit NEC V850 (32-bit) NXP Semiconductors LPC1000, LPC2000, LPC3000, LPC4000 (32-bit), LPC900, LPC700 (8-bit) Microchip PIC (8-bit PIC16, PIC18, 16-bit dspic33 / PIC24) Rabbit 2000 (8-bit) Motorola M68 Texas Instruments MSP430 (16-bit)
4. Pamięci W mikrokontrolerach możemy wyróżnić kilka podstawowych typów pamięci. W zależności od zastosowania określić możemy pamięć programu zawierająca kod programu, tablice stałych, wektor przerwań. Posiadamy również pamięć danych, która przechowuje zmienne oraz stos przechowujący adres powrotny przy obsłudze przerwań i wybrane przez programistę wartości (najczęściej przy obsłudze podprogramów/funkcji). Ze względu na budowę i architekturę wyróżnić możemy pamięci: EPROM przechowujące zmienne lub tablice stałych, które po wyłączeniu zasilania nie mogą ulec skasowaniu. Pamięci EPROM dzielimy ze względu na możliwości zapisu na: OTP (One Time Programable) w obudowach bez okienka kwarcowego, przez co możliwe jest tylko jednokrotne zaprogramowanie pamięci, EPROM (Erasable Programable ROM) z możliwością kasowania dotychczasowej zawartości promieniami ultrafioletowymi i wprowadzania nowej zawartości za pomocą zewnętrznego programatora. Pamięci EEPROM odróżnieniu od pamięci EPROM może być kasowana tylko przy użyciu prądu elektrycznego. Liczba zapisów i kasowań jest ograniczona, w zależności od typu i producenta pamięci wynosi do 100,000 cykli. Przy czym liczba operacji odczytu jest nieograniczona. W przypadku ROM (Read Only Memory) pogramowanie zawartości pamięci następuje w procesie produkcyjnym i nie może być przeprowadzone przez użytkownika. FLASH (Bulk Erasable Non-Volatile Memory) pozalają na kasowanie zawartości i programowanie bezpośrednio w systemie mikroprocesorowym. Są udoskonaleniem pamięci EEPROM, w których poprzez zastosowanie buforowania zwiększono szybkość zapisu do pamięci. Jest to pamięć nieulotna. SRAM (Static Random Access Memory) czyli statyczne pamięci RAM. Są to pamięci o krótkich czasach dostępu, prostsze w obsłudze przez jednostkę centralną, ale droższe. Jest to pamięć ulotna. FRAM (Ferroelectric RAM) pamięci ferroelektryczne, nieulotne pamięci, które są dopiero wprowadzane na rynek. Pierwsze mikrokontrolery (MSP430) wyposażone w tą pamięć dostępne już są w Texas Instruments. Nośnikiem informacji jest materiał ferroelektryczny zdolny do zapamiętania kierunku pola magnetycznego. Zaletami są bardzo mały pobór energii, wysoka szybkość działania i duża trwałość (nieograniczona liczba cykli zapisu/odczytu), wadą natomiast duży rozmiar komórki. Standardowo, współczesne mikrokontrolery wyposażone są w kilka do kilkudziesięciu kb pamięci RAM, od kilku kb do kilkuset kb pamięci programu Flash oraz opcjonalnie od kilkuset B do kilku kb pamięci EEPROM. 5. Urządzenia peryferyjne i obsługa przerwań
UART/USART - (Universal A/Synchronous Receiver and Transmitter), układ scalony używany do a/synchronicznego przekazywania i odbierania informacji, konwersja pomiędzy szeregową a równoległą formą transmisji, uzywany powszechnie z takimi standardami jak RS-232, RS-422 or RS-485 (różnica pojawia się jedynie w poziomach logicznych sygnału). Format danych oraz prędkośc transmisji są konfigurowane programowo, poziom sygnalizacji elektrycznej jak i same metody sygnalizacji obsługiwane są przez specjalny zewnętrzny obwód sterujący. Używany zwykle do komunikacji pomiędzy mikrokontrolerem, komputerem (przez port szeregowy) lub innym urządzeniem np. drugim mikrokontrolerem. DUART - dwa układy UART razem na jednym chipie. Bajt pamięci rozkładany jest na pojedyńcze bity i przesyłany do odbiornika praca synchroniczna - kolejne bity są przesyłane w takt zegara sterującego transmisją, praca asynchroniczna, odbiornik USART wykrywa początek ramki transmisyjnej, a następnie próbkuje sygnał wejściowy przez ustalony przez obie strony czas trwania bitu. Budowa: generator impulsów zegarowych wyjściowy/wejściowy rejestr przesuwny sterownik transmisji/odbioru logika sterująca zapisem/odczytem bufory pamięci FIFO, transmisji/odczytu, danych I2C - (Inter-Integrated Circuit: pośredniczący pomiędzy układami scalonymi) wynaleziona przez Philipsa szeregowa, dwukierunkowa magistrala służąca do przesyłania danych w urządzeniach elektronicznych, umozliwia podłączenie peryferiów o wolnej prędkości do mikrokontrolerów, płyt głównych, telefonów oraz innych urządzeń. dwie, dwukierunkowe linie (pull up): dane - SDA, zegar - SCl; typowe napięcia +5V/+3,3V, możliwość stosowanie innych, logika dodatnia 7bitowa przestrzeń adresowa, 112 węzłów komunikacji 16 adresów rezerwowych powszechne prędkości 110 kbps lub low mode 10kbps, dla systemów wbudowanych 400 kbit/s Fast mode, 1 Mbit/s Fast mode plus i 3.4 Mbit/s High Speed mode, rozrózniamy węzły: Master (rozprowadza sygnał zegara i adresuje slavy) i Slave w dowolnej ilości, mozliwa zmiana ról,
Wszystkie nadajniki są typu otwarty kolektor lub otwarty dren, a więc na liniach występuje tzw. iloczyn na drucie ("1" jest recesywna, a "0" dominujące). Pozwala to na wykrywanie kolizji. Każde urządzenie nadając "1" jednocześnie sprawdza, czy na magistrali rzeczywiście pojawił się stan wysoki. Jeżeli tak nie jest, oznacza to, iż inne urządzenie nadaje w tym samym czasie i urządzenie zaprzestaje nadawania.ponieważ dane nadawane są w kolejności od najstarszego bitu do najmłodszego, w przypadku jednoczesnego nadawania, urządzenie nadające adres o wyższym numerze wycofa się pierwsze, co wynika z binarnego sposobu zapisywania liczb. Występuje tu zatem arbitraż ze stałym przydziałem priorytetów, określonym przez adres urządzenia typu slave. Urządzenia o niższych adresach mają wyższy priorytet od urządzeń o adresach wyższych. SPI - (Serial Peripheral Interface Bus) opatentowany przez Motorole szeregowy interfejs urządzeń peryferyjnych jeden z najczęściej używanych interfejsów komunikacyjnych pomiędzy systemami mikroprocesorowymi a układami peryferyjnymi takimi jak: przetworniki ADC/DAC, pamięci EEPROM, pamięci flash, karty MMC/SD/ itp. komunikacja full-duplex pomiędzy masterem i slavami cztery linie sygnałowe SCLK: Serial Clock (output from master); MOSI; SIMO: Master Output, Slave Input (output from master); MISO; SOMI: Master Input, Slave Output (output from slave); SS: Slave Select (active low, output from master). Timer/ Counter - cyfrowy licznik zliczający w przód/tył z daną ustawioną częstotliwością, wyzwalający pożądaną akcję, przerywający prace procesora gdy osiągnie pożądaną wartość. Porty równoległe - wejścia/wyjścia ogólnego przeznaczenia do sterowania zazwyczaj diodami LED lub obsługi przycisków, zwykle istnieje możliwość włączenia wewnętrznych rezystorów podciągających.
ADC/DAC - (analog/digital converter) układ służący do zamiany sygnału analogowego (ciągłego) na reprezentację cyfrową, Dzięki temu możliwe jest przetwarzanie ich w urządzeniach elektronicznych opartych o architekturę zero-jedynkową oraz gromadzenie na dostosowanych do tej architektury nośnikach danych. Proces ten polega na uproszczeniu sygnału analogowego do postaci skwantowanej (dyskretnej), czyli zastąpieniu wartości zmieniających się płynnie do wartości zmieniających się skokowo w odpowiedniej skali (dokładności) odwzorowania. Przetwarzanie A/C tworzą 3 etapy: próbkowanie, kwantyzacja i kodowanie. Działanie przeciwne do wyżej wymienionego wykonuje przetwornik cyfrowo-analogowy (DAC). Rozdzielczość przetwornika określa liczbę dyskretnych wartości jakie może on wytworzyć. Zwykle wyraża się ją w bitach. Przykładowo, przetwornik A/C, który potrafi przetworzyć próbkę sygnału na jedną z 256 wartości liczbowych posiada rozdzielczość równą 8 bitów, ponieważ 2^8 = 256. Rozdzielczość może być również wyrażona w woltach. Rozdzielczość napięcia przetwornika A/C jest równa jego całkowitej skali pomiaru podzielonej przez liczbą poziomów kwantyzacji częstotliwość próbkowania jest odwrotnością różnicy czasu pomiędzy dwiema kolejnymi próbkami Przetwornik o przetwarzaniu bezpośrednim (nazywany także Flash) działa na zasadzie bezpośredniego i zazwyczaj jednoczesnego porównania wartości napięcia wejściowego z szeregiem napięć odniesienia reprezentujących poszczególne poziomy kwantowania Przetwornik o przetwarzaniu analogowym działa na zasadzie zliczania impulsów z generatora wzorcowego o dużej częstotliwości (względem czasu pomiaru) w czasie proporcjonalnym do napięcia wejściowego. Czas zliczania impulsów jest szerokością impulsu bramkującego generowanego przez układ sterujący na podstawie porównania napięcia wejściowego z liniowo narastającym napięciem odniesienia przez komparator analogowy Dodatkowo USB w wersji Host lub Device, Ethernet, LCD, ISI, SD, jednostki szyfrujące, MMU itp. W mikrokontrolerach dostępnych jest zwykle kilka przerwań zewnętrznych wyzwalanych stanem lub zboczem oraz przerwania pochodzące od wbudowanych peryferiów. Dzięki temu możliwe jest podjęcie odpowiedniej akcji np. po zakończeniu konwersji ADC lub odebraniu znaku przez UART. Tablica przerwań mikrokontrolera ATmega8 wygląda następująco:
W momencie wystąpienia przerwania procesor skacze do adresu podanego w tabeli, aby obsłużyć przerwanie, pod adresem tym powinien znajdować się skok w inne miejsce w pamięci, w którym znajduje się procedura obsługi przerwania. Powrót wykonywany jest za pomocą specjalnej instrukcji RETI, która dodatkowo włącza spowrotem przerwania. Aby włączyć dane przerwanie należy ustawić odpowiednio bit I w rejestrze SREG (globalne zezwolenie na przerwania) oraz włączyć przerwania w rejestrach konfiguracyjnych urządzenia peryferyjnego, z którego przerwania mają nadchodzić 6. Programowanie (ładowanie programu) i uruchamianie Szeregowe w systemie (w przypadku rodziny AVR) - programowanie pamięci Flash za pomocą interfejsu SPI, mikrokontroler programowany jest w działającym urządzeniu docelowym, jest to tzw. ISP (In System Programming), wymagane są 3 linie (MISO, MOSI, SCK) oraz Reset i zasilanie. Programowanie za pomocą bootloadera - dostępne tylko w układach, które same mają możliwość modyfikacji programu. Program może byc przesyłany szeregowo za pomocą interfejsu UART lub USB w zależności od implementacji. Istnieją systemy, w których mikrokontroler ma możliwośc aktualizacji własnego oprogramowani przez łącze bezprzewodowe np. ZigBee. Rówoległe - rzadko stosowane w praktyce ze względu na wygode, jest metodą ratunku w przypadku zablokowania programowania szeregowego (w rodzinie AVR), JTAG - interfejs początkowo wykorzystywany w produkcji do sprawadzania poprawności montażu układów scalonych, z czasem producenci zaczęli wykorzystywać go także do programowania i debugowania układów mikroprocesorowych oraz układów FPGA.
Program i zawartość pamięci EEPROM może być zabezpieczona przed nieuprawnionym odczytem. Dokonać tego można zapisując odpowiednie Lock Bity w momencie, gdy miktrokontroler jest w trybie programowania. Oprócz tego, można skonfigurować odpowiednio inne parametry pracy układu np. źródła sygnału zegarowego, ustawienia kalibracyjne, stan watchdoga, dostępność interfejsów do programowania itp., w zależności od stosowanego układu możliwości są różne. Do pracy układu wymagane jest zasilanie wraz z kondensatorem filtrującym zasilanie (zwykle 100nF) oraz opcjonalnie kwarcem służącym do generowania sygnału zegarowego. Pod układem zalecane jest pole masy pomagające chronić układ przed zakłóceniami mogącymi spowodować nieprawidłową pracę mikrokontrolera. W przypadku wykorzystywania przetworników DAC i ADC wykorzystuje się oddzielne piny do ich zasilania wraz z odsprzęganiem w postaci kondensatorów zwykle 100nF i dławików. Istnieje kilka możliwości generowania sygnału zegarowego: zewnętrzny kwarc (do jego działania wymagane dodatkowo dwa kondensatory o wartości kilkudziesięciu pf) dostarcza stabilny sygnał zewnętrzny generator dostarczający sygnał za pomocą 1 linii wewnętrzny oscylator RC - zaletą są niskie koszty urządzenia, bo nie wymagane są żadne zewnętrzne elementy, a płytka ma mniejsze rozmiary, jednak nie jest to stabilne źródło, gdyż zależy od wielu czynników np. temperatura otoczenia, zakłucenia itp., nie nadaje się do taktowania interfejsów szeregowych zewnętrzny oscylaror RC zewnętrzny kwarc niskiej częstotliwości (kwarc zegarkowy) 7. Programowanie (tworzenie kodu) Ponieważ mikrokontrolery tworzone są z myślą o nieustannej pracy w czasie rzeczywistym oraz minimalizację kosztów produkcji i eksploatacji programiści zmuszeni są do stosowania odpowiedniej metodologi programowania. Pierwszym i najważniejszym elementem jest stosowanie zmienych o jak najmniejszym możliwym rozmiarze spełniającym wymagania funkcjonalne programu. Aby to osiagnąć można pisać programy w języku niskiego poziomu (ze wskazaniem na Assembler) aby mieć pełną kontrolę nad wykorzystaniem zasobów mikrokontrolera. Zazwyczaj kod tworzony jest w języku C, wraz z ewentualnymi wstawkami w Asemblerze. Kolejnym istotnym aspektem jest konstrukcja kodu programu w taki sposób, aby mimo wystąpienia pewnych zdarzeń losowych lub oczekiwania na przerwanie procesor wykonywał pozostałe niezbędne operacje, oraz przechodził w jeden ze stanów uśpienia w celu oszczędzania zasilania w przypadku urządzeń zasilanych bateryjnie. Cechy: zwykle brak systemu operacyjnego, bezpośredni dostęp do sprzętu, mała wydajność, konieczna kontrola zależności czasowych. Jednym ze sposobów programowania jest tzw. cooperative multitasking - wielozadaniowość bez wywłaszczania, umożliwia uzyskanie pewnego rodzaju wielozdaniowości. Polega na umieszczeniu w pętli while(1) {..} funkcji do obsługi określonych zadań, w których używane są funkcje nieblokujące. Dzięki temu różne moduły programu mogą być wywoływane w
miarę regularnie i obsługiwać określone funkcje np. obsługa stosu sieciowego czy interfejsu użytkownika. http://www.mimuw.edu.pl/~marpe/mikrokontrolery/w1_wstep.pdf http://docs.google.com/viewer?a=v&q=cache:d1cfrtxgj2ej:156.17.46.1/ pmarkowski/pliki/ wyklad2.pdf+historia+mikrokontroler%c3%b3w&hl=pl&gl=pl&pid=bl&srcid=adg EESjc3vhdjXx_I47ZvVHG7-ECiI8P8n3Qj5ikGQ7nUDkaO6gT8hg6PF8IUiZdcm2t- 5htIIOWqg3myEzP-kMsK8_AdxZ6-n3W3HMKOP-SFGISmlTPRGcErJQP_- bettbli9_xoryo&sig=ahietbtnryy0nndxdvmbylxeakve7bcepg http://www.eetimes.com/design/embedded/4025995/implementing-your-mcu-basedsystem-s-serial-uart-in-software