ćwiczenie 1 - Republika WWW
Transkrypt
ćwiczenie 1 - Republika WWW
ĆWICZENIE TEMAT: OBSŁUGA KONTROLERA PRZERWAŃ W PAKIECIE KEILuVISON POZIOMY PRZERWAŃ 80C535 Wiadomości wstępne: W mikrokontrolerze jest wiele źródeł przerwań i może tak się zdarzyć, że kilka przerwań zgłosi się równocześnie, przy czym jedne przerwania mogą być ważniejsze od innych. Dlatego został wprowadzony specjalny mechanizm ustalający nadrzędność jednych przerwań nad innymi. Podprogram obsługi przerwania może być przerwany tylko przez przerwanie o wyższym poziomie niż aktualnie wykonywany. Mikrokontroler SAB 80(C)515/535 ma czteropoziomowy system przerwań, który umożliwia przerwanie wykonywanego aktualnie podprogramu obsługi przerwania przez przerwanie znajdujące się na wyższym poziomie od przerywanego przerwania. Poziom przerwania jest ustalany przez odpowiednie ustawienie znaczników w dwóch rejestrach IP0 i IP1 IP0 X WDST IP0.5 IP0.4 IP0.3 IP0.2 IP0.1 PI0.0 IP1 adres 0B9H X X IP1.5 IP1.4 IP1.3 IP1.2 IP1.1 P1.0 Stan znaczników określa poziom, na którym znajduje się dane przerwanie, (tabela 28-1) Tabela 28-1 Poziomy przerwań Znaczniki Poziomy IP1.x IP0.x przerwania 0 0 1 1 0 1 0 1 0 1 2 3 Ponieważ liczba znaczników jaka jest do dyspozycji jest za mała, by ustawić poziomy przerwań dla wszystkich źródeł, dlatego poszczególne źródła zostały połączone w pary i przypisane do odpowiednich znaczników. Przedstawia to tabela 28-2 Dla określenia kolejności obsługi przerwań, przy jednoczesnym nadejściu kilku sygnałów przerwań znajdujących się na tym samym poziomie, ustalony został priorytet przerwań przedstawiony w tabeli 28-3. Oznacza to, że przerwanie o wyższym priorytecie zostanie obsłużone przed przerwaniem o niższym priorytecie. Tabela 28-2 Powiązanie znaczników poziomów przerwań ze źródłami Znaczniki Źródła przerwań IP1.0, IP0.0 IP1.1, IP0.1 IP1.2, IP0.2 IP1.3, IP0.3 IP1.4, IP0.4 IP1.5, IP0.5 IE0 TF0 IE1 TF1 RI+TI TF2+EXF2 IADC IEX2 IEX3 IEX4 IEX5 IEX6 Tabela 28-3 Uszeregowanie źródeł przerwań według priorytetu Lp. Źródło przerwania Priorytet 1 2 3 4 5 6 7 8 9 10 11 12 IEO IADC TFO IEX2 IE1 IEX3 TF1 IEX4 RI+TI IEX5 TF2+EXF2 IEX6 Najwyższy Najniższy 1. Otwieramy projekt o nazwie „BLINKY” z katalogu c:\Keil\C51\EXAMPLES\test\ BLINKY.Uv2 2. Ćwiczenia dotyczące działania kontrolera przerwań wraz z ustawionymi poziomami. Zadanie 1. W celu sprawdzenia priorytetów przerwań posłużymy się licznikami T0 i T1 pracującymi w trybie 1. Obydwa liczniki są włączane w tym samym czasie więc generowane prze nie przerwania pojawią się jednocześnie. Program obsługi przerwania od licznika T0 powinien generować włącznie i wyłącznie pinów portu P5, natomiast program od licznika T1 generować włączanie i wyłączanie pinów portu P1. Opóźnieni w obydwu przypadkach ok. 0,5s. #include <REG515.H> void delay (void) { unsigned int i=50000; while(i--); } void main (void) { EAL=1; ET0=ET1=1; TMOD=0x11; TH0=TH1=TH1=TL1=0x00; TCON|=0x50; while(1); } void int_0 (void) interrupt 0 using 0 {} void int_T0 (void) interrupt 1 using 0 { P5=0x00; delay( ); P5=0xFF; delay( ); } void int_1 (void) interrupt 2 using 0 {} void int_T1 (void) interrupt 3 using 0 { P1=0x00; delay( ); P1=0xFF; delay( ); } Uwaga: Zaobserwuj które z przerwań jest obsługiwanie i dlaczego. Zadanie 2. Zablokuj pracę liczników tak aby przerwanie od liczników przychodziło tylko raz. Do blokowania pracy liczników służą odpowiednio instrukcje TR0=0; TR1=0; Zaobserwuj działanie programu i zapisz wnioski. Zadanie 3. Przerwanie od T1 przychodzi w trakcie obsługi przerwania od T0. Napisz program który spowoduje, iż przerwanie od licznika T0 przychodzi jako pierwsze natomiast przerwanie od licznika T1 przychodzi w trakcie obsługi przerwania od licznika T0. Zaobserwuj które z przerwań jest obsługiwane, co się dzieje jeśli w programach obsługi przerwań zablokujemy liczniki tak aby każde przerwanie zostało zgłoszone tylko raz. #include <REG515.H> void delay (void) { unsigned int i=50000; while(i--); } void main (void) { EAL=1; ET0=ET1=1; TMOD=0x11; TH0=0x80; TL0=0x00; TH1=TL1=0x00; TCON|=0x50; while(1); } void int_0 (void) interrupt 0 using 0 {} void int_T0 (void) interrupt 1 using 0 { P5=0x00; delay( ); P5=0xFF; delay( ); //TR0=0; } void int_1 (void) interrupt 2 using 0 {} void int_T1 (void) interrupt 3 using 0 { P1=0x00; delay( ); P1=0xFF; delay( ); //TR1=0; } Zadanie 4. Przerwanie od licznika T1 przychodzi jako pierwsze natomiast od licznika T0 przychodzi podczas obsługi przerwania od T1. Zaobserwuj działanie programu i zapisz wnioski, jaki wpływ na obsługę przerwań mają priorytety. Jaki wpływ na działanie programu ma blokowanie liczników w przerwaniu ( przerwania przychodzą tylko raz) ? Zadanie 5. Poziomy przerwań, w zadaniu przełączymy przerwanie od licznika T1 na wyższy poziom niż przerwanie od licznika T0. Korzystamy z tabeli Tabela 28-1 . Przerwania przychodzą w tym samym czasie czyli stany początkowe są równe TH0=TL0=TH1=TL1. Jaka jest różnica pomiędzy działaniem programu z zadania 1. W programie należy ustawić IP0=0x08; IP1=0x00; sprawdź który to poziom i dla jakiego przerwania. Zadnie 6. Poziomy przerwań pozostają takie same jak w zadaniu 5, różnica polega na tym iż jako pierwsze przychodzi przerwanie od licznika T0 , natomiast przerwanie od licznika T1 przychodzi w trakcie obsługi przerwania T0. Jak zachowuje się program gdy przerwania przychodzą ciągle (liczniki nie są blokowane), a jak jest w przypadku gdy przerwania przychodzą raz ( liczniki blokujemy w przerwaniu).