Dariusz Chaberski - Systemy Mikroprocesorowe (Regionalne Kółka Fizyczne)
Szczegóły spotkań
Dane kontaktowe
Regionalne Kółka Fizyczne
Regionalne Koła Fizyczne Matematyczne Informatyczne
Linki
Archiwum RKF Systemy mikroprocesorowe
Licznik odwiedzin

Liczniki odwiedzin

WSTĘP
Zadaniem spotkań pod tytułem Systemy mikroprocesorowe prowadzonych w ramach Regionalnych Kółek Fizycznych jest zapoznanie uczniów z budową oraz działaniem systemów mikroprocesorowych. Na zajęciach zostaną przedstawione dwa różne pod względem budowy i zastosowania systemy mikroprocesorowe. Pierwszym z nich będzie system zbudowany z wykorzystaniem mikrokontrolera rodziny AVR (ATmega16), drugim systemem będzie komputer osobisty klasy PC.

2010 II 27
MATERIAŁY DO POBRANIA
Spotkanie organizacyjno wprowadzeniowe
Zapraszam do przejrzenia prezentacji (pdf) z pierwszego spotkania.
Spotkania laboratoryjne
Poniższy opis (pdf) zawiera podstawowe informacje dotyczące szeroko pojętych systemów mikroprocesorowych oraz realizowanych w trakcie kursu przykładów.
Deklaracja uczestnictwa
Wszystkie osoby biorące udział w kursie proszone są o wypełnienie deklaracja uczestnictwa (doc) i przyniesieniu jej na kolejne zajęcia. Deklarację należy wypełnić w całości i czytelnie. Dla osób nie mających ukończonych 18 lat wymagany jest podpis rodzica na deklaracji.
8 bitowe mikrokontrolery rodziny AVR
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 pięciu spotkań laboratoryjnych (15 godzin lekcyjnych).
Programowanie mikrokontrolerów w Asemblerze
W tej części kursu 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.
Wprowadzenie do środowiska programistycznego AVR-Studio
Na pierwszym spotkaniu laboratoryjnym 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. Zaprezentowany zostanie zestaw uruchomieniowy ZL10AVR, który będzie wykorzystywany na kolejnych zajęciach.
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.


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
frogram 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.
2010 III 6

2010 III 13

2010 III 20

2010 III 27

Programowanie mikrokontrolerów w języku C
W tej części kursu zostanie zademonstrowanych kilka prostych programów napisanych w języku C 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.
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.

2010 III 27

2010 IV 10

2010 IV 17

Mikroprocesory rodziny x86
Niskopoziomowe programowanie procesorów rodziny x86

Ostatnie spotkanie (3 godziny lekcyjne) dotyczyć będą budowy i działania komputerów osobistych. Zajęcia będą miały charakter prezentacji, w ramach której pokrótce przedstawiona zostania budowa i działanie procesora x86 oraz wybranych modułów znajdujących się w CHIPSETach płyt głównych komputerów osobistych. Zajęcia te będą wspomagane Asemblerem FLATASM, emulatorem systemu QEMU oraz programem MS DEBUG.

2010 IV 17

aktualizacja 2010 IV 9