Você está na página 1de 7

Temat: System przerwa, liczniki i wywietlacz w STRC51.

wiczenie 3.

1. Mechanizm przerwa w procesorze C51 Przerwania s mechanizmem umoliwiajcym poczenie zdarze (sygnaw) z odpowiednim wykonaniem fragmentu programu - wywoywanymi niezalenie od aktualnie wykonywanego kodu. Procedura obsugi przerwania musi by zapisany w specjalny sposb. W jzyku maszynowym wymagane jest na pocztku procedury przerwania zapamitanie stanu przerwanego programu, a na kocu przywrcenie tego stanu. Piszc programy w jzykach wysokiego poziomu (takich jak C), cz pracy przejmuje na siebie kompilator. Pakiet SDCC umoliwia wczanie takich procedur w nastpujcy sposb: void func_isr (void) interrupt 2 { ... } Naley ten zapis rozumie jako przypisanie do podprogramu obsugi przerwania numer 2 kodu opisanego miedzy klamrami. Wntrze podprogramu obsugi przerwania powinno by jak najbardziej zwize. Szczeglnie naley zwrci uwag czy przed pojawieniem si nastpnego przerwania, obecna obsuga zostanie zakoczona (co mogo by powodowa nieprzewidywalne dziaanie programu). Z tego powodu jest dalece nie zalecane uywanie konstrukcji opniajcych wykonywanie kodu wewntrz procedur obsugi przerwania. Jednym ze sposobw uniknicia zego kodowania, jest przekazywanie danych wytworzonych w przerwaniu do kolejki danych ktra jest obsugiwana poza procedur obsugi przerwania. W procesorze C51 moliwe jest stosowanie jako rde przerwania nastpujcych sygnaw: - zmiana stanu logicznego na wejciu INT0 (pin 12), - zmiana stanu logicznego na wejciu INT1 (pin 13), - przepenienie licznika T0 (pin 14), - przepenienie licznika T1 (pin 15), - odebranie znaku lub zakoczenie wysania znaku przez port transmisji szeregowej. W wersjach bogatszych np.: C52, C515, C517, obsugiwane s rwnie przerwania od takich peryferii jak: -zegar czasu rzeczywistego, -moduu obsugi interfejsu I2C, -przetwornikw A/C, -wielu innych (zalenych od wersji mikrokontrolera). Kady z podprogramw obsugi przerwa jest umieszczany w innym miejscu pamici kodu (CODE): Numer Adres podprogramu Nazwa przerwania obsugi 0 Wejcie INT 0 0x0003 1 Licznik Timer 0 0x000B 2 Wejcie INT 1 0x0013 3 Licznik Timer 1 0x001B 4 Obsuga portu transmisji szeregowej 0x0023 Kompilujc program w jzyku C, linker umieszcza funkcje obsugi przerwa w odpowiednich miejscach pamici kodu. Obserwujc w jaki sposb zosta przetumaczony kod zapisany w C do postaci ASM (kompilator tumaczy przejciowo z C na ASM, potem na kod relokowalny .rel),

Temat: System przerwa, liczniki i wywietlacz w STRC51. wiczenie 3.

