8941


LABOLATORUM PODSTAW SYSTMÓW MIKROPROCESOROWYCH

TEMAT:

Timery mikrokontrolera 8051 system przerwań .

GRUPA:

ED 5.1

NR ĆWICZENIA :

4

WYKONALI :

Banach Tomasz

Czuryło Paweł

DATA WYK.:

25.10.1999

SEMESTR :

V

OCENA:

;******************************************************************************************

; LEKCJA 12 - SYSTEM PRZERWAŃ 8051

; PRZYKŁAD 1 - TIMERY

; *****************************************************************************************

LED EQU P1.7

; ************* Ustawienie TIMERÓW ********************

; TIMER 0

T0_G EQU 0 ; GATE

T0_C EQU 0 ; COUNTER/-TIMER

T0_M EQU 1 ; MODE (0...3)

TIM0 EQU T0_M + T0_C*4 + T1_G*8 ; TIMER 1

T1_G EQU 0 ; GATE

T1_C EQU 0 ; COUNTER/-TIMER

T1_M EQU 0 ; MODE (0...3)

TIM1 EQU T1_M +T1_C*4 + T1_G*8

TMOD_SET EQU TIM0 + TIM1*16

THO_SET EQU 0EAH ; stan początkowy Timera 0

TL0_SET EQU 066H ; opóźnienia 6 ms

KROTNOSC EQU 0FFH ;krotność powtarzania opóźnień 6 ms

;*******************************************************

LJMP START

;*************** Przerwanie Timera 0 **********************

ORG 0BH

MOV TH0,# TH0_SET ; stan początkowy do TH0

MOV TL0,# TL0_SET ; i do TL0 (6 ms)

DJNZ B,JESZCZE_NIE ; czy wykonano KROTNOSC opóźnień,

; tj.KROTNOSC*6ms

CPL LED ; mruganie diody TEST

MOV B,#KROTNOSC ; oczekaj kolejną KROTNOSC opóźnień

; KROTNOSC*6ms

JESZCZE_NIE:

RETI

; *****************************************************

ORG 100H

START:

MOV TMOD,#TMOD_SET ;Timer 0 liczy czas

MOV TH0 ,#TH0_SET ;stan początkowy do TH0

MOV TL0,#TL0_SET ;i do TL0

SETB TR0 ;start Timera 0

SETB EA ;włącz zezwolenie ogólne na przerwania

SETB ET0 ;włącz zezwolenie na przerwanie od Timera 0 ;*****************************************************************************************

;

; Robocza część programu głównego

;

;*****************************************************************************************

LOOP_0

LCALL LCD_CLR ;czyść wyświetlacz

MOV R1.#16 ;do odlicz.max. 16 znaków na wyświetlaczu

LOOP: ;w tej pętli czyta/pisze znak

LCALL WAIT_KEY ;czyta klawisz

MOV B,A ;przechowuj znak

MOV A,#2 ;niewielkie

LCALL DEALAY_MS ;opuźnienie

MOV A,B ;pobiera znak z „przechowalni”

ADD A,#30H ;zamienia binarny kod cyfry na kod w ASCII

MOV R0,#LCDWD ;wysyła

MOVX @R0,A ; znak na wyświetlacz

DJNZ R1,LOOP ;wyczyść wyświetlacz jeżeli było już 16 znaków

SJMP LOOP_0 ;zamknij pętlę

PYTANIA:

  1. Czy możliwe jest nie pojawienie się na wyświetlaczu kodu naciśniętego klawisza ?.

Jeżeli tak ,to jak temu zapobiec ?.

Po zapoznaniu się z programem stwierdziliśmy, że istnieje możliwość nie pojawienia się kodu naciśniętego klawisza. Klawiszem, który po naciśnięciu nie pokazuje swojego kodu na wyświetlaczu jest klawisz szesnasty.

Jest to wywołane tym, że po bezpośrednim naciśnięciu tego klawisza, mikrokontroler przechodzi do linii programu czyszczącej wyświetlacz LCD.

Aby zapobiec takiemu zachowaniu mikrokontrolera należy przed wyczyszczeniem wyświetlacza LCD wprowadzić dowolne opóźnienie czasowe.

  1. Czy kod klawisza może wpłynąć na częstotliwość mrugania diody?.

Jeżeli tak to jak temu zapobiec?.

