	#include <aduc841.h>
	org		0000h
	sjmp	basla
; mç nedir
; debug'ta sol tarafta state durumundan mç sayilarini gorebiliriz. 
; djnz komutu 3 mç zamanda calisir.
; mov	komutu 2 mç zamanda calisir.
; sjmp	komutu 3 mç zamanda calisir.
	;mov		r0,#10d
;basla: djnz r0,basla
	;mov		r0,#10d
	;sjmp	basla
	;end
	
;---------------------------------------
; ornegin her 1msn de bir p1.0 bagli ledi terslemek isteyelim
; bekleme zamanini dongu islemleri ile yapalim.
; bir r0 degiskeni maksimum 255 degerini alabilir. r0=255 ise
; her djnz komutunda r0 azaltir isek => cycle sayisi 255*3mç=suresi
; yani 255*3*90.4ns olur.
; bu durumda 1msn bekleme suresini yakalama imkani olmaz.
; bu durumda cift veya uc veya daha fazla dongu surelerini hazirlamamiz lazim.
; 1msn suresini elde edebilmek icin 1msn/90.4ns=11062 lik bir cycle olusturmamiz lazim.
; bir r0 degiskenine 255 degerini verelim. bu durumda djnz komutunda 3*255 lik bir cycle olusur.
; donguyu ikinci dongu icinde calistirirsak (r1=x olsun) ustteki r0 dongusu 3*255*k1 kadar lik bir cycle olusturur
	;sjmp	basla
;basla:
	;cpl		p1.0
	;acall	delay
	;nop
	;sjmp 	basla
;delay:
	;mov		r1,#255d     ; r1=k1 olsun
;x1:	mov		r0,#255d   ; r0=k2 olsun
;x2: djnz	r0,x2
	;djnz	r1,x1
	
	;; bekleme suresi : djnz 3mç için
	;; bu dongude olusan cycle sayisi hesabi
	;; ilk djnz satiri (3*k2)*k1 cycle kadardir.
	;; ikinci djnz satiri cycle sayisi 3*k1 kadardir.
	;; toplamdaki cycle sayisi= 3*k2*k1+3*k2 dir
	;; yani kisaca 3*k2(k1+1)
	;; biz k2=255 dedik k1 hesaplarsak
	;; 3*255(k1+1)=11062
	;; k1=15
	;nop
	;ret
	;end
; sonuclar yaklasik hesaplandigindan  state sayisi farkli cikacaktir.
;----------------------------------------------------------
; mod 1
; 65535 kadar cycle olur;
; cunku tf0=1 olduktan sonra tf0 sifir yapmazsak bir daha
; timer calismaya baslamaz.
; burada peripheralsdan timer0 ac. ve
; her sjmp bekle komutunda tl0 ve th0 kontrol et;
; sjmp bekle 3 cycle da calisiyor. dikkatinize.
;basla:
	;mov		tmod,#01h ;0000 0001b
	;; gt=0  baslatma sadece tr0 ile
	;; c/t=0 zamanlayici
	;; m1=0, m0=0; mod 1 16 bit sayici
	;NOP
	;nop
	;Nop
	;setb	tr0
;bekle:
	;nop
	;nop
	;sjmp	bekle
	
	;nop
	;end
;------------------------------------------------------
; 10 cycle olan bir zamanlayici ornegi 10*90.4 ns
; 65535-10=65525
; 65525 den baslayacagiz, 65535 olunca tf0=1 lenecek
; tekrar tl0 ve th0 guncellenip bir daha 10 cycle zamanlayacagiz.
; timer 0 mod 1 seciliyor, mod 1 oto yuklemeli degil
; mod 1 = 16 bit sayicidir
;basla:
	;mov 	tmod,#01h
	;mov		tl0,#0f5h
	;mov		th0,#0ffh
	;setb	tr0 		;timer calissin.
;bekle: jnb	tf0,bekle  ; tasma 1 oldumu kontrolu yani timer 65535 oldumu?
	;clr		tf0        ; tasma geldi; timer i yeniden baslamasi icin tf0=0 yapiyoruz.
	;mov		tl0,#0f5h
	;mov		th0,#0ffh
	;sjmp	bekle
	;end
;----------------------------------------------------------
; bir buton (p2.2) ile timer 1 baslatacagiz,
; 1Hz'de bir p0.0 bagli ledi tersleyecegiz.
; 1Hz=1 saniyedir
; 1 mç=90.4 ns'dir.
; timer1 mod 1 de maksimum 65535 mç yapar.
; 1 hz icin 1sn/90.4ns=11061947 mç gereklidir.
; ancak timer 1 mod 1 65535 mç'dir.
; o zaman 11061947/65535=169d=A9h
; yani 169 tane 65535 cycle gecerse= 1 sn olur.
; o zaman 169 kez tf1=1 olmasi gerekecek.
;basla:
	;mov		tmod,#10h ; timer 1; gt=0 
                      ;; c/t=0 zamanlayici, sayici degil
                      ;; 01 mod 1 = 16 bit sayici
	;mov		r0,#0A9h  ; r0=169d
	;mov		tl0,#0h
	;mov		th0,#0h
