Spis tre艣ci
Wst臋p i cel pracy
wst臋p i cel pracy
Niniejsza praca ma na celu zaprezentowanie systemu mikroprocesorowego zbudowanego w oparciu o magistral臋 I2C. Konsola zawiera modu艂 bazowy z kontrolerem jednouk艂adowym 80C552 realizuj膮cym sprz臋tow膮 obs艂ug臋 magistrali. Do szyny I2C do艂膮czono uk艂ady peryferyjne w postaci modu艂贸w: zegara czasu rzeczywistego, pami臋ci EEPROM, wy艣wietlacza LCD, klawiatury oraz linijki diodowej. Dodatkowo do pracy do艂膮czono interfejs sprz臋towy umo偶liwiaj膮cy komunikacj臋 systemu z komputerem PC przez port r贸wnoleg艂y emuluj膮cy magistral臋 I2C, uzupe艂niony o odpowiednie oprogramowanie. Konsola mo偶e by膰 wykorzystywana podczas r贸偶nego rodzaju zaj臋膰 dydaktycznych dotycz膮cych dzia艂ania magistrali I2C. Jako dodatek do opracowania do艂膮czone s膮 tematy przyk艂adowych 膰wicze艅 mo偶liwych do wykonania przy wykorzystaniu przedmiotowej konsoli.
Konsola wyposa偶ona jest w oprogramowanie stanowi膮ce system operacyjny daj膮cy mo偶liwo艣膰 komunikacji z u偶ytkownikiem za po艣rednictwem uk艂ad贸w peryferyjnych.
Praktyczn膮 funkcj膮 systemu jest realizacja miernika temperatury z rozbudowanym zakresem funkcji pomiarowych. Program steruj膮cy prac膮 systemu znajduje si臋 w zewn臋trznej pami臋ci kodu kontrolera '552.
System posiada w艂asny stabilizowany zasilacz oraz bateri臋 podtrzymuj膮c膮 dzia艂anie uk艂adu zegara czasu rzeczywistego w okresie gdy w艂a艣ciwe zasilanie jest wy艂膮czone.
Rozdzia艂 1
Magistrala I2C
Potrzeba stosowania transmisji szeregowej wyst臋puje nie tylko przy du偶ych odleg艂o艣ciach przesy艂ania danych ale r贸wnie偶 w przypadku system贸w o niewielkim rozproszeniu. W szczeg贸lno艣ci mo偶e ona okaza膰 si臋 bardzo dobrym wyborem nawet wtedy, gdy nale偶y po艂膮czy膰 uk艂ady ze sob膮 blisko s膮siaduj膮ce. Prowadzi to do znacznej redukcji ilo艣ci po艂膮cze艅, co upraszcza obwody drukowane, z艂膮cza oraz zmniejsza powierzchni臋 modu艂贸w.
Interfejs Inter IC BUS (I2CBUS) opracowany zosta艂 w firmie Philips w celu synchronicznej komunikacji szeregowej pomi臋dzy urz膮dzeniami tworz膮cymi pewien zestaw (na przyk艂ad aparatura audio-video), modu艂ami w ramach urz膮dzenia, jak r贸wnie偶 uk艂adami scalonymi na p艂ytce. Wymaga on jednak stosunkowo z艂o偶onego sterowania, co sprawia, 偶e trudno by艂oby zrealizowa膰 obs艂ug臋 interfejsu w ramach urz膮dzenia z jednym mikroprocesorem. Mikroprocesor stale zaj臋ty monitorowaniem 艂膮cza transmisyjnego, generacj膮 sygna艂贸w synchronizuj膮cych, wprowadzaniem lub wyprowadzaniem danych do/z linii magistrali, rozpoznawaniem adres贸w itp., mia艂by niewiele czasu na realizacj臋 programu u偶ytkowego. Firma Philips opracowa艂a w tym celu specjalne uk艂ady kontroler贸w interfejsu szeregowego (SIO), w kt贸re wyposa偶a wiele uk艂ad贸w scalonych. Dzi臋ki temu mo偶liwe jest 艂atwe wykorzystanie interfejsu I2CBUS:
w uk艂adach mikroprocesorowych,
w sterownikach opartych na mikrokontrolerach jednouk艂adowych,
w sterownikach wy艣wietlaczy LCD,
do sterowania pami臋ciami RAM, EPROM, uk艂adami I/O,
w cyfrowej syntezie cz臋stotliwo艣ci i przetwarzaniu sygna艂贸w stosowanych w telekomunikacji (na przyk艂ad telefony z akustycznym wyborem numeru), sprz臋cie elektroakustycznym i video.
Podstawowe zalety interfejsu I2CBUS to:
Budowa uk艂ad贸w zawieraj膮cych interfejs I2CBUS jest zgodna z nowoczesnym stylem projektowania uk艂ad贸w elektronicznych polegaj膮cym na bezpo艣rednim przej艣ciu z diagramu blokowego na schemat ideowy.
Nie ma potrzeby projektowania uk艂ad贸w sprz臋gaj膮cych, poniewa偶 znajduj膮 si臋 one ju偶 w uk艂adach odpowiedzialnych za transmisj臋.
Uk艂ady steruj膮ce s膮 bardzo uniwersalne, co pozwala na ich szerokie zastosowanie.
Dodatkowe uk艂ady korzystaj膮ce z magistrali mog膮 by膰 dodawane lub wy艂膮czane bez jakiejkolwiek ingerencji w pozosta艂y uk艂ad po艂膮cze艅 na magistrali.
Transmisja magistral膮 I2C jest wysoce odporna na zak艂贸cenia zewn臋trzne.
Dost臋pno艣膰 uk艂ad贸w w wersji CMOS pozwala na ich stosowanie w urz膮dzeniach o ograniczonej mocy zasilania.
Po艂膮czenia na magistrali sk艂adaj膮 si臋 z tylko dw贸ch przewod贸w, ograniczaj膮c w ten spos贸b liczb臋 og贸lnych po艂膮cze艅 w urz膮dzeniu.
Ca艂kowicie zintegrowany protok贸艂 eliminuje potrzeb臋 stosowania dodatkowych uk艂ad贸w, na przyk艂ad dekoduj膮cych adresy na magistrali.
Diagnostyka i wykrycie b艂臋d贸w jest proste i 艂atwe do analizy.
Na magistrali mo偶e znajdowa膰 si臋 wiele urz膮dze艅 typu master, umo偶liwiaj膮c kontrol臋 gotowych uk艂ad贸w przez zewn臋trzny mikrokomputer.
1.1. Og贸lna charakterystyka interfejsu I2CBUS
Magistrala I2CBUS sk艂ada si臋 z dw贸ch linii, kt贸re umo偶liwiaj膮 przesy艂anie danych mi臋dzy dowolnymi urz膮dzeniami pod艂膮czonymi do magistrali. Ka偶de z urz膮dze艅 rozpoznawane jest przez unikalny adres przesy艂any przewa偶nie na pocz膮tku transmisji. Urz膮dzenia mog膮 by膰 nadawcami lub odbiorcami, w zale偶no艣ci od pe艂nionej funkcji w systemie. Na przyk艂ad zwyk艂y sterownik wy艣wietlacza LCD jest tylko odbiorc膮 danych, natomiast uk艂ady pami臋ciowe mog膮 dane zar贸wno przyjmowa膰 jak i nadawa膰. Opr贸cz podzia艂u na nadajniki i odbiorniki, przypisuje si臋 jeszcze urz膮dzeniom pewien status, przy czym wyr贸偶nia si臋 dwa statusy master i slave. Master to urz膮dzenie, kt贸re inicjuje i prowadzi transmisj臋 danych generuj膮c sygna艂y zegarowe. Dowolne poprawnie zaadresowane urz膮dzenie nazywane jest slave.
Interfejs I2CBUS pozwala na pod艂膮czenie do magistrali kilku urz膮dze艅 o statusie master. Oznacza to, 偶e w systemie mo偶e si臋 znale藕膰 kilka urz膮dze艅 potrafi膮cych przej膮膰 sterowanie sygna艂ami na magistrali. Dobrym przyk艂adem jest uk艂ad sk艂adaj膮cy si臋 z dw贸ch r贸wnorz臋dnych mikrokomputer贸w jednouk艂adowych komunikuj膮cych si臋 ze sob膮.
Nale偶y pami臋ta膰, 偶e nie ma sta艂ej zale偶no艣ci master to nadawca, a slave to odbiorca. Odbiorc膮 mo偶e r贸wnie偶 by膰 urz膮dzenie o statusie master odbieraj膮ce tylko nadawane dane przez uprzednio zaadresowane urz膮dzenie typu slave.
Obecno艣膰 kilku urz膮dze艅 master steruj膮cych sygna艂ami na magistrali mog艂aby spowodowa膰 przek艂amania danych (kolizj臋). W systemie I2CBUS problem ten rozwi膮zano stosuj膮c arbitra偶 oparty na metodzie „iloczynu na drucie”, kt贸ra wykorzystuje spos贸b pod艂膮czenia uk艂ad贸w do magistrali. Je艣li dwa lub wi臋cej urz膮dze艅 stara si臋 wys艂a膰 jednocze艣nie dane na magistral臋, to pierwsze kt贸re wy艣le jedynk臋, podczas gdy inne b臋d膮 wysy艂a膰 zero, utraci kontrol臋 nad dost臋pem do 艂膮cza.
Sygna艂 zegarowy na magistrali generowany jest zawsze przez urz膮dzenie master, nawet w sytuacji, gdy urz膮dzenie to odbiera dane. Jedynymi wyj膮tkami, w kt贸rych inne urz膮dzenia ingeruj膮 w przebieg sygna艂u zegarowego, jest proces arbitra偶u oraz przypadek, gdy wolne urz膮dzenie odbiorcze chce obni偶y膰 szybko艣膰 transmisji wymuszaj膮c niski poziom na linii SCL.
Normalna szybko艣膰 transmisji w systemie I2CBUS wynosi 100 kbit/s. Na magistrali mo偶na zaadresowa膰 do 128 urz膮dze艅. Wraz z rozwojem technologii oraz zwi臋kszeniem liczby przesy艂anych danych, firma Philips umo偶liwi艂a prac臋 z szybko艣ci膮 transmisji wynosz膮c膮 400 kbit/s. W celu rozwi膮zania przysz艂ych problem贸w, wzros艂a te偶 przestrze艅 adresowa do 1024 urz膮dze艅. Obecnie produkowane uk艂ady s膮 wyposa偶ane w sterowniki spe艂niaj膮ce te rozszerzone wymagania.
1.2. Magistrala szeregowa
Szeregowa magistrala interfejsu I2CBUS sk艂ada si臋 z dw贸ch, dwukierunkowych linii: jednej dla sygna艂u danych (Serial Data - SDA) oraz drugiej dla sygna艂u zegarowego (Serial Clock - SCL). Dla zapewnienia poprawnej wymiany informacji przez magistral臋 zdefiniowano nast臋puj膮cy protok贸艂:
Inicjalizacja transmisji danych mo偶e nast膮pi膰 tylko wtedy, gdy magistrala nie jest zaj臋ta.
Podczas transmisji danych, sygna艂 na linii SDA musi by膰 stabilny (nie mo偶e si臋 zmienia膰), gdy stan sygna艂u na linii SCL jest H. Zmiany sygna艂u na linii SDA podczas wysokiego stanu na linii SCL s膮 interpretowane jako sygna艂y steruj膮ce (control). W zwi膮zku z tym okre艣lono nast臋puj膮ce warunki na magistrali:
magistrala nie zaj臋ta (Bus Not Busy) - linie SDA i SCL s膮 w stanie H,
start transmisji danych - zmiana stanu linii SDA z H na L, dokonana podczas wysokiego stanu linii SCL,
stop (zatrzymanie) transmisji danych - zmiana stanu na linii SDA, z L na H dokonana podczas wysokiego stanu linii SCL,
dane wa偶ne (Data Valid) - stany sygna艂u na linii SDA reprezentuj膮 „dane wa偶ne”, gdy (po wyst膮pieniu warunku startu) pozostaj膮 stabilne przez czas trwania stanu H linii SCL. Zmiana danych w linii SDA mo偶e nast膮pi膰 podczas trwania stanu niskiego linii SCL. Na rysunku 1 przedstawiono sekwencj臋 zdarze艅 zachodz膮cych podczas transmisji informacji na magistrali I2C. Ka偶da transmisja inicjowana jest poprzez wyst膮pienie warunku start i ko艅czona poprzez wyst膮pienie warunku stop.
Rysunek 1.
Magistrala interfejsu I2C.
Wykrycie warunk贸w start i stop jest zadaniem sterownika magistrali I2CBUS. Je偶eli nie wykorzystuje si臋 specjalizowanego sterownika, nale偶y testowa膰 stan linii SDA przynajmniej dwa razy cz臋艣ciej ni偶 okres sygna艂u zegara na linii SCL.
1.3. Synchronizacja wymiany danych na magistrali I2CBUS
Sygnalizacja pocz膮tku i ko艅ca transmisji
Jak ju偶 powiedziano, znacznikami pocz膮tku i ko艅ca transmisji s膮 odpowiednio warunki start i stop. Ilo艣膰 bit贸w transmitowanych pomi臋dzy startem i stopem nie jest limitowana.
Posta膰 przesy艂anych danych
Ka偶dy bajt wysy艂any lini膮 SDA ma d艂ugo艣膰 8 bit贸w. Liczba bajt贸w po rozpocz臋ciu transmisji do jej zako艅czenia jest dowolna. Ka偶dy wys艂any bajt musi by膰 potwierdzony przez odbiornik. Dane wysy艂ane s膮 od najstarszego bitu do najm艂odszego. Je艣li odbiornik nie jest w stanie przyj膮膰 kolejnego kompletnego bajtu, to dla poinformowania nadajnika i zwolnienia transmisji ustala stan niski na linii zegara SCL. Wznowienie transmisji mo偶e nast膮pi膰 natychmiast po tym, jak odbiornik zwolni lini臋 SCL, usuwaj膮c z niej stan niski.
Potwierdzenia danych
Na magistrali I2CBUS niezb臋dne s膮 potwierdzenia przesy艂anych danych, kt贸re wystawiane s膮 po przes艂aniu ka偶dego bajtu. Urz膮dzenie master zobowi膮zane jest do generowania dodatkowego taktu sygna艂u zegarowego dla uchwycenia bitu potwierdzenia. W czasie potwierdzenia, nadajnik ustawia swoje wyj艣cie danych na H, co umo偶liwia odbiornikowi wys艂anie potwierdzenia poprzez wymuszenie niskiego stanu na linii SDA. Potwierdzenie pojawia si臋 w czasie trwania wspomnianego, dodatkowego taktu zegarowego.
Mog膮 jednak wyst膮pi膰 sytuacje, w kt贸rych potwierdzenia nie b臋d膮 wystawiane. Je艣li odbiornik slave nie potwierdzi艂 wys艂anego do niego adresu w艂asnego (na przyk艂ad z powodu wykonywania jakiej艣 funkcji czasu rzeczywistego) lub kt贸regokolwiek z przesy艂anych nast臋pnie bajt贸w, to lini臋 SDA powinien pozostawi膰 w stanie wysokim, a urz膮dzenie master powinno wys艂a膰 warunek stop.
Je艣li odbiornik master przyjmuje dane, to powinien sygnalizowa膰 nadajnikowi koniec danych przez nie potwierdzenie ostatniego bajtu danych. Nadajnik pozostawia lini臋 SDA w stanie wysokim, umo偶liwiaj膮c urz膮dzeniu master zako艅czenie transmisji warunkiem stop.
1.4. Arbitra偶
W systemie I2CBUS mo偶e doj艣膰 do sytuacji, 偶e wi臋cej ni偶 jedno urz膮dzenie zechce przej膮膰 kontrol臋 nad 艂膮czem (by膰 masterem). Zdefiniowano wi臋c specjaln膮 procedur臋 arbitra偶ow膮, kt贸ra wy艂ania jednego mastera spo艣r贸d urz膮dze艅 rywalizuj膮cych o sterowanie transmisj膮. Arbitra偶 oparto na zasadzie kontroli zgodno艣ci stanu linii SDA z warto艣ci膮 logiczn膮 bitu wyprowadzanego przez dane urz膮dzenie. Odczyty stanu linii SDA odbywaj膮 si臋 w 艣ci艣le okre艣lonych momentach wyznaczanych sygna艂em zegarowym.
Trzeba pami臋ta膰, 偶e podczas arbitra偶u dwa lub wi臋cej urz膮dzenia wyprowadzaj膮 swoje bity na lini臋 danych i mo偶e si臋 zdarzy膰, 偶e gdy jedno wyprowadza jedynk臋, to drugie wyprowadza zero. Na linii SDA w takim przypadku ustali si臋 stan L, poniewa偶 dla pod艂膮czonych do tej linii urz膮dze艅 realizuje ona funkcj臋 iloczynu na drucie. Urz膮dzenie, kt贸re chcia艂o wyprowadzi膰 jedynk臋, po stwierdzeniu, 偶e na linii SDA jest zero, wypada z arbitra偶u (wy艂膮cza swoje wyj艣cie). Wida膰 wi臋c, 偶e przedstawione rozwi膮zanie preferuje urz膮dzenie, kt贸re w czasie arbitra偶u wysy艂a najni偶sz膮 warto艣膰 binarn膮.
Dla poprawnego przeprowadzenia arbitra偶u konieczna jest synchronizacja sygna艂贸w zegarowych urz膮dze艅, kt贸re walcz膮 o sterowanie transmisj膮. Wszystkie urz膮dzenia generuj膮 swoje w艂asne sygna艂y zegarowe na linii SCL umo偶liwiaj膮c przesy艂 danych oraz potwierdzenia. Dane na linii SDA s膮 wa偶ne tylko dla wysokiego stanu linii zegara. Synchronizacj臋 przesy艂u danych uzyskuje si臋 poprzez wykorzystanie funkcji iloczynu na drucie, tym razem realizowanej na linii SCL. Linia SCL b臋dzie tak d艂ugo w stanie niskim, a偶 wszystkie urz膮dzenia nie zwolni膮 tej linii. D艂ugo艣膰 stanu wysokiego na linii SCL jest zatem okre艣lona przez czas trwania najkr贸tszego okresu spo艣r贸d sygna艂贸w zegarowych, a d艂ugo艣膰 stanu niskiego przez czas trwania najd艂u偶szego okresu spo艣r贸d sygna艂贸w zegarowych.
Urz膮dzenie master, kt贸re utraci艂o kontrol臋 nad magistral膮, mo偶e generowa膰 tylko sygna艂y zegarowe do ko艅ca bajtu, przy kt贸rym utraci艂o kontrol臋. Arbitra偶 nie jest dozwolony w trakcie powtarzanego warunku START lub STOP.
1.5. Przebieg transmisji
Transmisj臋 rozpoczyna warunek start, po kt贸rym zostaje wys艂any siedmiobitowy adres urz膮dzenia slave. Kierunek przesy艂u danych okre艣la bit R/W wyprowadzany w nast臋pnej kolejno艣ci. Zerowa warto艣膰 tego bitu oznacza nadawanie do urz膮dzenia slave (operacja zapisu), natomiast jeden, oczekiwanie na dane z urz膮dzenia slave (operacja odczytu). Dalej odbywa si臋 w艂a艣ciwa wymiana danych, potwierdzana przez odbiornik impulsami ACK po skompletowaniu ka偶dego bajtu. Koniec transmisji wyznacza warunek stop. Na rysunku 2 przedstawiono pe艂ny transfer danych na magistrali I2CBUS.
Rysunek 2.
Pe艂ny transfer danych na magistrali I2CBUS
Mo偶liwe s膮 trzy formaty transmisji. Na rysunku 3 przedstawiono sytuacj臋, w kt贸rej urz膮dzenie master jest nadawc膮 a slave odbiorc膮 danych.
Drugi przypadek, w kt贸rym master zaraz po zaadresowaniu urz膮dzenia slave przechodzi do odbioru danych pokazuje rysunek 4
Trzeci format, b臋d膮cy kombinacj膮 dw贸ch poprzednich, ma miejsce, gdy w czasie jednej transmisji nast臋puj膮 zmiany kierunku przep艂ywu danych. Przed ka偶d膮 zmian膮 musi by膰 ponownie generowany sygna艂 start, adres urz膮dzenia slave oraz nowa warto艣膰 bitu kierunku (rysunek 5).
Rysunek 3.
Format transmisji: master - nadawca, slave - odbiorca.
Rysunek 4.
Format transmisji: master - odbiorca, slave - nadawca.
Rysunek 5.
Format transmisji ze zmian膮 kierunku nadawania.
1.6. Adresowanie urz膮dze艅
Po warunku start rozpoczynaj膮cym transmisj臋, zostaje wys艂any bajt, w kt贸rym siedem bit贸w reprezentuje adres urz膮dzenia slave, a najmniej znacz膮cy bit (LSB) okre艣la kierunek transmisji. Wszystkie urz膮dzenia po wykryciu warunku start por贸wnuj膮 odebrany adres ze swoim adresem sprz臋towym. Rozpoznanie adresu w艂asnego oznacza zaadresowanie urz膮dzenia jako odbiornik slave lub nadajnik slave, w zale偶no艣ci od bitu R/W.
W niekt贸rych urz膮dzeniach adres w艂asny sk艂ada si臋 z dw贸ch cz臋艣ci: sta艂ej oraz programowalnej. Taki przypadek wyst臋puje w uk艂adach scalonych o niedu偶ej inteligencji, wyposa偶onych w proste sterowniki interfejsu. Kilka starszych bit贸w adresu (zazwyczaj od 4 do 6) jest ustawionych na sta艂e przez producenta, a pozosta艂e m艂odsze bity u偶ytkownik mo偶e zaprogramowa膰 poprzez 艂膮czenie ich wyprowadze艅 do zasilania lub masy. Ilo艣膰 bit贸w programowalnych ogranicza ilo艣膰 uk艂ad贸w tego samego typu (a wi臋c posiadaj膮cych identyczn膮 sta艂膮 cz臋艣膰 adresu), kt贸re mog膮 by膰 jednocze艣nie pod艂膮czone do magistrali. Trzy bity programowalne pozwalaj膮 na po艂膮czenie do o艣miu uk艂ad贸w tego samego typu.
Pewnym wyj膮tkiem w sposobie adresowania jest adres rozg艂oszeniowy (general call), kt贸ry powoduje zaadresowanie wszystkich urz膮dze艅 w systemie. Adres ten, przynajmniej teoretycznie, powinien by膰 potwierdzony przez wszystkie urz膮dzenia. Niekt贸re urz膮dzenia mog膮 by膰 jednak niewra偶liwe na ten spos贸b adresowania. Po adresie rozg艂oszeniowym wys艂any zostaje drugi bajt okre艣laj膮cy polecenie. Procedura ta zostanie dok艂adniej wyja艣niona w dalszej cz臋艣ci rozdzia艂u.
W interfejsie I2CBUS zarezerwowano dwie grupy po osiem adres贸w do cel贸w przedstawionych w tabeli 1. S膮 to adresy o warto艣ci OOOOXXX[R/W] oraz 11110XX[R/W], gdzie X r贸wna si臋 0 lub 1, a R/W oznacza bit kierunku. Dla pierwszej grupy zdefiniowane s膮 nast臋puj膮ce zadania:
Adresacja rozg艂oszeniowa
Warto艣膰 bajtu adresowego 0000 000 0.
Urz膮dzenie reaguj膮ce na adres rozg艂oszeniowy potwierdza jego odbi贸r i dalej zachowuje si臋 jak odbiorca slave. Urz膮dzenia „nie zainteresowane” rozg艂aszan膮 informacj膮 mog膮 nie potwierdza膰 adresu rozg艂oszeniowego. Je偶eli urz膮dzenie nie jest w stanie przetworzy膰 kolejnych bajt贸w w bloku rozg艂oszeniowym, nie mo偶e wystawia膰 potwierdze艅.
Po adresie rozg艂oszeniowym wysy艂any jest drugi bajt, kt贸ry okre艣la znaczenie rozg艂oszenia. Wyst臋puj膮 tutaj dwa przypadki rozr贸偶niane stanem najm艂odszego bitu wspomnianego, drugiego bajtu:
Bit LSB drugiego bajtu = 0. Warto艣膰 drugiego bajtu mo偶e wynosi膰 00000110 (06h), co oznacza inicjalizacj臋 (reset) uk艂adu oraz zapis programowalnej cz臋艣ci adresu sprz臋towego urz膮dzenia, lub 00000100 (04h), co oznacza jedynie zapis programowalnej cz臋艣ci adresu sprz臋towego urz膮dzenia bez inicjalizacji.
Sekwencja programowania zale偶y od konkretnego urz膮dzenia i jest podawana w jego materia艂ach katalogowych.
Bit LSB drugiego bajtu = 1. Drugi bajt z LSB=1 stanowi og贸lne sprz臋towe wywo艂anie (hardware general call), co oznacza, 偶e sekwencja jest wysy艂ana przez sprz臋towe urz膮dzenie master (hardware master). Uk艂ady takie (na przyk艂ad scalony sterownik klawiatury) posiadaj膮 bardzo prosty kontroler interfejsu, niezdolny do przesy艂ania adres贸w slave. Skoro wi臋c sprz臋towe urz膮dzenie master nie zna przeznaczenia wysy艂anych przez siebie danych, mo偶e tylko wygenerowa膰 og贸lne sprz臋towe wywo艂anie oraz sw贸j w艂asny adres umo偶liwiaj膮cy jego identyfikacj臋 w systemie.
Tablica 1.
Znaczenie pierwszego bajtu
Adres slave |
Bit R/W |
Opis |
0000 000 |
0 |
Adres rozg艂oszeniowy |
0000 000 |
1 |
Bajt startowy |
0000 001 |
X |
Adres zarezerwowany dla urz膮dze艅 pracuj膮cych w standardzie CBUS |
0000 010 |
X |
Adres zarezerwowany dla innych format贸w transmisji |
0000 011 |
X |
Zarezerwowane dla przysz艂ych potrzeb |
0000 1XX |
X |
|
1111 1XX |
X |
|
1111 0XX |
X |
Adres dla dziesi臋ciobitowego trybu adresowania (rozszerzony I2CBUS) |
Siedem starszych bit贸w drugiego bajtu reprezentuje zatem adres sprz臋towego urz膮dzenia master. Adres ten rozpoznany zostaje przez inteligentne urz膮dzenie pod艂膮czone do magistrali, na przyk艂ad mikrokontroler, kt贸ry przejmuje dane wysy艂ane przez sprz臋towe urz膮dzenie master i skierowuje je do wybranego urz膮dzenia slave. Je偶eli sprz臋towe urz膮dzenie master mo偶e dzia艂a膰 jako slave, to jego adres slave jest taki sam jak adres master (rysunek 6).
Rysunek 6.
Blok rozgloszeniowy
W niekt贸rych systemach mo偶liwa jest nieco inna praca sprz臋towego urz膮dzenia master. Bezpo艣rednio po inicjalizacji zostaje ono ustawione w tryb odbiornik slave. Master konfiguruj膮cy system powiadamia nast臋pnie sprz臋towe urz膮dzenie master pod jaki adres wysy艂ane przez niego dane maj膮 trafi膰 (dump address). Po wykonaniu wspomnianej procedury programuj膮cej, sprz臋towe urz膮dzenie master pozostaje w trybie master nadawca (rysunek 7).
Rysunek 7.
Transmisja danych przez sprz臋towe urz膮dzenie master z ustalonym wcze艣niej adresem docelowym:
a - wystanie adresu docelowego przez master- konfiguruj膮cy system;
b - wys艂anie danych przez sprz臋towe urz膮dzenie master
Bajt startowy
Inteligentne urz膮dzenia, takie jak mikrokontrolery jednouk艂adowe, mog膮 posiada膰 specjalizowany sterownik interfejsu I2CBUS, kt贸ry bez anga偶owania CPU monitoruje magistral臋. Wychwytuje on wszystkie warunki, sprawdza adresy i komunikuje si臋 z procesorem (zazwyczaj przez przerwania) na og贸艂 wtedy, gdy chce zapisa膰 lub odczyta膰 bajt do/z akumulatora. Je偶eli urz膮dzenie mikroprocesorowe nie posiada sterownika interfejsu, to samo musi monitorowa膰 magistral臋 i rozpoznawa膰 wszystkie warunki. Pr贸bkowanie magistrali nale偶y przeprowadza膰 z du偶膮 cz臋stotliwo艣ci膮, przynajmniej dwa razy wi臋ksz膮 ni偶 cz臋stotliwo艣膰 zegara na linii SCL. Zadanie to bardzo anga偶uje procesor urz膮dzenia, kt贸ry nie ma czasu na realizacj臋 innych funkcji.
Aby odci膮偶y膰 CPU mikrokontroler贸w nie posiadaj膮cych sprz臋towego sterownika interfejsu od pr贸bkowania magistrali z du偶膮 cz臋stotliwo艣ci膮, wprowadzono specjaln膮 procedur臋 startow膮, znacznie d艂u偶sz膮 od normalnego warunku start (rysunek 8). Procedura ta sk艂ada si臋 z:
normalnego warunku start (S),
bajtu startowego 00000001,
impulsu potwierdzenia ACK,
powt贸rzonego warunku start (Sr).
Po wys艂aniu warunku start przez urz膮dzenie master 偶膮daj膮ce dost臋pu do magistrali, generowany jest bajt startowy. Inny mikrokontroler (nie wyposa偶ony w sterownik interfejsu) mo偶e pr贸bkowa膰 lini臋 SDA ze stosunkowo ma艂膮 cz臋stotliwo艣ci膮, tak膮 jednak aby zd膮偶y艂 wykry膰 kt贸re艣 z siedmiu zer bajtu startowego. Po detekcji niskiego poziomu na linii SDA, mikrokontroler powinien zmieni膰 szybko艣膰 pr贸bkowania magistrali na wy偶sz膮, pozwalaj膮c膮 na rozpoznanie powt贸rzonego warunku start (Sr), kt贸ry jest ju偶 normalnym warunkiem synchronizacyjnym.
Sterownik sprz臋towy interfejsu I2CBUS zostanie wyzerowany po odebraniu Sr, co oznacza zignorowanie bajtu startowego.
Po bajcie startowym generowany jest impuls potwierdzenia, lecz nie przez urz膮dzenie odbieraj膮ce, a przez sam nadajnik. Chodzi tu o zachowanie zasady potwierdzania ka偶dego bajtu. Bajt startowy nie mo偶e by膰 potwierdzany przez 偶adne urz膮dzenie odbieraj膮ce.
Rysunek 8.
Procedura startowa oparta na bajcie startowym
1.7. Metody pod艂膮czania urz膮dze艅 do magistrali
Dopuszcza si臋 przy艂膮czenie do magistrali uk艂ad贸w wykonanych w r贸偶nych technologiach. Ka偶dy uk艂ad posiadaj膮cy okre艣lone na sta艂e poziomy napi臋膰 wej艣ciowych (max 1,5 V dla stanu L i od 3 V do 5 V dla stanu H) mo偶e mie膰 swoje odr臋bne 藕r贸d艂o zasilania. Wymaga si臋 tylko pod艂膮czenia ka偶dej z linii magistrali do 5 V 卤 10% przez odpowiednie rezystory podci膮gaj膮ce RP (rysunek 9).
W przypadku uk艂ad贸w o poziomach napi臋膰 wej艣ciowych zale偶nych od VDD, powinno istnie膰 jedno 藕r贸d艂o zasilania, do kt贸rego pod艂膮czone s膮 linie magistrali przez odpowiednie rezystory podci膮gaj膮ce (rysunek 10).
W sytuacji pod艂膮czenia do magistrali zar贸wno uk艂ad贸w o okre艣lonych na sta艂e poziomach wej艣ciowych, jak i uk艂ad贸w o poziomach zale偶nych od napi臋cia VDD, te ostatnie musz膮 by膰 zasilane ze wsp贸lnego 藕r贸d艂a napi臋cia 5V 卤10% oraz posiada膰 pod艂膮czenie linii SDA i SCL do napi臋cia zasilaj膮cego przez rezystory RP (rysunek 11).
Rysunek 9.
Pod艂膮czenie do magistrali uk艂ad贸w o okre艣lonych na sta艂e poziomach wej艣ciowych.
Rysunek 10.
Pod艂膮czenie do magistrali uk艂ad贸w o poziomach wej艣ciowych zale偶nych od VDD.
Rysunek 11.
Mieszane pod艂膮czenie urz膮dze艅 o okre艣lonych na sta艂e poziomach wej艣ciowych z urz膮dzeniami o poziomach zale偶nych od napi臋cia zasilaj膮cego.
Rysunek 12.
Zabezpieczenie wej艣膰 uk艂ad贸w przed wysokonapi臋ciowymi impulsami.
W celu zabezpieczenia wej艣膰 uk艂ad贸w przed wysokonapi臋ciowymi impulsami, kt贸re mog膮 pojawi膰 si臋 na magistrali, nale偶y pod艂膮cza膰 wej艣cia uk艂ad贸w do linii SDA i SCL przez rezystory szeregowe RS o typowej warto艣ci oko艂o 300 惟 (rysunek 12).
Maksymalne i minimalne warto艣ci rezystor贸w RP i RS
Warto艣ci rezystor贸w RP, oraz RS zale偶膮 od nast臋puj膮cych parametr贸w:
napi臋cia zasilania,
pojemno艣ci linii magistrali,
ilo艣ci pod艂膮czonych urz膮dze艅 do magistrali.
Napi臋cie zasilania ogranicza minimaln膮 warto艣膰 rezystor贸w RP, kt贸re nale偶y tak dobra膰, aby nie zosta艂o przekroczone napi臋cie V0Lmax = 0,4 V przy obci膮偶eniu pr膮dem 3聽mA (V0L - niski poziom napi臋cia na wyj艣ciu).
Maksymaln膮 warto艣膰 RP ograniczaj膮:
pojemno艣膰 linii magistrali (z艂o偶ona z pojemno艣ci przewod贸w, z艂膮cz oraz wej艣cia-wyj艣cia uk艂ad贸w) ze wzgl臋du na wymaganie nie przekroczenia okre艣lonej warto艣ci czasu narastania,
ca艂kowity pr膮d wej艣ciowy w stanie wysokim (dla jednego wej艣cia/wyj艣cia max 10聽碌A), ze wzgl臋du na zachowanie marginesu zak艂贸ce艅 w stanie wysokim 0,2 VDD.
Maksymaln膮 warto艣膰 RS ogranicza wymaganie zachowania marginesu zak艂贸ce艅 w stanie niskim 0,2 VDD.
rozdzia艂 2
Opis p艂ytki bazowej.
cechy mikrokontrolera 80c552.
2.1. Opis p艂ytki bazowej
Podstawow膮, a zarazem najwa偶niejsza cz臋艣ci膮 sk艂adow膮 niniejszej pracy dyplomowej jest p艂ytka bazowa z mikrokontrolerem 80C552 firmy Philips. Budowa p艂ytki odzwierciedla sprz臋towe mo偶liwo艣ci procesora, jej schemat ideowy pokazuje rysunek 13. Uniwersalizm tego modu艂u polega na wyprowadzeniu wszystkich sygna艂贸w 碌K i logicznym pogrupowaniu ich na z艂膮czach J1, J2, J3. Uk艂ad wsp贸艂pracuje z zewn臋trzn膮 pami臋ci膮 programu typu EPROM lub EEPROM oznaczonej jako U3. Zatrzask U2 jest niezb臋dny przy odczycie przez procesor kolejnych bajt贸w programu ze wzgl臋du na multipleksowanie portu P0, pomi臋dzy m艂odsz膮 cz臋艣膰 szyny adresowej, a magistral臋 danych. Do gniazda J2 doprowadzono wszystkie potrzebne do pod艂膮czenia zewn臋trznej pami臋ci RAM lub niestandardowych urz膮dze艅 wej艣cia/wyj艣cia. Gniazdo J1 grupuje wyprowadzenia port贸w P3, P5 oraz wszystkich pin贸w zwi膮zanych z funkcjami przetwarzania analogowego. J3 to porty P1 i P4, kt贸rych funkcje 艂膮cz膮 si臋 mi臋dzy innymi z dzia艂aniem timera 2 i interfejsu I2C. Miejsca na gniazda umo偶liwiaj膮 wlutowanie podstawek i wtyk贸w dla ta艣my 20-偶y艂owej, mog膮cej po艂膮czy膰 wybrane porty z elementami peryferyjnymi montowanymi na dodatkowych p艂ytkach. Umo偶liwia to praktyczne wykorzystanie uk艂adu jako bloku steruj膮cego w konkretnych urz膮dzeniach. Do z艂膮cza J4 pod艂膮czone jest zasilanie i analogowe napi臋cie odniesienia V1.
Elementami konfiguracyjnymi p艂ytki s膮 jumpery SW1...SW3. Ustawienie SW2 pozwala na stosowanie r贸偶nego typu EPROM'贸w. Zwarcie 1-2 odpowiada pami臋ci 32 kB, 3-2 128 kB, a brak zworki 64 kB. Kr贸tsze obudowy na przyk艂ad w przypadku 32 kB pami臋ci nale偶y umieszcza膰 tak, aby skrajne wyprowadzenia 12 i 13 znalaz艂y si臋 w zaciskach podstawki 14 i 15. Jumperem SW1 wybiera si臋 dodatnie analogowe napi臋cie odniesienia, w po艂o偶eniu 1-2 jest to napi臋cie VCC zasilaj膮ce procesor, w po艂o偶eniu 3-2 napi臋cie odniesienia V1. SW4 wybiera ujemne napi臋cie odniesienia, 1-2 jest to masa uk艂adu, a w po艂o偶eniu 3-2 napi臋cie suwaka PR2. W przypadku, gdy p艂ytka zasilania jest napi臋ciem stabilizowanym +5V, jumper SW3 powinien znale藕膰 si臋 w pozycji 3-2, w przeciwnym po艂o偶eniu do stabilizacji wykorzystywany b臋dzie dodatkowy uk艂ad U4.
Rysunek 13.
Schemat elektryczny p艂ytki bazowej.
Opr贸cz tego na p艂ytce znajduj膮 si臋 jeszcze potencjometry PR1 i PR2 do precyzyjnego ustawienia napi臋膰 odniesienia, elementy rezonatora X1, C1, C2, kondensator resetu C3 i kondensatory filtruj膮ce. Jedynym uk艂adem nie zwi膮zanym bezpo艣rednio z funkcjonowaniem procesora jest U5, w kt贸rego podstawce mo偶na osadzi膰 pami臋膰 EEPROM lub zegar czasu rzeczywistego, pod艂膮czone do magistrali I2C.
Podobnie jak '51, cech膮 charakterystyczn膮 80C552 jest spos贸b traktowania pami臋ci. Procesor rozr贸偶nia i adresuje cztery jej rodzaje: pami臋膰 programu o maksymalnym rozmiarze 64 kB (przeznaczona tylko do odczytu), zewn臋trzn膮 pami臋膰 RAM, kt贸ra mo偶e by膰 do艂膮czana w maksymalnej wielko艣ci 64 kB, wewn臋trzn膮 pami臋膰 RAM o rozmiarze strony (256 bajt贸w), obszar SFR, zawieraj膮cy rejestry o specjalnym przeznaczeniu, kt贸rych adresy od 080h do 0FFh pokrywaj膮 si臋 z cz臋艣ci膮 wewn臋trznego RAM'u. Mog膮 by膰 jednak odczytywane i zapisywane przy pomocy trybu adresowania bezpo艣redniego, podczas gdy dost臋p do g贸rnej cz臋艣ci pami臋ci u偶ytkownika (o adresach 128-255) realizowany jest jedynie przy pomocy wska藕nik贸w danych R1 i R2.
Mikrokontroler 80C552 wzbogacony zosta艂 o szereg nowych mo偶liwo艣ci: 10-bitowy przetwornik A/C, dodatkowy timer o numerze 2, zwi臋kszon膮 liczb臋 przerwa艅 sprz臋towych, interfejs szeregowy szyny I2C. Sterowanie nimi odbywa si臋 przy pomocy dodatkowych rejestr贸w, umieszczonych w obszarze SFR.
2.2. Cechy kontrolera 80C552
Uk艂ad 80C552 nale偶y do rodziny mikrokontroler贸w jednouk艂adowych serii '51. Ze wzgl臋du na du偶膮 ilo艣膰 publikacji dotycz膮cych mikrokontrolera 8051, w niniejszym opracowaniu przedstawiono jedynie r贸偶nice pomi臋dzy procesorami 8051, a 80C552.
Dodatkowe informacje o uk艂adzie 80C552
Zewn臋trznie widoczna jest r贸偶nica w fizycznym wygl膮dzie uk艂adu, gdy偶 mikrokontroler 80C552 jest umieszczony w 68-pinowej obudowie PLCC.
Rysunek 14.
Diagram wyprowadze艅 uk艂adu.
Elementy architektury 80C552
Opr贸cz standardowych zasob贸w kontrolera 8051, uk艂ad 80C552 daje do dyspozycji dodatkowe elementy takie jak:
interfejs I2C,
dodatkowe 128 bajt贸w pami臋ci danych,
dwa dodatkowe porty we/wy,
10-bitowy przetwornik A/C posiadaj膮cy 8 wej艣膰 analogowych,
dwa przetworniki C/A typu PWM,
licznik czuwaj膮cy,
zesp贸艂 licznikowo-rejestrowy CCU.
Pami臋膰 danych 80C552
Mikrokontroler 80C552 opr贸cz wszystkich w艂a艣ciwo艣ci pami臋ci 8051 posiada dodatkowe 128 bajt贸w wewn臋trznej pami臋ci danych umieszczone pod adresami 128-255 (80H- 0FFH). Jak wida膰, niekt贸re adresy pokrywaj膮 si臋 z adresami rejestr贸w specjalnych SFR, jednak unikni臋to konfliktu okre艣laj膮c spos贸b dost臋pu do tego obszaru pami臋ci. Podobnie jak w mikrokontrolerze 8051 blok rejestr贸w specjalnych SFR mo偶e by膰 adresowany jedynie bezpo艣rednio, natomiast dodatkowe 128 bajt贸w pami臋ci mikrokontrolera 80C552 mo偶e by膰 adresowane jedynie indeksowo przy u偶yciu rejestr贸w R0 i R1 (spos贸b dost臋pu do pami臋ci danych o adresach poni偶ej 128 jest taki sam jak w 8051). Na podstawie sposobu adresowania mikrokontroler jest w stanie stwierdzi膰, czy dane odwo艂anie tyczy si臋 bloku rejestr贸w specjalnych, czy dodatkowej pami臋ci danych.
Rejestry specjalne 80C552
Blok rejestr贸w specjalnych mikrokontrolera 80C552 jest bardziej rozbudowany w stosunku do uk艂adu 8051. Wi膮偶e si臋 to z konieczno艣ci膮 sterowania wi臋ksz膮 liczb膮 uk艂ad贸w peryferyjnych mikrokontrolera 80C552. Zajmuje on blok pami臋ci danych o adresach 128-255 (80H-0FFH). Opr贸cz rejestr贸w SFR swojego poprzednika, blok rejestr贸w specjalnych uk艂adu '552 zawiera tak偶e nast臋puj膮ce pozycje (kilka rejestr贸w zmieni艂o znaczenie i/lub nazw臋).
Tabela 2.
Rejestry SFR charakterystyczne dla uk艂adu 80C552.
Nazwa |
Adres |
Pe艂niona funkcja |
S0CON |
152 (98H) |
Zamiast SCON (funkcja bez zmian) |
S0BUF |
153 (99H) |
Zamiast SBUF (funkcja bez zmian) |
IEN0 |
168 (0A8H) |
Rejestr maski przerwa艅 (zamiast IE) |
CML0 |
169 (0A9H) |
M艂odszy bajt 16-bitowego rejestru por贸wnuj膮cego CM0 |
CML1 |
170 (0AAH) |
M艂odszy bajt 16-bitowego rejestru por贸wnuj膮cego CM1 |
CML2 |
171 (0ABH) |
M艂odszy bajt 16-bitowego rejestru por贸wnuj膮cego CM2 |
CTL0 |
172 (0ACH) |
M艂odszy bajt 16-bitowego rejestru przechwytuj膮cego CT0 |
CTL1 |
173 (0ADH) |
M艂odszy bajt 16-bitowego rejestru przechwytuj膮cego CT1 |
CTL2 |
174 (0AEH) |
M艂odszy bajt 16-bitowego rejestru przechwytuj膮cego CT2 |
CTL3 |
175 (0AFH) |
M艂odszy bajt 16-bitowego rejestru przechwytuj膮cego CT3 |
IP0 |
184 (0B8H) |
Podstawowy rejestr priorytet贸w przerwa艅 (zamiast IP) |
P4 |
192 (0C0H) |
Port we/wy 4 |
P5 |
196 (0C1H) |
Port we/wy 5 |
ADCON |
197 (0C2H) |
Rejestr steruj膮cy przetwornika A/C |
ADCH |
198 (0C3H) |
Rejestr wynikowy przetwornika A/C |
TM2IR |
200 (0C8H) |
Rejestr wska藕nik贸w przerwa艅 uk艂adu CCU |
CMH0 |
201 (0C9H) |
Starszy bajt 16-bitowego rejestru por贸wnuj膮cego CM0 |
CMH1 |
202 (0CAH) |
Starszy bajt 16-bitowego rejestru por贸wnuj膮cego CM1 |
CMH2 |
203 (0CBH) |
Starszy bajt 16-bitowego rejestru por贸wnuj膮cego CM2 |
CTH0 |
204 (0CDH) |
Starszy bajt 16-bitowego rejestru przechwytuj膮cego CT0 |
CTH1 |
205 (0CDH) |
Starszy bajt 16-bitowego rejestru przechwytuj膮cego CT1 |
CTH2 |
206 (0CEH) |
Starszy bajt 16-bitowego rejestru przechwytuj膮cego CT2 |
CTH3 |
207 (0CFH) |
Starszy bajt 16-bitowego rejestru przechwytuj膮cego CT3 |
S1CON |
216 (0D8H) |
Rejestr steruj膮cy interfejsu I2C |
S1STA |
217 (0D9H) |
Rejestr stanu interfejsu I2C |
S1DAT |
218 (0DAH) |
Rejestr danych interfejsu I2C |
S1ADR |
219 (0DBH) |
Rejestr adresowy interfejsu I2C |
IEN1 |
232 (0E8H) |
Rejestr maski przerwa艅 dodatkowych |
TM2CON |
234 (0EAH) |
Rejestr steruj膮cy trybem pracy uk艂adu CCU |
CTCON |
235 (0EBH) |
Rejestr steruj膮cy prac膮 uk艂adu CCU w trybie przechwytywania |
TML2 |
236 (0ECH) |
M艂odszy bajt licznika T2 uk艂adu CCU |
TMH2 |
237 (0EDH) |
Starszy bajt licznika T2 uk艂adu CCU |
STE |
238 (0EEH) |
Rejestr steruj膮cy prac膮 uk艂adu CCU w trybie por贸wnywania |
RTE |
239 (0EFH) |
Rejestr steruj膮cy prac膮 uk艂adu CCU w trybie por贸wnywania |
IP1 |
248 (0F8H) |
Rejestr priorytet贸w dodatkowych przerwa艅 zewn臋trznych |
PWM0 |
252 (0FCH) |
Rejestr wype艂nienia impuls贸w na wyj艣ciu PWM0 |
PWM1 |
253 (0FDH) |
Rejestr wype艂nienia impuls贸w na wyj艣ciu PWM1 |
PWMP |
254 (0FEH) |
Rejestr cz臋stotliwo艣ci pracy wyj艣膰 PWM |
T3 |
255 (0FFH) |
Rejestr licznika czuwaj膮cego |
Podobnie jak w uk艂adzie 8051, tak偶e tutaj mo偶liwe jest wykonywanie operacji na pojedynczych bitach rejestr贸w o adresach podzielnych przez 8. Operacje bitowe mo偶na wykonywa膰 na nast臋puj膮cych rejestrach (opr贸cz rejestr贸w standardowych 8051):
Tabela 3.
Rejestry SFR charakterystyczne dla 80C552 adresowalne bitowo. Nazwy i adresy poszczeg贸lnych bit贸w.
SFR |
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
IEN0 |
EA |
EAD |
ES1 |
ES0 |
ET1 |
EX1 |
ET0 |
EX0 |
IP0 |
- |
PAD |
PS1 |
PS0 |
PT1 |
PX1 |
PT0 |
PX0 |
P4 |
P4.7 |
P4.6 |
P4.5 |
P4.4 |
P4.3 |
P4.2 |
P4.1 |
P4.0 |
TM2IR |
T2OV |
CMI2 |
CMI1 |
CMI0 |
CTI3 |
CTI2 |
CTI1 |
CTI0 |
S1CON |
CR2 |
ENS1 |
STA |
STO |
SI |
AA |
CR1 |
CR0 |
IEN1 |
ET2 |
ECM2 |
ECM1 |
ECM0 |
ECT3 |
ECT2 |
ECT1 |
ECT0 |
IP1 |
PT2 |
PCM2 |
PCM1 |
PCM0 |
PCT3 |
PCT2 |
PCT1 |
PCT0 |
Adresy poszczeg贸lnych bit贸w wyznacza si臋 identycznie jak dla uk艂adu 8051.
Pami臋膰 programu 80C552
Podstawow膮 cech膮 r贸偶ni膮c膮 mikrokontroler 80C552 od 8051 jest to, 偶e posiada on nie 4, a 8kB wewn臋trznej pami臋ci programu. Zasada wsp贸艂pracy z pami臋ci膮 wewn臋trzn膮 i zewn臋trzn膮 nie uleg艂a zmianie w stosunku do 8051. W zwi膮zku z rozbudowanymi zasobami mikrokontrolera 80C552 zwi臋kszeniu uleg艂 obszar pami臋ci przeznaczony na procedury obs艂ugi przerwania. Opr贸cz procedur odpowiadaj膮cych uk艂adowi 8051 znajduj膮 tam swoje miejsce nast臋puj膮ce programy obs艂ugi przerwa艅:
Tabela 4.
Adresy procedur obs艂ugi przerwa艅 charakterystycznych dla 80C552.
Adres |
Zawarto艣膰 |
002BH |
Pocz膮tek procedury obs艂ugi przerwania interfejsu I2C |
0033H |
Pocz膮tek procedury obs艂ugi przerwania uk艂adu CCU - CTI0 |
003BH |
Pocz膮tek procedury obs艂ugi przerwania uk艂adu CCU - CTI1 |
0043H |
Pocz膮tek procedury obs艂ugi przerwania uk艂adu CCU - CTI2 |
004BH |
Pocz膮tek procedury obs艂ugi przerwania uk艂adu CCU - CTI3 |
0053H |
Pocz膮tek procedury obs艂ugi przerwania przetwornika A/C |
005BH |
Pocz膮tek procedury obs艂ugi przerwania uk艂adu CCU - CMI0 |
0063H |
Pocz膮tek procedury obs艂ugi przerwania uk艂adu CCU - CMI1 |
006BH |
Pocz膮tek procedury obs艂ugi przerwania uk艂adu CCU - CMI2 |
0073H |
Pocz膮tek procedury obs艂ugi przerwania uk艂adu licznikowego T2 |
Porty we/wy mikrokontrolera 80C552
Porty P0, P2, P3 mikrokontrolera 80C552 posiadaj膮 wszystkie w艂a艣ciwo艣ci port贸w 8051. Wyj膮tkiem s膮 linie portu P1, kt贸re pe艂ni膮 tak偶e dodatkowe funkcje: linie P1.0-P1.3 obs艂uguj膮 sygna艂y CT0I-CT3I uk艂adu CCU, linie P1.4, P1.5 odpowiadaj膮 sygna艂om T2 i RT2 uk艂adu czasowego T2, natomiast linie P1.6 i P1.7 tworz膮 linie magistrali I2C (odpowiednio SCL i SDA).
Mikrokontroler '552 posiada tak偶e dwa dodatkowe porty: P4 i P5.
Struktura portu P4
Struktur臋 pojedynczej linii tego portu przedstawiono na rysunku 15.
Rysunek 15.
Struktura pojedynczej linii portu P4.
Podczas pracy portu jako standardowe wej艣cie/wyj艣cie zasada dzia艂ania nie odbiega od dzia艂ania pozosta艂ych port贸w. Podczas realizacji dodatkowej funkcji port jest wykorzystywany jako wyj艣cia sygna艂贸w generowanych przez uk艂ad CCU mikrokontrolera. W贸wczas linie portu pe艂ni膮 nast臋puj膮ce funkcje: P4.0-P4.5 odpowiadaj膮 sygna艂om CMSR0-CMSR5, natomiast linie P4.6 i P4.7 odpowiadaj膮 sygna艂om CMT0 i CMT1.
Pod wzgl臋dem sprz臋towym dodatkowa funkcja portu P4 jest realizowana w odmienny spos贸b ni偶 ma to miejsce w pozosta艂ych portach. Podczas pe艂nienia funkcji alternatywnej przerzutnik wchodz膮cy w sk艂ad linii portu jest asynchronicznie zerowany lub ustawiany przez odpowiedni sygna艂 pochodz膮cy z uk艂adu CCU. Zalet膮 takiego rozwi膮zania jest brak konieczno艣ci wpisania „1” do przerzutnika w celu wykorzystania funkcji dodatkowej, wad膮 jest natomiast utrata zawarto艣ci przerzutnika podczas realizacji tej funkcji, co uniemo偶liwia u偶ycie portu P4 jako we/wy podczas korzystania z uk艂adu CCU.
Struktura portu P5
Schemat pojedynczej linii portu P5 przedstawia rysunek 16.
Rysunek 16.
Schemat pojedynczej linii portu P5.
Port P5 mo偶e pracowa膰 wy艂膮cznie jako wej艣cie. Zapis danej do rejestru P5 nie daje 偶adnych efekt贸w, natomiast odczyt rejestru P5 jest r贸wnowa偶ny z odczytem stan贸w logicznych wyst臋puj膮cych na wyprowadzeniach mikrokontrolera. Sygna艂 z wyprowadzenia zewn臋trznego jest podawany na wewn臋trzn膮 magistral臋 za po艣rednictwem bufora z wej艣ciem Schmitta, co pozwala na pozbawiony zak艂贸ce艅 odczyt sygna艂贸w wolnozmiennych, o 艂agodnych zboczach. Mo偶liwo艣膰 odczytania stanu logicznego panuj膮cego na wyprowadzeniu portu jest niejako dodatkow膮 funkcj膮 portu P5, gdy偶 jego podstawowym zadaniem jest dostarczenie sygna艂u analogowego z wyprowadzenia do wewn臋trznego przetwornika A/C mikrokontrolera. Mo偶liwe jest doprowadzenie poprzez linie P5, o艣miu sygna艂贸w analogowych, z kt贸rych jeden mo偶e zosta膰 wybrany i poddany procesowi digitalizacji.
Uk艂ady licznikowe mikrokontrolera 80C552
Mikrokontroler 80C552 posiada uk艂ady licznikowe T0 i T1 dzia艂aj膮ce identycznie ze swoimi odpowiednikami w mikrokontrolerze 8051.
Dodatkowym elementem architektury mikrokontrolera 80C552 jest blok licznikowo-rejestrowy CCU o mo偶liwo艣ciach wielokrotnie wi臋kszych od pojedynczych licznik贸w. Schemat blokowy uk艂adu CCU przedstawiono na rysunku 17.
Rysunek 17.
Schemat blokowy uk艂adu CCU.
Uk艂ad CCU sk艂ada si臋 z szesnastobitowego licznika T2 oraz zestawu wsp贸艂pracuj膮cych z nim rejestr贸w realizuj膮cych prac臋 w trybie przechwytywania i por贸wnywania.
Licznik T2 jest widziany przez mikroprocesor jako dwa 8-bitowe rejestry, m艂odszy TML2 i starszy TMH2. 殴r贸d艂em zliczanych impuls贸w mo偶e by膰 wyprowadzenie T2(P1.4) lub zegar mikrokontrolera (zliczanie impuls贸w o okresie r贸wnym d艂ugo艣ci cyklu maszynowego). Wyb贸r 藕r贸d艂a taktowania oraz w艂膮czanie i wy艂膮czanie licznika przeprowadza si臋 za pomoc膮 bit贸w T2MS1 i T2MS0 rejestru TM2CON. Warto艣膰 bit贸w 00 oznacza wy艂膮czenie licznika, 01 - zliczanie cykli maszynowych, 10 - zarezerwowane, 11 - zliczanie impuls贸w z wyprowadzenia T2.
Tabela 5.
Rejestry kontrolne i steruj膮ce prac膮 T2 i uk艂adu CCU.
Rejestr: |
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
TM2IR |
T2OV |
CMI2 |
CMI1 |
CMI0 |
CTI3 |
CTI2 |
CTI1 |
CTI0 |
TM2CON |
T2IS1 |
T2IS0 |
T2ER |
T2BO |
T2P1 |
T2P0 |
T2MS1 |
T2MS0 |
CTCON |
CTN3 |
CTP3 |
CTN2 |
CTP2 |
CTN1 |
CTP1 |
CTN0 |
CTP0 |
STE |
TG47 |
TG46 |
SP45 |
SP44 |
SP43 |
SP42 |
SP41 |
SP40 |
RTE |
TP47 |
TP46 |
RP45 |
RP44 |
RP43 |
RP42 |
RP41 |
RP40 |
W przypadku zliczania impuls贸w zewn臋trznych, maksymalna szybko艣膰 zliczania wynosi jeden impuls na cykl maszynowy, a zliczenie impulsu nast臋puje w wyniku wykrycia narastaj膮cego zbocza sygna艂u zewn臋trznego. Detekcja zbocza realizowana jest synchronicznie z zegarem mikrokontrolera, przez testowanie stanu wyprowadzenia T2 podczas faz S2P1 i S5P1 ka偶dego cyklu maszynowego. Wykrycie stanu niskiego podczas jednej z tych faz oraz stanu wysokiego przy nast臋pnym pr贸bkowaniu interpretowane jest jako pojawienie si臋 zbocza. Je艣li zbocze zosta艂o wykryte przed ko艅cem fazy S2P1, zawarto艣膰 licznika zwi臋kszana jest w nast臋pnym cyklu maszynowym. W przeciwnym razie inkrementacja nast膮pi o jeden cykl maszynowy p贸藕niej. Impulsy taktuj膮ce podawane s膮 na licznik poprzez preskaler o programowanym wsp贸艂czynniku podzia艂u. Zale偶y on od stanu bit贸w T2P1 i T2P0 rejestru TM2CON: odpowiednie warto艣ci bit贸w 00 oznaczaj膮 wsp贸艂czynnik podzia艂u 1 (bez dzielenia), 01 oznacza wsp贸艂czynnik 2, 10 oznacza wsp贸艂czynnik 4, 11 oznacza wsp贸艂czynnik 8.
Licznik T2 mo偶e by膰 odczytywany podczas pracy, jednak ze wzgl臋du na brak odczytowych rejestr贸w zatrzaskowych, stan licznika mo偶e ulec zmianie mi臋dzy odczytem obu jego po艂贸wek. Zawarto艣膰 licznika nie mo偶e by膰 zmieniana na drodze programowej, licznik mo偶na natomiast wyzerowa膰 przez narastaj膮ce zbocze sygna艂u na wyprowadzeniu RT2 (P1.5) mikrokontrolera. Wyzerowanie nast膮pi jednak tylko wtedy, gdy ustawiony jest bit T2ER rejestru TM2CON. Zerowanie licznika powoduje jednoczesne wyzerowanie preskalera. Zerowanie licznika i preskalera nast臋puje r贸wnie偶 podczas przej艣cia mikrokontrolera do trybu u艣pienia. Preskaler jest zerowany tak偶e wskutek zmiany wsp贸艂czynnika podzia艂u lub 藕r贸d艂a zliczanych impuls贸w.
Do generacji przerwania mo偶e zosta膰 wykorzystany sygna艂 przepe艂nienia ca艂ego 16-bitowego licznika T2, sygna艂 przepe艂nienia 8-bitowej m艂odszej cz臋艣ci lub oba te sygna艂y. 殴r贸d艂o przerwa艅 okre艣lane jest stanem bit贸w T2IS1 i T2IS0 rejestru TM2CON. Ustawienie bitu T2IS1 aktywuje przerwanie przy przepe艂nieniu 16-bitowego licznika, ustawienie bitu T2IS0 aktywuje przerwanie przy przepe艂nieniu licznika 8-bitowego. Wska藕nikiem przerwania od przepe艂nienia licznika 8-bitowego jest bit T2BO rejestru TM2CON, a wska藕nikiem przerwania od licznika 16-bitowego jest bit T2OV rejestru TM2IR. Oba te wska藕niki s膮 ustawiane w nast臋pnym cyklu maszynowym po wyst膮pieniu przepe艂nienia.
Wska藕niki musz膮 by膰 zerowane programowo przez procedur臋 obs艂ugi przerwania. Niezale偶nie od tego, kt贸ry wska藕nik wywo艂a艂 przerwanie, wykonywana jest ta sama procedura obs艂ugi.
Operacja przechwytywania
Wyj艣cia licznika T2 po艂膮czone s膮 z czterema 16-bitowymi rejestrami przechwytuj膮cymi - CT0, CT1, CT2, CT3, kt贸re od strony mikroprocesora widziane s膮 jako pary 8-bitowych rejestr贸w CTH0, CTL0, CTH1, CTL1, CTH2, CTL2, CTH3, CTL3, stanowi膮cych odpowiednio starsze i m艂odsze bajty 16-bitowych rejestr贸w przechwytuj膮cych.
Przepisywanie zawarto艣ci licznika T2 do wymienionych rejestr贸w nast臋puje na skutek pojawienia si臋 aktywnego zbocza na wyprowadzeniach CT0I, CT1I, CT2I, lub CT3I portu P1 mikrokontrolera. Pojawienie si臋 aktywnego zbocza na jednym z tych wyprowadze艅, opr贸cz przepisania zawarto艣ci licznika T2 do skojarzonego z danym wej艣ciem rejestru przechwytuj膮cego, powoduje te偶 ustawienie wska藕nika, kt贸rym jest odpowiadaj膮cy rejestrowi bit CT0I, CT1I, CT2I lub CT3I w rejestrze TM2IR. Rodzaj aktywnych zboczy sygna艂贸w CT0I-CT3I (opadaj膮ce, narastaj膮ce lub obydwa zbocza) okre艣lony jest stanem odpowiednich bit贸w w rejestrze CTCON.
Ustawienie bitu CTNn wywo艂a aktywacj臋 przy opadaj膮cym zboczu, ustawienie CTPn wywo艂a aktywacj臋 przy narastaj膮cym zboczu. Wyzerowanie bit贸w CTNn i CTPn powoduje wy艂膮czenie danego wej艣cia. Stan linii CTnI jest testowany w fazie S1P1 ka偶dego cyklu maszynowego. Przepisanie zawarto艣ci licznika T2 do odpowiedniego rejestru przechwytuj膮cego nast臋puje pod koniec cyklu maszynowego, w kt贸rym wykryte zosta艂o aktywne zbocze.
Operacja por贸wnywania
Do pracy w trybie por贸wnywania wykorzystywane s膮 trzy 16-bitowe rejestry CM0, CM1 i CM2, z艂o偶one z par rejestr贸w 8-bitowych CMH0, CML0, CMH1, CML1, CMH2, CML2, kt贸re s膮 odpowiednio starszymi i m艂odszymi po艂贸wkami rejestr贸w 16-bitowych.
Wyj艣cia licznika T2 s膮 por贸wnywane ze stanem rejestr贸w CMn, a zr贸wnanie si臋 ich zawarto艣ci powoduje ustawienie (pod koniec nast臋pnego cyklu maszynowego) odpowiadaj膮cego rejestrowi wska藕nika przerwania. Wska藕nikami przerwa艅 dla operacji por贸wnania s膮 bity CM0, CM1, CM2 rejestru TM2IR. Opr贸cz ustawienia wska藕nika przerwania mikrokontroler wykonuje jeszcze pewne operacje na porcie P4. Je偶eli rejestrem, z kt贸rym zr贸wna艂a si臋 zawarto艣膰 licznika jest rejestr CM0, to stan wysoki bit贸w SP40-SP45 rejestru STE powoduje ustawienie tych linii portu P4, kt贸re odpowiadaj膮 bitom SP4n zawieraj膮cym „1”. Pozosta艂e linie portu P4 pozostaj膮 nie zmienione. Je偶eli stan licznika T2 zr贸wna艂 si臋 z zawarto艣ci膮 rejestru CM1, to zerowane s膮 te linie portu P4, kt贸rym odpowiada stan wysoki bit贸w RP40-RP45 rejestru RTE. Pozosta艂e linie portu pozostaj膮 nie zmienione. W przypadku gdy nast膮pi艂o zr贸wnanie zawarto艣ci T2 z rejestrem CM2, to negowany jest stan linii P4.6 i P4.7, o ile odpowiadaj膮ce tym liniom bity steruj膮ce TP46 i TP47 rejestru RTE s膮 ustawione. Zmiana zawarto艣ci odbywa si臋 nie wzgl臋dem aktualnego stanu linii, lecz wzgl臋dem stanu wpisanego podczas wykrycia poprzedniego zr贸wnania T2 i CM2.
Stan, kt贸ry ma by膰 obecnie ustawiony jest przechowywany w przerzutnikach TG46 i TG47 rejestru STE. Nie ma mo偶liwo艣ci programowej zmiany tych bit贸w.
Opr贸cz tego wszystkie linie portu P4 mog膮 by膰 zmieniane programowo. Jednak w przypadku r贸wnoczesnej modyfikacji programowej i sprz臋towej (przez uk艂ad CCU) w jednym cyklu maszynowym, zapami臋tany zostaje stan modyfikacji sprz臋towej. W przypadku pr贸by jednoczesnego zerowania i ustawiania linii przez uk艂ad CCU (np. w wyniku wykrycia zgodno艣ci z dwoma rejestrami), nast膮pi wyzerowanie linii.
Wsp贸艂praca uk艂adu CCU z uk艂adem przerwa艅
Uk艂ad CCU posiada 9 wska藕nik贸w przerwa艅 i wi臋kszo艣膰 z nich (poza T2BO z rejestru TM2CON) znajduje si臋 w rejestrze TM2IR. Ze wzgl臋du na specyfik臋 ustawiania poszczeg贸lnych wska藕nik贸w i dzia艂anie uk艂adu przerwa艅, wykrycie przerwania nast臋puje w warunkach przedstawionych w tabeli 6.
Tabela 6.
Mo偶liwo艣ci programowego i sprz臋towego wykrycia przerwa艅 z uk艂adu CCU.
Wska藕niki: |
Testowanie programowe |
呕膮danie przerwania |
CT0I, CT1I |
W tym samym cyklu |
W nast臋pnym cyklu |
CT2I, CT3I |
W nast臋pnym cyklu |
W nast臋pnym cyklu |
CMI0, CMI1, CMI2 |
Dwa cykle op贸藕nienia |
Dwa cykle op贸藕nienia |
T2BO, T2OV |
W nast臋pnym cyklu |
W nast臋pnym cyklu |
Uk艂ady transmisji szeregowej mikrokontrolera 80C552
Mikrokontroler 80C552 posiada uk艂ad transmisji szeregowej, identyczny jak w mikrokontrolerze 8051. Zmienione zosta艂y tylko oznaczenia rejestr贸w steruj膮cych: zamiast SBUF uk艂ad '552 posiada rejestr S0BUF, natomiast zamiast SCON posiada S0CON - funkcje obu rejestr贸w pozostaj膮 bez zmian.
Zmiana nazw rejestr贸w zwi膮zana jest z obecno艣ci膮 w uk艂adzie '552 drugiego uk艂adu transmisji szeregowej. Uk艂ad ten jest uk艂adem wyspecjalizowanym tylko do obs艂ugi transmisji zachodz膮cej w standardzie I2C.
Og贸lne cechy interfejsu I2C
Szyna I2C posiada nast臋puj膮ce cechy charakterystyczne:
transmisja odbywa si臋 za pomoc膮 dw贸ch linii sygna艂owych: SDA - linia danych, SCL - linia sygna艂u taktuj膮cego,
mo偶liwe jest przesy艂anie informacji mi臋dzy wieloma urz膮dzeniami wykorzystuj膮cymi wsp贸ln膮 szyn臋,
transmisja danych jest dwukierunkowa,
ka偶dy z uk艂ad贸w do艂膮czonych do szyny posiada niepowtarzalny adres, umo偶liwiaj膮cy jednoznaczne zaadresowanie danego urz膮dzenia,
przesy艂aniem danych steruje uk艂ad nadrz臋dny, w systemie mo偶e jednak wyst臋powa膰 wi臋cej ni偶 jeden uk艂ad nadrz臋dny,
w przypadku jednoczesnego rozpocz臋cia nadawania przez kilka urz膮dze艅 nadrz臋dnych, mechanizm arbitra偶u nie dopuszcza do utraty, ani przek艂amania przesy艂anych danych,
synchronizacja transmisji za pomoc膮 sygna艂u taktuj膮cego umo偶liwia komunikacj臋 mi臋dzy urz膮dzeniami stosuj膮cymi r贸偶ne pr臋dko艣ci przesy艂ania danych,
wszystkie uk艂ady posiadaj膮ce interfejs I2C wyposa偶one s膮 w uk艂ady filtracji zak艂贸ce艅, istotnie podwy偶szaj膮ce niezawodno艣膰 pracy interfejsu,
maksymalna pr臋dko艣膰 transmisji danych po szynie I2C wynosi 100 kbod'贸w w trybie standardowym i 400 kbod'贸w w trybie szybkim,
liczba uk艂ad贸w pod艂膮czonych do szyny ograniczona jest wy艂膮cznie maksymaln膮 pojemno艣ci膮 mi臋dzy liniami szyny a mas膮 wynosz膮c膮 400pF.
Liniami sygna艂owymi interfejsu I2C s膮 linie SDA i SCL. S膮 one liniami dwukierunkowymi. Wszystkie uk艂ady pod艂膮czone do tych linii maj膮 wyj艣cia typu otwarty kolektor (otwarty dren), a stan wysoki na liniach wymuszony jest przez rezystory podci膮gaj膮ce do dodatniego napi臋cia zasilania. Stopnie ko艅cowe typu otwarty kolektor (otwarty dren) umo偶liwiaj膮 realizacj臋 na liniach interfejsu funkcji AND wykorzystywanej m.in. przez mechanizm arbitra偶u szyny. Przedzia艂y napi臋膰 odpowiadaj膮ce poziomom logicznego zera (stan niski napi臋cia) i jedynki (stan wysoki napi臋cia) nie musz膮 by膰 sztywno ustalone i mog膮 zale偶e膰 od warto艣ci napi臋cia zasilaj膮cego rezystory podci膮gaj膮ce - wynika to z konieczno艣ci zapewnienia poprawnej wsp贸艂pracy uk艂ad贸w wykonanych w r贸偶nych technologiach (NMOS, CMOS, TTL itp.). zazwyczaj przyjmuje si臋, 偶e poziom napi臋cia do 1,5V oznacza „0”, a powy偶ej 3V oznacza „1”.
Parametry elektryczne interfejsu s膮 jednak okre艣lone o wiele dok艂adniej, a informacje na ten temat mo偶na znale藕膰 w literaturze.
Podczas transmisji danych, impulsy taktuj膮ce na szynie SCL wysy艂ane s膮 w ilo艣ci jeden impuls na ka偶dy bit przesy艂anych danych. Podczas wysokiego stanu na linii SCL stan linii SDA musi by膰 stabilny - zmianie mo偶e on ulega膰 tylko podczas niskiego stanu na linii SCL. Wyj膮tkiem od tej regu艂y s膮 sygna艂y START i STOP wysy艂ane przez urz膮dzenie nadrz臋dne. Wys艂anie sygna艂u START polega na wymuszeniu opadaj膮cego zbocza na linii SDA podczas trwania wysokiego stanu na linii SCL.
Sygna艂 START s艂u偶y do identyfikacji pocz膮tku transmisji - po pojawieniu si臋 tego sygna艂u szyna uwa偶ana jest za zaj臋t膮 a偶 do momentu pojawienia si臋 sygna艂u STOP. STOP jest generowany przez narastaj膮ce zbocze na linii SDA przy wysokim stanie na SCL.
Ka偶dy bajt danych przesy艂anych po szynie I2C musi sk艂ada膰 si臋 z 8 bit贸w, przy czym dane nadawane s膮 od bitu MSB do LSB. Liczba bajt贸w transmitowanych podczas pojedynczej transmisji nie jest ograniczona. Ka偶da operacja przes艂ania bajtu danych powinna zako艅czy膰 si臋 bitem potwierdzenia. Impuls taktuj膮cy zwi膮zany z bitem potwierdzenia jest generowany przez urz膮dzenie nadrz臋dne.
Urz膮dzenie nadaj膮ce dane musi na czas bitu potwierdzenia zwolni膰 lini臋 SDA, za艣 urz膮dzenie odbieraj膮ce na czas trwania wysokiego stanu na SCL wymusza stan niski na linii SDA. Je艣li dane s膮 odbierane przez urz膮dzenie nadrz臋dne, to wys艂anie przez to urz膮dzenie bitu braku potwierdzenia jest informacj膮 dla urz膮dzenia podrz臋dnego, 偶e zako艅czono w艂a艣nie transmisj臋 ostatniego bajtu danych - nast臋puje wtedy zwolnienie linii SDA przez urz膮dzenie podrz臋dne, aby urz膮dzenie nadrz臋dne mog艂o wys艂a膰 sygna艂 STOP.
Rysunek 18.
Przesy艂anie informacji na magistrali I2C.
W zwi膮zku z mo偶liwo艣ci膮 pod艂膮czenia do magistrali kilku urz膮dze艅 nadrz臋dnych, mo偶e wyst膮pi膰 sytuacja, w kt贸rej wi臋cej ni偶 jedno urz膮dzenie nadrz臋dne jednocze艣nie usi艂uje rozpocz膮膰 transmisj臋. Rozstrzygni臋cie takich sytuacji gwarantuje wykorzystywany w interfejsie I2C mechanizm arbitra偶u i synchronizacji. W przypadku jednoczesnego nadawania przez kilka urz膮dze艅 nadrz臋dnych, kontrol臋 nad szyn膮 SDA utrac膮 te, kt贸re b臋d膮 nadawa艂y stan „1”, gdy cho膰 jedno b臋dzie nadawa艂o „0” (w wyniku realizacji na szynie funkcji AND). Dzieje si臋 tak dlatego, 偶e nadaj膮ce urz膮dzenie jednocze艣nie monitoruje rzeczywisty stan magistrali SDA i je偶eli wykryje na niej stan inny od nadawanego, to przerywa transmisj臋. Mo偶e ono w贸wczas nadawa膰 sygna艂 synchronizuj膮cy na linii SCL, lub prze艂膮czy膰 si臋 w tryb pracy urz膮dzenia podrz臋dnego (je偶eli mo偶e realizowa膰 r贸wnie偶 tak膮 funkcj臋). Podobnie (w oparciu o funkcj臋 AND) dzia艂a r贸wnie偶 mechanizm synchronizacji. Skutkiem przej艣cia linii SCL w stan niski, wymuszony przez dowolne z nadaj膮cych urz膮dze艅, jest rozpocz臋cie odmierzania czasu trwania niskiego poziomu na linii SCL przez wszystkie nadaj膮ce urz膮dzenia nadrz臋dne. Linia SCL powr贸ci do stanu „1” dopiero wtedy, gdy ostatnie (najwolniejsze) urz膮dzenie odmierzy czas trwania stanu niskiego. Ponowne wymuszenie stanu „0” wykona urz膮dzenie najszybsze, itd. W wyniku na linii SCL otrzymamy przebieg taktuj膮cy, prawid艂owy pod wzgl臋dem logicznym i mieszcz膮cy si臋 w granicach dopuszczanych przez standard interfejsu I2C.
Mechanizm synchronizacji opr贸cz wykorzystania przy arbitra偶u mo偶e by膰 r贸wnie偶 u偶ywany do dostosowania pr臋dko艣ci transmisji do maksymalnej mo偶liwej w danych warunkach (mi臋dzy danymi urz膮dzeniami). Niekt贸re urz膮dzenia mog膮 szybko odbiera膰 bajty z szyny, ale mog膮 r贸wnie偶 potrzebowa膰 du偶o czasu na obr贸bk臋 odebranych danych. W takich przypadkach po odebraniu i potwierdzeniu bajtu, urz膮dzenie podrz臋dne mo偶e wymusi膰 stan niski na linii SCL, co powoduje przej艣cie urz膮dzenia nadrz臋dnego w stan oczekiwania. Zwolnienie linii SCL wywo艂uje kontynuacj臋 transmisji.
Podczas transmisji z wykorzystaniem magistrali I2C wykorzystuje si臋 najcz臋艣ciej jeden z dw贸ch protoko艂贸w: z adresowaniem 7-bitowym i z adresowaniem 10-bitowym.
Protok贸艂 z adresowaniem 7-bitowym
Przy wykorzystaniu tego protoko艂u transmisja danych przebiega w nast臋puj膮cy spos贸b: po sygnale pocz膮tku transmisji (START) nadawany jest 7-bitowy adres urz膮dzenia podrz臋dnego i bit kierunku transmisji (0 - urz膮dzenie nadrz臋dne nadaje, 1 - urz膮dzenie nadrz臋dne odbiera); po otrzymaniu potwierdzenia od urz膮dzenia podrz臋dnego nast臋puje wymiana danych mi臋dzy urz膮dzeniami w zadeklarowanym kierunku. Po zako艅czeniu transmisji danych urz膮dzenie nadrz臋dne wysy艂a sygna艂 STOP zwalniaj膮c magistral臋. Je偶eli urz膮dzenie nadrz臋dne chce natychmiast przes艂a膰 kolejny pakiet danych, to nie musi ono generowa膰 sygna艂u STOP. Wystarczy, 偶e ponownie wygeneruje sygna艂 START, prze艣le adres i bit kierunku, i mo偶e wymieni膰 nast臋pn膮 porcj臋 informacji.
Protok贸艂 z adresowaniem 10-bitowym
Przy realizacji transmisji z adresowaniem 10-bitowym, nieco inny jest spos贸b przesy艂ania adresu.
Po wys艂aniu sygna艂u START, urz膮dzenie nadrz臋dne wysy艂a bajt o warto艣ci 11110XXD, gdzie XX oznaczaj膮 dwa najstarsze bity adresu (A8 i A9), a D oznacza kierunek transmisji danych (jak w adresowaniu 7- bitowym). Po otrzymaniu potwierdzenia urz膮dzenie nadrz臋dne wysy艂a bajt z艂o偶ony z pozosta艂ych o艣miu bit贸w adresu i po kolejnym potwierdzeniu przyst臋puje do wymiany danych (w spos贸b identyczny jak przy adresowaniu 7- bitowym).
Interfejs I2C mikrokontrolera 80C552
Interfejs I2C mikrokontrolera 80C552 mo偶e pracowa膰 zar贸wno w trybie urz膮dzenia nadrz臋dnego jak i podrz臋dnego. Producent gwarantuje prac臋 z szybko艣ci膮 transmisji do 100 kbod'贸w. Do sterowania interfejsem s艂u偶膮 nast臋puj膮ce rejestry: S1CON - rejestr steruj膮cy, S1STA - rejestr stanu, S1DAT - rejestr danych, S1ADR - rejestr adresowy.
Tabela 7.
Rejestry steruj膮ce i statusowe interfejsu I2C.
Rejestr |
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
S1CON |
CR2 |
ENS1 |
STA |
STO |
SI |
AA |
CR1 |
CR0 |
S1STA |
SC4 |
SC3 |
SC2 |
SC1 |
SC0 |
0 |
0 |
0 |
S1ADR |
SA7 |
SA6 |
SA5 |
SA4 |
SA3 |
SA2 |
SA1 |
GC |
Znaczenie bit贸w rejestru S1CON:
ENS1 - bit zezwolenia na prac臋 interfejsu: 1 - interfejs aktywny (tryb pracy urz膮dzenia aktywnego), 0 - linie magistrali w stanie wysokiej impedancji, interfejs rozadresowany, tryb pracy jako urz膮dzenie podrz臋dne, wymuszony stan niski bitu STO.
STA - bit sygna艂u pocz膮tku transmisji, ustawienie bitu powoduje wys艂anie sygna艂u START i rozpocz臋cie transmisji (lub oczekiwanie na zwolnienie szyny).
STO - bit sygna艂u ko艅ca transmisji, w trybie uk艂adu nadrz臋dnego ustawienie powoduje wys艂anie sygna艂u ko艅ca transmisji STOP, wykrycie sygna艂u STOP na magistrali powoduje wyzerowanie bitu. W trybie pracy uk艂adu podrz臋dnego bit STO mo偶e by膰 wykorzystywany do wprowadzenia interfejsu w stan ustalony po wyst膮pieniu b艂臋du. Ustawienie bitu powoduje w贸wczas rozadresowanie interfejsu i przej艣cie do pracy w trybie uk艂adu podrz臋dnego bez wys艂ania sygna艂u STOP i nast臋pnie bit jest zerowany.
SI - wska藕nik przerwania od interfejsu I2C, ustawiany sprz臋towo po ka偶dym przej艣ciu interfejsu do nowego stanu. Wyj膮tkiem jest stan „brak informacji o stanie interfejsu”. R贸wnocze艣nie z ustawieniem bitu nast臋puje zawieszenie transmisji na magistrali przez wyzerowanie linii SCL. Bit jest zerowany wy艂膮cznie programowo (przez procedur臋 obs艂ugi przerwania).
AA - bit okre艣laj膮cy aktywno艣膰 interfejsu: 0 - interfejs ignoruje adres wywo艂ania og贸lnego i w艂asny adres w trybie pracy jako urz膮dzenie podrz臋dne, 1 - normalna praca interfejsu (wysy艂anie potwierdzenia po odebraniu informacji dla niego przeznaczonych)
CR2, CR1, CR0 - bity ustalaj膮ce cz臋stotliwo艣膰 sygna艂u taktuj膮cego wysy艂anego lini膮 SCL przy pracy interfejsu w trybie urz膮dzenia nadrz臋dnego. Stan bit贸w nale偶y dobra膰 tak, aby cz臋stotliwo艣膰 nie przekracza艂a 100kHz:
Okre艣lanie cz臋stotliwo艣ci taktuj膮cej SCL.
Tabela 8.
Ustawianie szybko艣ci transmisji.
CR2 |
CR1 |
CR0 |
Cz臋stotliwo艣膰 |
0 |
0 |
0 |
Fxtal/256 |
0 |
0 |
1 |
Fxtal/224 |
0 |
1 |
0 |
Fxtal/192 |
0 |
1 |
1 |
Fxtal/160 |
1 |
0 |
0 |
Fxtal/960 |
1 |
0 |
1 |
Fxtal/120 |
1 |
1 |
0 |
Fxtal/60 |
1 |
1 |
1 |
1/8 cz臋stotliwo艣ci przepe艂niania T1 |
Znaczenie bit贸w rejestru S1STA:
SC4 - SC0 - bity kodu stanu interfejsu. Informacja ta jest dost臋pna po ustawieniu wska藕nika przerwania SI i usuwana jeden cykl maszynowy po wyzerowaniu wska藕nika.
Znaczenie bit贸w rejestru S1ADR:
SA7 - SA1 - 7-bitowy adres w艂asny urz膮dzenia dla interfejsu pracuj膮cego w trybie urz膮dzenia podrz臋dnego.
GC - bit zezwolenia na rozpoznawanie adresu wywo艂ania og贸lnego: 0 - interfejs ignoruje adres wywo艂ania og贸lnego, 1 - interfejs reaguje na adres wywo艂ania og贸lnego.
Rejestr S1DAT zawiera informacj臋 przeznaczon膮 do przekazania na szyn臋. Podczas wyprowadzania informacji z tego rejestru, na miejsce poszczeg贸lnych bit贸w jest wpisywany aktualny stan linii. W wyniku tego po przes艂aniu zawarto艣ci rejestru na jej miejscu pojawia si臋 informacja, kt贸ra rzeczywi艣cie pojawi艂a si臋 na szynie.
Po wykonaniu ka偶dej operacji (wys艂anie lub odebranie informacji lub sygna艂贸w steruj膮cych) modyfikowana jest zawarto艣膰 rejestru S1STA. Tabele zawieraj膮 opis poszczeg贸lnych stan贸w.
Tabela 9.
Kody stanu w trybie nadawania jako urz膮dzenie nadrz臋dne.
Kod stanu |
Stan interfejsu i szyny |
08H |
Wys艂ano sygna艂 START |
10H |
Wys艂ano powt贸rny sygna艂 pocz膮tku transmisji (START zamiast STOP) |
18H |
Wys艂ano adres urz膮dzenia i bit nadawania, i odebrano potwierdzenie |
20H |
Wys艂ano adres urz膮dzenia i bit nadawania, i odebrano brak potwierdzenia |
28H |
Wys艂ano bajt danych i odebrano potwierdzenie |
30H |
Wys艂ano bajt danych i nie odebrano potwierdzenia |
38H |
Utrata kontroli nad szyn膮 podczas nadawania |
Tabela 10.
Kody stanu w trybie odbioru jako urz膮dzenie nadrz臋dne.
Kod stanu |
Stan interfejsu i szyny |
08H |
Wys艂ano sygna艂 START |
10H |
Wys艂ano powt贸rny sygna艂 pocz膮tku transmisji (START zamiast STOP) |
38H |
Utrata kontroli nad szyn膮 podczas nadawania braku potwierdzenia |
40H |
Wys艂ano adres urz膮dzenia i bit odbioru, i odebrano potwierdzenie |
48H |
Wys艂ano adres urz膮dzenia i bit odbioru, i odebrano brak potwierdzenia |
50H |
Odebrano dane i wys艂ano potwierdzenie |
58H |
Odebrano dane i wys艂ano brak potwierdzenia |
Tabela 11.
Kody stanu w trybie odbioru jako urz膮dzenie podrz臋dne.
Kod stanu |
Stan interfejsu i szyny |
60H |
Odebrano w艂asny adres i bit nadawania, i wys艂ano potwierdzenie |
68H |
Utrata kontroli nad szyn膮 podczas nadawania adresu i bitu kierunku, odebrano w艂asny adres i bit zapisu, i wys艂ano potwierdzenie |
70H |
Odebrano adres wywo艂ania og贸lnego i wys艂ano potwierdzenie |
78H |
Utrata kontroli nad szyn膮 podczas nadawania adresu i bitu kierunku, odebrano adres wywo艂ania og贸lnego i wys艂ano potwierdzenie |
80H |
Interfejs zosta艂 zaadresowany, odebrano dane i wys艂ano potwierdzenie. |
88H |
Interfejs zosta艂 zaadresowany, odebrano dane i wys艂ano brak potwierdzenia |
90H |
Interfejs zosta艂 zaadresowany adresem wywo艂ania og贸lnego, odebrano dane i wys艂ano potwierdzenie |
98H |
Interfejs zosta艂 zaadresowany adresem wywo艂ania og贸lnego, odebrano dane i wys艂ano brak potwierdzenia |
A0H |
Odebrano sygna艂 STOP, lub powt贸rny sygna艂 pocz膮tku transmisji (START zamiast STOP) podczas pracy jako zaadresowane urz膮dzenie podrz臋dne |
Tabela 12.
Kody stanu w trybie nadawania jako urz膮dzenie podrz臋dne.
Kod stanu |
Stan interfejsu i szyny |
A8H |
Odebrano w艂asny adres i bit odbioru, i wys艂ano potwierdzenie |
B0H |
Utrata kontroli nad szyn膮 podczas nadawania adresu i bitu kierunku, odebrano w艂asny adres i bit odbioru, i wys艂ano potwierdzenie |
B8H |
Wys艂ano dane i odebrano potwierdzenie |
C0H |
Wys艂ano dane i odebrano brak potwierdzenia |
C8H |
Wys艂ano ostatni bajt danych (AA=0) i odebrano potwierdzenie |
Tabela 13.
Kody stanu w niejednoznacznych stanach interfejsu.
Kod stanu |
Stan interfejsu i szyny |
00H |
B艂膮d transmisji wskutek niedozwolonego sygna艂u STOP lub START, lub wej艣cie interfejsu w stan nieokre艣lony w wyniku zak艂贸ce艅 |
F8H |
Brak informacji o stanie interfejsu (nie jest ustawiany wska藕nik przerwania SI) |
Rysunek 19.
Schemat strony hardware'owej interfejsu I2C.
Uk艂ady filtr贸w wej艣ciowych maj膮 za zadanie jednoznaczn膮 dyskryminacj臋 stanu logicznego linii SDA i SCL zgodnie ze standardami interfejsu I2C. sygna艂y wej艣ciowe synchronizowane s膮 z wewn臋trznym uk艂adem taktuj膮cym i zak艂贸cenia kr贸tsze ni偶 3 okresy sygna艂u zegarowego s膮 odfiltrowywane. Stopnie wyj艣ciowe interfejsu maj膮 minimaln膮 obci膮偶alno艣膰 (katalogow膮) wynosz膮c膮 3mA pr膮du wp艂ywaj膮cego przy napi臋ciu wyj艣ciowym poni偶ej 0.4V. Omawiane wyj艣cia nie maj膮 wewn臋trznych diod zabezpieczaj膮cych pod艂膮czonych do wyprowadze艅 napi臋cia zasilania VDD, dzi臋ki czemu mo偶liwe jest wy艂膮czenie zasilania mikrokontrolera bez wp艂ywu na prac臋 magistrali I2C.
Uk艂ad komparatora por贸wnuje odebrany 7-bitowy adres z w艂asnym adresem urz膮dzenia podrz臋dnego (S1ADR). Odebrany bajt adresu jest r贸wnie偶 por贸wnywany z adresem wywo艂ania og贸lnego. Wykrycie kt贸rejkolwiek r贸wno艣ci powoduje ustawienie odpowiedniego kodu stanu i wygenerowanie przerwania.
Uk艂ad arbitra偶u funkcjonuje jedynie w trybie pracy jako urz膮dzenie nadrz臋dne. Uk艂ad ten sprawdza, czy ka偶dy bit nadawany jako „1” wywo艂uje stan wysoki linii SDA. Je偶eli jakiekolwiek urz膮dzenie pod艂膮czone do magistrali wymusi w贸wczas na linii SDA stan niski, to kontrola nad szyn膮 przejmowana jest przez to urz膮dzenie, z tym, 偶e interfejs nadal na lini臋 SCL wysy艂a impulsy taktuj膮ce, a偶 do zako艅czenia przesy艂ania bie偶膮cej informacji. Kontrola nad szyn膮 mo偶e by膰 utracona tak偶e podczas pracy w trybie odbioru jako uk艂ad nadrz臋dny, lecz tego rodzaju utrata kontroli mo偶e wyst膮pi膰 tylko podczas zwracania bitu braku potwierdzenia. Mo偶e si臋 to zdarzy膰 tylko przy ko艅cu nadawania bajtu, tak wi臋c interfejs nie musi wysy艂a膰 dalszych impuls贸w taktuj膮cych. Je偶eli w trakcie pracy jako uk艂ad nadrz臋dny magistrala zostanie przej臋ta przez inne urz膮dzenie, interfejs prze艂膮cza si臋 natychmiast w tryb pracy urz膮dzenia podrz臋dnego, aby w razie konieczno艣ci m贸g艂 wykry膰 w trakcie aktualnej transmisji sw贸j w艂asny adres.
Generator sygna艂u taktuj膮cego wytwarza impulsy wysy艂ane lini膮 SCL tylko podczas pracy interfejsu w trybie urz膮dzenia nadrz臋dnego. Wype艂nienie sygna艂u taktuj膮cego wynosi normalnie 50%, jednak mo偶e si臋 zmieni膰 w wyniku dzia艂ania uk艂adu synchronizacji. Interfejs I2C mikrokontrolera 80C552 wymusza stan niski na linii SCL po przes艂aniu ka偶dego bajtu, kt贸ry otrzyma艂 potwierdzenie. Ustawiany jest w贸wczas wska藕nik przerwania SI, a zwolnienie linii SCL nast臋puje po wyzerowaniu tego wska藕nika.
Uk艂ad taktowania i sterowania wytwarza sygna艂y steruj膮ce wykorzystywane przy odbiorze i nadawaniu pojedynczego bajtu danych. Zadaniem tego bloku jest wytwarzanie impuls贸w przesuwaj膮cych zawarto艣膰 rejestru S1DAT, sterowanie komparatorem, wytwarzanie i detekcja sygna艂贸w START i STOP, nadawanie i odbi贸r bit贸w potwierdzenia, sterowanie w trybie pracy uk艂adu nadrz臋dnego i podrz臋dnego, zg艂aszanie przerwa艅 i testowanie stanu magistrali I2C.
Dekoder stanu interfejsu wykorzystuje r贸偶ne wewn臋trzne sygna艂y i na ich podstawie generuje 5-bitowy kod informuj膮cy o aktualnym stanie interfejsu. Kod ten mo偶e by膰 wykorzystany przez procedur臋 obs艂ugi przerwania, kt贸ra w zale偶no艣ci od stanu rejestru S1STA (w kt贸rym znajduje si臋 kod) wywo艂a odpowiedni podprogram obs艂uguj膮cy dane zdarzenie. Trzy najm艂odsze bity rejestru S1STA s膮 zawsze r贸wne „0”, co pozwala na wykorzystanie zawarto艣ci tego rejestru jako wektora adresowego (pocz膮tki ewentualnych procedur b臋d膮 rozmieszczone w odst臋pach co 8 bajt贸w).
Uk艂ad przerwa艅 mikrokontrolera 80C552
Uk艂ad przerwa艅 mikrokontrolera 80C552 nie r贸偶ni si臋 pod wzgl臋dem zasad funkcjonowania od uk艂adu przerwa艅 mikrokontrolera 8051. Ze wzgl臋du na rozbudowane zasoby mikrokontrolera 80C552, jego uk艂ad przerwa艅 ma do obs艂u偶enia wi臋cej urz膮dze艅 zg艂aszaj膮cych w sumie pi臋tna艣cie przerwa艅. Z tego wzgl臋du 80C552 posiada rozbudowany w stosunku do 8051 zesp贸艂 rejestr贸w specjalnych odpowiedzialnych za konfiguracj臋 uk艂adu przerwa艅, natomiast wska藕niki przerwa艅 znajduj膮 si臋 najcz臋艣ciej w rejestrach steruj膮cych odpowiednich uk艂ad贸w.
Tabela 14.
Rejestry steruj膮ce uk艂adu przerwa艅 mikrokontrolera 80C552.
Rejestr |
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
IEN0 |
EA |
EAD |
ES1 |
ES0 |
ET1 |
EX1 |
ET0 |
EX0 |
IEN1 |
ET2 |
ECM2 |
ECM1 |
ECM0 |
ECT3 |
ECT2 |
ECT1 |
ECT0 |
IP0 |
- |
PAD |
PS1 |
PS0 |
PT1 |
PX1 |
PT0 |
PX0 |
IP1 |
PT2 |
PCM2 |
PCM1 |
PCM0 |
PCT3 |
PCT2 |
PCT1 |
PCT0 |
Rejestry IEN0 i IP0 s膮 rozbudowanymi odpowiednikami rejestr贸w IE i IP mikrokontrolera 8051, znaczenie poszczeg贸lnych bit贸w jest nast臋puj膮ce:
Rejestr IEN0:
EA - ustawienie powoduje globalne w艂膮czenie obs艂ugi przerwa艅, wyzerowanie powoduje, 偶e mikrokontroler nie reaguje na 偶adne przerwania.
EAD - ustawienie w艂膮cza obs艂ug臋 przerwa艅 przetwornika A/C.
ES1 - ustawienie w艂膮cza obs艂ug臋 przerwa艅 od interfejsu I2C.
ES0 - ustawienie w艂膮cza obs艂ug臋 przerwa艅 od uk艂adu transmisji szeregowej.
ET1, ET0 - ustawienie w艂膮cza przerwania odpowiednio od licznik贸w T1 i T0.
EX1, EX0 - ustawienie w艂膮cza przerwania zewn臋trzne odpowiednio INT1' i INT0'.
Rejestr IP0:
PAD ustawia poziom priorytetu przerwania od przetwornika A/C.
PS1 ustawia poziom priorytetu przerwania od interfejsu I2C.
PS0 ustawia poziom priorytetu przerwania od uk艂adu transmisji szeregowej.
PT1, PT0 ustawiaj膮 poziomy priorytet贸w przerwa艅 licznik贸w T1 i T0.
PX1, PX0 ustawiaj膮 poziomy priorytet贸w przerwa艅 zewn臋trznych INT1' i INT0'.
Rejestr IEN1 jest dodatkowym rejestrem odpowiedzialnym za uaktywnianie przerwa艅 od urz膮dze艅 specyficznych dla mikrokontrolera 80C552. Ustawienie jedynki na odpowiedniej pozycji powoduje w艂膮czenie obs艂ugi przerwa艅 od danego urz膮dzenia:
ET2 w艂膮cza przerwanie od licznika T2.
ECM2-ECM0 aktywuj膮 przerwania od rejestr贸w por贸wnuj膮cych CM2-CM0.
ECT3-ECT0 aktywuj膮 przerwania od rejestr贸w przechwytuj膮cych CT3-CT0.
Rejestr IP1 jest odpowiedzialny za ustalanie poziomu przerwa艅 dla dodatkowych przerwa艅 wyst臋puj膮cych w mikrokontrolerze 80C552. Ustawienie odpowiedniego bitu przyporz膮dkowuje poziom priorytetu 1, wyzerowanie - poziom priorytetu 0.
PT2 odpowiada za poziom priorytetu przerwania od licznika T2.
PCM2-PCM0 odpowiadaj膮 za poziom priorytet贸w przerwa艅 od rejestr贸w por贸wnuj膮cych CM2-CM0.
PCT3-PCT0 odpowiadaj膮 za poziom priorytet贸w przerwa艅 od rejestr贸w przechwytuj膮cych CT3-CT0.
Przyj臋cie przerwania wywo艂uje identyczne efekty jak w mikrokontrolerze 8051, jednak ze wzgl臋du na wi臋cej obs艂ugiwanych uk艂ad贸w pami臋膰 programu musi zawiera膰 wi臋cej procedur obs艂ugi przerwa艅. Przerwania o jednakowym poziomie, wywo艂ane jednocze艣nie, obs艂ugiwane s膮 w nast臋puj膮cej kolejno艣ci: INT0' (najwy偶szy priorytet), I2C, A/C, T0, CTI0, CMI0, INT1', CTI1, CMI1, T1, CTI2, CMI2, RI+TI, CTI3, T2 (priorytet najni偶szy).
Uk艂ad sterowania mikrokontrolera 80C552
Zasadnicze cechy uk艂adu sterowania mikrokontrolera 80C552 s膮 takie same jak dla uk艂adu 8051 (80C51). Za sterowanie trybami u艣pienia r贸wnie偶 odpowiada rejestr PCON (posiada on dodatkowy bit WLE na pozycji b4, kt贸ry jest wykorzystywany przez licznik czuwaj膮cy; pozosta艂e bity rejestru maj膮 takie samo znaczenie jak w 80C51). Cz臋艣ciowo r贸偶ni膮 si臋 tylko tryby u艣pienia: w trybie IDL dodatkowo w stosunku do 80C51 wyzerowywany i wy艂膮czany jest licznik T2, wyzerowywane s膮 uk艂ady PWM (ich wyj艣cia przyjmuj膮 stan wysoki) oraz przerywany jest proces konwersji A/C.
Niemal identyczny jak w 80C51 jest tryb u艣pienia PD. Jedyn膮 r贸偶nic膮 przy wprowadzaniu mikrokontrolera 80C552 w ten tryb jest konieczno艣膰, opr贸cz ustawienia bitu PD, podania wysokiego poziomu na wyprowadzenie EW' mikrokontrolera (jest to swego rodzaju zabezpieczenie przed wej艣ciem w ten tryb u艣pienia).
Rozdzia艂 3
Urz膮dzenia peryferyjne
Do szyny I2C pod艂膮czono nast臋puj膮ce uk艂ady:
pami臋膰 EEPROM (PCF8582),
zegar czasu rzeczywistego (PCF8583),
8-bitowy port we/wy dla magistrali I2C (PCF8574), umo偶liwiaj膮cy sterowanie modu艂ami:
wy艣wietlacza,
linijki diodowej,
klawiatury.
Poni偶ej przedstawiono opis ka偶dego z tych modu艂贸w.
3.1. Pami臋膰 statyczna CMOS - EEPROM o pojemno艣ci 256 x 8 bit贸w z interfejsem magistrali I2C
Uk艂ad scalony PCF8582A jest reprogramowaln膮 elektrycznie pami臋ci膮 ROM (EEPROM) o pojemno艣ci 2K-bity i organizacji 256x8 bit贸w. Uk艂ad ten jest wykonany w technologii CMOS z bramk膮 swobodn膮 i zasilany jednym napi臋ciem +5V.
W transmisji sygna艂贸w za pomoc膮 szeregowej magistrali I2C jest wystarczaj膮ce stosowanie uk艂ad贸w PCF8582A w obudowie 8-ko艅c贸wkowej, przy czym jednocze艣nie do magistrali mo偶na do艂膮czy膰 nie wi臋cej ni偶 8 wymienionych uk艂ad贸w. Selekcji uk艂adu (aktywnego w danej chwili) dokonuje si臋 za pomoc膮 3 linii adresowych.
Sterowanie czasowe w cyklu KASOWANIE/ZAPIS mo偶e si臋 odby膰 w dwojaki spos贸b: z generatora (zegara) zewn臋trznego przez podanie impuls贸w steruj膮cych na ko艅c贸wk臋 PTC (n. 7 lub n. 13), b膮d藕 z generatora (zegara) wewn臋trznego, jednak w tym ostatnim przypadku obw贸d RC, okre艣laj膮cy sta艂膮 czasow膮 generatora, musi by膰 do艂膮czony do n. 7 lub n. 13 (zob. rys. 22).
W艂a艣ciwo艣ci
nieulotne zapami臋tywanie 2K-bit贸w informacji (danych) o organizacji 256x8 bit贸w,
jedno napi臋cie zasilania (+5V),
wzmacniacz napi臋ciowy sygna艂u KASOWANIE/ZAPIS wewn膮trz struktury uk艂adu,
szeregowa magistrala wej艣膰/wyj艣膰 (I2C),
automatyczna inkrementacja adresu,
nieznaczny pob贸r mocy,
jednopunktowy zegar cyklu KASOWANIE/ZAPIS,
autozerowanie po w艂膮czeniu zasilania,
mo偶liwo艣膰 wykonania 10.000 cykli KASOWANIE/ZAPIS na bajt,
nieulotno艣膰 zapami臋tanych danych przez 10 lat,
niesko艅czona liczba cykli odczytu,
kompatybilno艣膰 wyprowadze艅 i adres贸w z uk艂adami PCF8570, PCF8571, PCF8582 oraz PCD8572,
mo偶liwo艣膰 doprowadzenia sygna艂u zegarowego zewn臋trznego.
Powy偶szy uk艂ad wyst臋puje w dw贸ch rodzajach obud贸w:
PCF8582AP - dwurz臋dowa plastykowa 8-ko艅c贸wkowa (SOT97),
PCF8582AT - miniaturowa plastykowa 16-ko艅c贸wkowa (SO16L, SOT162A).
Rysunek 20.
Schemat i opis wyprowadze艅 dla uk艂adu w obudowie 8-ko艅c贸wkowej
Tabela 15.
Opis wyprowadze艅
ko艅c贸wka |
Opis |
A0 |
wej艣cia adresowe/wyboru rodzaju testu |
A1 |
|
A2 |
|
VSS |
masa |
SDA |
magistrala I2C |
SCL |
|
PTC |
uk艂ad sterowania czasowego |
VDD |
dodatnie napi臋cie zasilania |
Rysunek 21.
Schemat blokowo-funkcjonalny.
Szybko艣膰 transmisji z magistral膮 I2C
Zgodnie ze specyfikacj膮 techniczn膮, magistrala I2C mo偶e pracowa膰 z ma艂膮 szybko艣ci膮 transmisji (cz臋stotliwo艣膰 zegara 2kHz) i z wysok膮 szybko艣ci膮 transmisji (cz臋stotliwo艣膰 zegara 100kHz). Uk艂ad PCF 8582A jest dostosowany do pracy przy obu wymienionych wy偶ej szybko艣ciach transmisji.
Rysunek 22.
Spos贸b pod艂膮czenia element贸w RC obwodu oscylatora w celu realizacji sterownia czasowego impulsami programuj膮cymi za pomoc膮 generatora wewn臋trznego dla uk艂ad贸w:
a) PCF8582AT,
b) PCF8582AP.
Protok贸艂 transmisji magistrali I2C
Konfiguracje magistrali I2C w r贸偶nych cyklach ODCZYTU i ZAPISU dla uk艂adu PCF8582A s膮 przedstawione na rysunkach 23 a, b oraz c.
Rysunek 23 a.
Nadajnik nadrz臋dny przesy艂a dane do odbiornika podporz膮dkowanego PCF8582A (tryb KASOWANIE/ZAPIS).
Po prostym sygnale stopu rozpoczyna si臋 cykl kasowanie/zapis i magistrala jest wolna dla nowej (kolejnej) transmisji. Czas trwania cyklu kasowanie/zapis jest r贸wny w przybli偶eniu 30ms, gdy jest zapisywany tylko jeden bajt, lub 60ms, gdy s膮 zapisywane 2 bajty. Podczas cyklu kasowanie/zapis uk艂ad b臋d膮cy odbiornikiem podrz臋dnym nie wysy艂a bitu potwierdzenia, je艣li nie jest adresowany poprzez magistral臋 I2C.
Drugi bajt danych jest nadobowi膮zkowy. Nie dopuszcza do wyst膮pienia wi臋cej ni偶 dwu rodzaj贸w sygna艂贸w kasowania/zapisu.
Rysunek 23 b.
Uk艂ad nadrz臋dny odczytuje dane z uk艂adu PCF8582A podrz臋dnego po ustawieniu adresu s艂owa (zapis adresu, ODCZYT danych).
Rysunek 23 c. Uk艂ad nadrz臋dny odczytuje dane z uk艂adu PCF8582A podrz臋dnego natychmiast po pierwszym bajcie (tryb ODCZYT).
Uk艂ad bez zegara impuls贸w programuj膮cych mo偶e by膰 zastosowany tylko do odczytu danych.
Uwaga:
adres uk艂adu podrz臋dnego zgodnie ze specyfikacj膮 magistrali I2C ma nast臋puj膮cy format:
1 |
0 |
1 |
0 |
A2 |
A1 |
A0 |
|
3.2. Zegar/kalendarz z pami臋ci膮 statyczn膮 RAM 256 x 8
Uk艂ad PCF 8583 jest pobieraj膮c膮 ma艂膮 moc, 2048-bitow膮 statyczn膮 pami臋ci膮 CMOS RAM o organizacji 256 x 8 bit贸w. Adresy i dane s膮 przesy艂ane szeregowo dwuprzewodow膮 magistral膮 I2C. Zawarto艣膰 wewn臋trznego rejestru s艂owa adresowego jest automatycznie powi臋kszana o 1 po ka偶dym zapisie lub odczycie bajtu. Wyprowadzenie linii adresu A0 jest wykorzystane do sprz臋towego programowania adresu, umo偶liwiaj膮c do艂膮czenie do magistrali dw贸ch uk艂ad贸w bez 偶adnej dodatkowej automatyki. Wbudowane obwody oscylatora 32,768 kHz i pierwsze 9 bajt贸w pami臋ci s膮 wykorzystane dla funkcji zegara przez kalendarz. Kolejne 8 bajt贸w mo偶e by膰 zaprogramowane jako rejestr alarmu lub wykorzystane jako zwyk艂a pami臋膰 RAM.
W艂a艣ciwo艣ci
napi臋cie zasilania magistrali I2C: 2,5 梅 6 V
napi臋cie zasilania zegara (0梅+70掳C)1,0 梅 6V
napi臋cie podtrzymania zawarto艣ci RAM 1,0 梅 6V
pr膮d zasilania (fSCL = 0Hz) maks. 50碌A
funkcja zegara i czteroletniego kalendarza
format danych zegara 12- lub 24-godzinny
zliczanie sygna艂u wzorcowego 32,768kHz lub 50Hz
wej艣cie/wyj艣cie szeregowe (magistrala I2C)
funkcja automatycznej inkrementacji s艂owa adresowego
funkcje programowanego alarmu, timera i przerwa艅
Rysunek 24.
Schemat blokowy
Opis funkcjonalny
Uk艂ad PCF 8583 zawiera 256 8-bitowych kom贸rek pami臋ci RAM z 8-bitowym rejestrem adresowym, kt贸rego zawarto艣膰 jest automatycznie zwi臋kszana o jeden, wewn臋trzny uk艂ad oscylatora, dzielnik cz臋stotliwo艣ci, interfejs szeregowej, dwukierunkowej, dwuprzewodowej magistrali I2C i obwody zeruj膮ce po w艂膮czeniu zasilania (reset).
Osiem pierwszych bajt贸w pami臋ci RAM (o adresach 00 do 07) dzia艂a jak adresowalne 8-bitowe rejestry r贸wnoleg艂e. Pierwszy z nich (o adresie 00) s艂u偶y jako rejestr steruj膮cy/stanu. Rejestry o adresach od 01 do 07 s膮 licznikami dla funkcji zegara. Kom贸rki o adresach 08 do 0F mog膮 by膰 wykorzystywane jako kom贸rki RAM lub zaprogramowane jako rejestry alarmu.
Rysunek 25.
Opis wyprowadze艅
Tabela 16.
Opis wyprowadze艅
ko艅c贸wka |
Opis |
OSCI |
Wej艣cie oscylatora, sygna艂u o cz臋stotliwo艣ci 50 Hz lub impuls贸w zdarze艅 |
OSCO |
Wyj艣cie oscylatora |
A0 |
Wej艣cie adresowe |
VSS |
Ujemna linia zasilania |
SDA |
Linie magistrali I2C |
SCL |
|
INT |
Wyj艣cie przerwa艅 „otwarty dren” (aktywny poziom niski |
VDD |
Dodatnia linia zasilania |
Tryby funkcji licznika
W zale偶no艣ci od zawarto艣ci rejestru sterowania/stanu jest wybierany tryb pracy jako zegara 32,768kHz, zegara 50Hz lub licznika zdarze艅.
W trybie zegara setne sekundy, sekundy, minuty, godziny, data, miesi膮c (kalendarz czteroletni) i dni tygodnia, s膮 przechowywane jako liczby BCD. Rejestr czasu przechowuje do 99 dni. Tryb licznika zdarze艅 jest wykorzystywany do zliczania impuls贸w podawanych na wej艣cie oscylatora (OSCO pozostaje niepod艂膮czone). Licznik przechowuje do 6 cyfr dziesi臋tnych.
Gdy jeden z licznik贸w (kom贸rki pami臋ci od 00 do 07) jest odczytywany, zawarto艣膰 wszystkich licznik贸w jest przepisywana do zatrzask贸w na pocz膮tku cyklu odczytu. Ten spos贸b zapobiega b艂臋dom w wyniku przeniesie艅 podczas odczytu.
Funkcje alarmu
Ustawienie bitu zezwolenia alarmu w rejestrze sterowania/stanu aktywuje rejestr sterowania alarmem (08). Po ustawieniu w rejestrze alarmu alarmu datowanego, mo偶na zaprogramowa膰 alarm w wybranym dniu miesi膮ca, dniu tygodnia lub alarm timera (po odliczeniu zadania op贸藕nienia). W trybach zegara rejest timera (adres 07) mo偶e by膰 zaprogramowany na zliczanie setnych sekundy, sekund, minut, godzin lub dni. Dni s膮 zliczane, gdy alarm nie jest zaprogramowany.
Gdy warunek alarm zostanie spe艂niony, jest ustawiany wska藕nik alarmu w rejestrze sterowania/stanu. Sygna艂 alarmu timera ustawia wska藕nik alarmu, a przepe艂nienie rejestru timera ustawia wska藕nik timera. Wyj艣cie przerwa艅 typu „otwarty dren” jest prze艂膮czane w stan przewodzenia, gdy wska藕nik alarmu lub wska藕nik timera jest ustawiony.
Rejestr steruj膮cy/stanu
Rejestr steruj膮cy/stanu jest bajtem pami臋ci o adresie 00 ze swobodnym odczytem i zapisem poprzez magistral臋 I2C. Poprzez zmian臋 zawarto艣ci rejestru mo偶na sterowa膰 wszystkimi funkcjami uk艂adu (patrz rys. 26).
Rejestry licznika
W poszczeg贸lnych trybach pracy rejestry licznika s膮 zaprogramowane i zorganizowane tak, jak to przedstawia rysunek 27. Cykle licznika zawiera tabela 17.
W trybach zegara format 24-lub 12-godzinny jest wybierany ustawieniem najbardziej znacz膮cego bitu rejestr godzin. Format licznika godzin przedstawia rys. 28.
Rok i dzie艅 miesi膮ca s膮 przechowywane w kom贸rce pami臋ci 05 (patrz rys. 29) Dni tygodnia i miesi膮ce przechowuje kom贸rka 06 (patrz rys. 30). Przy odczycie tych kom贸rek, je偶eli bit wska藕nika maski rejestru steruj膮cego/stanu jest ustawiony, rok i dzie艅 tygodnia s膮 maskowane. Umo偶liwia to u偶ytkownikowi bezpo艣redni odczyt dnia i miesi膮ca.
Rysunek 26.
Rejestr steruj膮cy/stanu
Rysunek 27.
Organizacja rejestr贸w
W trybie licznika zdarze艅 wynik zliczania jest przechowywany w postaci liczby kodowanej BCD. D5 jest najstarsz膮, a D0 najm艂odsz膮 liczb膮. Dzielnik jest pomini臋ty.
Rejestr sterowania alarmem
Ustawienie bitu zezwolenia alarmu w rejestrze sterowania/stanu aktywuje rejestr sterowania alarmem (08). Zawarto艣膰 rejestru alarmu steruje wszystkimi alarmami, timerem i wyj艣ciowymi funkcjami przerwa艅 (patrz rys. 31 i 32).
Rysunek 28.
Format licznika godzin
Rysunek 29.
Format licznika lat/dni miesi膮ca
Rysunek 30.
Format licznika dni tygodnia/miesi臋cy
Rejestry alarmu
Wszystkie rejestry alarmu s膮 rozmieszczone ze sta艂ym przesuni臋ciem heksadecymalnie 08 wzgl臋dem odpowiednich rejestr贸w licznika.
Sygna艂 alarmu jest wysy艂any, gdy zawarto艣膰 rejestr贸w alarmu jest zgodna na ka偶dym bicie z zawarto艣ci膮 odpowiednich rejestr贸w licznika. Alarm codzienny ignoruje bity miesi膮ca i dnia miesi膮ca. Je艣li jest ustawiony alarm w dniu tygodnia, zawarto艣膰 rejestru dni tygodnia/miesi臋cy okre艣la dzie艅 aktywacji alarmu (rys. 33).
Tabela 17.
D艂ugo艣ci cykli licznik贸w czasu w trybach zegara
Jednostka |
Cykl zliczania |
Przej艣cie po przeniesieniu do nast臋pnej jednostki |
Zawarto艣膰 licznika miesi臋cy |
Setne sekundy |
00 do 99 |
99 na 00 |
|
Sekundy |
00 do 59 |
59 do 00 |
|
Minuty |
00 do 59 |
59 do 00 |
|
Godziny (24) |
00 do 23 |
23 do 00 |
|
Godziny (12) |
12AM, 01AM do 11AM, |
11 PM na 12 AM |
|
Dni miesi膮ca |
01 do 31 |
31 na 01 |
1, 3, 5, 7, 8, 10, 12 |
|
01 do 30 |
30 na 01 |
4, 6, 9, 11 |
|
01 do 29 |
29 na 01 |
2, rok = 0 |
|
01 do 28 |
28 na 01 |
2, rok = 1, 2, 3 |
Miesi膮ce |
01 do 12 |
12 na 01 |
|
Lata |
0 do 3 |
3 na 0 |
|
Dni tygodnia |
0 do 6 |
6 |
|
Dni timera |
00 do 99 |
brak przeniesienia |
|
Wyj艣cie przerwa艅
N-kana艂owe wyj艣cie typu „otwarty dren” sygna艂u przerwania jest programowane ustawieniem rejestru steruj膮cego alarmu. Wyj艣cie jest prze艂膮czane w stan przewodzenia, gdy jest ustawiony wska藕nik alarmu lub wska藕nik timera. W trybie zegara bez alarmu stan wyj艣cia jest sterowany przez wska藕nik timera. Napi臋cie na zatkanym wyj艣ciu przerwania mo偶e przekroczy膰 napi臋cie zasilania.
Oscylator i dzielnik
Do wyprowadze艅 OSCI (1) i OSCO (2) nale偶y do艂膮czy膰 rezonator kwarcowy 32,768kHz. Kondensator trymuj膮cy, w艂膮czony pomi臋dzy wyprowadzenia OSCI i VDD s艂u偶y do korekcji cz臋stotliwo艣ci oscylatora. Cz臋stotliwo艣膰 oscylatora jest dzielona przez 128 w uk艂adzie dzielnika. Pochodnym tego sygna艂u jest sygna艂 zegarowy 100Hz.
W trybie zegara 50Hz lub licznika zdarze艅 oscylator jest wy艂膮czony, a jego wej艣cie przechodzi w stan wysokiej impedancji. Daje to u偶ytkownikowi mo偶liwo艣膰 podania na wyprowadzenie OSCI wzorcowego sygna艂u 50Hz lub innego zewn臋trznego szybkozmiennego sygna艂u zdarze艅.
Rysunek 31.
Rejestr sterowania alarmem w trybach zegara
Rysunek 32.
Rejestr sterowania alarmem w trybie licznika zdarze艅
Inicjalizacja
Po w艂膮czeniu zasilania interfejs magistrali I2C, rejestr steruj膮cy/stanu i rejestry licznika s膮 zerowane. W formacie 24-godzinnym od pierwszego stycznia 0.00.00:00.
Drugi, aktywowany poziomem sygna艂 zeruj膮cy interfejs magistrali I2C jest generowany, gdy napi臋cie spadnie poni偶ej zerowania interfejsu. Nie ma on wp艂ywu na rejestr steruj膮cy/stanu ani rejestry licznika stanu.
Zaleca si臋 ustawianie wska藕nika stopu zliczania rejestru steruj膮cego/stanu przed wprowadzaniem aktualnego czasu do licznik贸w. Wprowadzenie nieprawid艂owych stan贸w doprowadzi do wadliwego funkcjonowania zegara, ale nie zablokuje uk艂adu.
Rysunek 33.
Wyb贸r alarmu w dniu tygodnia
Informacje aplikacyjne
Uk艂ad jest programowany poprzez magistral臋 I2C. Adresowanie jest dokonywane w pierwszym bajcie przesy艂anym po procedurze startu. Protok贸艂 magistrali jest podobny, jak dla zegara/kalendarza PCF8573.
1 |
0 |
1 |
0 |
0 |
0 |
A0 |
R/W |
|
grupa 1 |
|
|
grupa 2 |
|
|
|
|
|
|
|
|
|
|
Rysunek. 34.
Adres uk艂adu PCF8583
Rysunek 35.
Przyk艂ad aplikacji uk艂adu PCF8583
3.3. 8-bitowy port wej艣cia/wyj艣cia dla magistrali I2C
Uk艂ad PCF8574 jest wykonany w technologii CMOS. Realizuje port wej艣cia/wyj艣cia dla wi臋kszo艣ci rodzin mikrokontroler贸w poprzez magistral臋 I2C. Obw贸d sk艂ada si臋 z
8-bitowego quasi-dwukierunkowego portu oraz interfejsu magistrali I2C. Uk艂ad charakteryzuje si臋 ma艂ym poborem pr膮du, i posiada zatrzaskiwane wyj艣cia o stosunkowo du偶ej obci膮偶alno艣ci pr膮dowej, przystosowanej do bezpo艣redniego wysterowywania diod LED. Ma lini臋 przerywaj膮c膮 (INT), aktywn膮 stanem niskim, kt贸ra mo偶e by膰 pod艂膮czona do odpowiedniego wej艣cia mikrokontrolera. Poprzez wys艂anie sygna艂u na linii przerwania, port we/wy mo偶e informowa膰 碌K o danych na wej艣ciach portu bez konieczno艣ci komunikowania si臋 przez magistral臋 I2C. Oznacza to, 偶e powy偶szy uk艂ad jest prostym urz膮dzeniem podrz臋dnym.
W艂a艣ciwo艣ci
napi臋cie zasilania od 2,5 梅 6V,
ma艂y pob贸r pr膮du w trybie „u艣pienia” (max. 10 碌A),
port r贸wnoleg艂y dla magistrali I2C,
wyj艣cie przerwania typu otwarty dren,
kompatybilny z wi臋kszo艣ci膮 mikrokontroler贸w,
zatrzaskiwane wyj艣cia o du偶ej obci膮偶alno艣ci,
adres sprz臋towy ustalany przez trzy ko艅c贸wki (mo偶liwo艣膰 pod艂膮czenia do magistrali o艣miu PCF8574),
Rysunek 36.
Schemat blokowy
Rysunek 37.
Uk艂ad wyprowadze艅
Tabela 18.
Oznaczenia ko艅c贸wek
Symbol ko艅c贸wki |
n贸偶ka |
Opis |
A0 |
1 |
wej艣cie adresowe 0 |
A1 |
2 |
wej艣cie adresowe 1 |
A2 |
3 |
wej艣cie adresowe 2 |
P0 |
4 |
kwasi dwukierunkowe we/wy 0 |
P1 |
5 |
kwasi dwukierunkowe we/wy 1 |
P2 |
6 |
kwasi dwukierunkowe we/wy 2 |
P3 |
7 |
kwasi dwukierunkowe we/wy 3 |
VSS |
8 |
masa |
P4 |
9 |
kwasi dwukierunkowe we/wy 4 |
P5 |
10 |
kwasi dwukierunkowe we/wy 5 |
P6 |
11 |
kwasi dwukierunkowe we/wy 6 |
P7 |
12 |
kwasi dwukierunkowe we/wy 7 |
INT |
13 |
wej艣cie przerywaj膮ce (aktywne stanem niskim) |
SCL |
14 |
szeregowa linia zegara |
SDA |
15 |
szeregowa linia danych |
VDD |
16 |
zasilanie |
Rysunek 38.
Uproszczony schemat pojedynczej linii I/O.
Rysunek 39.
Adresy uk艂ad贸w podrz臋dnych PCF8574 i PCF8574A.
Adresowanie
Ka偶dy z o艣miu uk艂ad贸w PCF8574, kt贸re mo偶na pod艂膮czy膰 do magistrali, mo偶e by膰 niezale偶nie u偶yty jako wej艣cie lub wyj艣cie. Wej艣ciowe dane s膮 przesy艂ane od portu do mikrokontrolera w cyklu odczytu READ (rys. 41). Natomiast dane wyj艣ciowe s膮 transmitowane do portu w cyklu zapisu WRITE (rys. 40).
Rysunek 40.
Cykl zapisu.
Rysunek 41.
Cykl odczytu.
Przerwania
Uk艂ad PCF8574 posiada wej艣cie INT (otwarty dren), kt贸re mo偶e by膰 pod艂膮czone do odpowiedniego wej艣cia 碌K (np. INT0, INT1, w '51). Daje to mo偶liwo艣膰 inicjowania przez uk艂ad danej akcji w systemie zwi膮zanej z zaj艣ciem okre艣lonych warunk贸w w uk艂adzie. Przerwanie jest generowane przez ka偶de narastaj膮ce, b膮d藕 opadaj膮ce zbocze na wej艣ciach portu przy pracy w trybie wej艣ciowym (READ). Wyj艣cie INT uk艂adu jest dezaktywowane po odczycie uk艂adu, zapisie uk艂adu, b膮d藕 powrocie wej艣cia do stanu pocz膮tkowego.
Dok艂adniej ma to miejsce:
w cyklu odczytu READ podczas bitu potwierdzenia po narastaj膮cym zboczu sygna艂u na linii SCL,
w cyklu zapisu WRITE podczas bitu potwierdzenia po przej艣ciu ze stanu H na L sygna艂u na linii SCL,
przerwanie, kt贸re wyst膮pi艂o podczas taktu potwierdzenia mo偶e by膰 utracone (lub za kr贸tkie) ze wzgl臋du na resetowanie linii INT podczas tego taktu.
Quasi-dwukierunkowe we/wy
Quasi-dwukierunkowe linie we/wy mog膮 by膰 u偶ywane jako wej艣cia lub wyj艣cia bez konieczno艣ci wprowadzania kontrolnych sygna艂贸w kierunku przesy艂ania danych. Po w艂膮czeniu zasilania linie portu s膮 w stanie H. Dodatkowe „podci膮gni臋cie” do napi臋cia zasilania VDD zapewnia szybko narastaj膮ce zbocza na obci膮偶onych wyj艣ciach. Uk艂ad uaktywnia si臋, gdy na wyj艣ciach jest podany stan H i wy艂膮cza si臋 poprzez wyst膮pienie opadaj膮cego zbocza na linii SCL. Linie we/wy powinny by膰 w stanie H przed u偶yciem ich jako wej艣cia (rysunek 44).
Rysunek 42.
Aplikacja po艂膮czenia kilku uk艂ad贸w PCF8574 na wsp贸lnej linii INT.
Rysunek 43.
Przerwanie generowane przez zmian臋 stanu wej艣膰 (linia P5).
Rysunek 44.
Przemijaj膮ce podci膮ganie bie偶膮cego IOHt podczas gdy zmienia si臋 linia P3 ze stanu L na H i spowrotem wraca na L.
3.3.1. Linijka diodowa
Jest to modu艂 wykorzystuj膮cy port r贸wnoleg艂y z interfejsem I2C (PCF8574). Diody pod艂膮czone s膮 do wyj艣膰 portu P0 do P7 przez rezystory ograniczaj膮ce. Adres uk艂adu ustalony jest na 0100111R/W. Wyj艣cie INT uk艂adu nie jest do niczego pod艂膮czone ze wzgl臋du na niewykorzystanie (realizowany jest jedynie zapis z uk艂adu nadrz臋dnego). Transmisja danych odbywa si臋 na liniach SDA oraz SCL, a dana zapisana do uk艂adu pozostaje na liniach P0 do P7, a偶 do nast臋pnego zapisu.
Rysunek 45.
Schemat elektryczny modu艂u linijki diodowej.
3.3.2. Klawiatura
17-przyciskowy modu艂 klawiatury obs艂uguj膮 dwa uk艂ady PCF8574, a dodatkowa linia to przycisk RESET, pod艂膮czony bezpo艣rednio do 碌K. Uk艂ady pracuj膮ce w klawiaturze na magistrali I2C dost臋pne s膮 pod adresami: 0100 000R/W oraz 0100 011R/W. Podczas pracy w trybie wej艣ciowym zmiana poziomu na kt贸rejkolwiek z linii odpowiadaj膮ca naci艣ni臋ciu okre艣lonego klawisza, powoduje zg艂oszenie przerwania na wyj艣ciu INT. Wyj艣cia przerwa艅 uk艂ad贸w podwieszone s膮 pod linie portu P3.2 i P3.3 碌K, odpowiadaj膮ce wej艣ciom INT0 i INT1. Wyj艣cie INT uk艂adu PCF8574 jest to stopie艅 z otwartym drenem (open drain), zg艂oszenie przerwania jest r贸wnoznaczne z niskim poziomem, czyli zwarciem wyj艣cia do masy (dzi臋ki temu mo偶na pod艂膮czy膰 do jednej linii przerwania kilka uk艂ad贸w). Klawiatur臋 mo偶na odczytywa膰 w dwojaki spos贸b: metod膮 „pollingu”, czyli cyklicznego odczytywania przez program g艂贸wny lub w procedurze obs艂ugi przerwania zewn臋trznego INT0, INT1 procesora. Obs艂uga przerwania inicjuje sesj臋 komunikacyjn膮 I2C z klawiatur膮, podczas kt贸rej odczytywany jest stan klawiatury. W praktyce „polling” dzia艂a zupe艂nie wystarczaj膮co, bez widocznych dla u偶ytkownika op贸藕nie艅. Natomiast niewielka zw艂oka czasowa komunikacji szeregowej wprowadza „naturaln膮” filtracj臋 drga艅 ze styk贸w i na og贸艂 nie musimy si臋 ju偶 martwi膰 specjalnymi procedurami pisanymi w tym celu. Wyj艣cie INT uk艂adu jest dezaktywowane po: odczycie uk艂adu, zapisie do uk艂adu, powrocie wej艣cia do stanu pocz膮tkowego.
Rysunek 46.
Schemat elektryczny modu艂u klawiatury.
3.3.3. Wy艣wietlacz
W profesjonalnym przyrz膮dzie pomiarowym zasadnicze znaczenie ma spos贸b w jaki dokonywana jest prezentacja wynik贸w pomiarowych i komunikat贸w systemu zarz膮dzaj膮cego. Znaki wy艣wietlane s膮 w formacie 5x7 punkt贸w w jednej linii o d艂ugo艣ci 16 znak贸w (2 x 8 znak贸w). Zastosowanie wy艣wietlacza w zasadniczy spos贸b poprawi艂o czytelno艣膰 prezentowanych informacji.
Rysunek 47.
Schemat blokowy wy艣wietlacza wraz z uk艂adem pod艣wietlania.
Modu艂 wy艣wietlacza ciek艂okrystalicznego
Modu艂 ten jest ca艂kowicie autonomicznym blokiem funkcjonalnym. Mo偶e on by膰 obs艂ugiwany przez szeroki wachlarz system贸w mikroprocesorowych. Jego wsp贸艂praca z zewn臋trznym systemem nadzorczym odbywa si臋 za po艣rednictwem 14-tu sygna艂贸w. Oznaczenia poszczeg贸lnych wyprowadze艅 opisuje tabela 19. Dwie dodatkowe ko艅c贸wki umieszczone oddzielnie s艂u偶膮 do pod艂膮czenia napi臋cia pod艣wietlania (+5V). Schemat blokowy modu艂u wraz z uk艂adem pod艣wietlania przedstawiono na rysunku 47.
Tabela 19.
Znaczenie poszczeg贸lnych ko艅c贸wek.
|
Sterowanie wy艣wietlacza |
Pod艣wietlanie |
|||||||
Nr pinu |
1 |
2 |
3 |
4 |
5 |
6 |
7梅14 |
+ |
- |
Funkcja |
Vss |
Vdd |
V0 |
RS |
R/W |
E |
DB0梅DB7 |
+5V |
0V |
Opis wyprowadze艅
VSS - masa systemu (OV).
VDD - zasilanie (+5V).
V0 - LCD Drive Voltage, napi臋cie steruj膮ce s艂u偶膮ce do regulacji kontrastu obrazu, jego regulacja mo偶e si臋 obywa膰 w zakresie (-1 梅 +5V).
RS - Register Select, okre艣la rodzaj informacji, przesy艂anych do/z modu艂u wy艣wietlacza. Dla RS = H zachodzi transmisja danych za艣 dla RS = L przesy艂ana jest instrukcja wzgl臋dnie bajt statusowy.
R/W - Read/Write, definiuje kierunek transmisji pomi臋dzy modu艂em LCD, a jednostk膮 mikroprocesora. W przypadku R/W=L nast臋puje cykl zapisu danych do modu艂u wy艣wietlacza, dla R/W = H miejsce ma cykl odczytu.
E - Enable, sygna艂 ten steruje momentami zapisu i odczytu do/z modu艂u LCD. Odczyt danych mo偶liwy jest dla stanu E = H. Zapis danych do modu艂u odbywa si臋 przy opadaj膮cym zboczu E.
DBO - DB7 - dwukierunkowa 8-bitowa magistrala danych. Programowo dost臋pny jest tak偶e tryb 4 bitowej transmisji danych, wykorzystuj膮cej DB4梅DB7. Dla uproszczenia komunikacji, w naszym modelu wykorzystano tryb 4-bitowej transmisji (sterowanie jednym uk艂adem PCF8574).
ZA艁 - za艂膮czenie pod艣wietlania
WY艁 - wy艂膮czenie pod艣wietlania
Kombinacje sygna艂贸w RS, R/W oraz E decyduj膮 o tym jak膮 informacj臋 przesy艂amy i kto jest jego nadawc膮 a kto odbiorc膮. Relacje mi臋dzy tymi sygna艂ami a okre艣lonymi operacjami, realizowanymi za ich przyczyn膮 pokazuje tabela 20.
Tabela 20.
Funkcje sygna艂贸w RS i R/W.
RS |
R/W |
E |
OPERACJA |
0 |
0 |
|
Zapis kodu instrukcji |
0 |
1 |
|
Odczyt flagi zaj臋to艣ci licznika adresowego |
1 |
0 |
|
Zapis danych |
1 |
1 |
|
Odczyt danych |
Prac膮 modu艂u LCD zarz膮dza zawarty w jego strukturze specjalizowany mikrokontroler jednouk艂adowy HD44780. To w艂a艣nie do jego zada艅 nale偶y komunikacja z systemem zewn臋trznym. Po odpowiednim przetworzeniu otrzymanej informacji generuje on (przy wykorzystaniu sterownika segmentowego HD4410U) zestaw sygna艂贸w potrzebnych od wysterowania panelu wy艣wietlania (LCD_PANEL).
Modu艂 wy艣wietlacza wyposa偶ony zosta艂 w uk艂ad wewn臋trznego inicjowania (ang. Innternal Reset Circuit). Dzi臋ki temu uk艂adowi mo偶liwa jest ka偶dorazowo po w艂膮czeniu zasilania samoczynna inicjalizacja systemu wy艣wietlacza. Warunkiem poprawnego przeprowadzenia tej operacji jest dotrzymanie odpowiednich warunk贸w, okre艣laj膮cych przebieg doprowadzonego napi臋cia zasilaj膮cego. I tak zbocze narastaj膮ce tego przebiegu nie mo偶e by膰 kr贸tsze ni偶 100 ps, ani te偶 trwa膰 d艂u偶ej ni偶 10 ms i poprzedza膰 go musi zanik napi臋cia zasilaj膮cego przez okres co najmniej 1 ms. w przypadku niedotrzymania tych zalece艅 konieczne staje si臋 przeprowadzenie inicjalizacji w spos贸b programowy przez system zewn臋trzny.
Uk艂ad cechuje si臋 minimalnym poborem mocy. Typowa warto艣膰 pr膮du obci膮偶enia wynosi 1,8 mA maksymalna 5 mA. Kompensacja temperaturowa (realizowana poprzez regulacj臋 napi臋cia V0) zapewnia uzyskanie obrazu o dobrej jako艣ci w zakresie od 0 do +50 掳C.
Kontroler modu艂u wy艣wietlacza ma do dyspozycji dwa rodzaje pami臋ci:
DDRAM (ang. Display Data RAM) - pami臋膰 obrazu o pojemno艣ci 2x40 bajt贸w, do kt贸rej nale偶y wpisywa膰 kody znak贸w przeznaczonych do wy艣wietlania. Kody te s膮 szczeg贸艂owo opisane w odpowiednich katalogach firmowych, w wi臋kszo艣ci przypadk贸w s膮 one zgodne z kodami ASCII. Ka偶dej linii wy艣wietlacza przyporz膮dkowano kolejne 40 bajt贸w obszaru pami臋ci obrazu, przy czym w trybie standardowym wy艣wietlanych jest pierwsze 16 znak贸w z ka偶dego banku. Tak wi臋c wpis znak贸w do linii drugiej musi si臋 rozpoczyna膰 od adresu 28h (40)!
CGRAM (ang. Character Generator RAM) - pami臋膰 generatora znakowego 0 pojemno艣ci 64 bajt贸w. pami臋膰 ta s艂u偶y do przechowywania znak贸w, kt贸rych kszta艂t okre艣lony zosta艂 przez u偶ytkownika. Do zapami臋tania pojedynczego znaku (5x7 punkt贸w) potrzebnych jest 8 bajt贸w. Ca艂a pami臋膰 wystarcza wi臋c do zdefiniowania 8 znak贸w, kt贸rych kody, przeznaczone do wpisania w odpowiednie miejsca pami臋ci obrazu, przyjmuj膮 warto艣ci od 0 do 7h.
Kontroler HD 44780 sterowany jest za pomoc膮 zestawu instrukcji, kt贸rych format prezentuje tabela 21.
Tabela 21.
Format instrukcji steruj膮cych.
Instrukcja |
Kod instrukcji |
|||||||||
|
RS |
R/W |
DB7 |
RB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
Clear Display |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
Cursor At Home |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
X |
Entry Mode Set |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
I/D |
S |
Display On/Off Control |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
D |
C |
B |
Cursor Display Schift |
0 |
0 |
0 |
0 |
0 |
1 |
S/C |
R/L |
X |
X |
Function Set |
0 |
0 |
0 |
0 |
1 |
DL |
N |
F |
X |
X |
CGRAM Address Set |
0 |
0 |
00 |
1 |
ACG |
|||||
DDRAM Address Set |
0 |
0 |
1 |
ADD |
||||||
Busy Flag/Address Read |
0 |
1 |
BF |
AC |
||||||
CGRAM/ADDRESS Data Write |
1 |
0 |
Write Data |
|||||||
CGRAM/ADDRESS Data Read |
1 |
1 |
Read Data |
Opis dzia艂ania instrukcji wyszczeg贸lnionych w tabeli 21:
Clear Display - s艂u偶y do wyczyszczenia panelu wy艣wietlania. Instrukcja ta odbywa si臋 przez wpisanie kod贸w spacji (20h) do wszystkich kom贸rek pami臋ci DDRAM. Licznik adres贸w ustawiany jest na 0 (co ka偶dorazowo poci膮ga za sob膮 przeniesienie kursora do pozycji pocz膮tkowej).
Cursor At Home - powoduje reset licznika adres贸w i umieszczenie danych o adresach Oh, 40h na pierwszych pozycjach kolejnych linii panelu wy艣wietlania. Symbol „x” oznacza, 偶e okre艣lony bit magistrali danych przyjmowa膰 mo偶e dowoln膮 warto艣膰.
Entry Mode Set - ustawia kierunek przesuni臋cia kursora (I/D - Increment / Decrement) oraz w艂膮cza / wy艂膮cza przesuwanie danych na wy艣wietlaczu (S - Shift). I/D = 1/0 - adres kursora (licznik adres贸w) jest odpowiednio zwi臋kszany /zmniejszany o jeden po ka偶dym zapisie lub odczycie danych.
S= 1/0 -w艂膮czenie / wy艂膮czenie jednoczesnego obrotu wy艣wietlanego stringu.
Display ON/OFF Control w艂膮cza/ wy艂膮cza (1/0) wy艣wietlanie poszczeg贸lnych element贸w.
D - ca艂o艣膰 obrazu
C - kursor
B - mruganie znaku w pozycji kursora
Cursor/Display Shift - przesuwa kursor / obraca wy艣wietlany string bez zmiany zawarto艣ci pami臋ci DDRAM.
S/C = 1 - obr贸t stringu
S/C =0 - przesuni臋cie kursora
R/L =1 - kierunek przesuwu / obrotu w prawo R/L =0 - kierunek przesuwu obrotu w lewo.
Functionn Set - pozwala na ustawienie podstawowych parametr贸w pracy interfejsu wy艣wietlacza.
DL = 1 - magistrala 8 bitowa
DL = 0 - magistrala 4 bitowa (pracuje przy wykorzystaniu linii DB4 - DB7, przes艂anie ka偶dego cyklu obejmuje dwa cykle starsza cz臋艣膰 przesy艂ana jest jako pierwsza.)
N - ustala ilo艣膰 wy艣wietlanych linii
N = 1 - aktywne dwie linie panelu wy艣wietlania N = 0 - aktywna jedna linia panelu wy艣wietlania
F (ang. Font) - definiuje matryc臋 pojedynczego znaku
f = 1 - 5x10 punkt贸w (operacja dost臋pna tylko w przypadku, gdy uaktywniono pojedyncz膮 lini臋 panelu wy艣wietlania)
F = 0 - 5x7 punkt贸w
CGRAM Adress Set ustawienie adresu pami臋ci generatora znak贸w (A0 - A5) w liczniku adres贸w. Po tej operacji pami臋膰 CGRAM jest dost臋pna do zapisu lub odczytu.
DDRAM Adress Set - ustawienie adresu pami臋ci obrazu (A0 - A6) w liczniku adres贸w. Po tej operacji pami臋膰 DDRAM jest dost臋pna do zapisu lub odczytu.
Busy Flag/Adress Read - odczyt zawarto艣ci licznika adres贸w (DBO - DB6) i flagi zaj臋to艣ci BF.
BF=1 - mikrokontroler zaj臋ty jest wykonywaniem operacji wewn臋trznej i do momentu zako艅czenia wykonywania danej instrukcji nie mo偶e podj膮膰 wsp贸艂pracy z systemem zewn臋trznym.
BF=0 - kontroler HD44780 jest got贸w do przyj臋cia kolejnej instrukcji.
CGRAM/DDRAM Data Write - zapis danych (DBO do DB7) do pami臋ci DDRAM, ewentualnie CGRAM
CGRAM/DDRAM Data Read - odczyt danych (DBO do DB7) z pami臋ci DDRAM, ewentualnie CGRAM
Odczytywanie flagi zaj臋to艣ci nie jest rzecz膮 konieczn膮, je艣li system zewn臋trzny uwzgl臋dnia czasy wykonywania poszczeg贸lnych instrukcji. W takim przypadku mo偶liwa jest praca modu艂u LCD w trybie transmisji jednokierunkowej. Z regu艂y czasy te mieszcz膮 si臋 w granicach 40p,s. Wyj膮tek stanowi膮 instrukcje Clear Display oraz At Home, kt贸re powoduj膮 zaj臋cie wewn臋trznego kontrolera maksymalnie na czas 1,64 ms.
Wy艣wietlacz jest sterowany z jednego uk艂adu PCF8574, co zmusza do korzystania z 4-bitowego trybu transmisji (ograniczona liczba wyj艣膰 portu). Pod艂膮czenie odpowiednich linii wy艣wietlacza przedstawia rysunek 48.
Rysunek 48.
Schemat pod艂膮czenia wy艣wietlacza.
Uproszczenie sprz臋towe pod艂膮czenia wy艣wietlacza (sterowany 8 bitami) komplikuje nieco programow膮 obs艂ug臋 modu艂u. Zbocze opadaj膮ce sygna艂u Enable realizuj膮ce zapis danych do uk艂adu musi by膰 wytwarzane w spos贸b softwerowy, poprzez dwukrotny zapis danych odpowiednio z „1” a nast臋pnie „0” na linii portu do艂膮czonej do wej艣cia Enable. Nieco d艂u偶szy staje si臋 te偶 zapis danych, kt贸re nale偶y wysy艂a膰 po 4 bitu w kolejno艣ci starsza a potem m艂odsza po艂owa bajtu. Przy inicjalizacji wy艣wietlacza nale偶y ustawi膰 wspomniany 4 bitowy tryb transmisji za pomoc膮 odpowiedniego rozkazu steruj膮cego.
3.4. Czujnik temperatury LM35
Opis og贸lny
Uk艂ady z rodziny LM35 s膮 precyzyjnymi scalonymi czujnikami temperatury, kt贸rych sygna艂 wyj艣ciowy jest liniowo proporcjonalny do temperatury w stopniach Celsjusza. Uk艂ady LM35 maj膮 dodatkow膮 przewag臋 nad liniowymi czujnikami temperatury kalibrowanymi w Kelvinach, poniewa偶 u偶ytkownik nie potrzebuje odejmowa膰 du偶ego sta艂ego napi臋cia, aby uzyska膰 wyniku w por臋cznej skali stustopniowej. Uk艂ad LM35 nie wymaga 偶adnej zewn臋trznej kalibracji ani korekcji dla uzyskania typowych dok艂adno艣ci 卤0,25掳C w temperaturze pokojowej i 卤0,75掳C w ca艂ym zakresie temperatur od -55 do +150掳C. Nisk膮 cen臋 zapewnia korygowanie i kalibracja na poziomie struktury p贸艂przewodnikowej. Ma艂a impedancja wyj艣ciowa, liniowo艣膰 sygna艂u wyj艣ciowego oraz precyzyjna autokorekcja uk艂adu LM35 powoduj膮, 偶e jego sprz臋ganie z uk艂adami odczytu lub sterowania jest szczeg贸lnie proste. Uk艂ad LM35 mo偶e by膰 stosowany przy zasilaniu pojedynczym napi臋ciem lub symetrycznie (napi臋ciem dodatnim i ujemnym). Poniewa偶 ze 藕r贸d艂a zasilania pobiera tylko 60碌A, jego samonagrzewanie jest bardzo ma艂e, mniejsze ni偶 0,1掳C w nieruchomym powietrzu. Uk艂ad LM35 jest przeznaczony do pracy w zakresie temperatur od -55 do +150掳C. Uk艂ad LM35 montowany jest w hermetycznych obudowach tranzystorowych TO92 (rys. 49).
Rysunek 49.
Rozmieszczenie wyprowadze艅 LM35DZ.
Rysunek 50.
Uk艂ad pracy w systemie.
W艂a艣ciwo艣ci
Kalibracja bezpo艣rednio w 掳C,
Liniowy wsp贸艂czynnik skali +10mV/掳C,
Gwarantowana dok艂adno艣膰 0,5掳C (przy 25掳C),
Mo偶liwo艣膰 pracy w pe艂nym zakresie temperatur od -55 do +150掳C,
Przydatno艣膰 dla zdalnych zastosowa艅,
Niska cena wynikaj膮ca z korekcji na poziomie struktury p贸艂przewodnikowej,
Zakres napi臋膰 zasilania od 4 do 30V,
Pob贸r pr膮du mniejszy ni偶 60碌A,
Ma艂e samonagrzewanie, 0,08掳C w nieruchomym powietrzu,
Typowa nieliniowo艣膰 tylko 卤0,25掳C,
Ma艂a impedancja wyj艣ciowa, 0,1惟 przy obci膮偶eniu 1mA.
Zastosowanie
Wyj艣cie powy偶szego uk艂adu zosta艂o pod艂膮czone do jednego z wej艣膰 przetwornika A/C, wbudowanego w struktur臋 procesora `552. Zmiany napi臋cia na wyj艣ciu uk艂adu LM35, powsta艂e na skutek zmian temperatury samego uk艂adu s膮 pr贸bkowane przez przetwornik A/C. Nast臋pnie wynik konwersji zapisywany do odno艣nych rejestr贸w 碌K.
ROZDZIA艁 4
INterfejs i2C do komputera PC
4.1. Informacje o programie i interfejsie sprz臋towym
Projekt interfejsu wykorzystuje r贸wnoleg艂y port komputera. Korzysta on z rejestru danych, rejestru wyj艣ciowego (steruj膮cego) i rejestru wej艣ciowego portu. Oto wykorzystane bity poszczeg贸lnych rejestr贸w:
________ __________
SCL OUT - AUTOFEED Control LPT (037Ah) bit 1
SCL IN - PAPER END In LPT (0379h) bit 5
SDA OUT - DATA 7 Out LPT (0378h) bit 7
SDA IN - SELECT In LPT (0379h) bit 4
Takie wykorzystanie rejestr贸w portu umo偶liwia korzystanie r贸wnie偶 z komputer贸w, kt贸re nie s膮 wyposa偶one w modny obecnie, dwukierunkowy port LPT.
W zasadzie uk艂ad sprz臋towy urz膮dzenia m贸g艂by zosta膰 pomini臋ty, jednak偶e buforuje on port komputera, zabezpieczaj膮c go tym samym przed ewentualnym uszkodzeniem oraz powoduje sprz臋tow膮 negacj臋 sygna艂u SCL OUT.
Program steruj膮cy urz膮dzeniem powsta艂 w zasadzie jako program bardzo og贸lny, nie przeznaczony do jakich艣 konkretnych zastosowa艅. Mo偶e on wraz z interfejsem s艂u偶y膰 mi臋dzy innymi jako tester magistrali I2C (po od艂膮czeniu procesora steruj膮cego od szyny), tester uk艂ad贸w wyposa偶onych w interfejs I2C, jako kopiarka zawarto艣ci pami臋ci, programator pami臋ci EEPROM itp., a wi臋c w zastosowaniach raczej serwisowych, np. sprz臋tu RTV. W odr贸偶nieniu od typowych uk艂ad贸w do testowania magistrali I2C zbudowanych najcz臋艣ciej w oparciu o mikrokontrolery jednouk艂adowe, program ten np. umo偶liwia przechowywanie przez bardzo d艂ugi czas wynik贸w odczyt贸w pami臋ci czy innych uk艂ad贸w w postaci zbior贸w na dysku, ich 艂atw膮 modyfikacj臋, ponowny zapis i jest na pewno bardziej elastyczny, je艣li chodzi o udoskonalenia i modyfikacje.
Poniewa偶 jest to program w przewa偶aj膮cej cz臋艣ci (bez funkcji obs艂ugi szyny I2C, napisanych w asemblerze) napisany w j臋zyku wysokiego poziomu (Borland C++ ver.3.1 dla Windows) jest on wzgl臋dnie wolny. Pr臋dko艣膰 przesy艂ania danych mo偶e wynosi膰 do kilku tysi臋cy bit贸w na sekund臋. Zale偶y ona r贸wnie偶 od typu komputera. Nie ma to jednak wi臋kszego znaczenia ze wzgl臋du na dwie rzeczy:
po pierwsze, pojemno艣膰 pami臋ci uk艂ad贸w do艂膮czanych poprzez magistral臋 I2C wynosi do 16kB, co mo偶e powodowa膰 wyd艂u偶enie czasu transmisji co najwy偶ej do kilku sekund;
po drugie, to program generuje przebieg zegarowy, pracuj膮c w trybie MASTER.
Poniewa偶 p臋tle op贸藕niaj膮ce (czas pomi臋dzy zboczami impuls贸w SDA i SCL oraz czasy oczekiwania na ACK) generowane s膮 jako p臋tle programowe, czas ich wykonania zale偶y od typu komputera, o czym wspomniano powy偶ej. Warto艣ciami wbudowanymi w program, okre艣laj膮cymi czas ich trwania s膮 odpowiednio 100 i 1000. S膮 to wielko艣ci zapewniaj膮ce poprawne dzia艂anie programu z komputerem AMD K6-2 333MHz. Gdyby czasy te okaza艂y si臋 za kr贸tkie, nale偶y za pomoc膮 dowolnego edytora tekstowego utworzy膰 zbi贸r o nazwie i2c.cfg i wpisa膰 do niego odpowiednie czasy w spos贸b nast臋puj膮cy ( na przyk艂ad dla 10 i 100):
10
100
sa
ssa
bc
sh
Akceptowane liczby to 0-65535.
Symbole umieszczone poni偶ej sta艂ych okre艣laj膮cych czasy op贸藕nie艅 odpowiadaj膮 kolejnym parametrom zapami臋tywanym w zbiorze, odpowiednio:
sa - slave address: adres urz膮dzenia podporz膮dkowanego
ssa - slave subaddress: subadres kom贸rki;
bc - byte count: liczba bit贸w przesy艂anych;
sh - show: widoczne klawisze, je艣li 1.
Dane te s膮 zapami臋tywane, je艣li tylko istnieje na dysku zbi贸r i2c.cfg (nie jest on tworzony automatycznie). Wszystkie one powinny by膰 zapisane dziesi臋tnie.
Program obs艂uguje standardow膮 transmisj臋 poprzez z艂膮cze I2C - 7-mio bitowy adres urz膮dzenia (mo偶liwo艣膰 zaadresowania do 127 uk艂ad贸w), 14-to bitowy subadres, kt贸ry mo偶e by膰 wysy艂any lub nie (mo偶liwo艣膰 adresowania 16384 kom贸rek uk艂adu). Jak wspomniano powy偶ej, pracuje on w trybie MASTER, to znaczy zawsze rozpoczyna i ko艅czy transmisj臋 oraz generuje sygna艂 zegarowy.
Formaty transmisji realizowane przez program:
Do wsp贸艂pracy mi臋dzy komputerem (gniazdem CENTRONICS) a szyn膮 I2C niezb臋dny jest interfejs. Zbudowany zosta艂 on w oparciu o uk艂ad TTL 74LS06 (mo偶liwe jest zastosowanie innego negatora z otwartym kolektorem).
Rysunek 51.
Schemat interfejsu.
Dok艂adniejsze informacje na temat dzia艂ania i obs艂ugi programu mo偶na znale藕膰 w plikach Pomocy.
4.2. Przyk艂adowe 膰wiczenia z wykorzystaniem konsoli
Program „Obs艂uga z艂膮cza I2C” umo偶liwia zapis i odczyt danych z uk艂ad贸w pod艂膮czonych do magistrali emuluj膮c przez port r贸wnoleg艂y uk艂ad nadrz臋dny. Opr贸cz ciekawego interfejsu graficznego aplikacja posiada szereg dogodnych funkcji m.in. automatyczne rozpoznawanie adres贸w urz膮dze艅 pod艂膮czonych do magistrali I2C, ustalanie subadresu oraz ilo艣ci transmitowanych danych bajt贸w, przesy艂anie danych z i do bufora, kt贸rego zawarto艣膰 mo偶e by膰 edytowana i wiele innych opisanych szczeg贸艂owo w oknie pomocy. Zainicjowanie sesji komunikacyjnej na magistrali I2C powinno odbywa膰 wed艂ug poni偶szego algorytmu:
przeprowadzeniu testu interfejsu i rozpoznaniu pod艂膮czonych uk艂ad贸w (okna „Test interfejsu”, „Test systemu I2C” w menu „Opcje”)
wybraniu adresu uk艂adu z kt贸rym ma nast膮pi膰 komunikacja, ustaleniu subadresu oraz ilo艣ci przesy艂anych bajt贸w (okno „Parametry transmisji” w menu „Opcje”)
wpisaniu odpowiednich danych do bufora w przypadku zapisu b膮d藕 wyczyszczenie bufora przy operacji odczytu (polecenia „Edytuj”, „Czy艣膰” w menu „Bufor” )
rozpocz臋ciu transmisji (polecenia „Prze艣lij...”:”Odczytaj z urz膮dzenia”, „Zapisz do urz膮dzenia” w menu „Bufor”)
sprawdzeniu zawarto艣ci bufora po odczycie danych
Program musi dzia艂a膰 przy wy艂膮czonym sterowaniu systemu przez mikrokontroler. Ma to miejsce gdy po naci艣ni臋ciu przycisku „/” na wy艣wietlaczu pojawia si臋 napis „SLAVE” co oznacza i偶 kontroler przeszed艂 w tryb pracy urz膮dzania podrz臋dnego i zwolni艂 linie magistrali. Przywr贸cenie normalnej pracy systemu jest mo偶liwe jedynie poprzez wy艂膮czenie zasilania.
W przypadku poprawnego dzia艂ania magistrali program rozpoznaje nast臋puj膮ce adresy urz膮dze艅:
adres |
uk艂ad |
|
wy艣wietlacz* |
42h |
klawiatura* |
46h |
klawiatura* |
4Eh |
linijka diodowa* |
A0h |
zegar czasu rzeczywistego |
Aeh |
pami臋膰 typu EEPROM |
膯wiczenie 1
Dokonaj odpowiednich czynno艣ci aby zapali膰 na przemian diody w kolejno艣ci
zapalona-zgaszona („1”-dioda zgaszona, „0”-zapalona)
膯wiczenie 2
Przeprowad藕 zapis pi臋ciu danych: 24h, A8h, 00h, BDh, F2h do pami臋ci EEPROM pocz膮wszy od lokacji B7h, a nast臋pnie sprawd藕 poprawno艣膰 transmisji poprzez odczytanie zapisanych danych. Drugiego odczytu dokonaj po ponownych w艂膮czeniu zasilania aby sprawdzi膰 czy informacje te s膮 nieulotne.
膯wiczenie 3
Sprawd藕 kt贸re klawisze obs艂ugiwane s膮 przez odpowiednio uk艂ady dost臋pne pod adresami 42h i 46h. Por贸wnaj obserwacje z poni偶sz膮 tabel膮. Jak膮 warto艣膰 odczytujemy gdy 偶aden z klawiszy nie jest naci艣ni臋ty. Jakie warto艣ci otrzymujemy po naci艣ni臋ciu np. klawiszy:
*, Del, +, 1.
Adres uk艂adu 42h Adres uk艂adu 46h
klawisz |
kod klawisza |
|
klawisz |
kod klawisza |
||
„0” |
FEh |
1111 1110b |
|
„8” |
FEh |
1111 1110b |
„1” |
FDh |
1111 1101b |
|
„9” |
FDh |
1111 1101b |
„2” |
FBh |
1111 1011b |
|
„/” |
FBh |
1111 1011b |
„3” |
F7h |
1111 0111b |
|
„*” |
F7h |
1111 0111b |
„4” |
EFh |
1110 1111b |
|
„-” |
EFfh |
1110 1111b |
„5” |
DFh |
1101 1111b |
|
„+” |
DFh |
1101 1111b |
„6” |
BFh |
1011 1111b |
|
„Ent” |
BFh |
1011 1111b |
„7” |
7Fh |
0111 1111b |
|
„Del” |
7Fh |
0111 1111b |
膯wiczenie 4
Dokonaj odpowiedniej modyfikacji rejestru minut i godzin uk艂adu zegara czasu rzeczywistego (patrz opracowanie) tak aby po ponownym w艂膮czeniu systemu do normalnej pracy wskazywa艂 godzin臋 23:57, sprawd藕 czy po przekroczeniu godziny 00:00 zostanie automatycznie zmodyfikowana zawarto艣膰 rejestru dni miesi膮ca (zaobserwuj to na wy艣wietlaczu po ponownym w艂膮czeniu systemu)
膯wiczenie 5
Wy艣lij niezb臋dne dane aby wyczy艣ci膰 wy艣wietlacz (wys艂anie 4 kolejnych bajt贸w pod odpowiedni adres). Nast臋pnie wysy艂aj膮c po 4 bajty (ograniczenie wynikaj膮ce z szybko艣ci dzia艂ania magistrali i wy艣wietlacza) utw贸rz na ekranie
przyk艂adowy napis np.: DOM korzystaj膮c z poni偶szego zestawienia
Rozkazy steruj膮ce:
dzia艂anie |
kod operacji |
|
czyszczenie wy艣wietlacza |
0100 0000b |
40h |
|
0000 0000b |
00h |
|
0100 0001b |
41h |
|
0000 0001b |
01h |
powr贸t kursora |
0100 0000b |
40h |
|
0000 0000b |
00h |
|
0100 0010b |
42h |
|
0000 0010b |
02h |
ukrycie kursora |
0100 0000b |
40h |
|
0000 0000b |
00h |
|
0100 1100b |
4Ch |
|
0000 1100b |
0Ch |
Przyk艂adowe dane
klawisz |
kod |
|
klawisz |
kod |
||
A |
0101 0100b |
54h |
|
O |
0101 0100b |
54h |
|
0001 0100b |
14h |
|
|
0001 0100b |
14h |
|
0101 0001b |
51h |
|
|
0101 1111b |
5Fh |
|
0001 0001b |
11h |
|
|
0001 1111b |
1Fh |
D |
0101 0100b |
54h |
|
X |
0101 0101b |
55h |
|
0001 0100b |
14h |
|
|
0001 0101b |
15h |
|
0101 0100b |
54h |
|
|
0101 1000b |
58h |
|
0001 0100b |
14h |
|
|
0001 1000b |
18h |
M |
0101 0100b |
54h |
|
Z |
0101 0101b |
55h |
|
0001 0100b |
14h |
|
|
0001 0101b |
15h |
|
0101 1101b |
5Dh |
|
|
0101 1010b |
5Ah |
|
0001 1101b |
1Dh |
|
|
0001 1010b |
1Ah |
Literatura
Elektronika Praktyczna. Roczniki: 1994, 1996, 1999, 2000.
Ga艂ka Piotr, Ga艂ka Pawe艂, Podstawy programowania mikrokontrolera 8051, Warszawa 1995, Zak艂ad Nauczania Informatyki „MIKOM”
Lula Ireneusz, Zeszyty serwisowe - magistrala I2C, Gda艅sk 1999, Biuro Opracow艅 i Wdro偶e艅 Elektroniki „Jupitel” s.c.
Mielczarek Wojciech, Szeregowe interfejsy cyfrowe, Gliwice 1993, Wydawnictwo Helion
Rydzewski Andrzej, Mikrokomputery jednouk艂adowe rodziny MCS-51, Warszawa 1999, Wydawnictwa Naukowo-Techniczne
St臋pnie艅 Cezary, Mikroprocesory firmy Intel, Warszawa 1992, Wydawnictwo Naukowe PWN
Dodatek
Schemat p艂ytki drukowanej mikrokontrolera i rozmieszczenie element贸w
Listing programu dla 80C552 zapisanego w pami臋ci EEPROM
Ca艂o艣膰 oprogramowania mikrokontrolera zosta艂a napisana przez autor贸w niniejszej pracy.
;************** program '552 ***********
org 000h
ljmp start
org 003h ;int0
ljmp int_0
org 00bh ;przerwanie od T0
ljmp int_t0
org 013h ;int1
ljmp int_1
org 02bh ;i2c
ljmp i2cint
org 100h
start:
mrd equ 5fh
mtd equ 60h
numbyt equ 5ah
sla equ 5bh
hadd equ 5dh
backup equ 5eh
i2cerr bit 20h.0
i2c_busy bit 20h.1
nostop bit 20h.2 ;--------
flaga1 bit 20h.3
flaga2 bit 20h.4
tryb_t bit 20h.5
sla1 equ 6dh
sla2 equ 6eh
numbyt1 equ 6fh
numbyt2 equ 70h
zegar equ 61h
diody equ 62h
pamiec equ 63h
wysw equ 64h
klaw1 equ 65h
klaw2 equ 66h
zegar2 equ 67h
diody2 equ 68h
pamiec2 equ 69h
wysw2 equ 6ah
klaw12 equ 6bh
klaw22 equ 6ch
mov zegar,#0a0h ;adresy urzadzen i2c
mov diody,#4eh ;(zapis)
mov pamiec,#0aeh
mov wysw,#40h
mov klaw1,#42h
mov klaw2,#46h
mov zegar2,#0a1h ;adresy urzadzen i2c
mov diody2,#4fh ;(odczyt)
mov pamiec2,#0afh
mov wysw2,#41h
mov klaw12,#43h
mov klaw22,#47h
mov mtd,#30h ;parametry inicjalizujace
mov mrd,#45h
mov hadd,#04h
lcall i2cinit
lcall diod_test
lcall lcd_init
lcall qtest
lcall int_init
lcall zeg_init
lcall t0_init
clr tryb_t
;-------------------------------------------------------
;-------------------------------------------------------
petla: ljmp petla
;----------------------------------------------
;----------------------------------------------
delay:
mov r2,#07h ;9
petla1: mov r3,#0ffh
petla12:mov r4,#0ffh
petla13:djnz r4,petla13
djnz r3,petla12
djnz r2,petla1
ret
delay2:
mov r2,#02fh ;r5 ;4F
petla2: mov r3,#0ffh ;r6
petla3: djnz r3,petla3 ;r6
djnz r2,petla2 ;r5
ret
delay3:
mov r2,#0ffh ;r5 ;=5f
ptla2: mov r3,#0ffh ;r6
ptla3: djnz r3,ptla3 ;r6
djnz r2,ptla2 ;r5
ret
delay4:
mov r2,#03h
pe1: mov r3,#0ffh
pe12:mov r4,#0ffh
pe13:djnz r4,pe13
djnz r3,pe12
djnz r2,pe1
ret
;-----
diod_test:
clr c
mov a,#0ffh
mov r5,#9
powrd: ;setb c
rlc a
;setb c
mov 30h,a
mov r6,a
mov numbyt1,#1
mov sla1,diody
lcall zapis
lcall delay3
mov a,r6
setb c
djnz r5,powrd
ret
;------
lcd_init: ;inicjalizacja wyswietlacza
lcall delay
mov 30h,#01000010b
mov 31h,#00000010b
mov 32h,#01000010b ;function set
mov 33h,#00000010b
mov 34h,#01000000b
mov 35h,#00000000b
mov 36h,#01000000b
mov 37h,#00000000b ;clear display
mov 38h,#01000001b
mov 39h,#00000001b
mov numbyt1,#10
mov sla1,wysw
lcall zapis
mov 30h,#01000000b
mov 31h,#00000000b
mov 32h,#01001100b
mov 33h,#00001100b ;display on/off
mov numbyt1,#4
mov sla1,wysw
lcall zapis
ret
;-------
kursor0: ;powrot kurora
mov 30h,#01000000b
mov 31h,#00000000b
mov 32h,#01000010b
mov 33h,#00000010b
mov numbyt1,#4
mov sla1,wysw
lcall zapis
ret
;-------
czysc:
mov 30h,#01000000b
mov 31h,#00000000b ;clear display
mov 32h,#01000001b
mov 33h,#00000001b
mov numbyt1,#4
mov sla1,wysw
lcall zapis
ret
;-------
qtest:
mov 30h,#01010100b
mov 31h,#00010100b
mov 32h,#01011111b
mov 33h,#00011111b ;OK
mov 34h,#01010100b
mov 35h,#00010100b
mov 36h,#01011011b
mov 37h,#00011011b
mov numbyt1,#8
mov sla1,wysw
lcall zapis
lcall delay
lcall delay
mov 30h,#01000000b
mov 31h,#00000000b ;clear display
mov 32h,#01000001b
mov 33h,#00000001b
mov numbyt1,#4
mov sla1,wysw
lcall zapis
ret
;-------
int_init:
clr flaga1
clr flaga2
clr px1
clr px0
orl ien0,#10000101b
ret
;-------
dwukr:
mov 30h,#01010011b
mov 31h,#00010011b
mov 32h,#01011010b
mov 33h,#00011010b ;OK
mov numbyt1,#4
mov sla1,wysw
lcall zapis
ret
;-------
kropka:
mov 30h,#01010010b
mov 31h,#00010010b
mov 32h,#01011110b
mov 33h,#00011110b ;OK
mov numbyt1,#4
mov sla1,wysw
lcall zapis
ret
;-------
nap_sl:
mov 30h,#0ffh
mov numbyt1,#1 ;wygas diody
mov sla1,diody
lcall zapis
lcall czysc
;napis slave
mov 30h,#01010101b ;SL
mov 31h,#00010101b
mov 32h,#01010011b
mov 33h,#00010011b
mov 34h,#01010100b
mov 35h,#00010100b
mov 36h,#01011100b
mov 37h,#00011100b
mov numbyt1,#8
mov sla1,wysw
lcall zapis
;AV
mov 30h,#01010100b
mov 31h,#00010100b
mov 32h,#01010001b
mov 33h,#00010001b
mov 34h,#01010101b
mov 35h,#00010101b
mov 36h,#01010110b
mov 37h,#00010110b
mov numbyt1,#8
mov sla1,wysw
lcall zapis
;E
mov 30h,#01010100b
mov 31h,#00010100b
mov 32h,#01010101b
mov 33h,#00010101b
mov numbyt1,#4
mov sla1,wysw
lcall zapis
ret
;-------
displ_on:
mov 30h,#01000000b
mov 31h,#00000000b
mov 32h,#01001100b
mov 33h,#00001100b ;display on
mov numbyt1,#4
mov sla1,wysw
lcall zapis
ret
displ_off:
mov 30h,#01000000b
mov 31h,#00000000b
mov 32h,#01001000b
mov 33h,#00001000b ;display off
mov numbyt1,#4
mov sla1,wysw
lcall zapis
ret
;-------
czas:
lcall bcd_ascii2
mov r2,a
anl a,#11110000b
rl a
rl a
rl a
rl a
mov 30h,#01010000b
orl 30h,a
mov 31h,#00010000b
orl 31h,a
mov a,r2
anl a,#00001111b
mov 32h,#01010000b
orl 32h,a
mov 33h,#00010000b
orl 33h,a
mov numbyt1,#4
mov sla1,wysw
lcall zapis
mov a,b
mov r2,a
anl a,#11110000b
rl a
rl a
rl a
rl a
mov 30h,#01010000b
orl 30h,a
mov 31h,#00010000b
orl 31h,a
mov a,r2
anl a,#00001111b
mov 32h,#01010000b
orl 32h,a
mov 33h,#00010000b
orl 33h,a
mov numbyt1,#4
mov sla1,wysw
lcall zapis
ret
bcd_ascii2: ;push r2
mov b,a
anl a,#11110000b
rl a
rl a
rl a
rl a
add a,#48
mov r2,a
anl b,#00001111b
mov a,b
add a,#48
mov b,a
mov a,r2
;pop r2
ret
;-------
t0_init:
mov r7,#0dh
orl ien0,#10000010b
clr pt0
mov th0,#0h
mov tl0,#0h
orl tmod,#00000001b
setb tr0
ret
;-------
zeg_init:
mov 30h,#00
mov 31h,#00001000b
mov numbyt1,#2
mov sla1,zegar
lcall zapis
ret
;-------
odczyt:
setb i2c_busy
mov numbyt,numbyt1 ;ilo啪扭 transmitowanych danych
mov sla,sla1 ;adres uk'adu podrz`dnego
clr i2cerr ;zerowanie flagi b'`du magistarali
setb sta ;inicjacja odczytu
odczyt1: jnb i2cerr,odczyt11
mov a,#0ffh
ret
odczyt11: mov a,numbyt
jnz odczyt1
mov numbyt,numbyt2 ;odczyt x bajt藰w
mov sla,sla2 ;adres uk'adu podrz`dnego
clr i2cerr
setb sta
odczyt2: jnb i2cerr,odczyt21
mov a,#0ffh
ret
odczyt21: mov a,numbyt
jnz odczyt2
clr i2c_busy
ret
;--------
zapis:
setb i2c_busy
mov numbyt,numbyt1 ;wys'anie subadresu i bajt藰w
mov sla,sla1 ;adres uk'adu podrz`dnego
clr i2cerr
setb sta ;inicjacja zapisu
zapis1: jnb i2cerr,zapis11
ret
zapis11:mov a,numbyt
jnz zapis1
lcall delay2
clr i2c_busy
ret
;-------- proceduty obslugi I2C ---------------
; uzyty 0 bank rejestrow
org 400h
baza:
org baza+00h ;obs'uga b'edu magistrali
mov s1con,#0d4h
setb i2cerr ;ustaw flag` bl`du
pop psw
reti
org baza+08h ;start transmisji
mov s1dat,sla
mov s1con,#0c4h
ajmp initbase
org baza+010h ;start powt藰rzony
mov s1dat,sla
mov s1con,#0c4h
ajmp initbase
org baza+018h ;po wys'aniu adresu urzadzenia podrz`dnego
;mov psw,#08h ;odebrano potwierdzenie
mov s1dat,@r1
ajmp con
org baza+020h ;po wys'aniu adresu urz†dzenia podrz`dnego
mov s1con,#0d4h ;brak potwierdzenia
setb i2cerr ;ustaw znacznik b'`du
pop psw
reti
org baza+028h ;wys'any kolejny bajt danych
djnz numbyt,notldat1 ;odebrano potwierdzenie
mov s1con,#0d4h ;ustawienie STOP
ajmp retmt
org baza+030h ;po wys'aniu bajtu danych nie odebrano
mov s1con,#0d4h ;potwierdzenia
setb i2cerr
pop psw
reti
org baza+038h ;utracony arbitrarz magistrali
mov s1con,#0e4h
mov numbyt,backup
ajmp retmt
org baza+040h ;zapocz†tkowanie odbioru bajt藰w
mov s1con,#0c4h ;trybie master
pop psw
reti
org baza+048h ;brak potwierdzenia po wys'aniu adresu
;urz†dzenia podrz`dnego majacego nadawac
stop: mov s1con,#0d4h
setb i2cerr
pop psw
reti
org baza+050h ;odebrany bajt z urzadzenia podporz†dkowanego
;mov psw,#08h
mov @r0,s1dat
ajmp rec1
org baza+058h ;bajt zosta' odebrany
;mov psw,#08h ;potwierdzenia nie bedzie
mov @r0,s1dat
ajmp stop
i2cinit: ;procedura inicjalizacji z'†cza i2c
mov s1adr,#031h
setb p1.6
setb p1.7
orl ien0,#0a0h
setb ps1 ;clr ;------ustawic na 1
mov s1con,#0c4h
ret
i2cint: ;procedury przerwania z'†cza i2c
push psw
push s1sta
push hadd
mov psw,#00011000b ;-----
ret
initbase:
;mov psw,#08h
mov r1,mtd ;+a
mov r0,mrd ;+a
mov backup,numbyt
pop psw
reti
notldat1:
;mov psw,#08h
mov s1dat,@r1
con: mov s1con,#0c4h
inc r1 ;+a
retmt:
pop psw
reti
rec1:
djnz numbyt,notldat2
mov s1con,#0c0h
ajmp retmr
notldat2: mov s1con,#0c4h
retmr: inc r0 ;+a
pop psw
reti
;--------
;procedury obslugi przerwan int0 i int1
int_0: ;obsluga prawej klawiatury
wait1: jb i2c_busy,wait1
mov numbyt1,#1
mov sla1,klaw22
lcall zapis
jb flaga1,omin1
setb flaga1
mov a,45h
mov dptr,#600h
clr c
subb a,#127
movc a,@a+dptr
mov r4,a
mov dptr,#704h
movc a,@a+dptr
mov dptr,#718h
jmp @a+dptr ;tablica akcji
powrt1:
;wyswietlenie kodu klawisza
mov a,r4
mov 30h,a
mov numbyt1,#1
mov sla1,diody
lcall zapis
ljmp etyk1
omin1: clr flaga1
etyk1:
lcall delay3
reti
;-----
int_1: ;osluga lewej strony klawiatury
wait2: jb i2c_busy,wait2
mov numbyt1,#1
mov sla1,klaw12
lcall zapis
jb flaga2,omin2
setb flaga2
mov a,45h
mov dptr,#682h
clr c
subb a,#127
movc a,@a+dptr
mov r4,a
mov dptr,#704h
movc a,@a+dptr
mov dptr,#718h
jmp @a+dptr ;tablica akcji
powrt2:
mov a,r4 ;wyswietlenie kodu klawisza
mov 30h,a
mov numbyt1,#1
mov sla1,diody
lcall zapis
ljmp etyk2
omin2: clr flaga2
etyk2:
lcall delay3
reti
;--------
org 600h ;int0 - prawa
tablica1: ;kody klawiszy
org tablica1+00
db 15 ;del
org tablica1+64
db 14 ;enter
org tablica1+96
db 13 ;+
org tablica1+112
db 12 ;-
org tablica1+120
db 11 ;*
org tablica1+124
db 10 ;/
org tablica1+126
db 09 ;"9"
org tablica1+127
db 08 ;"8"
org 682h ;int1 - lewa
tablica2: ;kody klawiszy
org tablica2+00
db 07 ;"7"
org tablica2+64
db 06 ;"6"
org tablica2+96
db 05 ;"5"
org tablica2+112
db 04 ;"4"
org tablica2+120
db 03 ;"3"
org tablica2+124
db 02 ;"2"
org tablica2+126
db 01 ;"1"
org tablica2+127
db 00 ;"0"
org 704h ;wektoryzacja obslugi klawiatury
dzialanie:
db 00 ;"0"
db 16 ;"1"
db 32 ;"2"
db 48 ;"3"
db 64 ;"4"
db 80 ;"5"
db 96 ;"6"
db 112 ;"7"
db 128 ;"8"
db 144 ;"9"
db 160 ;"/"
db 176 ;"*"
db 192 ;"-"
db 208 ;"+"
db 224 ;"enter"
db 240 ;"del"
org 718h ;realizowana akcja
bazowy:
org bazowy+00 ;"0"
setb tryb_t
lcall czysc
ljmp powrt1
org bazowy+16 ;"1"
clr tryb_t
ljmp powrt1
org bazowy+32 ;"2"
ljmp powrt1
org bazowy+48 ;"3"
ljmp powrt1
org bazowy+64 ;"4"
ljmp powrt1
org bazowy+80 ;"5"
ljmp powrt1
org bazowy+96 ;"6"
ljmp powrt1
org bazowy+112 ;"7"
ljmp powrt1
org bazowy+128 ;"8"
ljmp powrt2
org bazowy+144 ;"9"
ljmp powrt2
org bazowy+160 ;"/"
lcall nap_sl ;tryb slave
clr ens1
ljmp powrt2
org bazowy+176 ;"*"
ljmp powrt2
org bazowy+192 ;"-"
lcall displ_off ;zgas wyswitlacz
ljmp powrt2
org bazowy+208 ;"+"
lcall displ_on ;zaswiec wyswietlacz
ljmp powrt2
org bazowy+224 ;"enter"
ljmp powrt2
org bazowy+240 ;"del"
ljmp powrt2
int_t0:
djnz r7, koniec
mov r7,#0dh
jb tryb_t,dzien
mov 30h,#02h ;odczyt godziny
mov numbyt1,#1
mov sla1,zegar
mov numbyt2,#3
mov sla2,zegar2
lcall odczyt
mov a,47h
lcall czas
lcall dwukr
mov a,46h
lcall czas
lcall dwukr
mov a,45h
lcall czas
lcall kursor0
reti
dzien:
mov 30h,#05h ;odczyt daty
mov numbyt1,#1
mov sla1,zegar
mov numbyt2,#2
mov sla2,zegar2
lcall odczyt
mov a,45h
lcall czas
lcall kropka
mov a,46h
lcall czas
lcall kropka ;-----
lcall kursor0
reti
koniec:
reti
end
OBS艁UGA PRZETWORNIKA A/C
; ----------- obsluga przetwornika AC -------
;x
hbajtad equ
lbajtad equ
;x
program:
anl adcon,#11111000b ;wybor do konwersji wej 0 multipleksera
anl adcon,#11011111b ;start konwersji niezalezny od stanu
;wejscia STADC
konw1: anl adcon,#11101111b ;kasowanie flagi zakonczenia konwersji
orl adcon,#00001000b ;start nowej konwersji AC
konw2: mov a,adcon ;oczekiwanie na zakonczenie konwersji
jnb acc.4,konw2
mov hbajtad,#0
mov lbatad,adch
mov r1,#2
konw3: clr c ;formowanie mlodszego i starszego bajtu
;liczby 10 bitowej
mov a,lbajtad ;otrzymanej po konwersji AC
rlc a
mov lbajtad,a
mov a,hbajtad
rlc a
mov hbajtad,a
djnz r1,konw3
mov a,lbajtad
mov a,adcon
anl a,#11000000b
rl a
rl a
orl a,lbajtad
mov lbajtad,a
mov r1,#0ffh
konw4: clr c ;przeksztelcenie liczby 10 bitowej do
;postaci dziesietnej
inc r1
mov a,lbajtad
subb a,#100
mov lbajtad,a
mov a,hbajtad
subb a,#0
mov hbajtad,a
jnc konw4
mov a,lbajtad
add a,#100
mov lbajtad,a
mov a,r1 ;znana jest juz liczba tysiecy i setek
cjne a,#10,konw5
mov wys1,#1
mov wys2,#0
jmp konw6
konw5: mov wys1,#0
mov wys2,a
konw6: mov a, lbajtad ;obliczanie liczby dziesiatek i jednosci
mov b,#10
div ab
mov wys3,a
mov wys4,b
jmp konw1
;x
end
C. Oprogramowanie na dyskietce
Dyskietka zawiera program „Obs艂uga I2C przez port r贸wnoleg艂y”, dzia艂aj膮cy w systemie Windows. Plik `I2C_soft' stanowi samorozpakowywuj膮ce archiwum.
1
1
Spis tre艣ci
2
Wst臋p i cel pracy
3
39
Rozdzia艂 2
70
20:33:0320:33:04Rozdzia艂 3
76
Rozdzia艂 4
77
Literatura
89
Dodatek
*modu艂y te s膮 sterowane czterema uk艂adami PCF 8274 (8 bitowy port dla magistrali I2C ) o r贸偶nych adresach sprz臋towych. W przypadku komunikacji z tymi uk艂adami nie wysy艂a si臋 subadresu.