[asm51] Skoki warunkowe i symulacja

0

Witam,

Na zajęciach z układów cyfrowych mamy wykonać projekt, który poprzez 2 fototranzystory zlicza osoby wchodzące i wychodzące. System obsługujący ma być napisany w assemblerze pod mikrokontroler 8051. Idea działania systemu jest następująca dla zliczania wejść:

  1. Jeżeli 'aktywny' fototranzystor na porcie P0.1, to przechodzimy dalej;
  2. Dodajemy do rejestru R1 wartość 1;
  3. Jeżeli fototranzystor P0.2 'nieaktywny', to przechodzimy dalej;
  4. Jeżeli rejestr R1 równy 1 to krok 5. , w przeciwnym razie R1 = 0;
  5. Jeżeli P0.1 'aktywna' to dodaj do akumulatora 1.

Po zapoznaniu się z rozkazami assemblera napisałem program, który niestety nie kompiluje się. Program 8051 Editor nie rozpoznaje komend CMP i JE, więc przepisałem je na JB i JNB i równiez nie kompilują się.
Proszę Was o nakierowanie mnie jak to wykonać. Mile widziany inny algorytm niż mój przedstawiony niżej. A także prosiłbym o wskazanie symulatora 8051. Przeszukiwałem zasoby sieci przez kilka dni bezskutecznie.

$mod51

org 0h
ljmp main

main:

	clr a
	mov p0, #255

	mov r1, #0
	mov r2, #0

	jb p0.1 d1a
	jb p0.2 d2a

; warunek na wchodzenie
d1a:
  mov r1, #1
  jnb p0.2, d1b

d1b:
  jb r1, d1c
  jnb r1, d1cn

d1c:
  jnb p0.1, d1d
  jb p0.1, d1dn

d1cn:
  mov r1, #0

d1d:
  inc a

; warunek na wychodzenie
d2a:
  mov r2, #1
  jnb p0.1, d2b

d2b:
  jb r2, d2c
  jnb r2, d2cn

d2c:
  jnb p0.2, d2d
  jb p0.2, d2dn

d2cn:
  mov r2, #0

d2d:
  dec a

jmp main

end

Kompilator zgłasza błędy przy następujących komendach typu:

jb r1, d1c
jnb r1, d1cn

Pozdrawiam

0

JB i JNB oczekują numeru bitu, nie rejestru:
JB bit, ofset
JNB bit, ofset

więc napisz:
JB p0.1, label.

Przebieg stanów dla pary fotokomórek (zero aktywne):
11 01 00 10 11 - wejście
11 10 00 01 11 - wyjście

Każdą parę stanów różną od 11 opisz labelem we0, we1, we2, oraz wy0, wy1, wy2.
Stan 11 jest stanem idle, gdzie czekasz na jedno zero. Pin na którym sięono pojawi określa kierunek: początek wchodzenia lub wychodzenia.

; makro
$define FK0 p0.1
$define FK1 p0.2 ; pierwsza cyfra stanu; dla stanu 01, FK1=0;FK0=1


idle:                ; 11
	jnb FK0,wy0  ; 11 -> 10 początek wychodzenia
	jb  FK1,idle ; 11 -> 01 początek wchodzenia

	; kolejne stany: 11<-cofnięcie<-[01]->wchodzenie->00
we0:                 ; 01
	jb  FK1,idle ; 01 -> 11 cofnięcie lub szum
	jb  FK0,we0  ; 01 -> 00 czekaj na tą zmianę

	; kolejne stany: 01<-cofnięcie<-[00]->wchodzenie->10
we1:                 ; 00
	jb  FK0,we0  ; 00 -> 01 cofnięcie lub szum
	jnb FK1,we1  ; 00 -> 10 czekaj na tą zmianę
	
we2:
	; kolejne stany: 00<-cofnięcie<-[10]->WEJŚCIE->11
	jnb FK1,we1  ; 10 -> 00 cofnięcie lub szum
	jnb FK0,we2  ; 10 -> 11 czekaj na tą zmianę

	; WEJŚCIE zakończone
	sjmp idle

	; kolejne stany: 11<-cofnięcie<-[10]->wychodzenie->00 01 11
wy0:                 ; 10
	; TODO: dopisz

	; kolejne stany: 11 10<-cofnięcie<-[00]->wychodzenie->01 11
wy1:                 ; 00
	; TODO: dopisz

	; kolejne stany: 11 10 00<-cofnięcie<-[01]->WYJŚCIE->11
wy2:                 ; 01
	; TODO: dopisz

	; WYJŚCIE zakończone
	sjmp idle

Zaleca się zapisanie tego w obsłudze przerwania zewnętrznego jeżeli kontroler ma coś dodatkowo robić. Wyjścia fotokomórek przez układy różniczkujące (na bramce XNOR z otwartm kolektorem) zwierają INT0 lub INT1 do masy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1