Zad 1:
Kod: |
---|
unsigned char packets_in_queue, packetnr; void packet_recv(){ packetnr++; packets_in_queue++; if(packets_in_queue > 16) CPSR |= (1<<7) // bo zdaje sie 7 siódmy odpwoadał przerwaniom if((packetnr % 2) && !(CPSR & (1<<7))) CPSR |= (1<<30); } void packet_disp(){ packets_in_queue --; } |
Zad 2:
Odpowiedź na ostatnie pytanie brzmi, że jest źle, bo stos jest LIFO czyli to co ostatnie wrzuciles na stos, to pobierzesz jako końcowe.
Odnośnie ASM:
mov AX, 0x1AF5, przerzuca 0x13F5 do AX'a
mov BX, 0xFF, przerzuca 0xFF do BX'a
add AX, BX, dodaje je więc w AX wyląduje 0x1BF4
mov CX, 0x10
mul CX, mnoży akumulator czyli AX razy CX, a wynik ląduje w DX:AX, czyli dolna polowka wyniku w AX, gorna DX
jest to przemnożenie x 16 więc wynik to przesyniecie liczby szesnstkowej o jeden w lewo: 0x1BF40, więc w AX będzie BF40
xor CX, CX, Xor czegokolwiek z tym samym daje zawsze 0
Zad 3:
Ilość bajtów dla ramek 8O2 : 1 bit startu + 8 bitów danych + 1 bit nieparzystości + 2 bity stopu ...
19200 / (1+8+1+2) = 1600 Bajtów / sek
Kod: |
---|
// Nie pamiętam nazwy tego rejestru co trza było sprawdzać unsigned char suma; for(int i=0; i<8 i++){ while(!(SPDR & (1<<7)); TDR = tab[i]; suma+= tab[i]; } suma = ~suma + 1; // dokładnie jest to LRC |
Ramki dla liczby 0B5h. W sumie to dla 0 to olałem, więc jest dla 8 i 5;
czyli w hexie B5 rozpieprzamy na bity:
10110101
I w odwrotnej kolejności, jak Pawcio słusznie zauważył zapisujemy:
[BS|1|0|1|0|1|1|0|1|0|Bs|Bs]
I właśnie w tym momencie skumałem, że zjebałem na egzamie, bo liczyłem bit parzystości, a nie nieparzystości, i wogole głupote jakąś napisałem
(jest 1 która uzupełnia do nieparzystej ilości jedynek)
Zad 4:
Są dwie wersje...
Pan Doktor sobie chyba życzył, żeby je polączyć więc zostaje jedna, ale gorsza:
5.242880 Mhz czyli 5242880 taktów w czasie sekundy.
Licznik 1 jest 16 bitowy, więc przepełnia się przy 0xFFFF.
5242880 / (2^16) = 80, czyli 80 przepełnień licznika pełnego w czasie sekundy. A mamy mieć 8 Hz czyli osiem przepełnień. A więc wyjście z licznika 1 łączymy z wejściem licznika 3.
Licznik3 w tryb CTC, Licznik jeden jako zwykly licznik. Dla pierwszego ustawiamy, że przy równości z OCR1 ma zmienić stan na pinie. Z koleji licznik 3 skoro wchodzi mu na wejście 80 razy na sekunde, a ma się wywoływać co osiem, to do OCR3 trzeba wpisać wartość 10.
Druga opcja to wykorzystanie tylko Timera 1 z preskalerem np /32 i wpisanie wartości odpowiedniej do OCR1