Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Notatki:
- ****Przerwania****
- Przerwania są zdarzeniami które tymczasowo wstrzymują wykonywanie głównego programu aby wykonać obsługę przerwania czyli zadeklarowany przez nas fragment kodu (funkcja w języku C). Po wykonaniu procedury obsługi przerwania, główny program zostaje kontynuowany od miejsca przerwania. 8051 posiada 5 sygnałów wywołujących przerwania: dwa sygnały zewnętrzne, dwa sygnały przepełnienia timerów oraz sygnał przerwania z portu szeregowego.
- Rejestr IE:
- Za włączanie lub wyłączanie przerwań odpowiada rejestr IE (Interrupt Enable) - jest to 8 bitowy rejestr jednak w 8051 znaczące jest tylko 6 spośród jego bitów. Ustawienie bitu powoduje włączenie danego przerwania, wyczyszczenie jego wyłączenie.
- EA - - ES ET1 EX1 ET0 EX0
- EA - bit decydujący o wszystkich przerwaniach, gdy EA = 0 żadne z przerwań nie będzie włączone, niezależnie od ustawień innych bitów rejestru.
- - Dwa kolejne bity nie są wykorzystywane w 8051.
- ES - Włącza lub wyłącza przerwania portu szeregowego (na zajęciach jeszcze nie wykorzystywany)
- ET1 - Włącza lub wyłącza przerwania przepełnienia timera 1
- EX1 - Włącza lub wyłącza zewnętrzne przerwanie nr 1 - przerwanie pinu 3.3
- ET0 - Włącza lub wyłącza przerwania przepełnienia timera 0
- EX0 - Włącza lub wyłącza zewnętrzne przerwanie nr 0 - przerwanie pinu 3.2
- Piorytet przerwań maleje od najmłodszego bitu tzn. EX0 czyli przerwanie zewnętrzne nr 0 ma piorytet najwyższy a ES czyli przerwanie portu szeregowego ma piorytet najniższy. Przerwanie o wyższym piorytecie może przerwać obsługę przerwania o piorytecie niższym, lecz nie odwrotnie.
- Rejestr IP:
- Piorytetem przerwań możemy sterować korzystając z rejestru IP (Interrupt Priority). Ustawiony odpowiadający bit w rejestrze IP powoduje, że dane przerwanie ma wysoki piorytet, wyczyszczony bit to niski piorytet (domyślny). Przerwania z wysokim piorytetem zawsze mają pierwszeństwo niezależnie od domyślnego piorytetu - chyba, że dojdzie do sytuacji gdzie dwa przerwania z takim samym piorytetem (wysokim) chcą się wykonać, wtedy znaczenie ma domyślny piorytet omawiany wcześniej.
- Rejestr IP jest 8 bitowy jednak korzystamy tylko z 5 bitów tego rejestru. Trzy najstarsze bity (bit 7, 6 i 5) nie są w 8051 wykorzystywane.
- - - - PS PT1 PX1 PT0 PX0
- - Trzy najstarsze bity nieużywane.
- - PS - określa piorytet przerwania portu szeregowego.
- - PT1 - określa piorytet przerwania przepełnienia timera 1.
- - PX1 - określa piorytet zewnętrznego przerwania nr 1.
- - PT0 - określa piorytet przerwania przepełnienia timera 0.
- - PX0 - określa piorytet zewnętrznego przerwania nr 0.
- Rejestr TCON:
- TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
- Cztery najstarsze bity dotyczą Timerów:
- TF1 - Flaga przepełnienia Timera 1, gdy zostaje ustawiona następuje również przerwanie Timera 1 (gdy jest włączone),
- TR1 - Bit sterujący Timera 1, gdy ustawiony to Timer włączony, gdy wyczyszczony to Timer wyłączony,
- TF0 - Analogicznie jak TF1 ale dla Timera 0,
- TR0 - Analogicznie jak TR1 ale dla Timera 0.
- Kolejne cztery dotyczą przerwać zewnętrznych:
- IE1 - Flaga przerwania INT1 - zewnętrzne przerwanie nr 1
- IT1 - Wybór rodzaju zgłoszenia przerwania INT1, 0 - gdy poziom niski, 1 - gdy zbocze opadające
- IE0 - Flaga przerwania INT0 - zewnętrzne przerwanie nr 0
- IT0 - Wybór rodzaju zgłoszenia przerwania INT0, 0 - gdy poziom niski, 1 - gdy zbocze opadające
- Wektor przerwań:
- Wektor przerwań określa miejsce w pamięci gdzie znajdują się procedury obsługi konretnego przerwania.
- 03H - EX0
- 0BH - ET0
- 13H - EX1
- 1BH - ET1
- 23H - ES
- Schemat działania:
- ORG 0BH ; w tym wypadku będziemy pisać obsługę przerwania ET0
- ;
- ;
- ; kod obsługi
- ;
- ;
- RETI ; powrót do wykonania głównego programu
- ****Timery****
- 8051 posiada dwa timery - Timer 0 i Timer 1. Timery mogą zliczać impulsy zegarowe (TIMER) lub zliczać impulsy zewnętrzne (COUNTER). Zajmowaliśmy się tylko tym pierwszym zastosowaniem. Timer jest inkrementowany z każdym cyklem maszynowym, przy kwarcu taktującym 11,0592MHz czas trwania cyklu zegarowego wynosi 1,08507 us - czyli w ciągu sekundy Timer zostanie zwiększony o 1 około 921600 razy bo 11059200 / 12 = 921600.
- Do konfiguracji timerów wykorzystywane są dwa rejestry - TCON i TMOD, z kolei wartość timerów jest zapisywana w rejestrach TH0, TL0, TH1, TL1.
- THx i TLx:
- TH0 i TH1 to starsze 8 bitów Timera 0 lub Timera 1 TL0 i TL1 to 8 młodszych bitów. Aby otrzymać 8 starszych lub młodszych bitów w assemblerze korzystamy z dyrektywy #HIGH liczba i #LOW liczba, w C korzystamy z dzielenia i modulo - liczba / 256 - odpowiednik #HIGH, liczba % 256 - odpowiednik #LOW. Wrzucanie liczby na te rejestry przydaje się żeby zacząć liczyć od konkretnej wartości przez co odliczyć konretny czas - o czym później.
- Rejestr TMOD:
- Cztery starsze bity rejestru TMOD konfigurują Timer 1, a cztery młodsze Timer 0. Oba timery konfiguruje się w ten sam sposób. Pierwszy (czyli bit 0 dla Timera 0 lub bit 4 dla Timera 1) oraz drugi bit konfiguruje tryb pracy Timera. Na dwóch bitach możemy zapisać cztery różne wartości - i tyle właśnie trybów posiada 8051. Bit trzeci gdy jest ustawiony to Timer zlicza zdarzenia na pinie P3.4 (Timer 0) lub P3.5 (Timer 1), gdy ten bit(y) nie jest ustawiony to Timer inkrementuje się w każdym cyklu (na tę chwilę tylko to nas interesuje więc zawsze będzie tam 0). Ostatni bit (czyli 3 lub 7) powoduje, że Timer 0 działa tylko gdy pin P3.2 jest w stanie wysokim, a Timer 1 tylko gdy P3.3 (tym bitem też nie musimy się przejmować - będzie ustawiony na 0).
- Rejestr TCON:
- Cztery najstarsze bity dotyczą Timerów:
- TF1 - Flaga przepełnienia Timera 1, gdy zostaje ustawiona następuje również przerwanie Timera 1 (gdy jest włączone),
- TR1 - Bit sterujący Timera 1, gdy ustawiony to Timer włączony, gdy wyczyszczony to Timer wyłączony,
- TF0 - Analogicznie jak TF1 ale dla Timera 0,
- TR0 - Analogicznie jak TR1 ale dla Timera 0.
- Tryby Timerów:
- Tryb 0:
- Timer działa w trybie 13 bitowym. Timer może zostać inkrementowany 8192 razy. Ten tryb jest analogiczny do trybu 1, nic specjalnego.
- Tryb 1:
- Najczęściej używany tryb. Timer działa w trybie 16 bitowym. Timer może zostać inkrementowany 65536 razy.
- Tryb 2:
- Timer działa w trybie 8 bitowym z auto uzupełnianiem. THx trzyma wartość która będzie wrzucana na TLx po przepełnieniu. Czyli dla przykładu gdy wrzucimy na THx 44 Timer będzie liczył od tej wartości, gdy osiągnie 255, zostanie zinkrementowany i nastąpi przepełnienie zamiast znów wkoczyć na wartość 0 znów automatycznie ustawi się na 44 czyli wartość rejestru THx, wygodne jeżeli liczymy małe wartości, upraszcza kod ale nie wnosi nic więcej - oprócz tego, że jest wykorzystywany przy komunikacji szeregowej.
- Tryb 3:
- Tryb nie do ogarnięcia. Gdy Timer 0 zostanie ustawiony w tryb 3 to tak naprawdę staje się dwoma oddzielnymi 8 bitowymi timerami. Timer 0 kontroluje TL0, a Timer 1 TH0. Każdy z timerów liczy od 0 do 255, bity odpowiadające za Timer 1 czyli np. TF1 teraz odpowiadają TH0. Timer 1 może być ustawiony w tryb 0, 1 lub 2 ale nie możemy go kontrolować, będzie on zliczał w każdym cyklu maszynowym.
- Wzór na liczenie wartości dla trybu 1:
- 2^16 - ((0-71ms) * 1000) / 1,08507) - czyli możemy zliczyć maksymalnie 71ms
- Wzór na liczenie wartości dla trybu 0:
- 2^13 - ((0-8ms) * 1000) / 1,08507) - maksymalnie 8ms
- Wzór na liczenie wartości dla trybów 8 bitowych:
- W trybie 8 bitowym nie zliczymy nawet jednej mikrosekundy, możemy zliczyć maksymalnie 255 * 1,08507 us czyli 276.69285 us
- 2^8 - ((0 - 276us) / 1,08507)
- Schemat uruchamiania Timerów:
- MOV TH0, #HIGH liczba - Timer 0
- MOV TH1, #HIGH liczba - Timer 1
- MOV TL0, #LOW liczba - Timer 0
- MOV TL1, #LOW liczba - Timer 1
- MOV TMOD, #x - wysyłamy liczbę która ustawi nam bity któryś z bitów 0, 1, 4, 5, bity 0 i 1 odpowiadają za tryb Timera 0, a 4 i 5 za Timer 1, pozostałe bity nas nie interesują gdy po prostu zliczamy czas.
- SETB TR0 - włącza Timer 0
- SETB TR1 - włącza Timer 1
- Teraz gdy nastąpi przepełnienie to ustawi nam się TF0 lub TF1 i nastąpi również przerwanie (gdy włączone).
- Zadania:
- 1. Napisz ponga w C używając softwarowych przerwań
- 2. Omów system przerwań (wszystko co wiesz, obszernie)
- 3. Napisz miganie diodą z przerwaniami
- 4. Jak ogarnąć przyciski wiedząc to co było na zajęciach
- 1. Napisz ponga w C używając softwarowych przerwań
- #include <8051.h>
- #define TIM 19456 // 50ms
- #define LEDS P1 // port do diod
- unsigned char acc, flag; // flag = 0 - lewo, flag = 1 - prawo
- void timer0(void) __interrupt(1) __using(1){
- // Lewo czy prawo?
- if(flag)
- acc = acc >> 1;
- else
- acc = acc << 1;
- // Jeżeli pali się ostatnia dioda z lewej lub z prawej:
- if(acc == 128 || acc == 1)
- flag = !flag;
- LEDS = acc; // wartość zostaje wrzucona na port diod
- // Ponownie wrzucam wartości od których ma zliczać Timer 0:
- TH0 = TIM / 256; // 4 starsze bity
- TL0 = TIM % 256; // 4 młodsze bity
- return;
- }
- int main(void){
- acc = 1; // wartość wrzucana na port diod
- flag = 0; // lewo czy prawo, lewo = 0, prawo = 1
- LEDS = 1; // zaczynam od zapalenia pierwszej diody z prawej
- // Timer:
- TH0 = TIM / 256; // 4 starsze bity
- TL0 = TIM % 256; // 4 młodsze bity
- TMOD = 1; // Timer 0 w trybie 1
- TR0 = 1; // włączam Timer 0
- // Przerwania:
- EA = 1; // włączenie przerwań
- ET0 = 1 // włączenie przerwania Timera 0
- while(1){
- // nieskończona pętla, przerywana przerwaniami
- }
- }
- 3. Napisz miganie diodą z przerwaniami
- // Dioda migająca co 500ms.
- #include <8051.h>
- #define TIM 19456 // 50ms
- #define LEDS P2 // port diod
- #define LED P2.0 // konkretna dioda
- unsigned char count = 1;
- void timer1(void) __interrupt(3) __using(1){
- if(count == 10){
- LED = !LED;
- count = 1;
- }
- else
- count++;
- TH1 = TIM / 256;
- TL1 = TIM % 256;
- return;
- }
- int main(void){
- LED = 0;
- // Wartości timerów:
- TH1 = TIM / 256;
- TL1 = TIM % 256;
- // Ustalenie trybu timera 1
- TMOD = 0b00010000; // timer 1 w trybie 1 - 16 bitowym
- // Włączenie timera 1
- TR1 = 1;
- // Włączenie przerwań
- ET1 = 1; // włączenie przerwania timera 1
- EA = 1; // włączenie przerwań - w ogóle
- // Nieskończona pętla przerywana przerwaniami co 50ms
- while(1);
- }
- 4. Jak ogarnąć przyciski wiedząc to co było na zajęciach
- Przycisk może być podłączony do pinu 3.2 lub 3.3. Domyślnie przerwanie EX0 i EX1 jest wywoływane przez stan niski dlatego przycisk musi zostać podciągnięty do zasilania (przez rezystor w celu odszumienia). Gdy przycisk zostanie wciśnięty - na pinie 3.2 lub 3.3 będzie stan niski, wywoła się przerwanie, w przerwaniu powinniśmy odczekać pewien czas zanim podejmiemy działania ze względu na drgania styków przycisku. Po odczekaniu można wykonać działania.
Advertisement
Add Comment
Please, Sign In to add comment