Tak, kod klawisza może wpłynąć na częstotliwość mrugania diody, ponieważ w części roboczej programu głównego kod ten zapamiętywany jest w rejestrze B. Później w tym samym rejestrze zapisywana jest wartość „KROTNOSC” w obsłudze przerwania. Przy wystąpieniu przerwania w rejestrze B pokazywana będzie inny kod klawisza ( kod klawisza wciśniętego tuż przed wystąpieniem przerwania).

Takiemu zachowaniu się programu możemy zapobiec poprzez zastosowania stosu do przechowywania kodu klawisza.

  1. Opisać przebieg pracy TIMERA w tym programie.

Na początku programu następuje ustawienie TIMERA 0 oraz jego uruchomienie. Po około półtorej sekundzie następuje przepełnienie tego TIMERA. Następnie ustawiana jest flaga TF0 z jednoczesnym zgłoszeniem żądania obsługi przerwania. Później procesor rozpoznaje źródło przerwania i ustawia licznik rozkazów na 000BH.

Wykonuje kolejne rozkazy do napotkania rozkazu RETI i powraca do programu głównego.

Program główny pobiera z klawiatury szesnaście kolejnych znaków i wyświetla je na ekranie.

PRZERWANIE TIMERA 0 : tutaj przeładowywane są rejestry TH0 i TL0. Przy 255 przerwaniu wykonywana jest negacja linii diody LED.

PROGRAM ZMODYFIKOWANY

;************************************************************

;ĆWICZENIE 4 - SYSTEM PRZERWAŃ 8051

;ZADANIE 5 - TIMERY

;************************************************************

LED EQU P1.7

;*********** USTAWIENIE TIMERÓW *************

;TIMER 0

T0_G EQU 0 ;GATE

T0_C EQU 0 ;COUNTER/-TIMER

T0_M EQU 0 ;MODE (0…3)

TIM0 EQU T0_M+T0_C*4+T0_G*8

;TIMER 1

T1_G EQU 0 ;GATE

T1_C EQU 0 ;COUNTER/-TIMER

T1_M EQU 0 ;MODE (0...3)

TIM1 EQU T1_M+T1_C*4+T1_G*8

TMOD_SET EQU TIM0+TIM1*16

TH0_SET EQU 0EAH ; stan początkowy TIMERA 0

TL0_SET EQU 066H ; opóźnienie 6ms

KROTNOSC EQU 0FFH ;krotność powtarzania opóźnienia 6ms

;*******************************************************

LJMP START

;

;************ PRZERWANIE TIMER 0 *********************

ORG 0BH

MOV TH0,#TH0_SET ;stan początkowy do TH0

MOV TL0,#TL0_SET ;i do TL0 (6ms)

DJNZ B,JESZCZE_NIE ;czy wykonano KROTNOSC opóźnień

;tj. KROTNOSC*6ms?

CPL LED ;mruganie diody TEST

MOV B,#KROTNOSC ;odczekaj kolejną KROTNOSC opóźnień

;KROTNOSC*6ms

JESZCZE_NIE:

RETI

;***************************************************************************

ORG 100H

START:

MOV TMOD,#TMOD_SET ;TIMER 0 liczy czas

MOV TH0,#THO_SET ;stan początkowy do TH0

MOV TL0,#TL0_SET ;i do TL0

SETB TR0 ;start TIMERA 0

SETB EA ;włącz zezwolenie ogólne na przerwania

SETB ET0 ;włącz zezwolene na przerwanie od TIMERA 0

;*******************************************************************************

;

; ROBOCZA CZĘŚĆ PROGRAMU GŁÓWNEGO

;

;*******************************************************************************

LOOP_0:

LCALL LCD_CLR ;czyść wyświetlacz

MOV R1,#16 ;do odliczania max. 16 znaków na wyświetlaczu

LOOP: ;w tej pętli czyta/pisze znak

LCALL WAIT_KEY ;czytaj klawisz

PUSH ACC ;przechowaj znak

MOV A,#2 ;niewielkie

LCALL DELAY_MS ;opóźnienie

POP ACC ;pobierz znak ze stosu

ADD A,#30H ;zamień binarny kod cyfry na kod w ASCII

LCALL WRITE_DATA ;wyślij znak na wyświetlacz

DJNZ R1,LOOP ;wyczyść wyświetlacz ,jeżeli było już 16 znaków

MOV A,#99

LCALL DELAY_MS

SJMP LOOP_0 ;zamknij pętlę

4



Wyszukiwarka