ć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).