Mikrokontroler Platforma Mikrokontroler AVR Uno Systemy Wbudowane IDE: Środowisko Preprocesor kodu Terminal Uruchamianie, AVR (wersja 018) mgr inż. Marek Wilkus http://home.agh.edu.pl/~mwilkus Wydział Inżynierii Metali i Informatyki Przemysłowej AGH Kraków 1 Oprogramowanie IDE: C: Podstawowe techniki programowania mikrokontrolerów, Budowa programu, Sterowanie wyjściami, Wejścia/wyjścia cyfrowe podłączenie urządzeń zewnętrznych, Urządzenia wewnętrzne, Komunikacja z komputerem, Przerwania. https://www.sites.google.com/site/unoardusim/ DIY Layout Creator: http://diy-fever.com/software/diylc/ 4 1970... Uniwersalne bloki sterujące. Jeden moduł, cechy późniejszych mikrokontrolerów. System mikroprocesorowy w postaci jednego układu scalonego. Zintegrowane: http://winavr.sourceforge.net/ UnoArduSim: Mikrokontroler http://www.kicad-pcb.org WinAVR: 3 http://fritzing.org KiCAD: http://www.arduino.cc Fritzing: CPU RAM Pamięć programu Urządzenia I/O Dodatkowe urządzenia Użycie jednego układu: oszczędność miejsca, energii, łatwa rozbudowa i programowanie systemu. 5 6
1971 Texas Instruments TMS1000 198x - BASIC Stamp miniaturyzacja, niska cena, łatwe zastosowania hobbystyczne. Pierwszy mikrokontroler Wewnętrzne źródło częstotliwości Programowanie: Mask-ROM Bardzo wysokie ceny 1976 Intel 8048 (MCS-48): Programowanie jak EPROM 1kB ROM 18B RAM Początek serii MCS-48 Programowanie: in-system, lub Mask-ROM. Układ hybrydowy, Łatwe programowanie, także Programowanie w BASIC. Wciąż produkowane. i późniejszych 51. Assembler 7 8 1975-85 PIC: 1995-97 Atmel AVR: Programowanie jak EPROM, 1993 Pamięć EEPROM. Różnorodność modeli. Programowanie: Assembler C Duża pamięć programu (4-51kB) Wiele urządzeń wewnętrznych Różnorodność modeli: od ATTiny do AVR3 Pamięć Flash dla programu Pamięć Flash dla użytkownika Niska cena Łatwe programowanie: Komercyjne narzędzia. Wciąż rozwijane. Assembler Basic (BASCOM) C Obecność platform np.. Otwarte narzędzia deweloperskie. Wciąż rozwijane. 9 10 Uno Mikrokontroler: AVR ATMega38 16MHz. 3kB pamięci Flash na program (31kB dostępne - bootloader) kb RAM 1kB EEPROM GPIO: 14 pinów (6 PWM) 6 wejść analogowych Interfejs z komputerem: USB-RS3. Programowanie przez USB. Zasilanie: 5V, własna stabilizacja. Platforma programistyczna dla systemów wbudowanych. Open Hardware (z wyjątkami). Pojedynczy moduł. Mikrokontroler AVR. Wbudowany interfejs mikrokontroler-komputer. Programowanie: C. Środowisko: IDE. 11 1
AVR AVR: Co otrzymujemy? 8-bitowy, jednoukładowy mikrokontroler RISC. Pamięć programu: Flash, Pamięć operacyjna: Statyczny RAM, Dodatkowa pamięć Flash dla programów użytkownika, Wyprowadzenia wielofunkcyjne, Wbudowane interfejsy i przetworniki, 1 6 6 timery 8-bitowe timer 16-bitowy liczniki kanałów PWM kanałów ADC, 10-bitowe przerwania z GPIO BOR, WDT, Możliwość pracy z wewnętrznym oscylatorem, Programowanie ISP (In-System Programming), 13 14 C Informacje Eliminuje konieczność ustawiania wbudowanych urządzeń przez konfigurację rejestrów sterujących. Ułatwia budowę programu. Znacznie przyspiesza testowanie i prototypowanie. Zabezpiecza przed problemami z konfiguracją wstępną (Fuse-bity). Dostarcza użytecznych bibliotek funkcji. Kod podobny do C++, konwertowany do C. Noty katalogowe i instrukcje: Niższa niż w przypadku czystego C wydajność i większy rozmiar kodu. Toleruje techniki marnujące pamięć operacyjną. Podręczniki: Monk S. - dla początkujących Podstawy i szkice Helion 014. http://www.atmel.com http://www.atmel.com/devices/atmega38.aspx : http://www.arduino.cc/ http://arduino.cc/en/reference/ http://ep.com.pl - Kurs (PL) Evans B. - Beginning programming - Apress 011. 15 Informacje Manual Co jest niezbędne? 16 Uno Parametry układu: Czy układ będzie spełniał zadanie w projekcie? Warunki pracy układu: Zasilanie. Moc wyjściowa. Warunki środowiskowe. Wydajność. Czy parametry używanych urządzeń są wystarczające? Programowanie: Mapa rejestrów i praca z urządzeniami. 17 18
Projekt na 1. Jakie urządzenia mają być obsługiwane? Wejście Wyjście Debug. Czy urządzenia wymagają specjalnego sterowania? Jakiego? (: max 0mA/pin) 3. Projekt konstrukcji. 4. 5. 6. 7. Założenia programu, podstawowe parametry I/O, urządzeń, definicje I/O. Konstrukcja. Program weryfikujący konstrukcję. Właściwy program. Testowanie, poprawki. 19 IDE programowanie. 0 C Co dzieje się gdy uruchamiamy kod? Sprawdzenie kodu Biblioteki Monitor portu terminal Załadowanie do Nie stosować danych binarnych!! Nowy plik Otwórz/zapisz Plik INO Preprocesor Plik.C AVR-GCC.c.o.elf hex Plik.HEX AVRDude Ustawienia platformy Informacje kompilatora USB lub RS3 Użyty wirtualny port szeregowy 1 Podstawowe techniki Podstawowe techniki Dyrektywa preprocesora #define: volatile nie buforuje zmiennej w rejestrach: volatile int stan; #define nazwa wartość Podczas kompilacji wystąpienia nazwy zostaną zastąpione wartością. Np. Zamieni występowanie ledpin na 13. W przypadku zmiany konstrukcji zmiana jednej linii kodu. 3 Gdy zmienna ta zostanie zmieniona poza programem (np. w trakcje procedury przerwania) zostanie użyta jej aktualna wartość. W nowszych wersjach kompilator automatycznie stara się ustawić buforowanie zmiennych. 4
Podstawowe typy danych Programowanie w pętli boolean wartość logiczna (prawda/fałsz), zajmuje 1 bajt danych. char, unsigned char = byte (0..55). int, unsigned int = word (0..^16-1). Zmiennoprzecinkowe: float (4B), double (8B). string jako tablica char'ów lub typ z biblioteki. Każdy program działający w systemie operacyjnym zaczyna się i kończy. Po zakończeniu programu następuje powrót do systemu operacyjnego. Mikrokontroler systemu operacyjnego nie posiada. Program wykonuje się w nieskończonej pętli. Można tworzyć pod-pętle wprowadzając różne tryby pracy. 5 Programowanie w pętli - przykład Zegar z budzikiem: Normalnie działanie: Wyświetlanie aktualnej godziny. Po naciśnięciu przycisku ustawienia godziny: Przyciskami H+/M+ można ustawić bieżącą godzinę. Zatwierdzamy dowolnym innym przyciskiem. Programowanie w pętli - przykład. : 56 Ust. godziny H+ Ust. alarmu M+ Normalnie działanie: Wyświetlanie aktualnej godziny. Po naciśnięciu przycisku ustawienia godziny: Po naciśnięciu przycisku ustawienia alarmu 7 Budowa programu #define ledpin Zegar z budzikiem: Przyciskami H+/M+ można ustawić bieżącą godzinę. Zatwierdzamy dowolnym innym przyciskiem. Po naciśnięciu przycisku ustawienia alarmu Wyświetlenie godziny alarmu Przyciskami H+/M+ można ustawić godzinę alarmu. Zatwierdzamy dowolnym innym przyciskiem. 6 Wyświetlenie godziny alarmu Przyciskami H+/M+ można ustawić godzinę alarmu. Zatwierdzamy dowolnym innym przyciskiem. Główna pętla: Odświeżanie aktualnej godziny, Czy wciśnięty przycisk ust. godziny? Odśwież aktualną godzinę Jeżeli wciśnięty H+ - zwiększ zmienną godzin, Jeżeli wciśnięty M+ zwiększ zmienną minut, Jeżeli wciśnięty inny przycisk opuść pętlę, Czy wciśnięty przycisk ust. alarmu? Odśwież godzinę alarmu, Jeżeli wciśnięty H+ - zwiększ godzinę alarmu, Jeżeli wciśnięty M+ zwiększ minutę alarmu, Jeżeli wciśnięty inny przycisk opuść pętlę, 8 Budowa programu 13 #define ledpin 13 9 void main() setup(); while(1) loop(); serialevent(); 30
LED Zmienne i funkcje Wymagany rezystor obniżający prąd. Vcc=5V Typowy LED 3mm: IF=0mA, VF=V unsigned int R= Vcc-VF IF (5-) / 0.0 = 150 Ω A w praktyce 10...470Ω 31 3 Wejścia idea rezystora podciągającego Stan logiczny HIGH to ok...5v. Stan LOW to 0..0.8V. Wejścia idea rezystora podciągającego Gdy dołączymy do wejścia stan niski (np. masę), prąd popłynie przez rezystor, a spadek napięcia na nim będzie wystarczający by na wejściu mikrokontrolera pojawił się stan niski. Ponieważ rezystor ma sporą oporność, prąd płynący przez niego będzie zaś niski na tyle, by nie poczynić szkód w układzie. Rezystory podciągające są powszechnie stosowane w układach logicznych. Prąd pobierany przez wejście przy sprawdzaniu stanu (pomiarze) jest minimalny, Wejście niepodłączone - wiszące w powietrzu (także podłączone do otwartego łącznika) - jest podatne na zakłócenia. Stany zmieniają się w nieprzewidywalny sposób. Są to tzw. stany nieustalone, Niezbędne jest użycie niewielkiego prądu, który zapewniłby wysoki stan logiczny gdy wejście jest niepodłączone, Prąd ten zapewniany jest przez rezystor podciągający (pull-up resistor) o wartości kilku kω, podłączony do zasilania. HIGH LOW ma wbudowane rezystory podciągające i nie ma potrzeby używania zewnętrznych! ma wbudowane rezystory podciągające i nie ma potrzeby używania zewnętrznych! 33 Zmienne i funkcje, wejścia #define resetpin 11 #define resetpin 11 if (!digitalread(resetpin)) delay(100); HIGH unsigned int k = 0; if (!digitalread(resetpin)) delay(100); Zmienne i funkcje, wejścia unsigned int k = 0; 34 35 36
Zmienne i funkcje, wejścia Funkcja delay i jej konsekwencje Istnieją dwie metody projektowania programu wykonywanego okresowo: unsigned int k = 0; #define resetpin 11 Korzystając z delay w przyszłości trudny do rozbudowy, Korzystając z licznika wymaga odpowiedniego zaprojektowania (jako maszyna stanowa), lecz umożliwia łatwą rozbudowę, if (!digitalread(resetpin)) delay(100); if (currentmillis - previousmillis >= 500) previousmillis = currentmillis; if (digitalread(ledpin)) else DigitalWrite(ledPin,HIGH); Wersja z delay: - W trakcie 500ms nie możemy nic zrobić (poza przerwaniami) unsigned long previousmillis=0; unsigned long currentmillis = millis(); LOW INPUT + digitalwrite(high) = INPUT_PULLUP 37 Przerwania #define resetpin volatile unsigned int void reset() 38 Wersja z millis kod otwarty na rozbudowę Przerwania #define resetpin volatile unsigned int void reset() attachinterrupt(0,reset,low); attachinterrupt(0,reset,low); Przerwanie Pin 0 1 3 39 Port szeregowy komunikacja z komputerem Serial.Read()...40! Port szeregowy komunikacja z komputerem Serial.begin(9600); Serial.begin(9600); Serial.print("TO JEST TEST\n"); Serial.print("TO JEST TEST\n"); delay(); millis(); = const unsigned int k = 111; unsigned int k = 111; Serial.println(k); Serial.println(k,DEC); Serial.println(k,HEX); Serial.println(k,BIN); Serial.println(k); Serial.println(k,DEC); Serial.println(k,HEX); Serial.println(k,BIN); Serial.Write(k); Serial.Write(k); Serial.println( /nkoniec. ); 41 TO JEST TEST 111 111 6F 11001111 O Koniec. Serial.println( /nkoniec. ); 4
Port szeregowy komunikacja z komputerem Odbieranie danych: Port szeregowy komunikacja z komputerem Odbieranie danych: Tryb automatyczny: char bajt=0; if (Serial.available() > 0) bajt = Serial.read(); Serial.print("Bajt: "); Serial.println(bajt, DEC); Tryb automatyczny: char bajt=0; if (Serial.available() > 0) bajt = Serial.read(); Serial.print("Bajt: "); Serial.println(bajt, DEC); void serialevent()... void serialevent()... To NIE jest przerwanie!!! void main() setup(); while(1) loop(); serialevent(); 43 Dziękuję. 45 44