pytania z egzaminu z tamtego roku:
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
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.
3. Podaj cechy architektury ARM, które zasadniczo różnią ją od „rodziny 8051” i AVR.
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.
5. Wymień najważniejsze różnice architektur RISC i CISC.
1. TAK
2. potrzebna tylko procedura Timer0
CSEG AT 0H
AJMP start
CSEG AT 0BH
AJMP Timer0
ILE DATA 20h
start:
SETB EA
SETB ET0
MOV TMOD,#00000001B ;T1: tryb 1=16b T1: tryb 1=16b
SETB TR0
AJMP $
;****************************************************
Timer0:
INC R0
MOV ILE,R0
CJNE R0,#0DEh,tam
CLR TR0
tam:
RETI
;***************************************************
END
3.patrz wykłady
4.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
hop:
MOV A,@R0
JNB PSW.0,tam
CPL PARITY
tam:
INC R0
DJNZ R1,hop
MOV P2,20h
END
5.patrz wykład
1) z tablicy pod adresem 0x50 o długości 0x40 wybierz bajty z parzysta liczba jedynek i utworzyc z nich nową tablice
2) DAC 10-bitowy o Uref =2.048V jaka będzie odpowiedź analogowa gdy rejestr danych przechowują wartosci: DACDATAH = 0
DACDATAL = 0xF3
3) napisz podprogram dla uzyskania opóźnienia 1ms. Procesor ma cykl maszynowy równy 0.5us
4) bufor danych znajduje się w pamięci pod adresem umieszczonym w R0 o długości umieszczoniej w R1 utwórz 16 bitową sume kontrolną w parze R2,R3
Zaczynając od końca, to ja zdanie 8. zrobiłem tak, że zawartość akumulatora przerzuciłem do pomocniczego rejestru, do A załadowałem binarnie jedynkę i dekrementując rejestr pomocniczy, przesuwalem rozkazem RL (bitowo w lewo) tę jedynkę. Oczywiście na początku warunek, że jeśli w A jest zero, to koniec programu. Można oczywiście na sztywno też zrobić, sprawdzając po jednym bicie a Akumulatora, instrukcja warunkowa, 8 linii, ale trochę nieelegancko.
7. to chyba łatwo opisać linię, ale co to robi, to nie wiem, jaka to funkcja.
5. to trzeba jakoś w pomocniczym rejestrze zliczać ile razy flaga tam jakaś od przepełnienia, ew dzielić, jak reszta 0, to coś tam robić
4. mam bardzo podobnie zrobione, tylko, że dane są podawane w innej formie:
Kod: Zaznacz wszystko
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
2. to trzeba policzyć, te cykle, chyba też łatwe
Trochę tak opisowo, ale mam nadzieję, że pomoże komuś choć trochę, kto nie ma pomysłu.
Reszty na examie nie przeczytałem nawet.
w 2 wystarczy zrobić pare pętli które przejdą przez razem 2 mln cykli, w 4 wystarczy przepisywać kolejne segmenty pamięci do akumulatora i robić skok do podprogramu gdzie się zlicza ilość nieparzystych, w 5 trzeba w innym rejestrze liczyć przerwania jak będzie 7 to zrobić co każą, w 6 tak jak w 4 trzeba przepisać rejestr SBUF do akumulatora i sprawdzić w rejestrze PSW czy jest niepażysta jedynek jeśli tak to skoczyć do podprogramu gdzie się sprawdzi bit TB8 i zrobić co każą, w 7 chyba prosto : P, w 8 wystarczy przepisać gdzieś akumulator a wpisać do niego "1" i przesówać w pętli DJNZ w lewo odejmując zapamiętaną wcześniej liczbę,
Zad.1 rozkminka do oceny
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 wlasnie ile? powyzej 2.55 juz zawsze FF?
Zad.2
PROG SEGMENT CODE
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
W keilu sie to szybko robi. 1000000000 [ns] dziele na 1 cykl (tu 500ns) i mnoze *12 (tyle taktow to 1 cykl) wychodzi 2400000 Hz czyli 24 MHz i to wpisuje w keilu i pokazuje tak jak ma byc.
8) dobrze rozkminione. Tu troche inaczej:
CSEG AT 0
JMP start
start:
MOV A,#7d
nasz_program:
MOV R0,A
INC R0
MOV A,#10000000b
loop:
RL A
DJNZ R0,loop
END
7) funkcja robi odwrotność zadania 8, (wypisze na którym miejscu była pierwsza 1 w akumlatorze)
np. A=0110 1000 to "wypisze" 4