C Programlama diliyle şamatalar

Başlatan z, 23 Ekim 2011, 15:32:04

Tagli

Derleyicinin verdiği hata mesajı nedir?
Gökçe Tağlıoğlu

yamak

Hocam bi de aşağıdaki gibi dener misin?
if(WriteI2C(HYT271_ADDR+I2CREAD) != 0 )

if(!WriteI2C(HYT271_ADDR+I2CREAD) == 0 ) bu kullanımda da ya baştaki ünlemi silmeniz gerekiyo ya da ==0 kısmını.Çünkü ikisi eğer 0 sa demek

yldzelektronik

Alıntı yapılan: yamak - 17 Temmuz 2013, 16:49:52
Hocam bi de aşağıdaki gibi dener misin?
if(WriteI2C(HYT271_ADDR+I2CREAD) != 0 )

Syntax hatası verdi.Şeklinde çözdüm.Denemiştim aslında bunu ama silip bi daha yazınca düzeldi :/
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yldzelektronik

Elimde;

Alıntı Yapsigned char getsI2C( unsigned char *rdptr, unsigned char length )

şeklinde bir fonksiyonum var. Ben bu fonksiyona giriş parametresi olarak;

Alıntı YapgetsI2C((char *)buffer,(HYT271_BUFFER_LEN - 1));

verebilir miyim?Bu arada buffer 4 elemanlı bir dizi.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Mucit23

Arkadaşlar,

32 bitlik (4 byte halinde bulunan) bilgiyi hızlı bir şekilde birer bit sola kaldırmak istiyorum.
32 bitlik deger 4 ayrı byte halinde bulunduğu için sorun yaşıyorum.

Bu bahsettigim işlemi 16x32  led ekran üzerinde yapmaya çalışıyorum.  Ekranın yapısı 8bitlik değişken halinde olmakla beraber toplamda 16x4 byte ediyor. Her 4byte lık degerin yanyana birlesmesiyle 32bitlik genişlik elde edilyor.16 satır 32 sütun.

Normalde bu ekran üzerinde düzgün ve hızlı çalışan pixel fonksiyonlarım var. Bu işlemi pixel komutuyla yapabiliyorum fakat cok uzun sürüyor.pixel ve getpixel komutu cok fazla kullanılıyor.

Bu sebeble Başka bir yolla yapmam gerekiyor.

Kullandıgım mcu İşlemci 40mhz de çalışıyor. Bu işlemi 40us nin altında bir surede yapabilirmiyim.

rree

int32 DegA;

DegA=0x12345678;
DegA=DegA<<1;

muhittin_kaplan

#531
ree istediği o değil

int8 A,B,C,D
int32 Z şeklinde
adam bunları birleştirip sola kaydıracak sanırım.

mucit23 herbir byte nasıl saklanmış değişkeni nedir ? onları birleştirip sola kaydır.

AsHeS

Alıntı yapılan: muhittin_kaplan - 19 Temmuz 2013, 01:47:13
ree istediği o değil

int8 A,B,C,D
int32 Z şeklinde
adam bunları birleştirip sola kaydıracak sanırım.

mucit23 herbir byte nasıl saklanmış değişkeni nedir ? onları birleştirip sola kaydır.
Durum sizin dediğiniz gibiyse
a en düşük byte, d en yüksek byte olmak üzere;
z=a+(((int32)b)<<8)+(((int32)c)<<16)+(((int32)d)<<24);
z<<=1;//1 bit kaydır.

Yukarıda ki gibi işlemi yaptıktan sonra aynı yöntemin tersiyle sayıyı parçalarsanız.

armsistem

Arkadaşlar merhaba , bir datayı 32 bit olarak taşıyorum , lakin adet olarak artırırken algoritmatik olarak sıkıntı yaşıyorum.

Her butona basıldığında adet birer bire artıyor 3...45....60(long) sprintf ile char array dönüştürüyorum. Veriyi gonderdiğimde 1000....2000....3000. bir iki üç seklinde gidiyor ama okurken sanki 1000 gibi okunuyor.

