yazılım tabanlı seri giriş seri çıkış

Başlatan kemalkemal, 08 Mart 2010, 21:15:13

kemalkemal

Merhaba pic assembly ile 16f873a'ya program yazıyorum. Amacım PORTA,3 den aldığım seri datayı PORTA,1 girişindeki harici clockun (1,25khz)yükselen kenarında okuyarak PORTB,7 den dışarı aktarmak. Sistem clock frekansım 10 Mhz. Kullandığım kod parçası şöyle
main
;***port initialization

	bsf 	STATUS,RP0
	movlw 	b'00001010'		 
	movwf 	TRISA 	
	clrf 	        TRISB 		
	movlw	0x07		
	movwf	ADCON1	
        bcf		STATUS,RP0
	movlw	0xff
	movwf	PORTB
start
	btfss 	PORTA,1
	goto 	$-1
	nop
	btfss 	PORTA,3
	goto	x_0
	goto	x_1
x_0
	bcf	PORTB,7
	goto	devam
x_1
	bsf	PORTB,7
devam
	btfsc 	PORTA,1
	goto 	$-1
	nop
	goto 	start
end


PORTA,3'e düşük frakanslı işaret (yaklaşık 0-100hz arası) yolladığım zaman sorun yok , işareti aynen PORTB,7'den görüyorum. ama PORTA,3'e uyguladığım işaretin frekansını yüksellttiğim zaman (mesela 500 hz) cıkıştaki isaretin girişi takip edemediğini görüyorum.
Bu program parçası/sistem clocku (10 Mhz)/harici örnekleme clocku(1,25khz) ile en fazla kaç hz'lik işareti yakalayabilirim?
Bunu artırabilmem için ne yapmaliyım? Yardımcı olursanız sevinirim.

Tagli

Programda bir hata gözüme çarpmadı. nop'ların ne işe yaradığını anlayamadım gerçi, bana gereksiz gibi göründüler.
Alıntı yapılan: "kemalkemal"cıkıştaki isaretin girişi takip edemediğini görüyorum.
Burada bir öteleme (giriş çıkş arası zaman farkı) mi var yoksa veri kaybı mı söz konusu? Devre fiziksel ortamda denenip ölçümler osiloskop ile mi yapıldı? Eğer mümkünse söz konusu takipsizliği gösteren veriyi burada paylaşırsan daha rahat yorum yapılabilir. Sanırım giriş ve çıkışın grafiği faydalı olacaktır.

Eğer yaptığı başka iş yoksa (ki program bu kadarsa yok gibi gözüküyor) PIC'i olduğu gibi kaldırabilirsin bence. Bu yazılımın yaptığı işi flip-flop da yapar.
Gökçe Tağlıoğlu

hasangurlek

Sesli düşünürsek 10 mhz de bir saat zamanı 0,4 us ise ve kabaca bir hesapla kodlarınız 10 us da tamamlanıyorsa bu durumda matematiksel olarak 2.5 mhz/10 us = 250 khz e kadar problemsiz okuma yapabilirsiniz. Fakat bu hesap teoride kalır. Probleminiz lojik seviye eşiklerindeki kararsız bölgeden kaynaklanıyor ve muhtemelen bir saat darbesinde birden fazla işlem yapılıyor. 250 khz hıza çıkmanız gerekmediğine göre BTFSS ve BTFSC PORTA,1 testlerinden sonra 10-20 saat zamanı ve hatta daha fazla bekleme yapın ve lojik seviyenin stabil olmasından sonra tekrar test edip seviyenin değiştiğinden emin olun. Bu şekilde kodlarınız 10 us değilde 100 us da tamamlanırsa 25 khz kadar okuma yapabilirsiniz.
http://www.cyber-warrior.org, Although they like whiteness, sometimes twilight is required...  Hala evlilermi bilinmez ama kesinlikle artık uygun değiller !!!

Everlast

Öncelikle Kodun doğru gibi görünüyor şimdi biraz kodunda değişiklik yaptım birde bu şekilde deneyebilir misin?

Öncelikle Program akışı clk pulse lerini kaçırabilir neden dersen

Frekansı Düşük Pulselerde Devam Tag ine geldiğinde Pulse Low seivyede değilse Aynı Pulse için birden fazla aynı datayı okuyabılırsın.

