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...
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.
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.
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..
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ı...
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;
}