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