CJNE ma trzy warianty: CJNE A,#n,d ; CJNE Rr,#n,d – 1)pobr. rozkazu, 2)pobr. danej natychmiastowej, 3)pobr. przesunięcia ; CJNE @Rr,#n,d – 1)pobr. rozkazu, 2)pobr. danej natychmiastowej, 3)pobr. przesunięcia, 4)pobr. danej wskazywanej przez adres zawarty w rej. Rr
@ -w mnemoniku poprzedza adres pośredni,
# -w mnemoniku poprzedza argument bezpośredni.
CJNE porównuje daną z daną natychmiastową i wykonuje skok względny o przesunięcie d pod warunkiem, że dane nie są równe. Skok zawiera się [-128,127]
CJNE zmienia stan flagi C:
C=0 gdy A>=n ; C=1 gdy A<n
Jakie błędy może wykryć mC na linii RXD
mC nie posiada sprzętowego mechanizmu wykrywania błędów. Można takie wykrywanie zrealizować programowo dla interfejsu szeregowego pracującego w trybie 2,3 (przesyłane 9 bitów). mC musi wykonać następujące czynności: 1)przenieść bit RB9 do rej. np.F0, 2)przenieść zawartość bufora SBUF do akumulatora, 3)porównać flagę F0 z flagą P
- jeżeli te flagi są równe to znak został przesłany poprawnie dla transmisji z kontrolą parzystości,
- jeżeli flagi nie są równe tzn. że znak został przesłany poprawnie dla transmisji z kontrolą nieparzystości
MOV F0,RB9
MOV A,SBUF
EXL F0,P (exor logiczny)
W ramach wewn. pamięci danych w obszarze 128-255 (80h-FFh) jest umieszczona grupa rej. specjalnych SFR (PCON, TCON, SBUF, TMOD, PSW, ACC, B, DPTR itp.). Dostęp do obszaru SFR pamięci jest możliwy wyłącznie poprzez adresowanie bezpośrednie. Tylko do niektórych z rej. specjalnych (np. ACC, B, DPTR) można się odwoływać poprzez nazwę. Wśród tych rej. znajdują się m.in. porty we-wy oraz rej. sterujące pracą bloków funkcjonalnych mC.
W wewnętrznej pamięci danych w obszarze pamięci użytkowej może być umieszczony stos o dowolnej wielkości (ograniczony pojemnością pamięci), adresowany przez 8bitowy wskaźnik stosu SP (SFR adres 81h) wskazujący jego wierzchołek. Wskaźnik przed każdym zapisem na stos jest zwiększany o 1, a po każdym odczycie zmniejszany o 1. Na stosie podczas wykonywania rozkazu skoku do podprogramu (CALL) oraz po przyjęciu przerwania jest zapisywana automatycznie zawartość licznika rozkazów (2 bajty). Ponadto za pomocą rozkazu PUSH może być tam także zapisana zawartość dowolnej (adresowanej bezpośrednio) komórki wewnętrznej pamięci danych (również rej. specjalnych). Zdejmowanie informacji ze stosu następuje w wyniku wykonania rozkazów powrotu RET lub RETI, powodujących odtworzenie stanu licznika rozkazów, oraz rozkazu POP powodującego wpisanie zdejmowanych danych pod wskazany adres bezpośredni w pamięci.
SP – wskaźnik stosu umieszczony w SFR 81h-wierzchołek, pamięć programu jest adresowana przez PC.
PC – licznik rozkazów 16bitowy. Bity 11 do 15 wyznaczają numer strony pamięci, bity 0 do 10 określają adres na stronie. W czasie zerowania (RESET) PC jest zerowany.
Rozkazy działające na bitach umożliwiają przesyłanie i wykonywanie operacji logicznych (AND, OR, NOT) na pojedynczych bitach z adresowanego bitowo obszaru wewnętrznej pamięci danych. Funkcję akumulatora dla operacji logicznych na bitach spełnia znacznik przeniesienia CY.
Rejestry umieszczone w wewnętrznej pamięci danych jako rej. specjalne SFR, które mogą być adresowane bitowo, a więc zapisywanie i odczytywanie danych może odbywać się za pomocą dowolnych rozkazów z adresem bezpośrednim dotyczącym wewnętrznej pamięci danych, oraz za pomocą rozkazów wykonujących operacje na bitach. Adresowanie bezpośrednie (8bitowy adres w treści rozkazu) obejmuje:
- pamięć urzytkową RAM, tzn. adresy 0-127,
- obszar rej. spec. tzn. adresy 128-255, jest to jedyny sposób adresowania rej. z obszaru SFR.
Cała wewn. pamięć danych może być adresowana bitowo np. MOV A,25 . Adresowanie bezpośrednie bitów (8bitowy adres w treści rozkazu) obejmuje obszar pamięci użytkowej ROM o adresach 32-47 i cześć rej. spec.
8051 nie posiada gotowych instrukcji do tworzenia pętli programowych. Można je realizować poprzez rozkazy skoków warunkowych (JZ, JNZ, JC, JNC, JB,JNB, JBC, CJNE, DJNZ). Są to skoki krótkie w obrębie 256bajtów [-128-127]. Można to realizować poprzez skok w tył o jakąś wartość w powyższym zakresie.
W trybach 2, 3 bit 9 (D8) jest pobierany do wysłania z pozycji TB8, a ten odebrany jest wpisywany na pozycję RB8 w rej. SCON. Jeżeli w słowie SCON jest SM2=0 , to wartość bitu D8 jest nieistotna. Przed wysłaniem znaku może być ona ustalona programowo i wpisana do znacznika TB8, a po odebraniu znaku, odczytana ze znacznika RB8 i przeanalizowana programowo, zgodnie z przyjętym protokołem transmisji, np. jako bit parzystości.
W komunikacji wieloprocesorowej, gdy procesor nadrzędny wysyła bajt adresu określający procesor docelowy, to bajt danych i adresu różnią się tym, że bit 9 bajtu adresu jest „1”, a bit 9 bajtu danych jest „0”
Po sygnale RESET PC jest zerowany i mC staruje od lokacji 0000h.
Do wskaźnika stosu SP (81h) wpisuje się wartość 07h. Wartość rej. SBUF po sygnale RESET jest nieokreślona.
Dzielenie: DIV AB (A)15-8 [A/B] 1bajt
(B)7-0 4cykle
Mnożenie: MUL AB (B)15-8 [A*B] 1bajt
(A)7-0 4cykle
8bitowa liczba bez znaku, znajdująca się w akumulatorze, jest dzielone/mnożone przez 8bitową liczbę bez znaku z rej. B
Operacje arytmetyczne
operacja
ADD
ADDC
SUBB
INC
DEC
MUL
DIV
DA
Kiedy zachodzi potrzeba komunikacji z pamięcią zewn. 8051 wysyła starszy bajt adresu przez port P2, a młodszy bajt adresu i dane przez port P0. Współpracują przy tym także sygnały ALE, PSEN oraz dwa wyjścia P3 (RD, WR) do sterowania pamięcią. Sygnał ALE jest wykorzystywany do zatrzaskiwania adresu wybierającego żądany bajt pamięci zewnętrznej. Sygn. PSEN odczytuje daną z pamięci programu za pomocą P0. RD odczytuje daną z zewn. pamięci danych przez port P0, zaś sygn. WR zapisuje daną do zewn. pamięci danych. Wszystko to odbywa się poprzez zapamiętanie w dodatkowym rej. adresu wysłanego do portu P0. Może do tego służyć np. rej. statyczny 8212, 8282. Otrzymuje się wtedy typową strukturę z 16bitową m-lą adresową i 8bitową m-lą danych
Komunikacja mC z zewn. układami pamięci programu i danych odbywa się poprzez port P0, który pełni fkcję we-wy dwukierunkowej multipleksowanej m-li adresowej/danych. Do portu P0 jest wysyłanych 8 mniej znaczących bitów adresu strobowanych sygnałem ALE. 8 bardziej znaczących bitów jest wysyłanych do portu P2. Przesyłanie danych odbywa się za pomocą sygnałów:
PSEN – odczytanie z zewn. pamięci programu
RD (P3.7) – odczytanie z zewn. pamięci danych
WR (P3.6) – zapis do zewn. pamięci danych
Odczytanie z zewn. pamięci programu jest wykonywane przez mC przy pobieraniu z pamięci programu kodu rozkazu, argumentu bezpośredniego lub danej, spod adresu większego lub równego 4096(1000h), oraz przy każdym pobraniu z pamięci programu we wszystkich układach ’51, gdy na wejściu EA jest stan niski (LOW TTL).
Odczytywanie z pamięci programu jest wykonywane dwukrotnie w każdym cyklu maszynowym.
Podłączenie zewn. pamięci do 8051 (linie sterujące)
Komunikacja mC z zewn. układami pamięci programu i danych odbywa się poprzez port P0, który pełni fkcję we-wy dwukierunkowej multipleksowanej m-li adres/dane. Do portu P0 jest wysłane 8 mniej znaczących bitów adresu, strobowanych sygnałem ALE. 8 bardziej znaczących bitów adresu jest wysyłanych do portu P2. Przesyłanie danych jest sterowane za pomocą sygnałów:
8051 przyjmuje zgłoszenia przerwań od:
a) zewnętrzne:
- z wejścia INT0 (IE0 – TCON.1)
- z wejścia INT1 (IE1 – TCON.3)
b) z układu czasowo licznikowego:
- przepełnienie licznika T0 (TF0 – TCON.5)
- przepełnienie licznika T1 (TF1 – TCON.7)
c) z portu szeregowego:
- koniec nadawania znaku (TI – SCON.1)
- koniec odbierania znaku (RI – SCON.0)
Jeżeli w słowie IE jest EA=1 (włączony system przerwań) to w stanie S6 każdego cyklu maszynowego są przeglądane znaczniki zgłoszenia niemaskowanych przerwań. Wykrycie zgłoszenia (ustawienia któregoś ze znaczników) spowoduje, że jeśli wykonywany w danej chwili cykl maszynowy nie jest ostatnim w cyklu rozkazowym lub w danej chwili jest wykonywany rozkaz RETI albo program obsługi przerwania z poziomu priorytetu wyższego lub równego zgłoszenia to przyjęcie przerwania zostaje wstrzymane. Jeśli powyższe warunki nie są spełnione to w następnym cyklu maszynowym rozpocznie się wykonywanie cyklu przyjęcia przerwania o najwyższym ze zgłoszonych priorytetów:
- ustawienie wewnętrznego przerzutnika poziomu przerw.,
- wyzerowanie znacznika zgłoszenia przyjętego przerwania (bez TI, RI, TF2, EXF2),
- zapisanie na stosie zawartości PC
- wpisanie do licznika PC początku programu obsługi przerwania (0003h – INT0 ; 000Bh – timer T0 ; 0013h – INT1 ; 001Bh – timer T1 ; 0023h – serial port ; 002Bh – timer T2 (dla 8052))
Jedynie znaczniki TI, RI oraz TF2, EX F2 nie są zerowane automatycznie (TI, RI –SCON ; TF2, EXF2 – T2CON-8052)
Flagi te nie są kasowane ponieważ można je wyzerować tylko programowo.
RET PC15-8 – (SP) 22h 1bajt
SP – SP-1 2cykle
PC7-0 – (SP)
SP – SP-1
- powrót z podprogramu,
RETI PC15-8 – (SP) 32h 1bajt
- powrót z przerwania,
Maksymalna częstotliwość impulsów zewn. zliczanych przez 8051
fCNTmax = fXTAL/24
dla fXTAL = 12MHz fCNTmax = 12/24 = 0,5 MHz
P3.0 – P3.7 (końcówki 10-17) – 8bitowy port we/wy
(B0h) - alternatywnie:
P3.0 – RXD – we.szereg.
P3.1 – TXD – wy. szereg.
P3.2 – INT0 we. przerwań zewn.
P3.3 – INT1
P3.4 – T0 we. zegarowe ukł. czasowo licznik.
P3.5 – T1
P3.6 – WR – zapis do pam. zewn.
P3.7 – RD – odczyt z pam. zewn.
P0.0 – P0.7 (końcówki 39-32 w 8051), 8bitowy, dwukierunkowy port we/wy (wy. z otwartym kolektorem, we. o dużej impedancji). Przy pracy z zewn. pamięcią programu lub danych stanowi multipleksowaną m-lę adres/dane. Adres portu 80h.
Zwiększyć można instrukcją inkrementacji INC DPTR. Natomiast nie można dekrementować całego rej. DPTR.
DPTR składa się z dwóch DPH-starszy i DPL-młodszy. Należy zdekrementować DPL i sprawdzić warunek czy DPL=255 (FFh). Jeżeli warunek jest spełniony (tzn. że DPL przeskoczył z 0 na 255 czyli cofną się o bajt) to należy zdekrementować DPH
DEC DPL
MOV A,DPL
CJNE A,#FF,SKOK
DEC DPH
SKOK:
wachu32