Arduino pin aynı anda output ve high yapmak

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
16,132
Arduino'nun pinlerinin varsayılan ayarı INPUT'tur. Bu da o girişin High Z olmasını demektir. High Z bir input'ta bulunan voltajın da ne olacağı hiç belli olmaz. Lojik 0 ve lojik 1 arasında bir yerdedir ve sabit de durmayıp gezinebilir. Şimdi diyelim biz bir pini OUTPUT yapmak istiyoruz, ama OUTPUT yaparken de hemen belli bir değeri almasını istiyoruz (yani lojik 1 veya lojik 0). Bunu nasıl yaparız? Elimdeki arduino ile önce bir durum tespiti yapalım

Arduino'ya boş bir sketch yükledim ve pin 6 nın durumuna baktım. Pin 6 her zaman lojik 0 da. Bu arduino'da demekki böyle. Parmağımla dokundum, üfledim, havyayı yaklaştırdım, alkol döktüm, yok, hep sıfırda. Burada bir mevzu anlatacağız, biraz gezin lan :mad:
 

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
16,132
Baya uğraştım, bu pin hep 0 da kalıyor. Ben de o pini önce INPUT_PULLUP yaptım, böylece bir pullup o girişi zorla 1'e çekti. Sonra tekrar INPUT'a geri döndürdüm. O giriş yavaşça gene 0 a indi.

C++:
#define THEPIN 6

void setup()
{
  pinMode(THEPIN, INPUT_PULLUP);
  pinMode(THEPIN, INPUT);
}

void loop()
{
}

a.png
 

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
16,132
Konuyu anlatmak için 1 seviyesine yakın bir pin bulamadığımdan, ben de bu INPUT_PULLUP ve INPUT hilesi ile pini 1 seviyesine yaklaştırıp oradan serbest düşüşe bıraktım. Ama fazla düşmeden asıl yapacağım testi yaptım. Şimdi pin diyelim 1 ve ben bu pini OUTPUT yapıp değerinin de 1 olmasını istiyorum. Ama gerçekte ne oluyor görelim.

C++:
#define THEPIN 6

void setup()
{
  /* bir turlu 1 seviyesine gelmeyen INPUT pinini
     zorla o seviyelere getir */
  pinMode(THEPIN, INPUT_PULLUP);
  pinMode(THEPIN, INPUT);

  /* pini output yap */
  pinMode(THEPIN, OUTPUT);

  /* pini 1 yap */
  digitalWrite(THEPIN, HIGH);
}

void loop()
{
}

Olan şu: Ben tam pini OUTPUT yaptığım anda pin 0 a düşüyor. Sonra da ben pinin değerini 1 yapmış oluyorum. Ama 5 μs boyunca bu pin 0 da kalıyor. İşte bu önemli bir sorun. Temiz bir şekilde, kesinlikle sıfıra düşmeden çıkışı OUTPUT yapamıyorum.

a.png
 

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
16,132
Bu sorunu çözmek için internette araştırınca iki farklı çözümden bahsediliyor. Birisi, pin daha INPUT modunda iken o pine bir değer yazmak. Deniyorum ve işe yaradığını görüyorum.

C++:
#define THEPIN 6

void setup()
{
  /* bir turlu 1 seviyesine gelmeyen INPUT pinini
     zorla o seviyelere getir */
  pinMode(THEPIN, INPUT_PULLUP);
  pinMode(THEPIN, INPUT);

  /* pin hala input, deger yaz */
  digitalWrite(THEPIN, HIGH);

  /* simdi output yap */
  pinMode(THEPIN, OUTPUT);
}

void loop()
{
}

a.png
 

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
16,132
İkinci çözüm, pini önce INPUT_PULLUP yapmak, sonra OUTPUT moduna sokmak. Deniyorum ve bunun da işe yaradığını görüyorum.

C++:
#define THEPIN 6

void setup()
{
  /* bir turlu 1 seviyesine gelmeyen INPUT pinini
     zorla o seviyelere getir */
  pinMode(THEPIN, INPUT_PULLUP);
  pinMode(THEPIN, INPUT);

  /* pini once INPUT_PULLUP yap */
  pinMode(THEPIN, INPUT_PULLUP);

  /* sonra output yap */
  pinMode(THEPIN, OUTPUT);
}

void loop()
{
}

a.png
 

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
16,132
Şimdi tamam, bu iki metot işe yarıyor, ama pinMode ve digitalWrite fonksiyonlarının dokümantasyonuna bakınca bu metotların her zaman çalışacağının bir garantisi yok. Bu problem ve çözümü bu fonksiyonların dokümantasyonunda ele alınmamış bile. Herhalde bu sorunlar yaşandığı için böyle çözümler getirilmiş ve öyle gidiyor. Eğer iş kesin olarak garantiye almak isteniyorsa, o zaman en iyisi doğrudan işlemcinin PORT registerlerine erişerek pinleri yapılandırmak. Böyle yapınca, MCU nun üreticisi bu metodun her zaman çalışacağını garanti ediyor.
 

semih_s

Aktif Üye
Katılım
16 Aralık 2020
Mesajlar
641
Bir keresinde ben de "digitalWrite" değil de "digitalRead" ile gariplik farketmiştim. Düşük frekanslı bir pwm pinin anlık durumunu "digitalRead" ile okuduğumda pwm kapanıyordu, ama registerdan mesela PORTD 2 nolu pini, "pinDurum=(PIND>>PIND2)&1;" şeklinde okuduğumda sorun olmuyordu.
 

semih_s

Aktif Üye
Katılım
16 Aralık 2020
Mesajlar
641
Şimdi hatırlıyorum da, sorunun "digitalRead"den kaynaklandığını anlayana kadar birkaç saat devrede ve kodda sorun aramıştım. Sonunda da ruh halim >> :kizgin3::kizgin3:
 
Top