mona zauway duy nadmiar instrukcji w okolicach pocztku i koca kodu obsugi przerwania. Jest on zwizany z odpowiednio zapamitaniem i odtworzeniem stanu przerwanego programu. Nadmiar ten moe wpywa niekorzystnie na szybko reakcji na fizyczne zdarzenie przez kod obsugi przerwania. Rozwizaniem tego problemu jest pisanie procedur obsugi przerwania jako tak zwanych goych (ang. nacked) czyli pozbawionych czasochonnych wstawek na pocztku i kocu. Definicja takiego podprogramu wyglda tak: void nakedInterrupt(void) interrupt 2 _naked { ... } Pisanie takiego typu podprogramw, jest stosunkowo trudne wymaga znajomoci asemblera tego procesora. Dlatego w wikszoci przypadkw w kod takiej funkcji wprowadza si wycznie wstawki asemblerowe: void nakedInterrupt(void) interrupt 2 _naked { _asm ... _endasm; } 2. Sekcje krytyczne i dzielenie zasobw. Piszc programy wykorzystujce przerwania naley uwzgldni asynchroniczn natur przerwa wzgldem wykonywanego programu. Odwoania do zasobw przez podprogram przerwania i przerwany program mog doprowadza do niejednoznacznoci, czy wrcz losowego dziaania caoci. Dla przykadu gdy program gwny wykonuje sekwencje: if (++p == 100){ ... } A podprogram obsugi przerwania w swoim kodzie modyfikuje zmienn p w nastpujcy sposb: p--; To gdy przerwanie wystpi tu po operacji ++p ale przed sprawdzeniem warunku == moe zosta podjta mylna decyzja o prawdziwoci warunku. Aby zabezpieczy si przed tego typu sytuacjami, moliwe jest uywanie sekcji krytycznych. Oglna posta takiego zapisu wyglda nastpujco: int funkcja() critical { ... } Oczywicie najwaniejsze sowo tutaj to critical. Dla kompilatora oznacza to e podczas trwania funkcji naley tak skonstruowa kod aby niemoliwe byo przerwanie go. Nie naley umieszcza zbyt dugo trwajcych fragmentw programu w sekcjach krytycznych w trakcie ich trwania przerwania nie s obsugiwane ani kolejkowane, a co moe prowadza do gubienia istotnych informacji.

Temat: System przerwa, liczniki i wywietlacz w STRC51. wiczenie 3.

3. Uruchamianie przerwa Przed rozwaaniem systemu przerwa warto wspomnie, e wikszo rejestrw opisywanych dalej bdcych rejestrami specjalnego przeznaczenia jest zdefiniowanych w pliku nagwkowym 8051.h w pakiecie SDCC (katalog: sdcc\share\sdcc\include). Nie naley ich zatem definiowa za kadym razem w kadym swoim programie. System obsugi przerwa w C51 jest zwizany z bitem EA umiejscowionym w rejestrze wewntrznym procesora o nazwie: IE (ulokowanym pod adresem 0xA8). Aby z poziomu jzyka C mona odwoywa si do tego rejestru naley uy nastpujc definicj: sbit at 0xAF EA; Ustawiajc zmienn EA na 1 (zmienna ta moe przyjmowa wartoci: 0 lub 1), moemy zezwoli na przyjmowanie przerwa. Nastpnie trzeba dla obsugiwanych przerwa ustawi odpowiednie bity w rejestrze IE o deklaracji: sfr at 0xA8 IE; Majcy nastpujce pola: 7 EA EA ES ET1 EX1 ET0 EX0 6 5 4 ES 3 ET1 2 EX1 1 ET0 0 EX0

replika bitu EA zdefiniowanego, bit zezwolenia na obsug przerwa zwizanych z portem szeregowym, bit zezwolenia na obsug przerwa zwizanych z licznikiem T1, bit zezwolenia na obsug przerwa zwizanych z wejciem /INT1, bit zezwolenia na obsug przerwa zwizanych z licznikiem T0, bit zezwolenia na obsug przerwa zwizanych z wejciem /INT0,

Do bitw tych mona odwoa si bezporednio dziki definicji pozostaych bitw wygldajcej nastpujco: sbit at 0xAC ES; sbit at 0xAB ET1; sbit at 0xAA EX1; sbit at 0xA9 ET0; sbit at 0xA8 EX0; 4. Liczniki Jednym z najprostszych sposobw generowania przerwa jest ustawienie jednego z licznikw w taki sposb aby jego przepenienie (osigniecie wartoci maksymalnej) wywoao podprogram obsugi przerwania. Ukady licznikw (w podstawowej wersji C51 mamy do dyspozycji dwa takie liczniki), mog by ustawione w czterech trybach: 0 tryb pracy 13 bitowy, stan licznika okrelaj rejestry TH0 i TH1, gdzie odliczanie przebiega od wartoci wpisanej przed wczeniem licznika, do wartoci 0 co rwnoczenie moe generowa przerwanie, 1 tryb pracy 16 bitowy, poza liczb bitw identycznie dziaajcym jak w trybie 0, 2 tryb pracy 8 bitowy z przeadowaniem (po osigniciu wartoci 0 nastpuje wpisanie do TL0 zawartoci z TH0 z rwnoczesnym wygenerowaniem przerwania i ponowne odliczanie),

