Przerwania w architekturze mikrokontrolera X51 (przykład przerwanie zegarowe) Ryszard J. Barczyński, 2009 Politechnika Gdańska, Wydział FTiMS, Katedra Fizyki Ciała Stałego Materiały dydaktyczne do użytku wewnętrznego
Przerwanie jest niczym innym, jak wywołaniem specjalnej procedury. Procedura ta jest umieszczona pod odpowiednim, stałym adresem. Obsługa przerwania kończy się specjalnym rozkazem RETI. Procedura przerwania musi zadbać o zachowanie używanych zasobów. Często używa się do tego celu alternatywnych banków rejestrów.
przykład oprogramowania przerwania zegarowego Napiszemy obsługę przerwania zegarowego, które liczy czas rzeczywisty Założymy, że procesor pracuje z zegarem 12 Mhz. Zaprogramujemy timer tak, by generował przerwanie co 10ms. Obsługa przerwania będzie: liczyła sekundy, minuty i godziny ustawiała flagę informującą o zmianie czasu (o pełnych sekundach) Program główny wyśle czas na port szeregowy gdy flaga zostanie ustawiona.
Przerwanie jest niczym innym, jak wywołaniem specjalnej procedury. Procedura ta jest umieszczona pod odpowiednim, stałym adresem. Obsługa przerwania kończy się specjalnym rozkazem RETI. Procedura przerwania musi zadbać o zachowanie używanych zasobów. Często używa się do tego celu alternatywnych banków rejestrów.
szkielet procedury obsługi przerwania TINTER: PUSH ACC zachowujemy akumulator PUSH PSW i słowo stanu procesora MOV PSW,#018h 3 bank rejestrów [... tu będzie nasz kod...] POP PSW odtwarzamy rejestry POP ACC RETI koniec przerwania
przykład oprogramowania przerwania zegarowego Zrobimy jeszcze parę założeń... Zdublujemy rejestry nazwami zmiennych... R0=Clk100, R1=ClkSec, R2=ClkMin, R3=ClkHrs Nie jest to konieczne, ale ułatwi i przyspieszy dostęp do danych DSEG ORG 018h adres 3 banku rejestrów Clk100: DS 1 ClkSec: DS 1 ClkMin: DS 1 ClkHrs: DS 1
przykład oprogramowania przerwania zegarowego Zrobimy jeszcze parę założeń... Flaga informująca o zmianie stanu zegara może być bitowa BSEG Display: DBIT 1
przykład oprogramowania przerwania zegarowego Zrobimy jeszcze parę założeń... Ponieważ timer T1 jest wykorzystywany do taktowania portu szeregowego... użyjemy timera T0. Tryb pracy T1 będzie 8 bitowy z automatycznym załadowaniem. Nad jego wartością nie będziemy się zastanawiać jest w dokumentacji. Tryb pracy T0 wybieramy 16 bitowy (potrzebujemy liczenia do 10000). TMOD zaprogramujemy jako więc jako 00100001B (021h). Musimy policzyć wartość początkową do załadowania...
przykład oprogramowania przerwania zegarowego Zrobimy jeszcze parę założeń... Musimy policzyć wartość początkową do załadowania... 0FFFFh 10000 = 0D8EFh Starszy bajt (TH0) załadujemy wartością 0D8h Młodszy bajt (TL0) załadujemy wartością 0EFh ValTH0 EQU 0D8h ValTL0 EQU 0EFh Ładować licznik trzeba będzie każdorazowo po przyjściu przerwania... oraz na początku
szkielet procedury obsługi przerwania TINTER: MOV TH0,#ValTH0 MOV TL0,#ValTL0 PUSH ACC zachowujemy akumulator PUSH PSW i słowo stanu procesora MOV PSW,#018h 3 bank rejestrów [... tu będzie nasz kod...] POP PSW odtwarzamy rejestry POP ACC RETI koniec przerwania
Przerwanie jest niczym innym, jak wywołaniem specjalnej procedury. Procedura ta jest umieszczona pod odpowiednim, stałym adresem. Obsługa przerwania kończy się specjalnym rozkazem RETI. Procedura przerwania musi zadbać o zachowanie używanych zasobów. Często używa się do tego celu alternatywnych banków rejestrów.
początek naszego kodu CSEG ORG 0 JMP Start ORG 0Bh JMP TINTER Przerwanie IE0 TF0 IE1 TF1 RI oraz TI Adres wektora 0003h 000Bh 0013h 001Bh 0023h
część funkcjonalna procedury obsługi przerwania INC R0 CJNE R0,#100,TIMEND SETB Display MOV R0,#0 INC R1 Pełna sekunda CJNE R1,#60,TIMEND MOV R1,#0 INC R2 Pełna minuta CJNE R2,#60,TIMEND MOV R2,#0 INC R3 Pełna godzina CJNE R3,#24,TIMEND MOV R3,#0 TIMEND:
co robimy na początku... Start: MOV SP,#Stack Starannie analizujemy położenie stosu!!! CALL InitHard Programujemy hardware MOV ClkMin,#0 Nie mam lepszego pomysłu MOV ClkSec,#0 na początkow ą godzin ę... MOV Clk100,#0 MOV ClkHrs,#0 Startuj przerwania i timerki SETB et0 Timer 0 interrupt SETB tr0 Timer 0 SETB TR1 Baud generator SETB ea Enable interrupts...
programowanie drutów... InitHard: MOV TMOD,#ValTMOD MOV TH0,#ValTH0 Wstępne załadowanie MOV TL0,#ValTL0 MOV TH1,#BaudH MOV PCON,#0 SMOD = 0 (baud dzielony przez 2) MOV SCON,#52H Port szeregowy mode 1 RET
główna pętla programu... Loop: Jeżeli czas si ę zmieni ł to wyświetl co ś. JNB Display,Loop CLR Display MOV DPTR,#MsgSec CALL SendStr JMP Loop
Pełny tekst omawianego dzisiaj programu znajdzie się na naszej stronie WWW. (ciekawy jestem czy zadziała?...)