Lab4_podprogramy_irq..

Transkrypt

Lab4_podprogramy_irq..
STOS, PODPROGRAMY, PRZERWANIA
Laboratorium 4
STOS, PODPROGRAMY, PRZERWANIA
Cel:
Celem dwiczenia jest poznanie mechanizmów organizacji podprogramów (wywołania i powroty),
przekazywania argumentów procedur oraz konstrukcji systemu przerwao.
Uwagi :
1. Przy realizacji poniższych zadao podobnie jak poprzedni należy skorzystad ze środowiska ATMEL
Studio. Tworząc nowy projekt należy pamiętad o wyborze kontrolera ATMEGA32 symulatora jako
środowiska do uruchomienia programu.
2. Na początku programu załaduj bibliotekę z definicją nazw rejestrów procesora:
.INCLUDE "m32def.inc"
Brak inicjalizacji STOSU
; P41.asm
; STOS i podprogramy
.INCLUDE "m32def.inc" ; SEGMENT DEKLARACJI
.DSEG
.ORG 0x0060
Zmienna1:
Zmienna2:
.CSEG
.ORG 0
jmp
; SEGMENT DANYCH
; początek pamięci SRAM dla tego kontrolera
.BYTE 1
.BYTE 1
Reset
Reset:
; deklaracja zmiennej bajtowej "Zmienna1" w pamięci SRAM
; deklaracja zmiennej bajtowej "Zmienna1" w pamięci SRAM
; SEGMENT PROGRAMU
; wektor zerowania
; skok do procedury inicjalizującej
; podprogram inicjalizujący
ldi R16, 0x01
sts Zmienna1, R16
ldi R16, 0x02
sts Zmienna2, R16
Petla:
; inicjalizacja zmiennych
; pętla główna programu
call Podprogram1
nop
nop
nop
nop
rjmp Petla
; Zanotuj wartośd SP oraz PC przed o po wykonaniu tego rozkazu
; PODPROGRAMY
Podprogram1:
PWSZ – Techniki mikroprocesorowa ćwiczenia
Strona 1 z 8
STOS, PODPROGRAMY, PRZERWANIA
lds R16, Zmienna1
lds R17, Zmienna2
ret
; Dlaczego program nie wrócił do pętli głównej?
; Wyjaśnij dlaczego adres powrotu ma wartośd 0xFFFF?
STOS
; P42.asm
.INCLUDE "m32def.inc"
;SEGMENT DEKLARACJI
.DSEG
.ORG 0x0060
; SEGMENT DANYCH
; początek pamięci SRAM dla tego kontrolera
Zmienna1:
Zmienna2:
.CSEG
.ORG 0
jmp
.BYTE 1
.BYTE 1
Reset
; deklaracja zmiennej bajtowej "Zmienna1" w pamięci SRAM
; deklaracja zmiennej bajtowej "Zmienna1" w pamięci SRAM
; SEGMENT PROGRAMU
; wektor zerowania
; skok do procedury inicjalizującej
; Przed wykonaniem dwiczenia wpisz do pamięci danych od lokacji 0x0060 0xFF
Reset:
; podprogram inicjalizujący
ldi
ldi
out
out
R17, 0x00
R16, 0x63
SPH, R17
SPL, R16
ldi R16, 0x01
sts Zmienna1, R16
ldi R16, 0x02
sts Zmienna2, R16
; inicjalizacja wskaźnika stosu
; inicjalizacja zmiennych
Petla:
ldi R16, 0x03
ldi R16, 0x04
; nowe wartości dla rejestrów R16 i R17
call Podprogram1
; Zanotuj wartośd SP oraz PC przed o po wykonaniu tego rozkazu
; Zauważ że SP wskazuje puste miejsce na stosie
; Narysuj obraz stosu
nop
nop
nop
nop
nop
rjmp
Petla
; PODPROGRAMY
Podprogram1:
PWSZ – Techniki mikroprocesorowa ćwiczenia
Strona 2 z 8
STOS, PODPROGRAMY, PRZERWANIA
push R16
; This instruction stores the contents of register Rr on the STACK.
; The stack pointer is post-decremented by 1 after the PUSH.
push R17
lds R16, Zmienna1
lds R17, Zmienna2
pop R17
; This instruction loads register Rd with a byte from the STACK.
; The stack pointer is pre-incremented by 1 before the POP.
pop R16
ret
; Sprawdź co stało się ze zmiennymi w pamięci
; Zmodyfikuj tak program aby temu zaradzid
; Co sie stanie gdy liczba push > od liczy pop i odwrotnie
Przekazywanie parametrów do podprogramu przez Rejestry
; P43.asm
.EQU SYS_FREQ = 1 ; częstotliwośd pracy w MHz
.INCLUDE "m32def.inc" ; SEGMENT DEKLARACJI
.DSEG
; SEGMENT DANYCH
.ORG 0x0060
; początek pamięci SRAM dla tego kontrolera
.CSEG
.ORG 0
jmp
; SEGMENT PROGRAMU
; wektor zerowania
; skok do procedury inicjalizującej
Reset
Reset:
; podprogram inicjalizujący
ldi
ldi
out
out
R17, high(RAMEND)
R16, low(RAMEND)
SPH, R17
SPL, R16
Petla:
; inicjalizacja wskaźnika stosu
; pętla główna programu
ldi R16,2
ldi R17,1
call Czekaj_ms
nop
nop
nop
nop
nop
rjmp Petla
; Ile będzie trwało to opóźnienie
; Zanotuj wartośd SP oraz PC przed i po wykonaniu tego rozkazu
; PODPROGRAMY
;************************************************************
;
MILISEKUNDOWA PROCEDURA OPÓŹNIAJĄCA
;
;
PWSZ – Techniki mikroprocesorowa ćwiczenia
Strona 3 z 8
STOS, PODPROGRAMY, PRZERWANIA
; Parametry:
;
R16 - wartośd opóźnienia w ms (dla zera - 256 ms)
;
R17 - mnożnik opóźnienia (dla zera - 256x)
;
; Wymagane stałe:
;
SYS_FREQ - częstotliwośd pracy w MHz
;
Czekaj_ms:
push R18
; ochrona rejstrów roboczych
push R19
push R20
push R21
mov
mov
ldi
R20, R16
R21, R17
R18, SYS_FREQ
Czekaj_ms_0:
mov R17, R21
Czekaj_ms_1:
mov R16, R20
Czekaj_ms_2:
ldi
R19, 249
nop
Czekaj_ms_3:
nop
dec
R19
brne Czekaj_ms_3
dec
brne
R16
Czekaj_ms_2
dec
brne
R17
Czekaj_ms_1
dec
brne
R18
Czekaj_ms_0
pop
pop
pop
pop
ret
R21
R20
R19
R18
;__________
;
\
;
|
;________
|
;
\ |
;
| |
;______
| |
;
\ | |
;
| | |
;__
| | |
; \
p p p
;
p3 2 1 0
;__/
| | |
;
| | |
;
| | |
;______/ | |
;
| |
;
| |
;________/ |
;
|
;
|
;__________/
; Można zmodyfikowad ten program tak aby przekazad do procedury parametry przez stos
PWSZ – Techniki mikroprocesorowa ćwiczenia
Strona 4 z 8
STOS, PODPROGRAMY, PRZERWANIA
Przekazywanie parametrów do podprogramu przez STOS
; P45.asm
; Stałe
.EQU SYS_FREQ = 1 ; częstotliwośd pracy w MHz
.INCLUDE "m32def.inc" ; SEGMENT DEKLARACJI
.DSEG
.ORG 0x0060
.CSEG
.ORG 0
jmp
; SEGMENT DANYCH
; początek pamięci SRAM dla tego kontrolera
Reset
Reset:
; SEGMENT PROGRAMU
; wektor zerowania
; skok do procedury inicjalizującej
; podprogram inicjalizujący
ldi
ldi
out
out
R17, high(RAMEND)
R16, low(RAMEND)
SPH, R17
SPL, R16
Petla:
; inicjalizacja wskaźnika stosu
; pętla główna programu
ldi R16,2
ldi R17,2
push R16
push R17
call Czekaj_ms ;
nop
nop
nop
nop
nop
rjmp Petla
; Ile będzie trwało to opóźnienie
; PODPROGRAMY
;************************************************************
;
MILISEKUNDOWA PROCEDURA OPÓŹNIAJĄCA
;
;
; Parametry:
;
??? - wartośd opóźnienia w ms (dla zera - 256 ms)
;
??? - mnożnik opóźnienia (dla zera - 256x)
;
; Wymagane stałe:
;
SYS_FREQ - częstotliwośd pracy w MHz
;
Czekaj_ms:
pop
R18
; adres powrotu przechowaj w rejestrach
pop
R19
;
pop
R21
; odtworzenie liczby z R17
PWSZ – Techniki mikroprocesorowa ćwiczenia
Strona 5 z 8
STOS, PODPROGRAMY, PRZERWANIA
pop
R20
push
push
R19
R18
ldi
R18, SYS_FREQ
Czekaj_ms_0:
mov R17, R21
Czekaj_ms_1:
mov R16, R20
Czekaj_ms_2:
ldi
R19, 249
nop
Czekaj_ms_3:
nop
dec
R19
brne Czekaj_ms_3
dec
brne
R16
Czekaj_ms_2
dec
brne
R17
Czekaj_ms_1
dec
brne
R18
Czekaj_ms_0
pop
pop
pop
pop
ret
ret
R21
R20
R19
R18
; odtworzenie liczby z R16
; adres powrotu na stos
;
;__________
;
\
;
|
;________
|
;
\ |
;
| |
;______
| |
;
\ | |
;
| | |
;__
| | |
; \
p p p
;
p3 2 1 0
;__/
| | |
;
| | |
;
| | |
;______/ | |
;
| |
;
| |
;________/ |
;
|
;
|
;__________/
Przerwania
; P46.asm
; Przerwania
.INCLUDE "m32def.inc" ; SEGMENT DEKLARACJI
.DSEG
; SEGMENT DANYCH
.ORG 0x0060
; początek pamięci SRAM dla tego kontrolera
.CSEG
.ORG 0
jmp
.ORG
Reset
INT0addr
jmp
IRQ_INT0
; SEGMENT PROGRAMU
; wektor zerowania
; skok do procedury inicjalizującej
; wektor przerwania INT0
PWSZ – Techniki mikroprocesorowa ćwiczenia
Strona 6 z 8
STOS, PODPROGRAMY, PRZERWANIA
; wektor przerwania INT1
.ORG
INT1addr
jmp IRQ_INT1
Reset:
; podprogram inicjalizujący
ldi
ldi
out
out
R17, high(RAMEND)
R16, low(RAMEND)
SPH, R17
SPL, R16
in
sbr
sbr
sbr
sbr
out
R16, MCUCR
; konfiguracja sposobu przyjęcia przerwania
R16, 1<<ISC01
R16, 1<<ISC00 ; przerwanie INT0 wywoływane zboczem narastającym
R16, 1<<ISC11
R16, 1<<ISC10 ; przerwanie INT1 wywoływane zboczem narastającym
MCUCR, R16
in
sbr
out
R16, GICR
R16, 1<<INT0
GICR, R16
; inicjalizacja wskaźnika stosu
; odmaskowanie przerwao zewnętrznych INT0
; Zgłoszenie przerwao polega na ustawieniu flagi INTF0 lub INTF1
; w rejestrze GIFR (Okienko I/O View)
in
sbr
out
R16, GICR
R16, 1<<INT1
GICR, R16
sei
; odblokowanie przerwao - ustawienie bitu I w rejestrze SREG
Petla:
nop
nop
nop
nop
nop
nop
nop
nop
rjmp
Petla
; Obsługa przerwao
PWSZ – Techniki mikroprocesorowa ćwiczenia
Strona 7 z 8
STOS, PODPROGRAMY, PRZERWANIA
IRQ_INT0:
nop
nop
nop
nop
reti
; powrót z przerwania (czym sie rożni od ret)
IRQ_INT1:
nop
nop
nop
nop
reti
; 1. Odmaskuj przerwania od INT1 (flaga INT1) i sprawdź czy można wywoład przerwanie INT0 w
czasie ; obsługi INT1.
; 2. Co dzieje się z flagą zgłoszenia przerwania w cyklu akceptacji przerwania?
; 3. Jakie czynności wykonuje procesor w cyklu akceptacji przerwania?
; 4. Które przerwanie zostanie przyjęte gdy oba są aktywne?
; 5. Kiedy procesor może przyjąd następne przerwanie?
; 6. Czy jest możliwe przyjęcie innego przerwania w czasie obsługi już zainicjalizowanego?
Zadanie 1
Napisz podprogram zamieniający liczbę BCD na ASCII. Przekazywanie parametrów rozwiąż dwoma
metodami: przez stos oaz przez wybrany rejestr.
Zadanie 2
Korzystając z przykładów napisz podprogram opóźniający o czasie wyrażonym w mikrosekundach.
PWSZ – Techniki mikroprocesorowa ćwiczenia
Strona 8 z 8