Temat: System przerwa, liczniki i wywietlacz w STRC51. wiczenie 3.

3 tryb pracy 8 bitowy z niezalenym odliczaniem TH0 i TL0 bez moliwoci przeadowywania. Aby ustawi w tryb pracy danego licznika naley, zadeklarowa w C rejestr TMOD: sfr at 0x89 TMOD; Ktry posiada nastpujc struktur: 7 GATE_1 GATE_1 3 2 1 0 C/T_1 M1_1 M0_1 GATE_0 C/T_0 M1_0 M0_0 bit bramkujcy licznik T1 ustawiony na 1 powoduje zliczanie sygnaw pod warunkiem ustawienia wejcia /INT1 (wyzerowanie tego bitu uniezaleni zliczanie od stanu tego pinu), C/T_1 bit wybierajcy sygna zliczania, dla ustawionego na 1 pobierany z wejcia T1, dla wyzerowanego pobierany z generatora synchronizujcego prac procesora podzielonego przez 12, M1_1, M0_1 wybiera tryb pracy licznika: M1_1 M0_1 0 0 - tryb 0, 0 1 - tryb 1, 1 0 - tryb 2, 1 1 - tryb 3, 6 5 4

Wane jest take aby ustawi bit TR0 zadeklarowany jako: sbit at 0x8C TR0; Ktry ustawiony, wcza ukad licznikowy T0. Dla ukadu licznikowego T1 analogicznie. Schemat na rys.1 pokazuje konfiguracje trybu pracy 1 licznika 0:

Rys. 1. Schemat wewntrznej struktury generacji przerwa Inne tryby pracy jak i dziaanie licznika T1 s niemal identyczne (rnice wynikaj z sposobu zliczania, a nie dostarczania sygnaw pobudze). 5. Przepenienie licznikw - rdo przerwa. Jak wida na rysunku 1, przepenienie jest sygnalizowane zmian wartoci bitu TF0 (umieszczony w rejestrze TCON o deklaracji: sbit at 0x8D TF0;).

Temat: System przerwa, liczniki i wywietlacz w STRC51. wiczenie 3.

Mona w tzw. poolingu analizowa stan licznika dla wychwycenia ewentualnego przepenienia, bardziej jednak efektywn metod jest wczenie obsugi przerwa. W takim trybie po osigniciu maksymalnej wartoci licznik wygeneruje przerwanie. Aby to jednak byo realizowane konieczne jest ustawienie bitu ET0 w rejestrze EA. Naley take zauway, e w trybach: 0 i 1, kady z licznikw liczy od wartoci ustawionej do maksymalnej po ktrej nastpuje przejcie do wartoci 0 i ponowne liczenie do wartoci maksymalnej. W efekcie moe generowa inn liczb przerwa ni spodziewan. Aby temu zapobiec wymagane jest ustawianie wartoci od jakiej licznik ma zlicza po kadym jego przepenieniu, najlepiej zatem jest ustawia dany licznik w procedurze obsugi przerwania zwizanej z nim. Natomiast w trybie 2, czynnoci zwizane z ustawieniem licznika wykonuje system automatycznie po kadorazowym jego przepenieniu. We wszystkich trybach wpisywanie liczby zliczanych impulsw, dokonuje si przez wpisanie odpowiedniej wartoci bezporednio do rejestrw TL0 i TH0 (i TL1 i TH1). Warto wpisywana do tych rejestrw nie jest liczb impulsw jakie musz by zliczone lecz od jakiej wartoci maja one by zliczane a do wartoci maksymalnej (w przypadku trybw 16 bitowych, iloci zliczonych impulsw wynosi: 65535-THL0/1, a w trybie 8 bitowym: 255-TH0/1). Deklaracje rejestrw s nastpujce: Licznik Starszy bajt Modszy bajt T0 sfr at 0x8C TH0; sfr at 0x8A TL0; T1 sfr at 0x8D TH1; sfr at 0x8B TL1; 6. Wywietlacz LED Schemat rys.2, przedstawia schemat wywietlacza LED podczony do magistrali procesora za porednictwem rejestrw U10 i U15.

