Ynt: Diziler ve Pointerler hakkında bir soru

Başlatan Cemre., 14 Ekim 2016, 15:30:45

Cemre.

Herkese merhaba,

AT24C32 isimli I2C ile çalışan bir EEPROM ile uğraşıyorum. Amacım EEPROM'a bazı verileri önceden yazmak ve daha sonra bunların sürekli okunması şeklinde bir uygulama yapmak. Yani aslında şuan EEPROM'u toplu halde yazacak bir uygulama yapmaya çalışıyorum.

EEPROM'a veriyi 32byte'lık sayfalar halinde yazmam gerekiyor. Ben de Page1_Data[32] Page2_Data[32] gibi diziler oluşturdum. Verileri bunların içine koydum.

EEPROM'a yazma, EEPROM'dan okuma kısmında sorun yaşamıyorum.

EEPROM'a bir sayfa yazmak için ve bir sayfa okuman için aşağıdaki fonksiyonları kullanıyorum.

if(HAL_I2C_Mem_Write(&hi2c1, AT24C32_Address_Write, MemAddr[x], I2C_MEMADD_SIZE_16BIT, Pointers[x], 32, 1000) != HAL_OK)
{
	Error_Handler();
}
HAL_Delay(20);
if(HAL_I2C_Mem_Read(&hi2c1, AT24C32_Address_Read, MemAddr[x], I2C_MEMADD_SIZE_16BIT, EEPROM_Read, 32, 1000) != HAL_OK)
{
	Error_Handler();
}


Buradaki diziler bir Header dosyasında aşağıdaki gibi tanımlandı. (Muhtemelen burada hata var, pointer kullanımım hatalı olabilir..)

uint8_t Page1_Data[32] = {0xAA, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF};

uint8_t Page2_Data[32] = {0xBB, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0xEE};

uint8_t Page3_Data[32] = {0xCC, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0xDD};

uint8_t *Pointers[3] = {&Page1_Data[0], &Page2_Data[0], &Page3_Data[0]};
uint16_t MemAddr[3] = {0x0000, 0x0020 ,0x0040};


Yapılan bu işlemi kontrol etmek için de şöyle bir döngü kurmaya çalıştım ancak asıl sorunlu olduğunu düşündüğüm yer de burası.


for(y=0;y<32;y++)
{
	if(EEPROM_Read[y] != (*Pointers[x]+y))
	{
		Error_Handler();
	}
}


Ana döngü içerisinde, ilk verdiğim kod bloğu arkasından bu test kodu geliyor. Yazılım burada Error_Handler'a düşüyor. Halbuki debug penceresinden baktığımda EEPROM_Read dizisinin içi olması gerektiği gibi Page1 verilerine eşit. Yani (*Pointers[x]+y) ifadesi hatalı (galiba).

Debug'da şunu fark ettim. Test döngüsüne giriliyor. İlk değişkenler test ediliyor, hata yok, Y bir artırıldığında Error veriyor. Yani dediğim gibi, hata (*Pointers[x]+y) ifadesinde..

Yardımcı olabilirseniz sevinirim.

Teşekkürler, iyi çalışmalar.

mesaj birleştirme:: 14 Ekim 2016, 15:37:33

   Pehh, *'ı parantezin içine yazdık diye madara olduk iyi mi?

z

#1
char* p diye pointer tanımla.

Datalar "array"i içine datalarını doldur.

p=Datalar+20;

yada p=&Datalar[20];

Dersen pointer, Dataların 20. adresini gösterir.

Bu pointer değerini artık sanal bir char arrayin başlangıç adresi olarak düşünebilirsin.

Böylece ayrı ayrı diziler oluşturmana gerek kalmaz.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Cemre.

Anladım ve uyguladım @z hocam. Aslında başlangıçta bu mantıkla bir kod yazmıştım, çalıştıramayınca vazgeçip parça parça yazdırmıştım. Şimdi senin anlatımınla tekrar birleştirdim kodumu ve çalıştı. Yazarken sayfa mantığıyla çalışan EEPROM okurken toplu okumaya izin veriyor. Yazma işlemi bittikten sonra toplu bir kontrol daha yaptırıyorum ben de. Bu güzel oldu. Sağolun.