1. Zbiór typu .hex jest wynikiem pracy assemblera. Jest to standardowy format zapisywany
w kodzie ASCII wierszami o następujących polach: kod startu ':' liczba bajtów danych
(dwa znaki), adres pamięci kodu, od którego wpisywane będą dane tego wiersza (4 znaki),
typ pola danych (dwa znaki, 00 - oznacza treść programu, 01 - oznacza wiersz końca), 2n
znaków dla n bajtów danych, najmniej znaczący bajt sumy kontrolnej utworzonej ze
wszystkich bajtów bez pola ':' i bez siebie samej.
Ten bajt sumy przed zapisem ma zmieniony znak wg "uzupełnienia dwójkowego" (czyli
wynik powstaje z odjęcia od 0x100 albo przez XOR x 0xFF i dodaniu 0x01). Przykład
wiersza programu do ładowania od adresu 00A0, oraz wiersza sygnalizującego koniec
zbioru:
:1000A000C0E0C0D0D2D3C2D4C2AAC218753AFFC22F
:00000001FF
Sprawdź, czy następujący wiersz jest poprawny:
:10022000D2A8D2A9D2ABD2ACE4F52FF52AF5477506
TAK
2. Napisz obsługę przerwania timera T0, zliczającego cykle maszynowe w trybie 16-bitowym.
Załóż, że T0 jest uruchomione. W przerwaniu zwiększana jest wartość zmiennej ILE aż
osiągnie ona wartość 0xDE. Wtedy T0 ma zostać zatrzymane.
potrzebna tylko procedura Timer0
Adres przerwania T0: 0Bh
Rejestr TMOD dla trybu 16-bitowego timera 0 wygląda tak: 00000001b
On/Off przerwań dla timera 0: ET0
On/Off timera 0: TR0
On/Off globalny przerwań: ET
ILE DATA 20h
CSEG AT 0Bh
AJMP timer0_interrupt
CSEG AT 0h
AJMP reset
CSEG AT 30h
reset:
MOV TMOD, #0000001b
SETB ET0
SETB EA
SETB TR0
CLR A
start:
SJMP $
timer0_interrupt:
INC A
MOV ILE, A
CJNE A, #0DEh, dalej
CLR TR0
dalej:
RETI
END
3. Podaj cechy architektury ARM, które zasadniczo różnią ją od „rodziny 8051” i AVR.
ARM - wykonuje praktycznie wszystkie instrukcje w jednym cyklu podczas gdy 8051 potrzebuje przeważnie więcej niż 1 np: BNEQ w ARM potrzebuje 1 cyklu DJNZ w 8051 potrzebuje 3. ARM jest bazowany na RISK gdy 8051 jest bazowany na architekturze CISC. ARM oparty jest na architekturze ładuj/zapisz, dane musza być przechowywane w rejestrze przed przetwarzaniem a w 8051 można dostęp uzyskać do pamięci bezpośrednio. ARM posiada warunkowe instrukcje przetwarzania danych (tj. przed wykonaniem instrukcji sprawdzany jest określony warunek), 8051 nie posiada takiej funkcji. Główną różnicą między rodziną AVR a 8051 są typy adresowania. O wiele więcej rejestrów możemy zaadresować w AVR niż w 8051, co ułatwia programowanie i skraca kod. Inną różnicą jest to, że instrukcje AVR zmieniają o wiele więcej flag mikrokontrolera.
4. Napisz w assemblerze program, który ustawia zmienną PARITY na 1, gdy liczba jedynek w
trzech bajtach 24-bitowej zmiennej umieszczonej w adresach BAJT, BAJT+1, BAJT+2 jest
nieparzysta, a ustawia - w przypadku przeciwnym.
napisane w asemblerze MCS-51 [ 1- nieparzyste, 0-parzyste]
CSEG AT 0H
AJMP start
ZMIENNA DATA 30h
PARITY BIT 0h
start:
MOV 30h,#00010001B
MOV 31h,#01000000B
MOV 32h,#00000000B
CLR PARITY
MOV R0,#ZMIENNA
MOV R1,#3
sprawdzaj:
MOV A,@R0
JNB PSW.0,dalej
CPL PARITY
dalej:
INC R0
DJNZ R1,sprawdzaj
MOV P2,20h
END
5. Wymień najważniejsze różnice architektur RISC i CISC.
Architektura CISC (Complex Instruction Set Computer - komputer o złożonym zbiorze rozkazów) cechuje się dużą ilością złożonych rozkazów (mikrokodowanych) mających zmienny format, małym zestawem rejestrów strukturalnych oraz zazwyczaj rozbudowanym sposobem adresowania, Nacisk na sprzęt
architektury RISC (Reduced Instruction Set Computer - komputer o zredukowanym zbiorze instrukcji) cechy to zastosowanie niewielkiej listy prostych rozkazów, stałej długości rozkazu, dużej ilości uniwersalnych rejestrów wewnętrznych, uproszczenie trybów adresowania i, zazwyczaj, zastosowanie architektury load/store (ładuj/zapisz), czyli rozdzielenie rozkazów operujących na pamięci od reszty rozkazów. możliwość wykonywania rozkazów w jednym cyklu zegara, a dokładniej kończenia jednego rozkazu w jednym cyklu zegara przy spełnieniu określonych warunków, Nacisk na oprogramowanie
6. z tablicy pod adresem 0x50 o długości 0x40 wybierz bajty z parzysta liczba jedynek i utworzyc z nich nową tablice
Ogólnie pod adresem na który wskazuje zmienna BUFOR (50h) mamy aktualną tablice. Przenosimy te elementy, które mają parzystą liczbę jedynek w zapisie bitowym do tablicy o adresie zdefiniowanym w TABLICA (70h). Wykorzystujemy bit PSW.0 (patrz zad. 4).
ILE EQU 8 ; 0x60 = dec. 64 = 8 bajtów (elementów)
BUFOR DATA 50h
TABLICA DATA 70h
CSEG AT 0h
JMP start
start:
MOV R0, #TABLICA
MOV A, #0
MOV DPTR, #BUFOR
MOV R1, #ILE
loop:
MOV A, #0
MOVC A, @A+DPTR ; Do A ladujemy WARTOSC z adresu 0x50 ...
INC DPTR ; ... ktory zwiekszamy z kazdym obrotem petli
JNB PSW.0, dodaj_do_tablicy ; jezeli PSW.0 = 0 (parzyste) to skocz do event
powrot:
DJNZ R1, loop ; licznik petli 8 do 0
AJMP $
dodaj_do_tablicy:
MOV @R0, A ; Ladujemy element do adresu 0x70...
INC R0 ; ...ktory zwiekszamy z kazdym obrotem petli
AJMP powrot
CSEG AT BUFOR
DB 1,2,3,4,5,6,7,8
; tablica z kolejnymi wartosciami
; bitowo: 1, 10, 11, 100, 101, 110, 111, 1000
; mamy 3 elementy z parzysta liczba bitow
END
7. DAC 10-bitowy o Uref =2.048V jaka będzie odpowiedź analogowa gdy rejestr danych przechowują wartosci: DACDATAH = 0 DACDATAL = 0xF3
Nie jestem pewien co do tego wzoru, ale ciężko znaleźć coś sensownego na ten temat.
D = 0xF3 = 243 dec.
N = 10
Uref = 2,048
Uout=Uref*D/2N
Uout = 2,04800 * (243 / (2^10)) = 0,486
8. napisz podprogram dla uzyskania opóźnienia 1ms. Procesor ma cykl maszynowy równy 0.5us
Obliczamy x - liczbę potrzebnych cykli
1ms = 1000µs
1000 = x*0,5
x = 2000
MOV R1, #4
petla:
MOV R0, #165
DJNZ R0, $
DJNZ R1, petal
NOP
NOP
NOP
1+(1+165*3+3)*4 = 1997 + 3 = 2000
NOP, MOV – 1 cykl
DJNZ – 3 cykle
9. bufor danych znajduje się w pamięci pod adresem umieszczonym w R0 o długości umieszczoniej w R1 utwórz 16 bitową sumę kontrolną w parze R2,R3
Nie do końca poprawnie, bo adres pamięci jest adresowany bezpośrednio (MOV DPTR, #50h) a nie poprzez R0.
CSEG AT 0h
JMP start
start:
MOV R1, #08h
MOV R2, #0
MOV R3, #0
MOV DPTR, #50h
petla:
MOV A, #0
MOVC A, @A+DPTR
; tmp
MOV R5, A
MOV A, R3
ADD A, R5
MOV R3, A
MOV A, #0
ADDC A, R2
MOV R2, A
INC DPTR
DJNZ R1, petla
CSEG AT 50h
DB 132,245,135,234,215,134,156,159
END
04 Luty 2011
Zad.1 Na wejście 8-mio bitowego przetwornika ADC podawane jest napięcie wzrastające liniowo od zera do wartości 10V z szybkością wzrostu 1 V / minutę. Proszę przyjąć, że ADC „próbkuje” sygnał co minutę i podać wartości rejestru odczytu ADC (binarnie, lub szesnastkowo) w kolejnych 10 minutach, Napięcie referencyjne ADC wynosi 2.55 V.
1111 1111 to dziesiętnie 255, odpowiada wartości Uref=2.55V
czyli jeden krok 0000 0001 odpowiada 0.01V
start
V=0V ADC=0000 0000
po 1. minucie
V=1V, 1V/0.01V=100 stad ADC=100dec=0110 0100bin=64hex
po 2. minucie
V=2V, 2V/0.01V=200 stad ADC=200dec=1100 1000bin=C8hex
po 3. minucie
V=3C, 3V/0.01V=300 stad ADC=no właśnie ile? powyżej 2.55 już zawsze FF? + flaga przepełnienia?
ZAD2. Potrzebujemy, by w programie dla 8-mio bitowego mikro-kontrolera, o cyklu maszynowym wynoszącym 500ns nastąpiło opóźnienie pomiędzy wykonaniem dwóch instrukcji. Opóźnienie ma wynosić 1 sekundę. Przy rozwiązaniu można podać/założyć które z użytych komend są jedno, a które dwu-cyklowe
CSEG AT 0
JMP start ;2cykle ktore nie licza sie do opoznienia
RSEG PROG
Delay_1s:
MOV R7, #16 ;1c
zewn:
MOV R6, #255 ;1c
wewn:
NOP ;1c
MOV R5, #243 ;1c
DJNZ R5, $ ;2c kazda
DJNZ R6,wewn ;2c kazda
DJNZ R7,zewn ;2c kazda
;i jeszcze dopelnic do rownych 2 mln
MOV R6, #255 ;1c
DJNZ R6, $ ;2c kazda
MOV R6, #117 ;1c
DJNZ R6, $ ;2c kazda
NOP ;1c
RET ;2c
start: ;jakis tam program
;instrukcja A
ACALL Delay_1s ;2c
;instrukcja B
end
ZAD4. Rejestr PSW (Program Status Word) na pozycji 0 ma bit parzystości. Jest on ustawiany (na 1) jeśli aktualnie liczba jedynek w ACC jest nieparzysta, zerowany w przeciwnym, wypadku. W obszarze pamięci danych od adresu 0x50 do adresu 0xAF znajdują się bajty o różnych wartościach. Napisz program zliczający liczbę bajtów o nieparzystej liczbie jedynek.
PROG SEGMENT CODE
Ile EQU 8
BUFOR DATA 50h
TABLICA DATA 70h
CSEG AT 0
JMP start
RSEG PROG
start:
MOV R0, #TABLICA
MOV A, #0
MOV DPTR, #BUFOR
MOV R1, #Ile
loop:
MOV A, #0
MOVC A, @A+DPTR
INC DPTR
JNB PSW.0, event
powrot:
DJNZ R1, loop
AJMP $
event:
MOV @R0, A
INC R0
AJMP powrot
CSEG AT BUFOR
Buf:
DB 1,2,3,4,5,6,7,8
END
5. Mikroprocesor wyposażony jest w 8-bitowy „timer”, który skonfigurowany jest tak, że przepełnienie powoduje przerwanie programowe. Timer zlicza cykle gdy ustawiony jest bit o nazwie TR1 (jeśli ten bit jest 0, to timer nie zlicza cykli). Należy napisać podprogram obsługi przerwania od tego Timer'a tak, by po piątym przepełnieniu ustawił rejestr R7 na wartość 0xFF oraz przestał zliczać cykle maszynowe.
PIEC DATA 30h
….
Start: MOV PIEC, #00
PUSH ACC
PUSH PSW
INC PIEC
MOV A,PIEC
CJNE A,#05, dalej
CLR TR1
MOV R7,#FF
Dalej:
POP PSW
POP ACC
RETI
ZAD7. Rozpoznaj funkcję poniższego programu i opisz sens każdej linii kodu:
;SUBROUTINE TOINT
TOINT:
CLR C ; clear znacznika przeniesienia C
JZ toend ; jeśli A= zero to toend
MOV R4,#00H ; przenoszenie do R4 wartosci 0
toi1:
RRC A ; rotacja w prawo akumulatora 7 bit staje się 6 itd.
INC R4 ; inkrementacja R4
JNC toi1 ; jeśli 0 to idz do toi1
MOV A,R4 ;przenoszenie do akumulatora wartości z rejestru R4
toend:
RET ; adres powrotu z podprogramu wpisywany do licznika PC
wypisze na którym miejscu była pierwsza 1 w akumlatorze)
np. A=0110 1000 to "wypisze" 4
ZAD8. Napisz podprogram, który wywołany zastaje w akumulatorze liczbę całkowitą z zakresu 0-7,a w wyniku zmienia ACC tak że ma on ustawiony jeden bit na pozycji odpowiadającej tej liczbie całkowitej.
CJNE A,#00, JEDEN
MOV A, #0000 0001B
SJMP KONIEC
JEDEN:
CJNE A,#01,DWA
MOV A,#0000 0010B
SJMP KONIEC
DWA:
…
KONIEC:
NOP
END