Majkel rzekł : a ) jakis asm.. ale to juz robiles.. przydalby sie jeszcze opis dodawania z przelepnieniem;] b) jakies przebiegi z roznym wypelnieniem.. tyle pamietam.. ale jakie zadanie z tego... o co halo... nie mam pojecia... c) szeregowka.. niby bylo.. ale nie wiem.. jakies podsuwmowanie moze? d) zadanie 4 dla "koneserow" czytaj nie dla mnie;] Asembler oznaczenia : c flaga (znacznik) przeniesienia ! - negacja sp wskaznik stosu [sp] = ax zapis pod adres sp ^ - xor ( a^a = 0 ; a^(!a) = 1 gdzie a = 1 lub 0) adc ax, cx ; ax = ax + cx + c add ax, cx ; ax = ax + cx sbb ax, cx ; ax = ax (cx + c) sub ax, cx ; ax = ax cx dec ax ; ax = ax 1 inc ax ; ax = ax + 1 and ax, cx ; ax = ax & cx not ax; ax = !ax or ax, cx ; ax = ax | cx xor ax, cx ; ax = ax ^ cx clc ; c = 0 cmc ; c = !c stc ; c = 1 push ax ; sp = sp + 1 , [sp] = ax pop ax ; ax = [sp], sp = sp 1 mov ax, cx ; ax = cx xchg ax, cx ; ax = cx i cx = ax mała uwaga: add, adc, sub, sbb zmieniają znacznik c tak, że jeśli po wykonaniu operacji wystąpi przepełnienie to c = 1; a jeśli nie to c = 0. or, xor i and zerują znacznik c! Przykład 1: mov ax, 0xFFFF ; ax = 0xFFFF ; bx = ? ; cx = ? ; c = ? add ax, 1 ; ax = 0 ; bx = ? ; cx = ? ; c = 1 mov bx, 3 ; ax = 0 ; bx = 3 ; cx = ? ; c = 1 adc ax, bx ; ax = 4 ; bx = 3 ; cx = ? ; c = 0 mov cx, 6 ; ax = 4 ; bx = 3 ; cx = 6 ; c = 0 sub ax, cx ; ax = 0xFFFE ; bx = 3 ; cx = 6 ; c = 1 xor bx, bx ; ax = 0 ; bx = 0 ; cx = 6 ; c = 0 sbb bx, 1 ; ax = 0 ; bx = 0xFFFF ; cx = 6 ; c = 1 sbb ax, 1 ; ax = 0xFFFE ; bx = 0xFFFF ; cx = 6 ; c = 1 add cx, 1 ; ax = 0xFFFE ; bx = 0xFFFF ; cx = 7 ; c = 0 Przykład 2: 1. mov ax, 1 2. mov bx, 2 3. mov cx, 3 4. push ax 5. push bx 6. push cx 7. pop ax 8. pop cx 9. pop bx na początku stos wyglada np. tak: ? ? ? ? <= SP ? ? Po instrukcji nr 3, nadal będzie wyglądał tak samo :) a rejestry : ax = 1; bx = 2; cx = 3 Po instrukcji nr 4 : ax = 1; bx = 2; cx = 3 ? ? 1 <= SP ? ? ? Po 5 : ax = 1; bx = 2; cx = 3 ? 2 <= SP 1 ? ? ? Po 6: ax = 1; bx = 2; cx = 3 3 <= SP 2 1 ? ? ? Po 7: ax = 3; bx = 2; cx = 3 ? 2 <= SP 1 ? ? ? Po 8: ax = 3; bx = 2; cx = 2 ? ? 1 <= SP ? ? ? Po 9: ax = 3; bx = 1; cx = 2 ? ? ? ? <=SP ? ? Timer: Mamy sobie generator fgen = 1800 Hz, liczniki 8 bitów chcemy uzyskać 50% wypełnienia i częstotliwość f = 90 Hz. I szukamy jak ustawić RA i RC : RA po doliczeniu przez licznik do tej wartości wyjście zmienia się na przeciwne RC po doliczeniu przez licznik do tej wartości wyjście i licznik zerują się (liczy od 0) Z tego wynika że dla wypełnienia 50% powinniśmy mieć RC = 2*RA. RC kończy okres więc powinno być ustawione tak, żeby licznik dochodził do tej wartości z daną częstotliwością = 90 razy na sek. Skoro generator daje nam 1800 Hz to RC = fgen/f = 1800/90. Bo to w sumie działa jak dzielnik częstotliwości gdzie RC jest dzielnikiem. RC = 1800/90 = 200 RA = 0.5 * RC = 100 Czyli mieścimy się w liczniku 8 bitowym :) Gdyby było f = 9 Hz to RC = 2000 i RA = 1000, to już nie mieści się w 8 bitach więc łączymy w kaskadę 2 liczniki. I teraz problemik : jeśli oba są ustawione w tryb Waveform czyli ten gdzie się ustawia RA i RC to trzeba na pierwszym liczniku ustawić taki dzielnik, żeby drugi dał radę zliczyć resztę. Ogólnie RC1*RC2 = fgen/f trzeba to tak dobrać, żeby żaden nie przekroczył 256, dla naszego przykładu wystarczy: RC1 = 10 RA1 = 5 oraz RC2 = 200 RA2 = 100. Nie jestem pewien ale dla pierwszego licząc od generatora powinno być wypełnienie 50% niezależnie od zadanego, a na drugim zadane. Jeśli za to pierwszy będzie capture a drugi waveform to mamy podobny wzorek OCR1*RC2 = fgen/f czyli OCR1 = 10 a RC2 i RA2 jak wyżej. No to teraz przykład, bez kaskady bo wątpię żeby dał takie ciulstwo (a jak da to chyba jest to dość jasne jak to zrobić nie ? :D ) fgen = 10 MHz f = 200 Hz licznik 16 bit wypełnienie 25% RC = 10 000 000 / 200 = 50000 < 65536 czyli mieści się w liczniku RA = (1 0.25)*RC = 37500 Interpretacja tych wartości : RA = 37500 taktów generatora będzie 0 na wyjściu, potem zmieni się na 1 i przez kolejne RC-RA = 12500 taktów będzie się utrzymywała ta 1 na wyjściu, po czym licznik się zresetuje i na wyjściu znowu będzie 0 i tak w kółko. Razem daje nam to 50000 taktów na jeden okres syg. wyjściowego Czyli tak jakby na jeden okres wyjściowy przypada 50000 okresów wejściowych, stąd wzór RC = fgen/f. Szeregówka: Ponoć Czyż powiedział że bajt/sek = baud / dł_ramki , on to sprawdza więc przyjąłbym to za fakt :) Ramka asynchroniczna: Bit startu | dane (5 8 bitow) | kontr. Parz. | bit(y) stopu dane są pisane od LSB czyli liczba 33 = 0100001 powinna być zapisana : 1000010 kontr parzystości: jeśli ODD - nieparzysta liczba jedynek w danych i bicie kontr. Parz jeśli EVEN parzysta liczba jedynek w danych i bicie kontr. Parz jeśli NONE nie ma tego bitu Wartość bitu kontroli parzystości: Ilość jedynek w danych ODD EVEN parzyście 1 0 nieparzyście 0 1 Programy ... no takie jak na poprzednich terminach :) PRZYKAADY DO ROZWIZANIA! Ad1) wypisać ax,bx,cx, flage c i stosik po instrukcji adc ax i po xor bx,bx Stos na starcie wygląda tak: ? ? ? ? ? <=SP ? mov ax, 0xDD mov bx, 0x01 mov cx, 0x00 push ax push bx push cx sub cx, bx adc ax, 1 and ax, 0xF0 or bx, 0xBB add ax, bx pop ax xor bx,bx pop cx pop bx Ad2) a) Częstotliwość generatora 2GHz, wypełnienie 20%, częstotliwość wyjściowa 100MHz b) Częstotliwość generatora 2MHz, wypełnienie 80%, częstotliwość wyjściowa 100Hz c) Częstotliwość generatora 1.6kHz, wypełnienie 50%, częstotliwość wyjściowa 8Hz Ad3) Odbieracie ramke o postaci Start | 3*dane | Koniec start i koniec = 1 bajt odebrać ramkę, zsumować wszystkie bajty danych i jeśli parzysta suma to odesłać kompletną ramkę z danymi 0xFF667C (3 bajty) jeśli nie to dane = 0x000001 (3bajty)