Rys. 2. Schemat obwodu sterujcego wywietlaczem LED Rejestry te s umieszczone w przestrzeni pamici danych. W jzyku C mona je zadeklarowa jako (uwaga! 80C51.h nie zawiera ich definicji): xdata at 0x8000 unsigned char U15; xdata at 0xFFFF unsigned char U10;

Temat: System przerwa, liczniki i wywietlacz w STRC51. wiczenie 3.

Rejestry te su wycznie do zapisu, nie ma sensu wywoanie typu: if(U10 & 0x10)... czy: U10 &= 0x01; W tabeli poniej pokazano definicje i maski jakie trzeba wysa do ukadu U10 aby wczy poszczeglne segmenty kadego z wywietlaczy. Definicja: Oznaczenie segmentw: #define SEG_A 0x02 a --#define SEG_B 0x04 f| g |b #define SEG_C 0x40 --#define SEG_D 0x10 e| |c #define SEG_E 0x08 --#define SEG_F 0x01 d .h #define SEG_G 0x20 #define SEG_H 0x80 Dla atwiejszego definiowania ksztatu wywietlanych znakw warto uy preprocesingu jzyka C, w nastpujcy sposb: #define CYFRA_1 SEG_B | SEG_C #define CYFRA_2 SEG_A | SEG_B | SEG_G | SEG_E | SEG_D ... Po takim zdefiniowaniu symboli, dla przykadu aby wywietli znak o ksztacie 2 na pozycji cyfry 4 naley wykona nastpujcy kod: U15=0xBF; //wczenie wywietlacza na pozycji 4 U10=CYFRA_2;//wczenie takich segmentw aby cyfra wygldaa jak 2 Wczanie poszczeglnych cyfr wywietlacza odbywa si przez wysyanie do ukadu U15 wartoci z wyzerowanym bitem (jednym z czterech najstarszych bitw): 7 6 5 4 3 2 1 0 Cyfra 3 Cyfra 4 Cyfra 1 Cyfra 2 0x7F 0xBF 0xDF 0xEF W dolnej linii powyszej tabeli podano przykadowe wartoci do wysania na ukad U15 aby wczy moliwo wywietlenia informacji na pojedynczym wywietlaczu. Wyczenie wicej ni jednego z podanych bitw w U15 spowoduje wczenie dwch lub wicej cyfr co z reguy jest nie podane. Jednym ze sposobw wypisywania na wywietlaczu informacji jest wyzerowanie kolejno jednego z czterech bitw wysyanych do U15 i odpowiedniego wysterowania bitw wysyanych do U10, takie rozwizanie wymaga cigego i czsto powtarzanego, gaszenia i zapalania cyfr na kolejnych pozycjach (przemiatanie). Przez swoj szybko proces ten moe by niezauwaalny dla oka ludzkiego. Przy bardzo duej szybkoci przemiatania wymagane jest przed zmian cyfry (wyzerowanie nastpnego bitu w U15) wpisanie do U10 samych zer zapobiega to smurzeniu wywietlacza.

Temat: System przerwa, liczniki i wywietlacz w STRC51. wiczenie 3.

Na rysunkach 3,4,5,6 pokazano kolejne fazy budowania napisu 1234, w caoci pokazanego na rysunku 7. Czas przejcia midzy kolejnymi fazami w takim procesie musi by bardzo krtki (rzdu 10ms) aby oko ludzkie nie zauwayo przej midzy wywietlaczami.

Rys. 3.

Rys. 4.

Rys. 5.

Rys. 6.

Rys. 7.

Você também pode gostar