çözümü low freq için

devam
btfss PORTA,1
goto $-1


Ayrıca Kulladnıgın İşlemci Hangi Frekansta kullanıyorsun, PIC te RISC Mimarisinde üretilirler fakat CALL ve GOTO Komutları 1 den fazla Cycle Harcar bu tür timing gerektiren programlarda kaçınmak gerek...




//=============================
main
;***port initialization

bsf STATUS,RP0
movlw b'00001010'
movwf TRISA
clrf TRISB
movlw 0x07
movwf ADCON1
bcf STATUS,RP0
movlw 0xff
movwf PORTB

start
btfss PORTA,1
goto $-1

btfss PORTA,3
goto x_0

bsf PORTB,7
goto devam

x_0
bcf PORTB,7


devam
btfsc PORTA,1
goto $-1
goto start
end

//==========================
- - - Check it Out - - -

ferdem

Evet, Tagli nin dediği gibi eğer mikrodenetleyicinin yapması gereken başka bir iş yoksa bu işi D tipi(74-74) flip-flop ile yapabilirsiniz.

kemalkemal

zaman ayırıp cevap verdiğiniz için teşekkür ederim
öncelikle şunu söyleyim
bu kod tabiki pek bir anlam ifade etmiyor o yüzden bu kod yerine bir flip flop kullanmak daha mantıklı ama ben bu kodu başka bir programda subroutine olarak kullancağım. (Zaten bu kod UDEA'nın sitesinde UTRC10M için verdiği asm örneğinin bir benzeri)

cevaplar içinde hasangürlek arkadaşımızın önerdiği gibi PORTA,1 sorgulamalarından sonra kodu biraz beklettim ve mükemmel sonuç :) teşekkürler sayın hasangürlek

kodun son ve çalışır hali aşağıda. goto x_1 ve goto x_2 satırlarının olmaması sizi şaşırtmasın kilit değişiklik ilk koddaki nopların yerine burada 20us'lik call t20us satırıdır.
DATAOKURF			
	LDF 	databit,0X08	
RFOKU
	btfss 	PORTA,1
	goto 	$-1
call	t20us
	rlcf 	RF0,1	
	bsf 	RF0,0	
	btfss 	PORTA,3		
	bcf 	RF0,0	
	call	t20us
	btfsc 	PORTA,1	
	goto 	$-1		
	call	t20us
	decfsz 	databit,f
	goto 	RFOKU	
	retlw 	0

kemalkemal

3ncü ayda atmışım ilk mesaji, bugün 7nci ayın sonları.
Bakmayın, daha o günlerde "tamam sorun kalmadı çözdüm hallettim" deyişime. Evet çözdüğümü sanmıştım ilk başlarda ama fazla sorunun devam etmediğini anlamam için fazla zaman geçmesi gerekmedi.

Kısaca özetleyim;
pic ile belirlediğim datayı, verici modül ile kablosuz olarak karşıya yolluyorum. Ve ne hikmetse alıcı modülün data çıkış bacağında , yolladığım veriyi aynen görmeme rağmen bu veriyi ,,,, yukarıda yazdığım program parçalarını kullanarak alıcı taraftaki pic'e depolayamıyorum. Sorun bu idi işte, ve beni nerden baksanız en az 6 ay uğraştırdı.

Sonra ne mi oldu?
Yarın sabah tez savunma sınavım var. Çalışmayan bir devre ile hocaların karşısına çıkacağım ve ezile büzüle biraz daha uzatma isteyeceğim.
Ve fakat ilginç olan şu ki,,, 6-7 aylık uğraşın sonunda, sanıyorum yaptığım hatayı, tez savunma sınavımın olduğu günün sabahında keşfettim. Evet evet, yaklaşık yarım saat önce "nası yani" diyerek o ufak ayrıntıya çakıldım kaldım.

Bu kadar uğraştan ve başarısızlıktan sonra tam da emin değilim aslında cevabı bulduğumdan ama yine de uyku tutmadı işte :)
Sıkıntı neymiş biliyormusunuz?
Veriyi yollarken, kablosuz modülün (UDEA UTR C10 M) clocku yüksekteyken yolluyorum. Neden? Çünkü udeanın sitesinde verdiği kod parçası öyle de ondan...
Veriyi alırkende, alıcı taraftaki kablosuz modülün clocku alçaktayken okuyorum. Neden?Çünkü udeanın sitesinde verdiği kod parçası öyle de ondan...
Sizce bu garip değil mi? Veriyi yükselen kenarda yolluyorsan , yükselen kenarda okumalısın değilmi.

