VEndymionV

SW - Wejściówka nr 2

May 5th, 2018
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.10 KB | None | 0 0
  1. ****Przerwania****
  2. 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.
  3.  
  4. Rejestr IE:
  5. 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.
  6. EA - - ES ET1 EX1 ET0 EX0
  7.  
  8. 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.
  9. - Dwa kolejne bity nie są wykorzystywane w 8051.
  10. ES - Włącza lub wyłącza przerwania portu szeregowego (na zajęciach jeszcze nie wykorzystywany)
  11. ET1 - Włącza lub wyłącza przerwania przepełnienia timera 1
  12. EX1 - Włącza lub wyłącza zewnętrzne przerwanie nr 1 - przerwanie pinu 3.3
  13. ET0 - Włącza lub wyłącza przerwania przepełnienia timera 0
  14. EX0 - Włącza lub wyłącza zewnętrzne przerwanie nr 0 - przerwanie pinu 3.2
  15.  
  16. 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.
  17.  
  18. Rejestr IP:
  19. 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.
  20. 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.
  21. - - - PS PT1 PX1 PT0 PX0
  22.  
  23. - Trzy najstarsze bity nieużywane.
  24. - PS - określa piorytet przerwania portu szeregowego.
  25. - PT1 - określa piorytet przerwania przepełnienia timera 1.
  26. - PX1 - określa piorytet zewnętrznego przerwania nr 1.
  27. - PT0 - określa piorytet przerwania przepełnienia timera 0.
  28. - PX0 - określa piorytet zewnętrznego przerwania nr 0.
  29.  
  30. Rejestr TCON:
  31. TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
  32. Cztery najstarsze bity dotyczą Timerów:
  33. TF1 - Flaga przepełnienia Timera 1, gdy zostaje ustawiona następuje również przerwanie Timera 1 (gdy jest włączone),
  34. TR1 - Bit sterujący Timera 1, gdy ustawiony to Timer włączony, gdy wyczyszczony to Timer wyłączony,
  35. TF0 - Analogicznie jak TF1 ale dla Timera 0,
  36. TR0 - Analogicznie jak TR1 ale dla Timera 0.
  37. Kolejne cztery dotyczą przerwać zewnętrznych:
  38. IE1 - Flaga przerwania INT1 - zewnętrzne przerwanie nr 1
  39. IT1 - Wybór rodzaju zgłoszenia przerwania INT1, 0 - gdy poziom niski, 1 - gdy zbocze opadające
  40. IE0 - Flaga przerwania INT0 - zewnętrzne przerwanie nr 0
  41. IT0 - Wybór rodzaju zgłoszenia przerwania INT0, 0 - gdy poziom niski, 1 - gdy zbocze opadające
  42.  
  43. Wektor przerwań:
  44. Wektor przerwań określa miejsce w pamięci gdzie znajdują się procedury obsługi konretnego przerwania.
  45. 03H - EX0
  46. 0BH - ET0
  47. 13H - EX1
  48. 1BH - ET1
  49. 23H - ES
  50. Schemat działania:
  51. ORG 0BH ; w tym wypadku będziemy pisać obsługę przerwania ET0
  52. ;
  53. ;
  54. ; kod obsługi
  55. ;
  56. ;
  57. RETI ; powrót do wykonania głównego programu
  58.  
  59.  
  60. ****Timery****
  61. 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.
  62. Do konfiguracji timerów wykorzystywane są dwa rejestry - TCON i TMOD, z kolei wartość timerów jest zapisywana w rejestrach TH0, TL0, TH1, TL1.
  63.  
  64. THx i TLx:
  65. 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.
  66.  
  67. Rejestr TMOD:
  68. 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).
  69.  
  70. Rejestr TCON:
  71. Cztery najstarsze bity dotyczą Timerów:
  72. TF1 - Flaga przepełnienia Timera 1, gdy zostaje ustawiona następuje również przerwanie Timera 1 (gdy jest włączone),
  73. TR1 - Bit sterujący Timera 1, gdy ustawiony to Timer włączony, gdy wyczyszczony to Timer wyłączony,
  74. TF0 - Analogicznie jak TF1 ale dla Timera 0,
  75. TR0 - Analogicznie jak TR1 ale dla Timera 0.
  76.  
  77. Tryby Timerów:
  78. Tryb 0:
  79. Timer działa w trybie 13 bitowym. Timer może zostać inkrementowany 8192 razy. Ten tryb jest analogiczny do trybu 1, nic specjalnego.
  80. Tryb 1:
  81. Najczęściej używany tryb. Timer działa w trybie 16 bitowym. Timer może zostać inkrementowany 65536 razy.
  82. Tryb 2:
  83. 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.
  84. Tryb 3:
  85. 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.
  86.  
  87. Wzór na liczenie wartości dla trybu 1:
  88. 2^16 - ((0-71ms) * 1000) / 1,08507) - czyli możemy zliczyć maksymalnie 71ms
  89. Wzór na liczenie wartości dla trybu 0:
  90. 2^13 - ((0-8ms) * 1000) / 1,08507) - maksymalnie 8ms
  91. Wzór na liczenie wartości dla trybów 8 bitowych:
  92. W trybie 8 bitowym nie zliczymy nawet jednej mikrosekundy, możemy zliczyć maksymalnie 255 * 1,08507 us czyli 276.69285 us
  93. 2^8 - ((0 - 276us) / 1,08507)
  94.  
  95. Schemat uruchamiania Timerów:
  96. MOV TH0, #HIGH liczba - Timer 0
  97. MOV TH1, #HIGH liczba - Timer 0
  98. MOV TL0, #LOW liczba - Timer 1
  99. MOV TL1, #LOW liczba - Timer 1
  100. 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.
  101. SETB TR0 - włącza Timer 0
  102. SETB TR1 - włącza Timer 1
  103. Teraz gdy nastąpi przepełnienie to ustawi nam się TF0 lub TF1 i nastąpi również przerwanie (gdy włączone).
Advertisement
Add Comment
Please, Sign In to add comment