;x:  jb		p2.2,x   ; buton testi basilmasini bekliyoruz.
	;setb	tr1		 ; timer 1 calismaya basladi.
;x1: jnb		tf1,x1   ; tf1=1 oldugu zaman 65535 cycle gecmis demektir.
	;NOP
	;NOP
	;clr		tf1		 ; tf1=1 oldu o zman tekrar 0 yap ki timer 1 tekrar calissin.
	;djnz	r0,x1	 ; tekrar x1 git. 65535 cycle tamamlanmasini bekle
	;; 169 kez dongu bitince 1 sn gecmis demektir.
	;cpl		p0.0
	;mov		r0,#0A9h ; tekrar r0=169d
	;sjmp	x1
	;end
;------------------------------------------------------
; yukaridaki ornegi alt program haline getirelim
; call birsaniyebekle olacak sekilde.
; bu sekilde istedigimiz anda  1 sn bekle yi kullanabiliriz.
;basla:
	;mov		tmod,#10h ; timer 1; gt=0 
                      ;; c/t=0 zamanlayici, sayici degil
                      ;; 01 mod 1 = 16 bit sayici
	;mov		r0,#0A9h  ; r0=169d
	;mov		tl0,#0h
	;mov		th0,#0h
	;x:  jb		p2.2,x   ; buton testi basilmasini bekliyoruz.
;anadongu:
	;cpl		p0.0
	;acall	birsaniyebekle
	;sjmp	anadongu
;birsaniyebekle:
	;mov		r0,#0A9h ; tekrar r0=169d
	;setb	tr1		 ; timer 1 calismaya basladi.
;x1: jnb		tf1,x1   ; tf1=1 oldugu zaman 65535 cycle gecmis demektir.
	;clr		tf1		 ; tf1=1 oldu o zman tekrar 0 yap ki timer 1 tekrar calissin.
	;djnz	r0,x1	 ; tekrar x1 git. 65535 cycle tamamlanmasini bekle
	;; 169 kez dongu bitince 1 sn gecmis demektir.
	;ret
	;end
;----------------------------------------------------------
; p3.4'e bagli bir sensor yardimi ile banttan gecen kutularin sayisi tespit edilecektir
; her 100 kutu oldugunda p0.1 bagli ledi yakip sonduren kodu yaziniz.
; 8 bit yeniden yuklemeli, t0 kullanalim
; mod 2 olacak -> 8 bit yeniden yuklemelidir.
; th0 ve tl0'a 155d degerlerini yukleyelim (255-100)= 155 den baslayacak.
; 155d=9bh'dir.
; onemli = p3.4 lojik 1'den 0 gecis oldugunda sayar.
;basla:
	;mov		tmod,#00000110 ; t0, mod 1, gate=0 ve tr0 ile baslayacak
	;mov		tl0,#250d
	;mov		th0,#250d
	;setb	tr0     ; sayma basladi
	;clr		p0.1
;x:	jnb		tf0,x  ; p3.4'ten 100 kutu oldugunda yani tl0=255'e 
		    ;; ulasildiginda tf0=1 olur. 
	;clr		tf0 ; tf0=1 oldugunda otomatik olarak th0=> tl0 olur.
	;setb	p0.1
	;nop
	;clr		p0.1
	;sjmp	x
	;end	
;-----------------------------------------------------------------------	
; bir sinusoidal dalganin peryodu 20ms dir
; sifir gecislerinden sonra 18 derecede tristorun tetiklenmesi istenmektedir.
; 18 derece = 1 msn karsilik geldigi hesaplanmalidir.
; ayni zamanda bir devre ile 0 gecislerinin tespitinin yapilmasi
; ve bu durumun mikroislemciye bildirilmesi gereklidir.
; bu durum icin t0 kullanilacak ve sifir gecisi p3.2 ile tespit edilip
; sayicinin baslanmasi saglanacaktir.
; dolayisisyla bu durum icin gate=1 olacaktir. yani timer p3.2 den gelen sinyal
; ile calismaya baslayacaktir.
; mod 1 ayarlanacaktir.
; 1msn=1000000ns=1milyon ns'dir
; 1milyon/90.4ns=11062 cycle olmasi gereklidir.
; yani mikroislemci t0 65535-11062=54473 baslamasi gerecektir.
; 54473 d= d4c9 h'dir.
basla:
		mov		tmod,#00001001b ; t0, p3.2'den darbe ile basla, mod 1
		mov		tl0,#0c9h
		mov		th0,#0d4h
		setb	tr0				; bu anda daha t0 saymaz
			    ; p3.2 den darbe gelirse saymaya baslayacak.
bekle: jnb		tf0,bekle      ; bir anda p3.2'den darbe gelirse sayma baslayacak
				; tf0=1 lendiginde 1 ms gecmis olacaktir.
		clr		tf0 ; 1msn gecti, tekrar p3.2 beklemek icin tf0=0 yapildi.
		clr		tr0 ; stop
; bir sure sonra tekrar 0 gecisi oldugunda tekrar t0 saymaya baslayacak.
		setb	p1.5 ; tristore bir sure 1 ile aktif edilicek.
		nop
		nop
		clr		p1.5

x1:	jnb		p3.2,x1
		setb	tr0
		sjmp	bekle
		end
		