void send_rf(void){
	if (!( FIO1PIN & (0x01<<16))){
  while (!(FIO1PIN & (0x01<<16))){}
	adet ++;
			sprintf(sadet ,"%ld",adet );
	   	TxBuf[9] = sadet [0];
	   		TxBuf[10] = sadet [1];
	TxBuf[11] = sadet [2];
	  	TxBuf[12] = sadet [3];
		check_array ();
	 		TxBuf[31] = '\n';	
rfTxPacket();
}


Aşağıdaki şekilde değiştirdiğimde değer bu sefer 0001 ...(bir)0003....(üç).....0051(15) ama okuduğumda 51 oluyor .
TxBuf[9] = sadet [3];
	TxBuf[10] = sadet [2];
	TxBuf[11] = sadet [1];
	TxBuf[12] = sadet [03];



Mucit23

Alıntı yapılan: muhittin_kaplan - 19 Temmuz 2013, 01:47:13
ree istediği o değil

int8 A,B,C,D
int32 Z şeklinde
adam bunları birleştirip sola kaydıracak sanırım.

mucit23 herbir byte nasıl saklanmış değişkeni nedir ? onları birleştirip sola kaydır.

Hocam Ekran yapım bu şekilde.


free pic

Hafızada 16X4 lük iki boyutlu bir dizi tanımladım. Bu dizideki değerleri yukarıdaki resimdeki yapıya göre ekrana yansıtıyorum. Örneğin Ekranın 0,0 noktasındaki ledi yakmak için display_ram[0][0] değerine 10000000 yüklemem gerekir. Arka planda ramdeki bu değişklik hemen ekrana yansıtılıyor. Buralar süper işliyor. Şimdi amacım yukarıdaki şekilde tasarlanmış alanı birer bit sağa ve sola kaydırmak.

Alıntı yapılan: AsHeS35 - 19 Temmuz 2013, 02:01:50
Durum sizin dediğiniz gibiyse
a en düşük byte, d en yüksek byte olmak üzere;
z=a+(((int32)b)<<8)+(((int32)c)<<16)+(((int32)d)<<24);
z<<=1;//1 bit kaydır.

Yukarıda ki gibi işlemi yaptıktan sonra aynı yöntemin tersiyle sayıyı parçalarsanız.

Hocam birleştirme aklıma geldi aslında ama program biraz esnek olsun istiyorum. Örneğin Ekranda bir tane veya iki tane daha yan yana koyduğumda  kaydırma işlemi sıkıntılı olacak. Örneğin ekran boyutu 16x64 olsa bende bu 64 sütünü iki adet 32 bitte saklasam bu iki 32 bit arasında yine bir geçiş işlemi olacak.

Hocam aklıma assembly ile yazmak geldi. Hatırladığım kadarıyla asm ile sola kaydırma işlemi yapıldığında en soldaki bit status registerinin elde bitine düşüyordu. CCS de ise en soldaki bit kayboluyor.  Gerçi asm deki bu durum 16F de böyleydi 18F de durum nasıl bilmiyorum. Sola kaydırma işleminde Elde bitini alıp önceki registerin 7. bitine yazsam nasıl olur? Daha önce C de Asm kod hiç gömmedim . İsimi görecek kadar asm biliyorum. Sizce ASM ilemi yapmalıyım?

omereliusuk

shiftleft veya rotate left
gibi kodlar var idi ama

yldzelektronik

Yeni bir konu açmak istedim müsade varsa kısa bir soru sormak istiyorum.

static void sda_low(void) {
   SDA_PORT_       &=  ~(SDA_MASK_);       // internen Pull-Up aus
   SDA_DDR_       |=   SDA_MASK_;         // Pin von SDA als Ausgang

}
şeklindeki tanımda sda_mask ne amaçla kullanılmış biraz kafamı karıştırdı doğrusu.

hedar içinde;

#define SDA_PORT_   PORTA
#define SDA_PIN_   PINA
#define   SDA_DDR_   DDRA
#define   SDA_MASK_   (1<<PORTA3)

source içinde;
#define I2C_SDA_LOW      sda_low()
#define I2C_SDA_HIGH   sda_high()

şeklinde tanımlarım var.Burada yapılmaya çalışılan genel anlamda ilgili pinleri h l yapmak ancak kafamı karıştıran tris yazmacına da mı müdahale var?Nasıl yapılmış?Biri açıklayabilir mi?Biraz kafam karıştı.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

camby

Alıntı yapılan: yldzelektronik - 19 Temmuz 2013, 15:00:55
Yeni bir konu açmak istedim müsade varsa kısa bir soru sormak istiyorum.

static void sda_low(void) {
   SDA_PORT_       &=  ~(SDA_MASK_);       // internen Pull-Up aus
   SDA_DDR_       |=   SDA_MASK_;         // Pin von SDA als Ausgang

}
şeklindeki tanımda sda_mask ne amaçla kullanılmış biraz kafamı karıştırdı doğrusu.

hedar içinde;

#define SDA_PORT_   PORTA
#define SDA_PIN_   PINA
#define   SDA_DDR_   DDRA
#define   SDA_MASK_   (1<<PORTA3)

source içinde;
#define I2C_SDA_LOW      sda_low()
#define I2C_SDA_HIGH   sda_high()

şeklinde tanımlarım var.Burada yapılmaya çalışılan genel anlamda ilgili pinleri h l yapmak ancak kafamı karıştıran tris yazmacına da mı müdahale var?Nasıl yapılmış?Biri açıklayabilir mi?Biraz kafam karıştı.

I2C'de iletişim pinleri open-drain. Yani bilgi göndermek için sadece pull-down yapabiliyorlar entegre içinden. 1'e çekme kısmını dışarıdaki pull-up direnci hallediyor.

Eğer pin open-drain değil ise :
0 gönderilmek istenildiğinde pin çıkış yapılıp 0 yapılıyor.
1 gönderilmek istenildiğinde pin giriş yapılıp boşta bırakılıyor.

Gösterdiğin kodlarda da yapılan bu.

I2C açıklamasında da şöyle bir not gördüm , aynı şeyden bahsediyor :

Alıntı YapAt the physical layer, both SCL & SDA lines are of open-drain design, thus, pull-up resistors are needed. Pulling the line to ground is considered a logical zero while letting the line float is a logical one.

1-Wire hattında da aynı bu şekilde MCU tarafı yazılıyor.

Klein

#538
Alıntı yapılan: Mucit23 - 19 Temmuz 2013, 00:46:33
Arkadaşlar,

32 bitlik (4 byte halinde bulunan) bilgiyi hızlı bir şekilde birer bit sola kaldırmak istiyorum.
32 bitlik deger 4 ayrı byte halinde bulunduğu için sorun yaşıyorum.

Bu bahsettigim işlemi 16x32  led ekran üzerinde yapmaya çalışıyorum.  Ekranın yapısı 8bitlik değişken halinde olmakla beraber toplamda 16x4 byte ediyor. Her 4byte lık degerin yanyana birlesmesiyle 32bitlik genişlik elde edilyor.16 satır 32 sütun.

Normalde bu ekran üzerinde düzgün ve hızlı çalışan pixel fonksiyonlarım var. Bu işlemi pixel komutuyla yapabiliyorum fakat cok uzun sürüyor.pixel ve getpixel komutu cok fazla kullanılıyor.

Bu sebeble Başka bir yolla yapmam gerekiyor.

Kullandıgım mcu İşlemci 40mhz de çalışıyor. Bu işlemi 40us nin altında bir surede yapabilirmiyim.

uint8_t x[8];
uint32_t *p32;
uint64_t *p64;

p32 = (uint32_t *) x;

*p32 <<=1;

p64 = (uint64_t *) x;

*p64 <<=1;


veya
uint8_t x[8];

 *(uint32_t *) x  <<= 1;
 *(uint64_t *) x  <<= 1;


eğer byte değişkenleriniz array şeklinde değilse , derleyici bu 4 veya 8 adet değişkeni sıralı yerleştirmeyebilir. bu yüzden yukarıdakimantık çalışmaz. Ancak array olması durumunda çalışır.
kaç mikrosaniyede yapar, ne kadar kod harcar bilmem. çıktısına bakmak gerek.

hasankara

for(n=7;n>0;n--)
	{
	if((dram[n]&0b10000000)>0) bitset(dram[n+1],0); else bitclr(dram[n+1],0);
	dram[n]<<=1;
	}


for döngüsünü, örneğe göre düşünürsek 7 adıma yayman performans arttırır. program hafızasını kısıtlamadığı sürece adımlara bölmeni öneririm.

birde hi-tech c nin önerdiği şekli var bunun:
for(n=7;n>0;n--) dram[n] = (dram[n-1]>>7 | dram[n]<<1);

ancak performansı çok etkileyecek şekilde benim ilk önerime göre kötü.

performans konusunda bir kaç şey daha önerebilirim. mesela 8 bitlik hafıza lar arasında birden fazla kayma yapmak istiyorsak önce 8 er grup halinde kaydırıp sonra kalan kısmı bit bit şeklinde kaydırmak performansa oldukça katkısı oluyor.
i=cnv_data/8;
	for(;i>0;i--)dshift_lbl();
	i=cnv_data%8;
	for(;i>0;i--)dshift_left();