Dioda, opoznienie - ASSEMBLER '51

0

Witam

Mam napisac program w asemblerze, ktory odpowiada za mruganie diody w ilosci wczesniej wpisanej. Wymodzilem takie cos:

	MOV	R1 , #5H
start:
	CLR	P1.7	
	CPL	P1.7
	DJNZ	R1, start
	END

I oto moje pytanie. W jaki sposob zrobic pewne opoznienie, zeby po uruchomieniu programu widac bylo mruganie tej diody. Np. zeby dioda swiecila sie przez 1s oraz byla wygasana na 1s.

Pracuje na dsm-51 z symulatorem Jagoda.

Pozdrawiam

0

Tu znajdziesz więcej ludzi o podobnych zainteresowaniach
http://elektroda.pl/rtvforum/forum12.html

0

Ostatni raz kiedy sie z tym bawilem, byl wieki temu, ale co nieco pamietam (trzeba podkreślic, że nie jestem najlepszy w temacie). Nie wiem z jaką częstotliwością pracuje generator, a to na pewno by się przydało. Jedna możliwośc to wrzucenie do dwóch rejestrów dwóch ( np. R1 i R2) liczb, a następnie użycie instrukcji, którą z powodu ulotu pamięci zdołam opisac jedynie w zarysach.

Nagloweg0:
MOV R1,#Liczba którą wrzucisz do R1
Nagloweg1:
NOP
NOP
NOP
DJNZ R1,nagloweg1
Nagloweg2:
NOP
NOP
NOP
DJNZ R2,Nagloweg0

Mam nadzieję, że nie zrobiłem za wiele strasznych błędów, ale jeżeli rozumuję dobrze, to instrukcje które są pod nagłówkiem1 zostaną wykonane tyle razy, ile wynosi liczba wrzucona do R1 razy liczba wrzucona do R2 (to zajmie mu troche czasu). Obie liczby trzeba rzecz jasna znaleźc metodą prób i błędów, ale można też posłużyc się w tym celu obliczeniami związanymi z częstotliwości generatora (wiem, nie umiem pisac ani językiem "branżowym", ani obrazowo, sorki).

0

możesz też podczepić przełączanie stanu diody pod przerwanie od zegara, po czym ustawić mu odpowiednią częstotliwość - tylko obawiam się, że przerwanie co 64k cykli zegara to i tak będzie za często - możesz dorzucić kolejny licznik wewnątrz obsługi przerwania.
metoda ta poza wadą w postaci większego skomplikowania kodu, ma jedną zaletę - obsługa migania diody wykonuje się "w tle".

0

Najlepiej użyć do tego celu przerwanie wewnętrzna np. licznika T0.

Oto kod takiego programiku (zakładam że dioda jest pod P1.7):

org 0h
jmp start

org 0bh
;obsługa przerwania od licznika T0

intT0:
inc R7 ;zwiekszamy nasz dodatkowy licznik
cjne R7, #14, rozne
mov R7, #0 ;serujemy R7
cpl P1.7 ;negujemy stan na lini portu (gasimy lub zapalamy diode)
rozne:
reti

start:
;ustawiamy licznik (zakładam częstotliwość kwarcu na 11,059 MHz
;11059000 / 12 = 921583 (w przyblizeniu ilość cykli licznika T0 na 1 sekunde)
;maksymalna wartość licznika = 65535 (FFFFh) czyli co 1 sek licznik przepwłnia się
; 921583 / 65536 = 14 razy 
;R7 będzie naszym dodatkowym licznikiem jeśli osiagnie 14 to mineła jedna sekunda
mov R7, #0
;T0 zlicza zawsze 0ffffh (czyli maksymalny przebieg)
;ustawiamy T0 (tryb 1, impulsy wewnętrzne)
mov TL0, #0
mov TH0, #0
mov TMOD, #1
mov IE, #82h ;uruchamiamy system przerwań
orl TCON, #10h ;startujemy T0

jmp $ ;wieczna pętla

end

Do testów polecam ESM8051 - http://www.czarny421.republika.pl/esm8051.zip ;)

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