Zaten adamlar, kılavuzda da aynen böyle yazmışlar ama uygulama kodunda tam tersini yapmışlar. Veriyi yüksekte yollamışlar, alçakta okutmaya çalışmışlar... Vay anasını ya

CLR

Alıntı yapılan: kemalkemal - 23 Temmuz 2010, 00:41:45
Veriyi yollarken, kablosuz modülün (UDEA UTR C10 M) clocku yüksekteyken yolluyorum. Neden? Çünkü udeanın sitesinde verdiği kod parçası öyle de ondan...
Veriyi alırkende, alıcı taraftaki kablosuz modülün clocku alçaktayken okuyorum. Neden?Çünkü udeanın sitesinde verdiği kod parçası öyle de ondan...
Sizce bu garip değil mi? Veriyi yükselen kenarda yolluyorsan , yükselen kenarda okumalısın değilmi.

Zaten adamlar, kılavuzda da aynen böyle yazmışlar ama uygulama kodunda tam tersini yapmışlar. Veriyi yüksekte yollamışlar, alçakta okutmaya çalışmışlar... Vay anasını ya

Merhaba

Eğer data yükselen kenarda bus'a konuyorsa, okuma işlemi düşen kenarda yapılır çünkü okuma yapılan yer datanın tam ortası olmuş olur. Yükselen kenarda okumaya çalışırsan, önceki veya yeni datayı okuyabilirsin yani yanlış bir yöntem olur.
Knowledge and Experience are Power

kemalkemal

#8

Alıntı yapılan: eemkutay - 23 Temmuz 2010, 10:01:50
Alıntı yapılan: kemalkemal - 23 Temmuz 2010, 00:41:45


Merhaba

Eğer data yükselen kenarda bus'a konuyorsa, okuma işlemi düşen kenarda yapılır çünkü okuma yapılan yer datanın tam ortası olmuş olur. Yükselen kenarda okumaya çalışırsan, önceki veya yeni datayı okuyabilirsin yani yanlış bir yöntem olur.


aslında dediğiniz mantıklı gibi duruyor ama son umudum yukarıda bahsettiğim ihtimal kaldı. :) eğer yine pic'in girişine kadar getirdiğim veriyi pic'e kaydedemezsem , ağlamamak işten değil

CLR

#9
Alıntı yapılan: kemalkemal - 23 Temmuz 2010, 13:48:06

Alıntı yapılan: eemkutay - 23 Temmuz 2010, 10:01:50
Alıntı yapılan: kemalkemal - 23 Temmuz 2010, 00:41:45


Merhaba

Eğer data yükselen kenarda bus'a konuyorsa, okuma işlemi düşen kenarda yapılır çünkü okuma yapılan yer datanın tam ortası olmuş olur. Yükselen kenarda okumaya çalışırsan, önceki veya yeni datayı okuyabilirsin yani yanlış bir yöntem olur.


aslında dediğiniz mantıklı gibi duruyor ama son umudum yukarıda bahsettiğim ihtimal kaldı. :) eğer yine pic'in girişine kadar getirdiğim veriyi pic'e kaydedemezsem , ağlamamak işten değil

Merhaba ,

1. yöntem:
Aslında yapacağın basit , öğrencisin de, olanağın yok değil yani, okula gider scop ile data ve clock hattına scobu bağlarsın clk'un hangi kenarı data ortasına geliyor bulursun(bulurdun yani). Sonra pic'in RB2 ye düşen veya yükselen kenar interrupt kurarsın ilgili kenar geldiğinde datayı okurdun,

2. Yöntem: Yapı clk ve datadan oluştuğuna göre bu yapıya SPI(serial peripheral interface) denir. Kullandığın işlemcide SPI portu var, işlemciyi slave olarak ayarlarsan SPI'dan gelen datayı okursun(veya okurdun).

Bu bahsettiğim iki yöntemde de işlemci meşgul olmuyor




Knowledge and Experience are Power