Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00408 007374 14238991 na godz. na dobę w sumie
Mikrokontrolery PIC w praktycznych zastosowaniach - książka
Mikrokontrolery PIC w praktycznych zastosowaniach - książka
Autor: Liczba stron: 408
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-3721-8 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> elektronika >> elektronika
Porównaj ceny (książka, ebook, audiobook).

Weź udział w konkursie! »

 


 

 

 

Zostań ekspertem od mikrokontrolerów PIC!

Mikrokontrolery PIC przebojem wdarły się na rynek uniwersalnych cyfrowych układów sterujących. Obecnie są wykorzystywane do kontrolowania pracy różnych urządzeń technicznych, instalacji automatyki przemysłowej i systemów informatycznych, jednak można je znaleźć również w używanym na co dzień sprzęcie AGD czy telefonach komórkowych. Ogromną popularność zawdzięczają sporym możliwościom, dużej niezawodności i elastyczności, prostocie programowania, szerokiemu spektrum zastosowań oraz niewygórowanym cenom. Jedyną wadą PIC-ów wydaje się stosunkowo niewielka ilość polskojęzycznej dokumentacji, a zwłaszcza brak podręcznika, który umożliwiałby początkującemu użytkownikowi bezbolesne rozpoczęcie przygody z tymi mikrokontrolerami, zaś doświadczonemu elektronikowi — szybkie włączenie ich do swojego warsztatu pracy. Na szczęście to już przeszłość, ponieważ do rąk czytelników trafia pierwsze tak wyczerpujące kompendium wiedzy z tej dziedziny: 'Mikrokontrolery PIC w praktycznych zastosowaniach'.

Niezależnie od tego, czy studiujesz robotykę, automatykę, elektronikę lub informatykę, jesteś początkującym lub zaawansowanym inżynierem, czy też technika cyfrowa to Twoje hobby i pragniesz poznać tajniki mikrokontrolerów dla własnej satysfakcji, podręcznik wprowadzi Cię w świat projektowania, konstruowania, programowania nowoczesnych mikrokomputerów jednoukładowych oraz przedstawi najistotniejsze zagadnienia związane z używaniem kilku typów PIC-ów.

