Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

Hitech de btfsc

Başlatan eseneren, 03 Mart 2011, 22:08:07

eseneren

Selamlar
Bir fonksiyon icinde sıkıstım, C kullanmak ıstemıyorum hızdan ramdan ısıme gelmıyor
asm kullanmak ıstemıyorum cok karısık proje.

ara ara asm yazarım gerekırse dedım ılk karma kullanmada cuvalladım dizinin elemanlarını bitlerini test etmem gerekıyor
shıft edıp carry den okumak aklıma geldı ama btfsc yada btfss daha mantıklı geldı,bu satırı yazdım anlatması kolay olsun dıye
sorun yasadıgım fonksıyon ve satır asagıdadır.
if(asm(btfsc data,j)) // Bu satır

void analyzer()
{
	char i,j;
	
	for(i=0;i<8;i++)
	{
		for(j=39;j>=0;j--)
		{
			if(asm(btfsc data[i],j)) // Bu satır
				data=0;
			else
				data=1;
			sr_clk=1;
			sr_clk=0;
		}
	enable=0;
	enable=1;
	PORTD=pdata[i];
	}
	asm("nop");
}
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

M_B


#define bit_tes(var, bitno )		(var>>bitno)& 0x01   //


a = bit_tes(data[ i ], j );
Testin sonucuna gore.
burda a nın degeri
0 veya 1 olur.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

eseneren

@M_B tam olarak istedigim bu idi tesekkur ederim.

Bunu asm de yazsam tek cycle yaparken burada 6 bıtı kontrol ıcın 6 kere shıft edıp sonra 1 ıle and lıyor sanırım ?
define bu sekılde kullanılacagını hıc dusunmemıs ıdım Hitech manuelınde de gordum anlam verememıs ıdım tsk ederım tekrar..
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

Tagli

#3
Burada iki sorun var:

asm(btfsc data[ i ],j) ifadesinin çalışmamasının sebeplerinden biri gerek data[ i ] ifadesinin gerekse j'nin derleme sırasında belirsiz oluşu olabilir. Çünkü bu komut, diğer tüm assembly komutları gibi, sabit değerler ile kullanılır. Yaşadığın sorununu ne olduğunu belirtmemişsin ama ben derleme hatası aldığını tahmin ediyorum, yanılıyorsam düzelt. Derleyici data[ i ] yerine INDF yazıp yukarıda bir yerde FSR'ı ayarlayacak kadar akıllı olabilir, ama değişken j sorunu için aklıma bir çözüm gelmiyor.

Ama asıl sorun şu ki, doğası gereği bu komutu tek başına kullanamazsın. Derleyicinin bu komutun altına ne yerleştirdiğini bilemeyeceğin için, doğru çalışmasını da bekleyemezsin. Bu tür durumlarda tüm fonksiyonu assembly ile yazman gerekebilir.

Ayrıca, sanki i ve j birbirine karışmış? Kodda data'nın türü gözükmüyor, ama normalde 40 biti olmasa gerek. Eğer data bir byte değilse zaten bir assembly komutunu üzerinde doğrudan kullanamazsın.

Yapmaya çalışıtığın şeyi tam olarak anlatırsan assembly mantığı ile bir çözüm önerebilirim. Bir dizinin byte'larını topluca karşılaştırırken bazen OR, XOR, AND gibi mantıksal işlemler sonuca daha rahat ulaşmanı sağlayabilir.
Gökçe Tağlıoğlu

X-Fi

biyerden hızlı geçmek veya bayrak olarak atadığınız bir değişkeni sürekli kontrol etmem gerektiğinde.

unsigned bit flag;

if(flag){
..
}


şeklinde yazıyorum "unsigned char" olmaması BTFSS komutuyla işlenebilmesini sağlıyor.

bu aralar disassembly listing kısmının ne olduğunu bilmeden C kod yazanlarla başımız dertte çünkü  ;)
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

eseneren

Alıntı yapılan: X-Fi - 04 Mart 2011, 00:34:35
bu aralar diassembly listing kısmının ne olduğunu bilmeden C kod yazanlarla başımız dertte çünkü  ;)
@X-Fi eyvallah haklısın da sorunu anlatmak ıcın o sekılde yazdım. Birkac kere yazdım cumleyı toparlayamadım bu sekılde acıklamakda cozum buldum.

@Tagli amac 40*16 bı color led ekranı surmeye calısıyorum 40 bıt satır sayısı 595lere gıdıyor. 8 x 5bayt olarak, 40 bit o manada
Bı hevesle kayan yazı yapayım saat yapayım dedım calısan bırsey yaptım da ıcıme sınmedı.
Sımdı bıraz daha evrensel dırek amaca yonelık hızlı fonksıyonlar yazmaya calısıyorum.

@Tagli hata derleyıcı de yada kodda degıl benım oraya dogru bırsey oturtamamam da, C nın bır suru guzel yanında asm nın btfsc gıbı komutunun burada işime gelmesi onuda burada dogru sekılde kullanamam hata.

i,j birbirne karısmıs demıssın orayı anlamadım kod mu acık degıl (okunabilirligi) mantık hatasımı yapmısım?
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

Tagli

btfsc ve btfss komutlarının formatı şöyledir: btfsc [byte],[bit]. Bit değeri 0'dan 7'ye kadar bir değer olmalı. Senin kodunda o kısımda j yazıyor ama j 39'dan 0'a kadar olan değerleri alıyor.
Gökçe Tağlıoğlu

eseneren

@Tagli elinin fotografını cek yolla öpüp geri upload edicem.
2 saattir alakasız yerleri kurcalıyorum proteus da hatayı arıyor idim.
Çok sağolasın..
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk