|
|
Na zajęciach przedstawiona zostanie budowa i działanie systemów mikroprocesorowych oraz dokonany zostanie podział tych systemów na komputery osobiste, kontrolne i pomiarowe. We wstępie przedstawione zostaną podstawowe informacje dotyczące sposobu przechowywani informacji w postaci dwójkowej oraz podstawowe działania arytmetyczne oraz logiczne na liczbach dwójkowych. W dalszej części zostanie przedstawiony podział mikroprocesorów według architektury, listy instrukcji oraz wykazane zostaną różnice pomiędzy mikroprocesorem a mikrokontrolerem. Stosunkowo szczegółowo zostanie zaprezentowana architektura mikrokontrolerów rodziny AVR oraz mikroprocesorów rodziny x86. Przedstawiony zostanie sposób działania, wykorzystania oraz podłączania urządzeń peryferyjnych (przetworniki A/C, liczniki, czasomierze, kontrolery przerwań, kontrolery bezpośredniego dostępu do pamięci) w obu rodzajach systemów.
Z użyciem środowiska programistycznego AVR-Studio uczestnicy kursy będą mogli zapoznać się z praktycznymi aspektami programowania mikrokontrolerów rodziny AVR zarówno w języku Asembler jak i w języku C. W trakcie zajęć laboratoryjnych dotyczących mikrokontrolerów uczniowie będą rozbudowywać dostarczone, działające kody źródłowe po ich wcześniejszym omówieniu.
Komputer osobisty klasy PC posłuży jako przykład systemu zbudowanego z wykorzystaniem procesora o architekturze Von Neumana. Przedstawione zostaną przykłady ilustrujące działanie procesora rodziny x86 w trybie rzeczywistym oraz chronionym. W tej części kursu omówione zostaną również podstawowe moduły znajdujące się w CHIPSETach płyt głównych.
Materiał dotyczący pierwszego wykładu
|
|
|
|
|
|
|
|
Mikroprocesory rodziny x86
|
|
|
Charakter zajęć (dotyczy od jednego do dwóch ostatnich spotkań)
|
W ramach tych spotkań uczniowie zapoznają się w sposób praktyczny z programowaniem procesorów rodziny x86 w Asemblerze z użyciem programu MSDEBUG. Wyjaśnione zostanie działanie procesora w trybie rzeczywistym oraz chronionym. Omówione zostaną podstawowe moduły składowe CHIPSETów płyt głównych komputerów osobistych.
Więcej szczegółów można znaleźć w zaktualizowanych materiałach do pobrania (pdf).
Spotkanie 2010 I 9 będzie ostatnim w ramach kursu Systemy mikroprocesorowe. Proszę nie zapomnieć o przynieniu na te zajęcia wypełnionych deklaracji uczestnictwa.
|
|
|
|
|
8 bitowe mikrokontrolery rodziny AVR
|
|
|
Charakter zajęć (dotyczy pierwszych czterech spotkań laboratoryjnych)
|
Zajęcia dotyczące systemu mikroprocesorowego zbudowanego z wykorzystaniem mikrokontrolera AVR będą miały charakter praktyczny. Uczniowie z wykorzystaniem AVR Studio będą mieli możliwość rozbudowy dostarczonych programów, napisania własnych oraz dokonania ich symulacji na modelu lub też sprawdzenia działania w układzie rzeczywistym. Tej tematyce zostanie poświęconych około czterech spotkań (12 godzin lekcyjnych).
|
|
|
|
Programy demonstracyjne (Assembler i język C)
|
Na zajęciach zostanie dokończona demonstracja, omawianie i rozbudowa programów napisanych w Asemblerze, a następnie omówione zostaną programy napisane w języku C. Wszystkie prezentowane programy (podobnie jak ostatnio) są dostępne poniżej, wszystkie są w pełni funkcjonale. Niektóre programy w czasie zajęć będzie należało zmodyfikować na potrzeby uzyskania dodatkowego efektu. W czasie zajęć każdy z programów zostanie omówiony tak, aby nie pozostawić wątpliwości co do jego działania. Poniżej zawarte programy zostały przewidziane na dwa lub trzy kolejne spotkania.
|
Program odtwarzający dźwięk
|
|
Program sound.asm odtwarza dźwięk zapisany w postaci cyfrowej w pliku sound.txt, który (plik) z użyciem odpowiednich dyrektyw Asemblera zostaje w momencie asemblacji umieszczony w sekcji danych pamięci programu. Podczas działania programu pobierane są kolejne bajty z sekcji danych pamięci programu, które określają wypełnienie na wyjściu PWM. Do wyjścia PWM podłączony jest głośniczek i w efekcie słyszany jest sygnał dźwiękowy zapisany w pliku. Dostarczony w pliku tekstowym sygnał dźwiękowy powstał poprzez modyfikację oryginału sound_22050_Hz_16_bit.wav, który został spróbkowany z częstotliwością 22050 Hz oraz rozdzielczością 16 bitów. Aby możliwe było zapisanie tego dźwięku do mikrokontrolera (ograniczona pamięć) sygnał ten został poddany procesowi zmniejszania rozdzielczości do 8 bitów oraz procesowi zmniejszania częstotliwości próbkowania do 3906 Hz. Plik sound_3906_Hz_8_bit.wav zawiera tą samą informację co dostarczony plik tekstowy, ale w formacie, który można bezpośrednio odtworzyć na komputerze. Zadaniem uczniów będzie taka modyfikacja programu, aby odtworzyć kolejne nagranie sound1.txt, w którym próbki umieszczone zostały w odwrotnej kolejności.
|
Kopiowanie tablic danych
|
|
Program strcopy.asm dokonuje kopiowania do pamięci EEPROM tablicy danych, która (tablica) pierwotnie znajduje się w pamięci programu FLASH, a następnie tablica ta jest kopiowana do pamięci danych SRAM. Śledząc działający na modelu program można dostrzec istniejące w rodzinie AVR mechanizmy adresowania. Program demonstruje zapis i odczyt pamięci EEPROM, który jest nieco odmienny od zapisu i odczytu innych zasobów pamięciowych.
|
Edycja pamięci EEPROM
|
|
Program eeprom_edit.asm umożliwia edycję (zapis oraz odczyt) czterech pierwszych komórek pamięci EEPROM. Interfejs użytkownika stanowią cztery przyciski (młodsze bity portu PORTB) oraz osiem diod LED (PORTA). Przycisk pierwszy umożliwia wybór edytowanego bitu, każde jego wciśnięcie powoduje wybór kolejnego bitu. Przycisk drugi umożliwia edycję bitu, każde jego wciśnięcie powoduje zanegowanie wybranego do edycji bitu. Przycisk trzeci powoduje zapis do komórki pamięci EEPROM na którą wskazuje wskaźnik zapisu oraz następnie inkrementację modulo 4 wskaźnika zapisu. Przycisk czwarty umożliwia odczyt i inkrementację modulo 4 wskaźnika odczytu. Oba te wskaźniki są niezależne od siebie.
Po zapisaniu kilku przykładowych wartości do pamięci EEPROM, można układ wyłączyć z prądu i ponownie włączyć, a wartości, które zostały zapisane nie ulegną skasowaniu.
|
Eliminacja wpływu drgań styków
|
|
Każde naciśnięcie lub zwolnienie przycisku w początkowej fazie powoduje szereg zwarć i rozwarć, które spowodowane są drganiami mechanicznymi elementów zwierających. Efekt ten często nazywa się drganiami styków i jest on oczywiście niepożądany z punktu widzenia systemu mikroprocesorowego. Nie jesteśmy w stanie tego efektu wyeliminować, jedyne co, to mamy możliwość wyeliminować jego wpływ na stan układu elektronicznego. Algorytm eliminacji jest bardzo prosty. Jeżeli nastąpiło przyciśnięcie przycisku, należy odczytać go ponownie po czasie dłuższym aniżeli okres drgań styków (10 ms) i sprawdzić czy nadal przycisk jest wciśnięty. Jeżeli jest wciśnięty, to należy podjąć związaną z tym przyciskiem akcję, w przeciwnym wypadku należy wrócić do pętli głównej programu.
Program key_cnt.c powoduje zwiększenie stanu diod podłączonych do portu PORTA przy każdym wciśnięciu jakiegokolwiek z czterech przycisków podłączonych do młodszych bitów portu PORTB. Zadaniem ucznia jest taka modyfikacja programu aby jedno przyciśnięcie powodowało pojedynczą inkrementację stanu diod (należy zastosować algorytm eliminacji opisany powyżej). Do uzyskania opóźnień można wykorzystać funkcję _delay_ms(t) (util/delay.h), która pozwala uzyskiwać opóźnienia o wartości t wyrażonej w milisekundach. Następnie należy napisać program, który będzie rozróżniał przyciski (dla każdego przycisku zostanie przypisana inna akcja). Naciśnięcie pierwszego przycisku ma zwiększać stan diod o 1, drugiego zwiększać o 10, trzeciego ma zmniejszać o 10, a czwartego zmniejszać o 1.
|
Sterowanie multipleksowe zespołem wyświetlaczy siedmio-segmentowych
|
|
Sterowanie multipleksowe wykorzystywane jest w sytuacjach, kiedy istnieje konieczność sterowania stosunkowo licznym zbiorem elementów. Idea sterowania multipleksowego polega na tym, że w danym przedziale czasu sterowany jest jeden podzbiór elementów, podczas gdy inne pozostają wyłączone. W następnym przedziale czasu sterowany jest kolejny podzbiór itd. W danej chwili tylko elementy jednego podzbioru są sterowane, podczas gdy wszystkie inne są wyłączone. Przełączanie podzbiorów następuje stosunkowo szybko (1 ms), tak więc obserwator ma wrażenie, że wszystkie elementy są sterowane jednocześnie.
W programie 7_seg_mux_edit_dec.c występuje sterowanie multipleksowe czterema 7 segmentowymi wyświetlaczami LED. Wyprowadzenia segmentów o tych samych oznaczeniach (oraz znaków dziesiętnych) wszystkich czterech wyświetlaczy zostały podłączone (równolegle) do ośmiu bitów portu PORTA mikrokontrolera. Cztery sygnały wspólne (wspólne katody) podłączono do czterech młodszych bitów portu PORTB. Dostarczony program umożliwia edycję dowolnej cyfry przy użyciu prostego interfejsu zbudowanego z wykorzystaniem czterech przycisków. Przycisk pierwszy wybiera kolejną cyfrę do edycji, natomiast przycisk drugi wybiera poprzednią. Przycisk trzeci powoduje zwiększenie stanu wybranej cyfry, natomiast przycisk czwarty powoduje zmniejszenie stanu tej cyfry.
Definicje wyglądu poszczególnych cyfr zawarte są w pamięci programu, do której na poziomie danych otrzymujemy dostęp poprzez stosowanie przy deklaracji atrybutu __attribute__((progmem)) (avr/pgmspace.h) oraz funkcji pgm_read_byte() przy odczycie. Makro ISR() pozwala zdefiniować podprogram obsługi przerwania, w tym przypadku (TIMER0_COMP_vect) jest to przerwanie wykonywane w sytuacji, kiedy licznik osiągnął wartość zapisaną w rejestrze z nim skojarzonym. Przerwanie to wykorzystywane jest do przełączania podzbiorów elementów sterowanych multipleksowo.
Dostarczony program należy zmodyfikować w taki sposób, aby umożliwiał on edycję liczb szesnastkowych (na pojedynczej cyfrze wystąpią wartości 0-9 oraz abcdef). Dodatkowo należy zaimplementować migający punkt dziesiętny na wyświetlaczu, na którym znajduje się edytowana cyfra.
|
Obsługa przetwornika analogowo-cyfrowego
|
|
Program 7_seg_mux_calc_adc.c stanowi demonstrację wykorzystania przetwornika analogowo-cyfrowego. Wartość podawana na wejście przetwornika AC ustalana jest za pomocą potencjometru znajdującego się na zestawie laboratoryjnym. Każde naciśnięcie przycisku drugiego spowoduje dodanie aktualnego stanu przetwornika AC do zmiennej wynik, naciśnięcie przycisku trzeciego spowoduje odjęcie od zmiennej wynik aktualnego stanu przetwornika, natomiast naciśnięcie przycisku czwartego spowoduje wyzerowanie zmiennej wynik. Na czterech wyświetlaczach 7 segmentowych (PORTB[0-7], PORTC[0-3]) może pojawiać się albo aktualny stan przetwornika AC albo wartość zmiennej wynik. Przełączanie pomiędzy wartością a przetwornikiem AC odbywa się z wykorzystaniem przycisku pierwszego. Przyciski podłączono do starszych bitów portu PORTC.
Program należy rozbudować tak, aby edycja każdej cyfry możliwa była z wykorzystaniem potencjometru. Dwa przyciski należy wykorzystać do wyboru edytowanej cyfry. Maksymalna wartość odczytana z przetwornika wynosi 1023, stąd wartość cyfry na pozycji pos można wyznaczać w programie w następujący sposób data[pos]=10*ADC/1024, gdzie ADC jest wskazaniem przetwornika AC.
|
Obsługa klawiatury matrycowej
|
|
Podobnie jak sterowanie multipleksowe wyświetlaczami 7 segmentowymi odbywa się odczyt klawiatury matrycowej. W danej chwili czasowej tylko jedna kolumna przycisków jest aktywna, to znaczy, że przy odczycie otrzymamy stan aktywny na którymkolwiek wierszu, jeżeli zostanie wciśnięty przycisk znajdujący się w tej kolumnie. Jeżeli jest wciśnięty tylko przycisk znajdujący się w nieaktywnej kolumnie, wówczas wszystkie wiersze będą nieaktywne w tej chwili czasowej. Oczywiście przełączanie następuje bardzo szybko (1 ms) i nawet najkrótsze wciśnięcie przycisku (30 ms) nie zostanie przegapione.
Dostarczony program 7_seg_mux_key_mux_adder.c demonstruje rozróżnianie przycisków oraz eliminację wpływu drgań styków. Każde naciśnięcie przycisku powoduje zwiększenie stanu wyświetlanego na czterech wyświetlaczach 7 segmentowych o wartość równą indeksowi przycisku (0 - 15). Wyświetlacze podłączono tak samo jak w poprzednim przykładzie. Klawiaturę natomiast podłączono w taki sposób, że sygnały sterujące (kolumny) podłączono do starszych bitów portu PORTC, natomiast wiersze (odczyt) podłączono do starszych bitów portu PORTA.
Z wykorzystaniem dostarczonego szablonu należy napisać program realizujący kalkulator. Przyciski o indeksach od 0 do 9 mogą stanowić wpisywane cyfry. Przyciski o indeksach 10, 11, 12 i 13 mogą być odpowiadać za poszczególne operacje +, -, * oraz /. Przycisk o indeksie 15 może stanowić odpowiadać za wykonanie działania (=), a przycisk o indeksie 14 może być przyciskiem zerującym wynik.
|
Interfejs szeregowy RS232
|
|
Program rs_echo.c (AVR) odbiera znaki pochodzące z komputera (Hyper Terminal) gromadzi je w buforze i z częstotliwością równą około 1 Hz odsyła z powrotem. Jeżeli użytkownik wpisze kilka znaków w krótkim przedziale czasu, wówczas znaki zostaną zgromadzone w buforze i będą odsyłane sukcesywnie (jeden znak na sekundę). Indeks (położenie w buforze) dla znaków odebranych i wysłanych jest raportowany na porcie PORTA.
Zadaniem ucznia jest tak zmodyfikować program aby odebrane wielkie litery wysyłał z powrotem jako małe i vice versa, inne znaki mają nie ulegać zmianie.
|
|
|
|
|
Programy demonstracyjne (Assembler)
|
Na zajęciach zostanie zademonstrowanych kilka prostych programów napisanych w Asemblerze na mikrokontroler ATmega16. Wszystkie prezentowane programy są dostępne poniżej, wszystkie są w pełni funkcjonale. Niektóre programy w czasie zajęć będzie należało zmodyfikować na potrzeby uzyskania dodatkowego efektu. W czasie zajęć każdy z programów zostanie omówiony tak, aby nie pozostawić wątpliwości co do jego działania.
|
Migająca dioda
|
|
Program zawarty jest w pliku led_twinkle.asm. Program ten naprzemiennie zapala i gasi diodę świecącą LED. Dioda została podłączona do wyprowadzenia zerowego portu PORTA, który został skonfigurowany jako wyjście. Opóźnienie wykonywane jest w sposób programowy i w dostarczonym pliku jest ono na tyle duże, że miganie jest ledwo dostrzegalne (dioda miga bardzo szybko - gdybyśmy podłączyli generowany sygnał nie do diody ale do głośniczka usłyszelibyśmy buczenie). Na zajęciach należy, poprzez analogię do zastosowanego rozwiązania, zwiększyć opóźnienie generowane przez program tak, aby dioda migała z częstotliwością równą około 1 Hz.
|
Modulacja szerokości impulsu
|
|
Modulacja szerokości impulsu (PWM) wykorzystywana jest powszechnie w przemyśle do sterowaniu elementami wykonawczymi takimi, jak żarówki, silniki, grzejniki oporowe i inne. Podczas sterowania z wykorzystaniem PWM do odbiornika (na przykład żarówki), którego mocą chcemy sterować (jasność świecenia żarówki) nie dostarcza się napięcia analogowego o wartości proporcjonalnej do żądanej jasności, ale napięcie prostokątne, którego wypełnienie jest tym większe im do odbiornika ma zostać dostarczona większa moc. Wypełnienie definiuje się jako stosunek czasu, kiedy odbiornik jest załączony (230 V) do sumy obu czasów, to jest czasu wyłączenia (0V) i wspomnianego wcześniej włączenia odbiornika. Program pwm.asm steruje diodą świecącą LED wykorzystując licznik czasomierz 0 mikrokontrolera AVR skonfigurowany do pracy w trybie PWM. Dostarczony program stopniowo rozjaśnia diodę świecącą LED (zmieniając wypełnienie sygnału na wyjściu OC0), a następnie ją gasi i cały proces powtarza ponownie. Zadaniem uczniów będzie taka zmiana programu, aby proces zachodził w przeciwnym kierunku, czyli aby dioda stopniowo zmniejszała intensywność świecenia.
|
Przerwania sprzętowe
|
|
Mechanizm przerwań upraszcza implementację obsługi zdarzeń, które wystąpiły poza rdzeniem mikrokontrolera, a należy na nie zareagować z jak najmniejszym opóźnieniem. W mikrokontrolerze AVR istnieje wiele źródeł przerwań. Na zajęciach jako przykład zostanie pokazana obsługa przerwań zewnętrznych (zewnętrzne wyprowadzenia mikrokontrolera) oraz przerwań pochodzących od licznika czasomierza zerowego. Program interrupt_ext.asm reaguje na zdarzenia zewnętrzne, które przejawiają się zboczem opadającym na wyprowadzeniu INT1 (bit trzeci portu PORTD) mikrokontrolera. Każde zbocze opadające powoduje przerwanie aktualnie wykonywanego programu, zapisanie adresu powrotu na stosie i rozpoczęcie wykonywania podprogramu obsługi przerwania. Po wykonaniu podprogramu obsługi przerwania mikrokontroler, wykorzystując adres powrotu, powraca do przerwanego zajęcia. Drugi program interrupt_tc0.asm demonstruje obsługę dwóch rodzajów zdarzeń. Pierwsze przerwanie występuje w momencie, kiedy licznik osiągnie wartość zapisaną w rejestrze z nim skojarzonym (0x10=16). Następuje wówczas wykonanie odpowiedniego podprogramu, ale licznik liczy dalej. W momencie, kiedy się przepełni (255->0) następuje wywołanie drugiego podprogramu obsługi przerwania. Zadaniem uczniów jest taka modyfikacja drugiego programu, aby znacząco zmniejszyć czas pomiędzy wywołaniem przerwania na zdarzenie, kiedy licznik osiągnie wartość zapisaną w rejestrze a zdarzeniem, kiedy się przepełni.
|
|
|
|
|
Zakres materiału (dotyczy pierwszego i może po części drugiego spotkania laboratoryjnego)
|
Na najbliższym spotkaniu przedstawione zostanie środowisko programistyczne AVR Studio. Pokazany zostanie sposób tworzenia projektów w języku Asembler, ich asemblacji oraz symulacji na modelu w tym środowisku. Zaprezentowane zostaną te instrukcje mikrokontrolera AVR, które pozwalają zapoznać się z jego architekturą. Dodatkowo przedstawione zostaną te podstawy Asemblera, których znajomość jest konieczna przy tworzeniu prostych projektów na niskim poziomie. Należą do nich między innymi etykiety i następujące dyrektywy: .cseg, .eseg, .dseg, .db, .byte.
|
|
|
|
|
|