while kullanımı

Başlatan AKAY989, 20 Aralık 2022, 17:15:46

AKAY989

unsigned int8 datalariokuyalim()
{
  unsigned int8 i, gelendatalar= 0;     
  for(i = 0; i < 8; i++){      while(!Data_Pin)
    delay_us(30);
    if(!Data_Pin)
      bit_clear(_data, (7 - i));
.
.
............
kod içerisinde yer alan
 while(!Data_Pin)
data pin i 0 iken
30 us bekle mi
data pin i 1 olana kadar bekle mi
olarak yorumlamalıyım...           

Kırambor

Sanırım burada şöyle bir şey olacak. Kod for'un içine girecek ve while(!Data_pin)'i check edecek. Data pin'in değeri 0 olduğu sürece while(1) olacak ve kod orada kalacak ta ki datapin 1 olana kadar çünkü while()'ın içi 0 a dönecek. Sonrası zaten bekleme vs. Ben böyle düşünüyorum. 

fide

Data_Pin 0 olduğunda 30 us bekle, eğer 1 ise 0 olana kadar bekle + 30us bekle.
Bunu Total olarak 8 defa döndür şeklinde.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

AKAY989

Alıntı yapılan: fide - 20 Aralık 2022, 18:39:37Data_Pin 0 olduğunda 30 us bekle, eğer 1 ise 0 olana kadar bekle + 30us bekle.
Bunu Total olarak 8 defa döndür şeklinde.
cevap için teşekkür ederim
bunu konu olarak detaylı açıklamalı ne şekilde aratabilirim..
basit do while veya while döngüleri değil..

mehmet

#4
Sizin kafanızı karıştıran yazım farklılığı:
while(!Data_Pin) delay_us(30);

while(!Data_Pin) 
  delay_us(30);
(Şart kodundan sonra bir satır varsa geçerli bunlar.)
---
while(!Data_Pin) 
{
  delay_us(30);
}

Bunların hepsi aynı...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

AKAY989

cevap icin tesekkur ederim ancak yazdiginiz kisimlari biliyorum.
konuyu anlatabilmek adina acik kaynak kodu ile aciklamak istiyorum
dht22 sicaklik nem sensoru mcu ya
50 us low >> 28-30 us high   gonderir ise sirasi gelen bit=0
50 us low >> 70    us high   gonderir ise sirasu gekeb but=1
olarak instruction book unda tanimlanmistir

Asagidaki kaynak kodu olusturan arkadas
      while (!(HAL_GPIO_ReadPin (DHT22_PORT, DHT22_PIN)));   // wait for the pin to go high
      delay (40);   // wait for 40 us

seklinde tanimladigi kisim  "wait for the pin to go high" seklinde belitmis
read pin eksi iken
40 us bekle seklinde anliyorum
eksi iken 40 us bekler ise
if tanimlamamizda sensorun girisi high yaptigi kisma denk geliyoruz karisiklik burada


ben sunu bu sekilde tanimlardim
while (dht22pin != 0); // eksi iken bekle
while (dht22pin != 1); // arti ike bekle
delay_us(30);          // sonucta 50us eksi  daha sonrasinda gelen artinin suresine gore bitin 0 mi 1 mi olduguna karar veriyoruz..
if (input(dht22pin)==0)
{...}


sorumdaki kaynak kood asagida
uint8_t DHT22_Read (void)
{
	uint8_t i,j;
	for (j=0;j<8;j++)
	{
		while (!(HAL_GPIO_ReadPin (DHT22_PORT, DHT22_PIN)));   // wait for the pin to go high
		delay (40);   // wait for 40 us

		if (!(HAL_GPIO_ReadPin (DHT22_PORT, DHT22_PIN)))   // if the pin is low
		{
			i&= ~(1<<(7-j));   // write 0
		}
		else i|= (1<<(7-j));  // if the pin is high, write 1
		while ((HAL_GPIO_ReadPin (DHT22_PORT, DHT22_PIN)));  // wait for the pin to go low
	}

	return i;
}