Lektura nie tylko przybliży Ci podstawy asemblera i sposoby korzystania z języka C, lecz pokaże też, jak zastosować je w praktyce. Książka napisana została lekko, przystępnie i zrozumiale, lecz jest jednocześnie naprawdę rzetelnym i dogłębnym kompendium wiedzy o mikrokontrolerach. To właśnie na ten podręcznik czekałeś - Twoja cierpliwość została wreszcie nagrodzona!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Redaktor prowadzący: Michał Mrowiec Projekt okładki: Maciej Pasek Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie?mipicp Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Kody źródłowe wybranych przykładów dostępne są pod adresem: ftp://ftp.helion.pl/przyklady/mipicp.zip ISBN: 978-83-246-3721-8 Copyright © Helion 2012 Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis treĈci Wstöp .................................................................................................... 7 Rozdziaä 1. Podstawy. Programatory. Programowanie ............................................... 9 1.1. Podstawy ................................................................................................................... 9 1.2. Programatory PICkit 2, PICkit 3, JDM. ĝrodowisko programistyczne MPLAB IDE. Kompilatory HI-TECH oraz C30 ............................................................................ 11 1.3. Z nosem w dokumentacji ......................................................................................... 15 1.4. Przykáady dostĊpne na FTP ...................................................................................... 15 1.5. Rap-Ort koĔczący rozdziaá ...................................................................................... 15 Rozdziaä 2. (PIC16F877A) Obsäuga diod LED. Obsäuga wyĈwietlaczy LED i alfanumerycznych wyĈwietlaczy LCD. Obsäuga serwomechanizmów ..... 17 2.1. JĊzyk C .................................................................................................................... 17 Obsáuga diod LED .................................................................................................... 17 Obsáuga wyĞwietlacza LED ..................................................................................... 33 Obsáuga wyĞwietlacza alfanumerycznego LCD ....................................................... 35 Obsáuga serwomechanizmów ................................................................................... 49 2.2. Asembler .................................................................................................................. 53 ZaĞwiecenie diody LED ........................................................................................... 53 Mruganie diody LED ............................................................................................... 61 Obsáuga alfanumerycznego wyĞwietlacza LCD ....................................................... 73 2.3. Projekt: sterowanie mechanicznym ramieniem .................................................... 80 2.4. Rap-Ort koĔczący rozdziaá ...................................................................................... 88 Rozdziaä 3. (PIC16F877A) Obsäuga przycisków. Obsäuga klawiatury. Sumowanie czasu trwania impulsu. Maäy skok w bok: kompilator mikroC kontra koszmar I2C .............................................. 91 3.1. JĊzyk C .................................................................................................................... 91 Obsáuga przycisków ................................................................................................. 91 Obsáuga klawiatury .................................................................................................. 98 Sumowanie czasu trwania impulsu ......................................................................... 103 Maáy skok w bok: kompilator mikroC kontra koszmar I2C .................................... 114 3.2. Asembler ............................................................................................................... 131 Obsáuga przycisków ............................................................................................... 131 3.3. Projekt: zamek szyfrowy ....................................................................................... 133 3.4. Rap-Ort koĔczący rozdziaá .................................................................................... 140 4 Mikrokontrolery PIC w praktycznych zastosowaniach Rozdziaä 4. (PIC16F877A) Przerwania. Przerwanie zewnötrzne RB0/INT. Timery. Oscylator moduäu Timer1. Watchdog. Moduä CCP (PWM). Tryb uĈpienia (Sleep) .......................................................................... 143 4.1. JĊzyk C .................................................................................................................. 143 Przerwanie zewnĊtrzne RB0/INT ........................................................................... 143 Timer ...................................................................................................................... 154 Oscylator moduáu Timer1 ...................................................................................... 159 Watchdog ............................................................................................................... 169 Moduá CCP (PWM) ............................................................................................... 172 Tryb Capture .......................................................................................................... 174 Tryb Compare ........................................................................................................ 179 Tryb PWM ............................................................................................................. 184 Tryb uĞpienia (Sleep) ............................................................................................. 189 4.2. Asembler ............................................................................................................... 192 Przerwanie zewnĊtrzne RB0/INT ........................................................................... 192 Timer ...................................................................................................................... 204 4.3. Projekt: czĊstotliwoĞciomierz ................................................................................ 211 4.4. Rap-Ort koĔczący rozdziaá .................................................................................... 218 Rozdziaä 5. (PIC24FJ64GB002) Podstawy. Przerwania. Remapowanie linii portów. SPI. Moduä RTCC ....................................... 219 5.1. JĊzyk C .................................................................................................................. 219 Podstawy ................................................................................................................ 219 Przerwania .............................................................................................................. 240 Remapowanie linii portów. Interfejs SPI ................................................................ 251 Moduá RTCC .......................................................................................................... 267 5.2. Asembler ............................................................................................................... 283 Podstawy ................................................................................................................ 283 Obsáuga przerwaĔ i wektorów puáapek .................................................................. 300 5.3. Projekt: interfejs UART i lokalizator GPS ............................................................ 303 5.4. Rap-Ort koĔczący rozdziaá .................................................................................... 312 Rozdziaä 6. (PIC24FJ64GB002) Obsäuga dodatkowej pamiöci SRAM i EEPROM. Obsäuga kart pamiöci SD. MDD File System. Obsäuga kolorowego wyĈwietlacza graficznego .................................................................... 313 6.1. JĊzyk C .................................................................................................................. 313 Obsáuga dodatkowej pamiĊci SRAM ..................................................................... 313 Obsáuga pamiĊci EEPROM .................................................................................... 320 Zagadka .................................................................................................................. 329 Obsáuga kart pamiĊci SD ........................................................................................ 330 6.2. Asembler ............................................................................................................... 347 Obsáuga kolorowego wyĞwietlacza graficznego ..................................................... 347 6.3. Projekt: przetwornik A/C i termometr cyfrowy ..................................................... 358 6.4. Rap-Ort koĔczący rozdziaá .................................................................................... 367 Spis treĈci 5 Rozdziaä 7. (dsPIC33FJ128GP802) Podstawy. Przetwornik A/C i czujnik odlegäoĈci. RS232. ................................................................ 369 7.1. JĊzyk C .................................................................................................................. 369 Podstawy ................................................................................................................ 369 Przetwornik A/C i czujnik odlegáoĞci ..................................................................... 382 RS232 ..................................................................................................................... 385 7.2. Asembler ............................................................................................................... 390 7.3. Raport koĔczący rozdziaá ...................................................................................... 393 Epos o Królu Wielkim, czyli nieco inny spis rzeczy ............................ 395 O autorze ............................................................................................ 399 Skorowidz .......................................................................................... 401 6 Mikrokontrolery PIC w praktycznych zastosowaniach Rozdziaä 2. PIC16F877A Obsäuga diod LED. Obsäuga wyĈwietlaczy LED i alfanumerycznych wyĈwietlaczy LCD. Obsäuga serwomechanizmów 2.1. Jözyk C Obsäuga diod LED Nasz pierwszy mikrokontroler PIC prezentuje siĊ tak jak na rysunku 2.1. Rysunek 2.1. Mikrokontroler PIC16F877A Skromny, ale odwaĪny. Ma 40 bohaterskich nóĪek, które nie zawahają siĊ uczyniü tego, do czego je zaprogramujemy. ProszĊ mi wybaczyü tĊ nieĞcisáoĞü. Programujemy oczywiĞcie wyprowadzenia, których fizycznym przedáuĪeniem są owe nóĪki. Mądrzy ludzie powiadają, Īe uroda to nie wszystko. WiĊc czymĪe ten heros moĪe siĊ po- chwaliü, jeĞli chodzi o jego wnĊtrze? Spójrzmy na rysunek 2.2, który pochodzi z doku- mentacji mikrokontrolera. 18 Mikrokontrolery PIC w praktycznych zastosowaniach Rysunek 2.2. Zestawienie wyposaĪenia mikrokontrolerów rodziny 16F877A. Rysunek pochodzi z dokumentacji mikrokontrolera (DS39582B), s. 1 SPI? Yes! Master I2C? Yes! USART? Yes! Czyli trzy razy „yes”! Zaczyna siĊ nie najgo- rzej. Na razie interesowaü nas bĊdzie blok oznaczony I/O, czyli cyfrowy interfejs wejĞcia/ wyjĞcia. WáaĞnie pod tym hasáem kryją siĊ ulubione przez nas terminy port i linie portu. Wszystko zmierza ku jednemu — aby pojawiá siĊ rysunek trzeci, tym razem z opisem wyprowadzeĔ mikrokontrolera (patrz rysunek 2.3). Rysunek 2.3. Rozmieszczenie wyprowadzeĔ mikrokontrolera PIC16F877A Porównajmy rysunki 2.1 i 2.3. Czy rzeczywiĞcie mikrokontroler jest tak szeroki, jak widaü na rysunku 2.3? Raczej nie. Poszerzyáa go koniecznoĞü zmieszczenia wszystkich funkcji wyprowadzeĔ. WeĨmy taką nazwĊ: RA3/AN3/VREF+. Oznacza ona, Īe wyprowa- dzenie o numerze 5 peáni trzy alternatywne funkcje: linii portu A (RA3), wejĞcia analo- gowego (AN3) i czegoĞ tam jeszcze (VREF+). Przeáączanie miĊdzy tymi funkcja- mi wiąĪe siĊ z ustawianiem odpowiednich wartoĞci na odpowiednich rejestrach. Nie jest to trudne, ale wymaga od nas dobrej znajomoĞci dokumentacji programo- wanego ukáadu. Na ogóá przy pierwszych programach, którymi najczĊĞciej są ekscesy z diodami, alternatywne funkcje wyprowadzeĔ nie powinny nas martwiü. Koniecznie jednak sprawdĨmy, czy linia, do której podáączyliĞmy diodĊ, jest domyĞlnie linią I/O. MoĪe siĊ bowiem okazaü, co jest zjawiskiem nagminnym w mikrokontrolerach PIC, Īe domyĞlnie jest to wejĞcie analogowe. Wróümy jednak do prapoczątków. Musimy bowiem zaáoĪyü, Īe wĞród Czytelników są takĪe mikrokontrolerowi nowicjusze. Na razie wiemy tyle: mikrokontroler to kostka z nóĪkami, inaczej wyprowadzeniami. Nazwy wyprowadzeĔ wskazują na ich funkcjĊ. A jeĞli wyprowadzenie skáada siĊ z kilku nazw oddzielonych ukoĞnikiem, oznacza to, Īe wyprowadzenie peáni kilka funkcji. Zapowiedziaáem, Īe mamy siĊ tym nie martwiü. WiĊc siĊ nie martwmy. My teĪ peánimy kilka alternatywnych funkcji, co nas wcale nie smuci. Na dodatek nie witamy siĊ, podając ich peáną listĊ: „CzeĞü, Jacku Rozdziaä 2. i Obsäuga diod LED 19 Michale Czarnecki, mĊĪu GraĪyny, ojcu ĩanety i Edgara, sprzedawco w osiedlowym sklepie spoĪywczym, teraz przechodzĊ do informacji niejawnych…”. A wiĊc, powta- rzam, tak siĊ nie witamy. Raczej powiemy sobie: „CzeĞü, Jacku” i po káopocie. Taka sama zasada obowiązuje w przypadku opisu wyprowadzeĔ mikrokontrolera. Najwy- godniej jest przedstawiü ukáad, w którym z wielu funkcji wyprowadzeĔ pozostawiamy jedynie nazwy linii portu. NazwĊ dodatkowej funkcji bĊdziemy umieszczaü wtedy, gdy bĊdziemy z niej korzystaü (patrz rysunek 2.4). Rysunek 2.4. Rozmieszczenie wyprowadzeĔ mikrokontrolera PIC16F877A w wersji uproszczonej Rysunek mikrokontrolera wygląda teraz o wiele lepiej. W ten oto sposób rozwiązali- Ğmy pierwszy problem, pozostaáo ich jeszcze 728. Zajmiemy siĊ nimi po kolei. Tradycja kaĪe, by pierwszy mikrokontrolerowy program dotyczyá ukáadu z diodą LED1, przy czym dioda ma Ğwieciü, a nawet — ku zgorszeniu wszystkich — mrugaü. Schemat naszego pierwszego ukáadu z diodą LED zostaá przedstawiony na rysunku 2.5. Rysunek 2.5. Schemat ukáadu z mikrokontrolerem PIC16F877A i podáączoną do niego diodą LED Mikrokontrolerowi wyjadacze teraz ziewają, lecz nowicjuszy opanowaá lekki strach. Czy ukáad rzeczywiĞcie musi tak wyglądaü? Dlaczego przy wyprowadzeniu MCLR jest to, co jest? Po co te kondensatory przy liniach zasilających? Odpowiadam na pytanie 1 W literaturze dotyczącej mikrokontrolerów pojĊcie ukáadu czĊsto uĪywane jest w dwóch znaczeniach: pierwszym, dotyczącym mikrokontrolera, i dodatkowo drugim, odnoszącym siĊ do obwodów elektrycznych, w których ów mikrokontroler wystĊpuje. NajczĊĞciej z kontekstu áatwo siĊ domyĞliü, o które znaczenie chodzi. CóĪ, mikrokontrolery to taka dziedzina wiedzy, w której nawet pojĊcia peánią alternatywne funkcje. 20 Mikrokontrolery PIC w praktycznych zastosowaniach pierwsze: nie, ukáad nie musi tak wyglądaü. Rysunek 2.5 przedstawia schemat mega- poprawny, zgodny z kanonem, mówiąc wprost — grzeczny. Ukáad zostaá przygoto- wany na wszelkiego typu niespodzianki, jak wybuch wulkanu, plamy na SáoĔcu itp. RozwaĪmy elementy schematu po kolei. Zacznijmy od ukáadu RESET (rysunek 2.6). Rysunek 2.6. Ukáad RESET Jest wielce prawdopodobne, szanowny Czytelniku, Īe widziaáeĞ lub zobaczysz wiele podobnych albo zupeánie róĪnych ukáadów RESET. Nic dziwnego. Chodzi wszakĪe o to, by obwód dziaáaá w charakterystyczny sposób, a osiągnąü to moĪna na wiele sposo- bów. Ukáady PIC resetowane są po podaniu niskiego poziomu na wejĞcie MCLR. Sygnaá musi byü odpowiednio dáugi, gdyĪ krótkie spadki napiĊcia na linii MCLR są ignorowane dziĊki specjalnym filtrom szumu. Rozpoznanie sygnaáu RESET wymusza przyjĊcie przez rejestry wartoĞci początkowych. Jakich? To moĪna sprawdziü w dokumentacji. Dodatko- wo istnieje wiele Ĩródeá resetujących mikrokontroler: 1. RESET po wáączeniu zasilania (Power-on Reset POR); 2. tak zwany normalny RESET, wymuszony sygnaáem niskim w trakcie pracy ukáadu; 3. RESET po przejĞciu w stan uĞpienia; 4. RESET wywoáany sygnaáem moduáu nadzorującego watchdog; 5. RESET wywoáany chwilowym spadkiem napiĊcia. Do kaĪdego z wymienionych punktów moĪna zaprojektowaü specyficzny ukáad RESET. Nas interesuje jedynie zbudowanie obwodu zapewniającego dostarczenie do mikrokon- trolera sygnaáu zerującego po wáączeniu zasilania (POR). Natomiast w trakcie pracy mikrokontrolera na liniĊ MCLR powinien byü dostarczany stabilny sygnaá zapobie- gający zerowaniu ukáadu. Z tego wszystkiego powinniĞmy wysnuü taki wniosek: linia MCLR nie powinna wisieü w powietrzu, lecz na czas pracy ukáadu powinien byü na niej wymuszony stan wysoki. W jaki sposób to osiągnąü — oto caáe zagadnienie, nad któ- rym wáaĞnie mamy przyjemnoĞü siĊ pochylaü. Rysunek 2.6 prezentuje jedno z moĪ- liwych rozwiązaĔ. PrzeĞledĨmy najprostsze rozwiązania wystĊpujące w literaturze. Rysunki 2.7 i 2.8 przedstawiają dwie propozycje pochodzące z dokumentacji PIC- micro MID-RANGE MCU FAMILY. Rysunek 2.7. Ukáad POR z opcjonalnym rezystorem. Rysunek pochodzi z dokumentacji PICmicro MID-RANGE MCU FAMILY (DS31003A), s. 3 – 4 Rozdziaä 2. i Obsäuga diod LED 21 Rysunek 2.8. Ukáad POR przedáuĪający czas wáączenia zasilania. Rysunek pochodzi z dokumentacji PICmicro MID-RANGE MCU FAMILY (DS31003A), s. 3 – 4 W przypadku obwodu zaprezentowanego na rysunku 2.7 rezystor moĪe wystąpiü, ale nie musi. Czyli, prawdĊ mówiąc, liniĊ MCLR moĪemy bezpoĞrednio podáączyü do Ĩródáa napiĊcia. Jak twierdzi dokumentacja, czas zaáączenia ukáadu bĊdzie w tym przypadku wystarczający do wygenerowania sygnaáu RESET. Nieco odmiennego zdania jest do- kumentacja mikrokontrolerów rodziny PIC16F8XA. Na stronie 148 tej dokumentacji moĪemy przeczytaü: [...] Microchip recommends that the MCLR pin no longer be tied directly to VDD. (DS39582B, s. 148) I dla odmiany proponowany jest tu obwód jeszcze innej postaci (patrz rysunek 2.9). Rysunek 2.9. Obwód MCLR. Rysunek pochodzi z dokumentacji mikrokontrolerów rodziny PIC16F8XA (DS39582B), s. 148 PodobieĔstwo rysunków 2.6 i 2.9 nie jest przypadkowe. Tyle na ten temat. Drugą rzeczą związaną ze schematem z rysunku 2.5, o której wypada wspomnieü, jest postaü obwodu zasilania (patrz rysunek 2.10). Rysunek 2.10. Obwód zasilania mikrokontrolera PIC16F877A Rolą doáączonego kondensatora jest eliminowanie zakáóceĔ o wysokiej czĊstotliwoĞci (sáynne odsprzĊganie zasilania). 22 Mikrokontrolery PIC w praktycznych zastosowaniach Nie skupilibyĞmy siĊ na tych elementach, gdyby to nie miaáo sensu. Chodzi o to, Īe jeĞli brak nam ochoty lub wystarczającej liczby czĊĞci, schemat z rysunku 2.5 moĪemy uproĞciü do postaci z rysunku 2.11. Rysunek 2.11. Schemat ukáadu z mikrokontrolerem PIC16F877A i podáączoną do niego diodą LED (wersja oszczĊdna) PamiĊtajmy jednak, Īe poprawniejsza jest wersja ukáadu z rysunku 2.5. Jej realizacjĊ na páytce stykowej przedstawia rysunek 2.12. Rysunek 2.12. Realizacja schematu z rysunku 2.5 na páytce stykowej Rysunek 2.13 przedstawia ukáad z mikrokontrolerem PIC16F877A zrealizowany na páytce edukacyjnej ARE. Na rysunku 2.13 zostaá zaznaczony ukáad RESET, gdzie podáączamy liniĊ MCLR. LiniĊ MCLR podáączamy do Ğrodkowego z trzech pinów, masĊ podáączamy z lewej, a VDD z prawej strony pinu linii MCLR (miejmy nadziejĊ, Īe rozkáad pinów siĊ nie zmieni). Linie OSC1 i OSC2 podáączamy do skrajnych pinów stojących obok oscy- latora 20 MHz. Do Ğrodkowego pinu podáączamy masĊ. JeĞli chodzi o Ĩródáo zasilania, to napiĊcie 5 V jest wyprowadzone na listwĊ pinów P25, a masa egzystuje sobie na li- stwie P27. Rozdziaä 2. i Obsäuga diod LED 23 Rysunek 2.13. Realizacja schematu z rysunku 2.5 na páytce edukacyjnej ARE (nie zostaáy umieszczone kondensatory C2 i C3) Czas najwyĪszy zacząü pisaü program2. Uruchamiamy MPLAB IDE. By utworzyü nowy projekt, z menu wybieramy Project/Project Wizard… (patrz rysunek 2.14). Rysunek 2.14. Zakáadka tworzenia nowego projektu Pojawi siĊ okno tworzenia nowego projektu, w którym klikamy Dalej. W oknie drugim, a jak twierdzi kompilator, w kroku pierwszym, bĊdziemy mieli za zadanie wybraü interesujący nas mikrokontroler. PoniewaĪ lista jest dáuga, zarezerwujmy sobie wolne popoáudnie, gdyĪ czeka nas niemaáa przygoda. NajwaĪniejsze, abyĞmy znaleĨli nazwĊ naszego mikrokontrolera, czyli PIC16F877A (patrz rysunek 2.15). W drugim kroku konfiguracji projektu wybieramy kompilator. Jak juĪ wiemy po fa- scynującej lekturze rozdziaáu pierwszego, kompilatorem ukáadów 8-bitowych jest HI- TECH. JeĞli nie moĪemy wybraü go z listy, to znaczy, Īe zapomnieliĞmy go zainsta- lowaü. Po naprawieniu tego maáego przeoczenia na pewno uda nam siĊ znaleĨü punkt HI-TECH Universal ToolSuite (patrz rysunek 2.16). 2 JeĞli jest na coĞ najwyĪszy czas, to na taką oto prawdĊ Īyciową: Z cyklu Rozterki gracza futbolowego Nie wykonam tego kopa. Ciągle Ğmieje mi siĊ stopa. 24 Mikrokontrolery PIC w praktycznych zastosowaniach Rysunek 2.15. Okno wyboru mikrokontrolera Rysunek 2.16. Okno wyboru kompilatora Trzeci krok to podanie lokalizacji i nazwy projektu. Ja wpisaáem R02_Prog01_C_ ´PIC16F877A, bo lubiĊ nazwy áatwe i nieskomplikowane3. Czáon R02_ oznacza u mnie, Īe projekt jest opisywany w drugim rozdziale ksiąĪki, Prog01_ mówi, Īe jest to pierwszy projekt tego rozdziaáu, na dodatek napisany w jĊzyku C (czáon C_). W czwartym kroku budowania projektu zostaniemy poproszeni o wskazanie plików, które juĪ na wstĊpie mają byü doáączone do projektu. Prawdopodobnie niczego nie bĊdziemy chcieli doáączyü, dlatego klikamy Dalej, a nastĊpnie ZakoĔcz. W oknie robo- czym projektu zobaczymy jego strukturĊ (patrz rysunek 2.17). 3 A co siĊ tyczy nieskomplikowanego Īycia, to mam przygotowaną taką prawdĊ Īyciową: Z cyklu Rozterki Ğlimaka Gdy jadáem saáatĊ — nic siĊ nie dziaáo. Spokojnie wyjadáem ziarna gorczycy. I wáaĞnie wtedy wszystkim siĊ zachciaáo Mnie przegnaü, gdy szedáem do Ğlimaczycy. Rozdziaä 2. i Obsäuga diod LED 25 Rysunek 2.17. Struktura nowo utworzonego projektu Kod bĊdziemy wpisywaü w pliku Ĩródáowym, który musimy utworzyü. W tym celu klikamy ikonĊ New File (patrz rysunek 2.18). Rysunek 2.18. Ikona utworzenia nowego pliku Otworzy siĊ okno edytora, w którym wreszcie moĪemy zacząü pisaü program. W pierw- szym wierszu musimy poinformowaü kompilator o chĊci skorzystania z zasobów kom- pilatora. #include htc.h Bez tego nazwy wáasne, takie jak PORTA, TRISA, nie bĊdą rozpoznawalne. NastĊpnie ustawimy bity konfiguracyjne. Do tego sáuĪy makro __CONFIG. //oscylator szybszy od 10 MHz (FOSC_HS) //watchdog wyáączony (WDTE_OFF) //wyáączone LVP (Low-Voltage ICSP Programming) (LVP_OFF) __CONFIG(FOSC_HS WDTE_OFF LVP_OFF); Lista argumentów makra zawiera tylko róĪnice w stosunku do domyĞlnej konfiguracji mikrokontrolera. ListĊ masek dostĊpnych dla mikrokontrolera PIC16F877A znaj- dziemy w zasobach kompilatora HI-TECH w pliku pic16f877a.h. A jeĞli nie chciaáoby nam siĊ szukaü, przytoczĊ interesujący nas fragment tego pliku. Nie naleĪy go czytaü, a jedynie z okrzykiem „E tam!” przerzuciü stronĊ. Listing pic16f877a.h (fragment) // //Configuration mask definitions // //Config Register: CONFIG #define CONFIG 0x2007 //Oscillator Selection bits 26 Mikrokontrolery PIC w praktycznych zastosowaniach //RC oscillator #define FOSC_EXTRC 0xFFFF //HS oscillator #define FOSC_HS 0xFFFE //XT oscillator #define FOSC_XT 0xFFFD //LP oscillator #define FOSC_LP 0xFFFC //Watchdog Timer Enable bit //WDT enabled #define WDTE_ON 0xFFFF //WDT disabled #define WDTE_OFF 0xFFFB //Power-up Timer Enable bit //PWRT disabled #define PWRTE_OFF 0xFFFF //PWRT enabled #define PWRTE_ON 0xFFF7 //Brown-out Reset Enable bit //BOR enabled #define BOREN_ON 0xFFFF //BOR disabled #define BOREN_OFF 0xFFBF //Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit //RB3/PGM pin has PGM function; low-voltage programming enabled #define LVP_ON 0xFFFF //RB3 is digital I/O, HV on MCLR must be used for programming #define LVP_OFF 0xFF7F //Data EEPROM Memory Code Protection bit //Data EEPROM code protection off #define CPD_OFF 0xFFFF //Data EEPROM code-protected #define CPD_ON 0xFEFF //Flash Program Memory Write Enable bits //Write protection off; all program memory may be written to by EECON control #define WRT_OFF 0xFFFF //0000h to 00FFh write-protected; 0100h to 1FFFh may be written to by EECON control #define WRT_256 0xFDFF //0000h to 07FFh write-protected; 0800h to 1FFFh may be written to by EECON control #define WRT_1FOURTH 0xFBFF //0000h to 0FFFh write-protected; 1000h to 1FFFh may be written to by EECON control #define WRT_HALF 0xF9FF //In-Circuit Debugger Mode bit //In-Circuit Debugger disabled, RB6 and RB7 are general purpose I/O pins #define DEBUG_OFF 0xFFFF //In-Circuit Debugger enabled, RB6 and RB7 are dedicated to the debugger #define DEBUG_ON 0xF7FF //Flash Program Memory Code Protection bit //Code protection off #define CP_OFF 0xFFFF //All program memory code-protected #define CP_ON 0xDFFF Przy okazji rozszyfrujemy trzy skróty, bardzo czĊsto wystĊpujące w dokumentacji: FOSC (Frequency of the device OSCillator) — czĊstotliwoĞü oscylatora podáączonego do ukáadu. W naszym przykáadzie FOSC = 20 MHz. Rozdziaä 2. i Obsäuga diod LED 27 TOSC (Time for the device OSCillator) — czas jednego cyklu zewnĊtrznego oscylatora. W naszym przykáadzie, w którym FOSC = 20 MHz, wielkoĞü TOSC = 1/20000000 s = 0,00000005 s (50 ns). TCY (Time for the CYcle) — czas jednego cyklu maszynowego = 4*TOSC. Skąd wiemy, Īe mając w ukáadzie rezonator 20 MHz, powinniĞmy wybraü maskĊ FOSC_HS? Niestety, z dokumentacji. Z tabeli, takiej jak 14-2, którą prezentuje rysunek 2.19. Rysunek 2.19. Tabela typów oscylatora i zalecanych pojemnoĞci kondensatora dla róĪnych prĊdkoĞci rezonatora krystalicznego (tabela pochodzi z dokumentacji mikrokontrolera PIC16F877A — DS39582B, s. 146) Czy z tego wynika, Īe korzystanie z dokumentacji jest waĪne? CóĪ, nie jest záe. Ale prawdĊ mówiąc, komu chciaáoby siĊ czytaü dokumentacjĊ? Chyba Īe siĊ jest autorem podrĊcznika. Wtedy raczej wypada4. Przechodzimy do definiowania funkcji main, czyli do pisania kodu wáaĞciwego. Na rysunku 2.5 widzimy, Īe diodĊ LED podáączyliĞmy do linii RA5. Zainteresujmy siĊ nią, a jest to zdrowe zainteresowanie. Czy przypadkiem linia RA5 nie wspóádzieli wyprowadzenia z wejĞciem analogowym? Przypadkiem wspóádzieli. Jak wynika z rysun- ku 2.3, wyprowadzenie o numerze 7 moĪe byü jednoczeĞnie cyfrową linią portu A, a takĪe — domyĞlnie — wejĞciem analogowym AN4. Znów siĊgamy do dokumentacji mikro- kontrolera PIC16F877A. Chcemy siĊ dowiedzieü, w jaki sposób z AN4 uczyniü RA5. Oto zagadka. Pierwszym tropem powinno byü znalezienie rejestru ADCON1 (patrz rysunek 2.20). Rysunek 2.20. Organizacja zawartoĞci rejestru ADCON1 PoniewaĪ moduá ADC interesuje nas na razie o tyle, Īe chcemy go wyáączyü, pomijamy rolĊ bitów ADFM i ADCS2. KonfiguracjĊ kluczowych dla nas bitów PCFG3:PCFG0 znajdziemy w tabeli, którą przedstawia rysunek 2.21. 4 To oczywiĞcie Īart. Od początku tego rozdziaáu staram siĊ przekonaü szanownego Czytelnika, Īe drobiazgowe i rzetelne przygotowanie najprostszego nawet programu, wraz ze związaną z tym koniecznoĞcią siĊgania do dokumentacji, przypomina pracĊ detektywa, a przez to staje siĊ fascynującą przygodą. OczywiĞcie na początku programistycznej drogi liczba problemów do rozwiązania moĪe zniechĊciü najwytrwalszych badaczy, dlatego dobrze jest wtedy korzystaü z gotowych i sprawdzonych rozwiązaĔ. 28 Mikrokontrolery PIC w praktycznych zastosowaniach Rysunek 2.21. Ustawienia bitów PCFG3:PCFG0 i odpowiadająca im konfiguracja linii mikrokontrolera (tabela pochodzi z dokumentacji DS39582B, s. 128) Z tabeli odczytujemy nastĊpujący fakt: jeĞli chcemy, aby wszystkie linie byáy cyfrowe, konfiguracja bitów PCFG3:PCFG0 powinna odpowiadaü liczbie 6 lub 7. W naszym programie (przypominam, Īe piszemy program) bĊdzie to wyglądaáo tak. ADCON1 = 0x06; Teraz zaĞwiecimy diodĊ. Zastanówmy siĊ, dlaczego linie cyfrowe nazywa siĊ liniami I/O, czyli wejĞcia/wyjĞcia? OczywiĞcie wiemy. JeĪeli do linii podáączamy urządzenie, którym chcemy sterowaü, linia musi byü wyjĞciowa. Czasem jednak chcemy odczytaü informacjĊ, na przykáad pochodzącą z czujnika temperatury. Wtedy linia musi byü wejĞciowa. TĊ elementarną wiedzĊ juĪ mamy. Dodatkowo linia wyjĞciowa moĪe mieü wysoki lub niski stan logiczny. W mikrokontrolerach PIC rejestrem kierunkowym jest re- jestr TRISx, gdzie x oznacza nazwĊ portu, czyli na przykáad TRISA dla portu A, TRISB dla portu B itd. LiniĊ portu konfigurujemy w kierunku wyjĞciowym, zerując odpowiedni bit rejestru TRISx, natomiast ustawienie bitu czyni liniĊ wejĞciową. Zapiszmy to w jĊ- zyku C. ZaáóĪmy, Īe chcemy, by linia RA3 byáa wejĞciowa. W tym celu musimy ustawiü trzeci bit rejestru TRISA. MoĪemy to zrobiü tak: TRISA |= (1 3); MoĪna teĪ zastosowaü zapis binarny: TRISA |= 0b00001000; MoĪna zastosowaü zapis szesnastkowy: TRISA |= 0x08; ZauwaĪmy, Īe w powyĪszych przykáadach zastosowaliĞmy operator sumy bitowej, dziĊki czemu pozostaáe bity rejestru TRISA pozostaáy niezmienione. Czasem jednak chcemy od razu skonfigurowaü wszystkie bity rejestru TRISA. Wtedy stosujemy operator przypisania. TRISA = 0b111100; PORTA = 0b001110; Rozdziaä 2. i Obsäuga diod LED 29 W tym przykáadzie tylko dwie linie bĊdą wyjĞciowe: RA0, która bĊdzie w niskim sta- nie logicznym, i RA1, której stan bĊdzie wysoki. W sposób obrazowy przedstawia to rysunek 2.22. Rysunek 2.22. Schemat pokazujący konfigurowanie linii portu A za pomocą rejestrów PORTA i TRISA Aby rzecz byáa zupeánie jasna, popatrzmy na rysunek 2.23. Rysunek 2.23. Opowiastka dydaktyczna pod tytuáem „Trudne i peáne wyrzeczeĔ Īycie studenta” JeĞli nie zaleĪy nam na konkretnej konfiguracji pozostaáych linii portu, moĪna po pro- stu caáy rejestr TRISA wypeániü zerami i uczyniü wszystkie linie wyjĞciowymi. Tak teĪ postąpimy w naszym programie. TRISA = 0; //linie portu A wyjĞciowe PORTA = (1 5); //wáącz liniĊ 5. 30 Mikrokontrolery PIC w praktycznych zastosowaniach Program mikrokontrolerowy powinien zawsze koĔczyü siĊ pĊtlą nieskoĔczoną. To ostatni element naszego kodu. for(;;); //pĊtla nieskoĔczona Popatrzmy teraz na caáy pierwszy program. Listing R02_Prog01_C_PIC16F877A.c #include htc.h //oscylator szybszy od 10 MHz (FOSC_HS) //watchdog wyáączony (WDTE_OFF) //wyáączone LVP (Low-Voltage ICSP Programming) (LVP_OFF) __CONFIG(FOSC_HS WDTE_OFF LVP_OFF); void main() { ADCON1 = 0x06; //wyáączenie linii analogowych //(wszystkie linie cyfrowe) TRISA = 0; //linie portu A wyjĞciowe PORTA = (1 5); //wáącz liniĊ 5. for(;;); //pĊtla nieskoĔczona } Czy po wgraniu tego programu do mikrokontrolera dioda powinna Ğwieciü? Tak, nie ma wyjĞcia. Ale jako siĊ rzekáo, najpierw musimy program skompilowaü, a nastĊpnie wgraü go do ukáadu. Nasz plik z kodem nie jest jeszcze czĊĞcią projektu. Aby go do- áączyü, klikamy prawym klawiszem myszy w pole Source Files, a nastĊpnie z rozwi- niĊtej listy wybieramy Add Files… (patrz rysunek 2.24). Rysunek 2.24. Doáączanie pliku Ĩródáowego do zasobów projektu PoniewaĪ moĪe nam siĊ nieraz zdarzyü — przez roztargnienie — Īe zapomnimy o doáą- czeniu pliku Ĩródáowego, przyjrzyjmy siĊ komunikatowi generowanemu w takim przy- padku: Error [939] ; . no file arguments Teraz kompilujemy projekt, naciskając klawisz F10 lub klikając ikonĊ Build with Compiler for PIC10/12/16 MCUs (patrz rysunek 2.25). Rysunek 2.25. Ikona kompilacji projektu Rozdziaä 2. i Obsäuga diod LED 31 JeĞli nie byáo báĊdów, kompilacjĊ zakoĔczy taki komunikat: ********** Build successful! ********** Dodatkowo, jeĞli korzystamy z wersji Lite kompilatora, zostaniemy ostrzeĪeni o braku optymalizacji programu. (1273) Omniscient Code Generation not available in Lite mode (warning) Jak twierdzi kompilator, gdybyĞmy uĪywali páatnej wersji PRO kompilatora, otrzymali- byĞmy program wynikowy 40 mniejszy od wáaĞnie utworzonego. Running this compiler in PRO mode, with Omniscient Code Generation enabled, produces code which is typically 40 smaller than in Lite mode. See http://microchip.htsoft.com/portal/pic_pro for more information. Nie mam nic przeciwko dodatkowym 40 kodu. Mam nadziejĊ, Īe Czytelnik takĪe. Kontynuujmy wiĊc proces programowania. Nadszedá czas, by zaáadowaü program do pamiĊci flash mikrokontrolera. NiezaleĪnie od tego, z jakiego programatora korzystamy, powinniĞmy podáączyü go piĊcioma li- niami do mikrokontrolera. Są to: MCLR, VDD, VSS, PGD i PGC. Czasami konieczne jest odáączenie obwodu RESET na czas programowania ukáadu, szczególnie jeĞli liniĊ MCLR bezpoĞrednio podáączamy do Ĩródáa napiĊcia. Rysunek 2.26 przedstawia schemat podáączenia ukáadu do programatora PICkit 2 bądĨ PICkit 3. Rysunek 2.26. Schemat podáączenia ukáadu do programatorów PICkit 2 lub PICkit 3 PamiĊtajmy, by podáączyü zasilanie do ukáadu, a programator podáączyü do komputera. SzczĊĞliwi posiadacze programatora PICkit 3 mogą w procesie programowania wspo- móc siĊ zasobami Ğrodowiska MPLAB IDE. Program áadujący uruchamiamy, wybiera- jąc z menu typ uĪywanego programatora. W przypadku programatora PICkit 3 jest to ĞcieĪka Programmer/Select Programmer/PICkit 3 (patrz rysunek 2.27). Skoro wybór siĊ dokonaá, w tym momencie pojawi siĊ okno narzĊdzi programatora. Wybieramy ikonĊ Program (patrz rysunek 2.28). 32 Mikrokontrolery PIC w praktycznych zastosowaniach Rysunek 2.27. Wybór programatora Rysunek 2.28. Uruchomienie procesu áadowania programu do pamiĊci flash mikrokontrolera Program zostaá zaáadowany. Aby ukáad zacząá dziaáaü, do MCLR naleĪy podáączyü ob- wód RESET, o ile byliĞmy zmuszeni go odáączyü. Bardzo moĪliwe, Īe bĊdziemy zmusze- ni takĪe odáączyü od ukáadu programator. W tym momencie dioda powinna Ğwieciü. Zajmijmy siĊ teraz mruganiem diody. WciąĪ programujemy ukáad z rysunku 2.5. DuĪym uáatwieniem bĊdzie dla nas obecnoĞü funkcji odmierzających czas. Zostaáy zaimple- mentowane w bibliotece kompilatora HI-TECH. WáaĞciwie są to makra postaci: __delay_ms(unsigned long n); //czekaj n ms __delay_us(unsigned long n); //czekaj n ȝs Korzystanie z nich wymaga wczeĞniejszego zdefiniowania nazwy _XTAL_FREQ prĊdkoĞcią naszego oscylatora. #define _XTAL_FREQ 20000000 PoniewaĪ program nie zawiera wiĊcej tajemnic, popatrzmy na jego kod. Listing R02_Prog01_C_PIC16F877A.c #include htc.h //definiujemy szybkoĞü oscylatora dla funkcji __delay_ #define _XTAL_FREQ 20000000 //oscylator szybszy od 10 MHz (FOSC_HS) //watchdog wyáączony (WDTE_OFF) //wyáączone LVP (Low-Voltage ICSP Programming) (LVP_OFF) __CONFIG(FOSC_HS WDTE_OFF LVP_OFF); void main() { Rozdziaä 2. i Obsäuga diod LED 33 ADCON1 = 0x06; //wyáączenie linii analogowych //(wszystkie linie cyfrowe) TRISA = 0; //linie portu A wyjĞciowe for(;;) //pĊtla nieskoĔczona { PORTA |= (1 5); //wáącz liniĊ 5. __delay_ms(500); //czekaj 1/2 s PORTA = ~(1 5); //wyáącz liniĊ 5. __delay_ms(500); //czekaj 1/2 s } } Obsäuga wyĈwietlacza LED Trzecim programem rozdziaáu, zgodnie z zapowiedzią, ma byü program obsáugujący wyĞwietlacz LED. Schemat bĊdzie nieco bardziej skomplikowany niĪ ten z rysunku 2.5. Zresztą przekonajmy siĊ sami. Spójrzmy na rysunek 2.29. Rysunek 2.29. Schemat ukáadu z mikrokontrolerem PIC16F877A i wyĞwietlaczem LED WyĞwietlacz LED to nic innego niĪ zbiór gustownie uáoĪonych diod. Pojedynczy wy- Ğwietlacz skáada siĊ z oĞmiu diod, na rysunku 2.30 oznaczonych od A do DP. 34 Mikrokontrolery PIC w praktycznych zastosowaniach Rysunek 2.30. UáoĪenie diod w jednej czĊĞci wyĞwietlacza LED Obsáuga wyĞwietlacza LED jest najáatwiejsza, gdy podáączamy go do mikrokontrole- ra zgodnie z pewnym porządkiem: diodĊ A do linii zerowej portu, diodĊ B do linii pierwszej itd. Jak wynika z rysunku 2.29, diody wyĞwietlacza bĊdą zaáączane stanem niskim. Na przykáad chcąc wyĞwietliü cyfrĊ 3, musimy wáączyü (stanem niskim) diody A, B, C, D i G. Pozostaáe diody wyáączamy, podając na odpowiadające im linie logiczne 1. PORTB = 0b10110000; //wyĞwietl cyfrĊ 3 JeĞli jednak zaáączane diody są czĊĞcią wiĊkszego wyĞwietlacza LED, a tak jest w tym przypadku, kaĪdą z czĊĞci musimy zaáączyü, podając stan niski na linie tranzystorów T1, T2, T3, T4. Oto dla przykáadu bardzo krótki program, którym wyĞwietlimy w ukáa- dzie z rysunku 2.29 cyfrĊ 3. #include htc.h //oscylator szybszy od 10 MHz (FOSC_HS) //watchdog wyáączony (WDTE_OFF) //wyáączone LVP (Low-Voltage ICSP Programming) (LVP_OFF) __CONFIG(FOSC_HS WDTE_OFF LVP_OFF); void main() { ADCON1 = 0x06; //wyáączenie linii analogowych //(wszystkie linie cyfrowe) TRISB = 0; //wszystkie linie portu B wyjĞciowe TRISD = 0; //wszystkie linie portu D wyjĞciowe PORTD = 0b00001110; //wáącz W1 (RD0 w stan logicznego 0) //W2, W3, W4 wyáączone PORTB = 0b10110000; //wyĞwietl cyfrĊ 3 for(;;); //pĊtla nieskoĔczona } Teraz nasza ambicja kaĪe nam jednoczeĞnie obsáuĪyü cztery czĊĞci wyĞwietlacza, aby wyĞwietliü na nim liczbĊ 1234. Nie jest to zadanie nie do zrealizowania. Wystarczy zrozumieü mechanizm zaáączania wyĞwietlaczy. OtóĪ chcąc wyĞwietliü jednoczeĞnie cztery róĪne cyfry, naleĪy kaĪdą czĊĞü wyĞwietlacza na chwilĊ wáączyü i wyĞwietliü na niej poĪądaną cyfrĊ. Czas zaáączenia czĊĞci wyĞwietlacza nie powinien byü za dáugi (cyfry bĊdą migaü) ani za krótki (cyfry bĊdą sáabo widoczne). W naszym kolejnym programie czas zaáączania bĊdzie wynosiá 5 ms. Podáączamy wyĞwietlacz LED zgodnie ze schematem z rysunku 2.29. Najáatwiej bĊdzie nam to zrobiü na páytce edukacyjnej ARE. Linie portu B mikrokontrolera podáączamy do kolejnych pinów przy wyĞwietlaczu LED. I tak liniĊ RB0 podáączamy do pinu A, RB1 do B itd. Cztery linie portu D podáączamy do pinów zaáączających tranzystory: liniĊ RD0 do W1, RD1 do W2 itd. Mając zbudowany ukáad elektroniczny, wypróbujmy taki program. Rozdziaä 2. i Obsäuga diod LED 35 Listing R02_Prog03_C_PIC16F877A.c //definiujemy szybkoĞü oscylatora dla funkcji __delay_ #define _XTAL_FREQ 20000000 #include htc.h //oscylator szybszy od 10 MHz (FOSC_HS) //watchdog wyáączony (WDTE_OFF) //wyáączone LVP (Low-Voltage ICSP Programming) (LVP_OFF) __CONFIG(FOSC_HS WDTE_OFF LVP_OFF); void main() { ADCON1 = 0x06; //wyáączenie linii analogowych //(wszystkie linie cyfrowe) TRISB = 0; //wszystkie linie portu B wyjĞciowe TRISD = 0; //wszystkie linie portu D wyjĞciowe for(;;) //pĊtla nieskoĔczona { PORTD = 0b00001110; //wáącz W1 (RD0 w stan logicznego 0) //W2, W3, W4 wyáączone PORTB = 0b11111001; //wyĞwietl cyfrĊ 1 __delay_ms(5); //zaczekaj 5 ms PORTD = 0b00001101; //wáącz W2 (RD1 w stan logicznego 0) //W1, W3, W4 wyáączone PORTB = 0b10100100; //wyĞwietl cyfrĊ 2 __delay_ms(5); //zaczekaj 5 ms PORTD = 0b00001011; //wáącz W3 (RD2 w stan logicznego 0) //W1, W2, W4 wyáączone PORTB = 0b10110000; //wyĞwietl cyfrĊ 3 __delay_ms(5); //zaczekaj 5 ms PORTD = 0b00000111; //wáącz W4 (RD3 w stan logicznego 0) //W1, W2, W3 wyáączone PORTB = 0b10011001; //wyĞwietl cyfrĊ 4 __delay_ms(5); //zaczekaj 5 ms } } Obsäuga wyĈwietlacza alfanumerycznego LCD WiĊcej z diod wycisnąü siĊ nie da. MoĪna na wyĞwietlaczu LED generowaü liczby zmieniające siĊ dynamicznie, na przykáad zgodnie z upáywającym czasem. Zostawiam ten temat radosnej twórczoĞci Czytelnika. Nadszedá czas, by zapoznaü siĊ z tematem obsáugi wyĞwietlacza alfanumerycznego LCD. Schemat ukáadu, który bĊdziemy ob- sáugiwaü, zostaá przedstawiony na rysunku 2.31. Kompilator HI-TECH ma wáasną bibliotekĊ obsáugi wyĞwietlaczy LCD opartych na standardowym sterowniku Hitachi HD44780. Niestety, owa biblioteka ma wiele ograni- czeĔ. Na przykáad dziaáa tylko dla jednego ukáadu podáączeĔ. Tymczasem czĊsto jest tak, 36 Mikrokontrolery PIC w praktycznych zastosowaniach Rysunek 2.31. Schemat ukáadu z mikrokontrolerem PIC16F877A i alfanumerycznym wyĞwietlaczem LCD Īe podáączamy wyĞwietlacz po prostu do linii, które nie są zajĊte. ProponujĊ zatem, abyĞmy zbudowali wáasną bibliotekĊ, wolną od wymienionych niedoskonaáoĞci. Zanim jednak do tego dojdzie, zbudujmy próbny ukáad. Rysunek 2.32 przedstawia realizacjĊ ukáadu z rysunku 2.31 na páytce stykowej. Rysunek 2.32. Realizacja ukáadu z mikrokontrolerem PIC16F877A i alfanumerycznym wyĞwietlaczem LCD na páytce stykowej Na rysunku 2.33 widzimy ten sam ukáad zrealizowany na páytce edukacyjnej. Realizując ukáad na páytce edukacyjnej ARE, naleĪy liniĊ RW wyĞwietlacza LCD samodzielnie podáączyü do masy. Zbudowana przez nas biblioteka obsáugi wyĞwietlacza LCD ma poprawnie dziaáaü dla kaĪdej konfiguracji podáączenia wyprowadzeĔ mikrokontrolera. W tym kontekĞcie najáatwiejsze do zaprogramowania byáyby dla nas rozkazy, w których bĊdziemy mogli uĪyü nazw pojedynczych bitów. Na szczĊĞcie istnieje taka moĪliwoĞü — dziĊki zdefi- niowaniu specjalnych struktur. Oto fragment pochodzący z pliku pic16f877a.h znaj- dującego siĊ w zasobach kompilatora HI-TECH. Rozdziaä 2. i Obsäuga diod LED 37 Rysunek 2.33. Realizacja ukáadu z mikrokontrolerem PIC16F877A i alfanumerycznym wyĞwietlaczem LCD na páytce edukacyjnej Listing pic16f877a.h (fragment) //Register: PORTB volatile unsigned char PORTB @ 0x006; //bit and bitfield definitions volatile bit RB0 @ ((unsigned) PORTB*8)+0; volatile bit RB1 @ ((unsigned) PORTB*8)+1; volatile bit RB2 @ ((unsigned) PORTB*8)+2; volatile bit RB3 @ ((unsigned) PORTB*8)+3; volatile bit RB4 @ ((unsigned) PORTB*8)+4; volatile bit RB5 @ ((unsigned) PORTB*8)+5; volatile bit RB6 @ ((unsigned) PORTB*8)+6; volatile bit RB7 @ ((unsigned) PORTB*8)+7; #ifndef _LIB_BUILD volatile union { struct { unsigned RB0 : 1; unsigned RB1 : 1; unsigned RB2 : 1; unsigned RB3 : 1; unsigned RB4 : 1; unsigned RB5 : 1; unsigned RB6 : 1; unsigned RB7 : 1; }; } PORTBbits @ 0x006; #endif //Register: TRISB volatile unsigned char TRISB @ 0x086; //bit and bitfield definitions volatile bit TRISB0 @ ((unsigned) TRISB*8)+0; volatile bit TRISB1 @ ((unsigned) TRISB*8)+1; volatile bit TRISB2 @ ((unsigned) TRISB*8)+2; volatile bit TRISB3 @ ((unsigned) TRISB*8)+3; volatile bit TRISB4 @ ((unsigned) TRISB*8)+4; volatile bit TRISB5 @ ((unsigned) TRISB*8)+5; 38 Mikrokontrolery PIC w praktycznych zastosowaniach volatile bit TRISB6 @ ((unsigned) TRISB*8)+6; volatile bit TRISB7 @ ((unsigned) TRISB*8)+7; #ifndef _LIB_BUILD volatile union { struct { unsigned TRISB0 : 1; unsigned TRISB1 : 1; unsigned TRISB2 : 1; unsigned TRISB3 : 1; unsigned TRISB4 : 1; unsigned TRISB5 : 1; unsigned TRISB6 : 1; unsigned TRISB7 : 1; }; } TRISBbits @ 0x086; #endif Jak widaü, wybrany fragment dotyczy portu B. Co z niego wynika? OtóĪ dziĊki tym definicjom moĪliwe jest uĪycie w kodzie takiego zapisu: TRISBbits.TRISB5 = 0; PORTBbits.RB5 = 1; Co wiĊcej, nazwy bitów zastąpimy nazwami linii wyĞwietlacza. To pozwoli uczyniü naszą bibliotekĊ obsáugi wyĞwietlacza naprawdĊ uniwersalną. Przy tym umawiamy siĊ, Īe przed uĪyciem naszej biblioteki zawsze konieczne bĊdzie zdefiniowanie tych nazw. W przypadku ukáadu z rysunku 2.31 definicja nazw linii wyĞwietlacza powinna wyglądaü tak: #define TRIS_RS_LCD TRISBbits.TRISB5 #define TRIS_EN_LCD TRISBbits.TRISB4 #define TRIS_DB4_LCD TRISCbits.TRISC5 #define TRIS_DB5_LCD TRISCbits.TRISC4 #define TRIS_DB6_LCD TRISDbits.TRISD3 #define TRIS_DB7_LCD TRISDbits.TRISD2 #define RS_LCD PORTBbits.RB5 #define EN_LCD PORTBbits.RB4 #define DB4_LCD PORTCbits.RC5 #define DB5_LCD PORTCbits.RC4 #define DB6_LCD PORTDbits.RD3 #define DB7_LCD PORTDbits.RD2 #include lcd.h Jeszcze dwa sáowa o rolach linii RS, EN, DB4-DB7. Co do ostatnich czterech mamy podejrzenie, Īe sáuĪą przesyáaniu danych. Tak jest w istocie. Linia EN sygnalizuje waĪny transfer danych. A dokáadniej: potwierdzamy transfer waĪnych danych opadającym zboczem EN5. Linią RS sygnalizujemy przesyáanie rozkazu (stan niski) lub danych (stan wysoki). 5 Czytelnikom nieznającym pojĊcia zbocza opadającego/narastającego polecam podrĊcznik AVR ARM7. Programowanie mikrokontrolerów dla kaĪdego, w którym na stronie 236 rzecz wytáumaczyáem dokáadniej. A kto Ğlubowaá, Īe przeczyta w swoim Īyciu tylko tĊ jedną ksiąĪkĊ, którą wáaĞnie czyta, tego proszĊ o cierpliwoĞü. Do zagadnienia zbocza opadającego/narastającego wrócĊ jeszcze w rozdziale 4 przy okazji tematu przerwaĔ. Rozdziaä 2. i Obsäuga diod LED 39 Zdefiniujemy funkcjĊ wysyáającą bajt do pamiĊci sterownika wyĞwietlacza LCD. Po- niewaĪ zdecydowaliĞmy siĊ na interfejs 4-bitowy, musimy wysyáaü dane w dwóch paczkach po 4 bity. W pierwszej kolejnoĞci wyĞlemy 4 najstarsze bity. //ustawienie EN EN_LCD = 1; //wysáanie 4 najstarszych bitów danych if(bajt 0x80) DB7_LCD = 1; else DB7_LCD = 0; if(bajt 0x40) DB6_LCD = 1; else DB6_LCD = 0; if(bajt 0x20) DB5_LCD = 1; else DB5_LCD = 0; if(bajt 0x10) DB4_LCD = 1; else DB4_LCD = 0; LiniĊ EN ustawiamy, Īeby móc ją nastĊpnie wyzerowaü. PrzecieĪ to wáaĞnie opadające zbocze tej linii ma potwierdziü waĪnoĞü danych. Tu powstaje pytanie: po jakim czasie moĪna wysáaü nastĊpną paczkĊ danych? SprawdĨmy w dokumentacji sterownika HD44780 (patrz rysunek 2.34). Rysunek 2.34. Przebiegi czasowe dla operacji zapisywania danych (rysunek pochodzi z dokumentacji sterownika HD44780, s. 58) WartoĞci liczbowe odcinków czasu zaznaczonych na rysunku 2.34 znajdziemy w tabeli, którą przedstawia rysunek 2.35. Rysunek 2.35. WartoĞci liczbowe przebiegów czasowych dla operacji zapisywania danych (rysunek pochodzi z dokumentacji sterownika HD44780, s. 52) 40 Mikrokontrolery PIC w praktycznych zastosowaniach Jeden peány cykl linii EN, oznaczony na rysunku 2.34 jako tcycE, nie moĪe byü krótszy niĪ 500 ns, czyli 0,5 μs. Natomiast minimalna dáugoĞü stanu wysokiego na linii EN, na rysunku 2.34 oznaczona jako PWEH, nie moĪe byü krótsza od 230 ns. NaleĪy o tym pamiĊtaü, szczególnie przy programowaniu ukáadów o szybkim taktowaniu. Dlatego miĊdzy kolejnymi transferami paczki danych umieĞcimy funkcjĊ oczekującą 1 μs. Dodatkowo damy opóĨnienie przed kaĪdym potwierdzaniem waĪnych danych. Nato- miast caáą operacjĊ zapisywania danych powinien zakoĔczyü czas oczekiwania 37 μs. Skąd to wiem? Z tabeli, którą wáaĞnie mam przyjemnoĞü przedstawiü (tabela 2.1). Skoro operacja zapisywania danych ma trwaü nie wiĊcej niĪ 40 μs, a w funkcji umiesz- czamy juĪ trzy funkcje opóĨniające o 1 μs, naleĪy dodaü opóĨnienie 37 μs. A oto caáa funkcja wysyáająca dane do sterownika wyĞwietlacza LCD. Listing lcd.h (fragment) void Wyslij_do_LCD(unsigned char bajt) { //ustawienie EN EN_LCD = 1; //wysáanie 4 najstarszych bitów danych if(bajt 0x80) DB7_LCD = 1; else DB7_LCD = 0; if(bajt 0x40) DB6_LCD = 1; else DB6_LCD = 0; if(bajt 0x20) DB5_LCD = 1; else DB5_LCD = 0; if(bajt 0x10) DB4_LCD = 1; else DB4_LCD = 0; //zaczekaj 1 ȝs __delay_us(1); //potwierdzenie wysáania danych (opadającym zboczem EN) EN_LCD = 0; //zaczekaj 1 ȝs __delay_us(1); //ustawienie EN EN_LCD = 1; //wysáanie 4 najmáodszych bitów danych if(bajt 0x08) DB7_LCD = 1; else DB7_LCD = 0; if(bajt 0x04) DB6_LCD = 1; else DB6_LCD = 0; if(bajt 0x02) DB5_LCD = 1; else DB5_LCD = 0; if(bajt 0x01) DB4_LCD = 1; else DB4_LCD = 0; //zaczekaj 1 ȝs __delay_us(1); //potwierdzenie wysáania danych (opadającym zboczem EN) EN_LCD = 0; //zaczekaj 37 ȝs __delay_us(37); } ĝwiat jest tak przedziwnie zbudowany, Īe aby samochód mógá jechaü, najpierw musi ruszyü. Ta zdumiewająca wáasnoĞü dotyczy takĪe alfanumerycznych wyĞwietlaczy LCD. Aby móc na nich cokolwiek wyĞwietliü, w pierwszej kolejnoĞci trzeba je ini- cjalizowaü. Algorytm tej czynnoĞci znajdziemy w dokumentacji sterownika. Oczywi- Ğcie nas interesuje inicjalizacja interfejsu 4-bitowego, którą prezentuje rysunek 2.36. Rozdziaä 2. i Obsäuga diod LED. Obsäuga wyĈwietlaczy LED i alfanumerycznych ... 41 - y s k a M l y n a m - o k y w i a n a n s a z c s m 4 6 1 , s m 4 6 1 , s μ 0 4 s μ 0 4 s μ 0 4 s μ 0 4 i j c y z o p o d a c a r w r o s r u k , a z c a l t e i w Ğ y w i c Ċ i m a p i c Ğ o t r a w a z e i n e z c z s y z C j e w o k t ą z c o p — S ) o n k o : 1 , r o s r u k : 0 ( e i s i p a z o p Ĕ u s e z r p , ) a j c a t n e m e r k n i : 1 , a j c a t n e m e r k e d : 0 ( h c y n a d e i s i p a z o p s e r d a — D / I , ) y n o z c ą á w : 1 ( z c a l t e i w Ğ y w w a t s u — B , ) y n o z c ą á w : 1 ( r o s r u k w a t s u — — D C ) e n o z c ą á w : 1 ( a r o s r u k e i n a g i m w a t s u , o n k o : 1 = C / S o w a r p : 1 = L / R , r o s r u k : 0 = C / S Ĕ u s e z r P , o w e l : 0 = L / R w k o r k o i j c y z o p o d a r o s r u k a i n a l t e i w Ğ y w z a r o e i n e c ó r w y z r P j e w o k t ą z c o p M A R D D 0 u s e r d a d o h c y n a d : a z c a l t e i w Ğ y w a i n e i w a t s u j u r u g i f n o K r e f s n a r t : 0 ( h c y n a d a m o i m Ğ o r e f s n a r t : 1 i i n i l a b z c i l — L D , i m a i n i l a m e r e t z c a z c a l t e i w Ğ y w i i n i l a b z c i l — N , ) i m a i n i l — F , ) e i n i l e i w d : 1 , a i n i l a n d e j : 0 ( 8 × 5 : 0 ( j e w o k a n z y c y r t a m ) w ó t k n u p 0 1 × 5 : 1 , r a i m z o r w ó t k n u p 1 – S B – – 0 1 D / I C – – 0 0 1 D 0 0 0 1 L / R C / S 0 0 0 0 1 F N L D 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 s i p O 0 B D 1 B D 2 B D 3 B D 4 B D 5 B D 6 B D 7 B D W / R S R d o K j a c k u r t s n I z c a l t e i w Ğ y w ü Ğ y z C r o s r u k ü ó r W a z d a w o r p W h c y n a d e i n a z c a l t e i w Ğ y w e j c k n u f z c ą á W a z c a l t e i w Ğ y w a i n e i w a t s U Ĕ u s e z r P b u l o n k o r o s r u k 0 8 7 4 4 D H a k i n w o r e t s i j c k u r t s n i e i n e i w a t s e Z . 1 . 2 a e b a T l 42 - y s k a M l y n a m - o k y w s a z c Mikrokontrolery PIC w praktycznych zastosowaniach i a n a n s μ 0 4 s μ 0 4 s μ 0 s μ 0 4 s μ 0 4 , M A R G C ü Ċ i m a p ą n w y t k a o k a j ) A A A ( s e r d a y w o t i b - 3 y w o n j e j w a t s U w a t s u ) L L L ( a i n a i w a t s w i i n i l r e m u n i , M A R D D ü Ċ i m a p ą n w y t k a o k a j s e r d a y w o t i b - 7 y w o n j e j w a t s U w a t s u ) A A A A A A A ( y w o t i b - 7 i ) F B ( i c Ğ o t Ċ j a z Ċ g a l f j a t y z c d O ) A A A A A A A ( h c y n a d s e r d a M A R G C i c Ċ i m a p o d h c y n a d e i n a s i p a Z w a t s U a d n e m o k a á y b j e i n Ğ e z c w i l Ğ e j ( M A R D D b u l ) M A R G C M A R G C i c Ċ i m a p z h c y n a d e i n a t y z c d O w a t s U a d n e m o k a á y b j e i n Ğ e z c w i l Ğ e j ( M A R D D b u l ) M A R G C L A A L A A L A A A A A A A A A A A 1 A A 0 1 F B u s i p a z o d e n a D e n a d e n a t y z c d O 0 0 1 0 1 0 0 0 1 1 s i p O 0 B D 1 B D 2 B D 3 B D 4 B D 5 B D 6 B D 7 B D W / R S R d o K j a c k u r t s n I M A R G C w a t s U M A R D D w a t s U j a t y z c d O i c Ğ o t Ċ j a z ü Ċ i m a p i Ċ g a l f M A R G C o d M A R D D b u l e n a d z s i p a Z e n a d j a t y z C M A R G C z M A R D D b u l y z s l a d g ą i c — 0 8 7 4 4 D H a k i n w o r e t s i j c k u r t s n i e i n e i w a t s e Z . 1 . 2 a e b a T l Rozdziaä 2. i Obsäuga diod LED 43 Rysunek 2.36. Algorytm inicjalizacji sterownika HD44780 w przypadku interfejsu 4-bitowego (rysunek pochodzi z dokumentacji sterownika, s. 46) Szanowny Czytelnik zapewne siĊ domyĞliá, Īe skoro przedstawiáem pewien algorytm, to zaraz powiem, dlaczego mi siĊ nie podoba. Tak jest w istocie. Moje doĞwiadczenie pokazuje, Īe dokáadne jego przestrzeganie nie zawsze skutkuje poprawnie zainicjo- wanym sterownikiem HD44780. Zmienimy dwie rzeczy: wydáuĪymy czas oczekiwania na stabilizacjĊ do 45 ms oraz dodamy czas oczekiwania 100 μs takĪe po trzeciej pro- cedurze wysyáania sekwencji 0011. Oto nasz poprawiony algorytm — co prawda przedstawiáem go juĪ w podrĊczniku AVR ARM7, ale zrobiáem to z takim wdziĊkiem, Īe nie mogĊ siĊ powstrzymaü, by uczyniü to jeszcze raz. 1. Ustaw linie RS_LCD, EN_LCD, DB4_LCD, DB5_LCD, DB6_LCD, DB7_LCD w kierunku wyjĞciowym, wyzeruj linie. 2. Zaczekaj co najmniej 45 ms na ustabilizowanie napiĊcia. 3. WyĞlij sekwencjĊ 0011. 4. Zaczekaj co najmniej 4,1 ms. 5. Powtórnie wyĞlij sekwencjĊ 0011. 6. Zaczekaj co najmniej 100 μs. 7. Po raz trzeci wyĞlij sekwencjĊ 0011. 8. Zaczekaj co najmniej 100 μs. 44 Mikrokontrolery PIC w praktycznych zastosowaniach 9. Ustaw interfejs 4-bitowy, czyli wyĞlij sekwencjĊ 0010. 10. Ustaw parametry wyĞwietlacza. 11. Ustaw tryb pracy wyĞwietlacza. 12. Wáącz wyĞwietlacz. 13. WyczyĞü pamiĊü wyĞwietlacza. A oto programowa realizacja algorytmu. Listing lcd.h (fragment) void WlaczLCD() { //ustawienie kierunku wyjĞciowego linii podáączonych do LCD TRIS_RS_LCD = 0; TRIS_EN_LCD = 0; TRIS_DB7_LCD = 0; TRIS_DB6_LCD = 0; TRIS_DB5_LCD = 0; TRIS_DB4_LCD = 0; //stan niski na liniach RS_LCD = 0; EN_LCD = 0; DB7_LCD = 0; DB6_LCD = 0; DB5_LCD = 0; DB4_LCD = 0; //zaczekaj co najmniej 45 ms na ustabilizowanie siĊ napiĊcia __delay_us(45000); //1 //ustaw liniĊ EN EN_LCD = 1; //zaáaduj sekwencjĊ 0011 DB7_LCD = 0; DB6_LCD = 0; DB5_LCD = 1; DB4_LCD = 1; //zaczekaj 1 ȝs __delay_us(1); //potwierdĨ opadającym zboczem EN EN_LCD = 0; //zaczekaj co najmniej 4,1 ms __delay_us(4100); //2 //ustaw liniĊ EN EN_LCD = 1; //zaczekaj 1 ȝs __delay_us(1); //potwierdĨ opadającym zboczem EN sekwencjĊ 0011 EN_LCD = 0; Rozdziaä 2. i Obsäuga diod LED 45 //zaczekaj co najmniej 100 ȝs __delay_us(100); //3 //ustaw liniĊ EN EN_LCD = 1; //zaczekaj 1 ȝs __delay_us(1); //potwierdĨ opadającym zboczem EN sekwencjĊ 0011 EN_LCD = 0; //zaczekaj co najmniej 100 ȝs __delay_us(100); //4 //ustaw liniĊ EN EN_LCD = 1; //ustawienie interfejsu 4-bitowego DB4_LCD = 0; //zaczekaj 1 ȝs __delay_us(1); //potwierdĨ opadającym zboczem EN EN_LCD = 0; //ustaw parametry wyĞwietlacza //bit 4 = 0 (sáowo danych ma 4 bity) //bit 3 = 1 (2 wiersze znaków) //bit 2 = 0 (matryca 5×8 pikseli) RS_LCD = 0; Wyslij_do_LCD(0b00101000); RS_LCD = 1; //wáącz wyĞwietlacz //bit 2 = 1 (wáączenie wyĞwietlania) //bit 1 = 0 (kursor nieaktywny) //bit 0 = 0 (kursor nie miga) RS_LCD = 0; Wyslij_do_LCD(0b00001100); RS_LCD = 1; //ustaw tryb pracy wyĞwietlacza //bit 2 = 1 (inkrementowanie adresu zapisu danych) //bit 1 = 1 (wyáączenie przesuwania w prawo) RS_LCD = 0; Wyslij_do_LCD(0b00000110); RS_LCD = 1; CzyscLCD(); } W przedstawionym kodzie wystĊpuje wywoáanie funkcji CzyscLCD, której jeszcze nie zdefiniowaliĞmy. Drobne przeoczenie. 46 Mikrokontrolery PIC w praktycznych zastosowaniach Listing lcd.h (fragment) void CzyscLCD() { RS_LCD = 0; Wyslij_do_LCD(1); RS_LCD = 1; //czekaj 1.64 ms __delay_us(1640); } Standardowy zestaw znaków sterownika HD44780 pokrywa siĊ w swojej podstawo- wej czĊĞci ze znakami kodowania ASCII. To upraszcza zadanie wyĞwietlania danych na wyĞwietlaczu. Zdefiniujemy funkcjĊ, której argumentami bĊdą ciąg znaków do wy- Ğwietlania wraz z dáugoĞcią napisu. Listing lcd.h (fragment) void WyswietlLCD(char *napis, unsigned char ile) { unsigned char k = 0; while(k ile) { Wyslij_do_LCD(napis[k]); k++; } } Wróümy na chwilĊ do tabeli 2.1. Znajduje siĊ w niej instrukcja Ustaw DDRAM. DziĊki niej moĪliwy jest zapis znaku w dowolnym miejscu pamiĊci DDRAM i — co z tego wynika — w dowolnym miejscu ekranu wyĞwietlacza LCD. Jest to dla nas okolicznoĞü wielce sprzyjająca, chcemy bowiem zbudowaü funkcjĊ, która pozwoli nam wyĞwietlaü dane w róĪnych miejscach ekranu. W tym miejscu wypada nam zazna- jomiü siĊ z architekturą pamiĊci DDRAM wyĞwietlacza. Sterownik HD44780 obsáu- guje 80 komórek pamiĊci DDRAM, z których kaĪda ma rozmiar 1 bajta. W przypadku wyĞwietlaczy o dwóch liniach kaĪda z linii ma 40 komórek o adresach podanych na rysunku 2.37. Rysunek 2.37. Sposób adresowania komórek wyĞwietlacza LCD typu 2*16 Zwracam uwagĊ, Īe adresy zostaáy zapisane w kodzie szesnastkowym. Pierwszych 40 komórek ma adresy od 0x00 do 0x27. Adresy komórek w wierszu drugim zaczynają siĊ od liczby 0x40, a koĔczą liczbą 0x67. Dodatkowo na rysunku zostaáy zaznaczone widoczne komórki pamiĊci. MoĪliwe jest przesuwanie okna wyĞwietlacza w celu wi- zualizacji pozostaáych adresów pamiĊci DDRAM. Rozdziaä 2. i Obsäuga diod LED 47 Po zresetowaniu pamiĊci wyĞwietlacza kursor pamiĊci DDRAM jest umiejscawiany pod adresem 0x00. Zapisanie komórki powoduje automatyczne przesuniĊcie wskaĨni- ka pod adres nastĊpny. Z opisu instrukcji Ustaw DDRAM wiemy, Īe w celu przesuniĊcia wskaĨnika pod dany adres naleĪy wysáaü bajt postaci 1AAAAAAA, skáadający siĊ z 7-bitowego adresu AAAAAAA oraz ustawionego najstarszego bitu. Wysáanie rozkazu powinno byü poprzedzone wyzerowaniem linii RS. A co z listą argumentów budowanej funkcji? Rysunek 2.38 przedstawia zwyczajowe numerowanie komórek ekranu wy- Ğwietlacza typu 2*16. Rysunek 2.38. Zwyczajowe numerowanie komórek ekranu wyĞwietlacza LCD typu 2*16 Z rysunku 2.38 wynika na przykáad, Īe ustawienie kursora w miejscu o wspóárzĊdnych (2,14) powinno skutkowaü przesuniĊciem wskaĨnika pod adres 0x4D. Najprostsza funkcja realizująca to zadanie moĪe wyglądaü tak. Listing lcd.h (fragment) void UstawKursorLCD(unsigned char y, unsigned char x) { //ustal nowy adres pamiĊci DD RAM unsigned char n; if (y==1) n = x - 1; else n = 0x40 + x - 1; //ustaw kod n |= 0b10000000; //wyĞlij rozkaz ustawienia nowego adresu DD RAM RS_LCD = 0; Wyslij_do_LCD(n); RS_LCD = 1; } Z tabeli 2.1 wyczytamy, Īe instrukcja ustawienia adresu pamiĊci DDRAM powinna trwaü 40 μs. Nie ma potrzeby dodawania instrukcji opóĨniającej, gdyĪ mniej wiĊcej 40 μs trwa wykonanie funkcji Wyslij_do_LCD. ZbudowaliĞmy wáasną bibliotekĊ obsáugi alfanumerycznego wyĞwietlacza LCD. Skorzy- stamy z niej w sposób wáaĞciwy. W pierwszej linii ekranu wyĞwietlimy napis „Odli- czanie:” wraz ze zmieniającymi siĊ co sekundĊ cyframi od 9 do 1. Po wyĞwietleniu cyfry 1 w drugiej linii ekranu wyĞwietlony zostanie napis „Detonacja!”. Taki maáy Īart. Wszystko powinno wyglądaü tak jak na rysunku 2.39. Rysunek 2.39. Ekran wyĞwietlacza po wykonaniu bombowego zadania 48 Mikrokontrolery PIC w praktycznych zastosowaniach PamiĊtamy, Īe skorzystanie z naszej biblioteki obsáugi wyĞwietlacza LCD wymaga zdefiniowania poáączenia wyĞwietlacza do mikrokontrolera. Dopiero po tym zabiegu moĪemy doáączyü zasoby biblioteki do programu gáównego. Drugą rzeczą wymagają- cą wyjaĞnienia jest wyĞwietlanie liczb. PoniewaĪ moĪemy wyĞwietlaü jedynie napisy, skorzystamy z funkcji utoa znajdującej siĊ w zasobach kompilatora HI-TECH. Funkcja konwertuje liczby bezznakowe w napisy. W zasobach jĊzyka C kompilatora HI-TECH znajdziemy cztery funkcje konwertujące liczby w napisy (patrz tabela 2.2). Tabela 2.2. Funkcje konwertujące liczby w napisy Deklaracja funkcji char *ftoa(float f, int *status); Opis Funkcja konwertująca liczbĊ zmiennoprzecinkową f w napis, który jest umieszczany w pamiĊci o adresie *buf. char *itoa(char *buf, int val, int base) char *ltoa(char *buf, long val, int base) char *utoa(char *buf, unsigned val, int base) Funkcja konwertująca liczbĊ caákowitą val w napis, który jest umieszczany w pamiĊci o adresie *buf. Parametr base oznacza podstawĊ kodowania liczby. Funkcja konwertująca liczbĊ val typu long w napis, który jest umieszczany w pamiĊci o adresie *buf. Parametr base oznacza podstawĊ kodowania liczby. Funkcja konwertująca liczbĊ bezznakową val w napis, który jest umieszczany w pamiĊci o adresie *buf. Parametr base oznacza
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Mikrokontrolery PIC w praktycznych zastosowaniach
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: