Arduino pin aynı anda output ve high yapmak

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
21,539
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:
 
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
 
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
 
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
 
İ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
 
Ş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.
 
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.
 
Ş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:
 
@taydin abi INPUT olarak atama yapıp programda çıkış gibi kullanıp open drain gibi kullanabilir miyiz acaba.
 
Şimdi arduino due ile denedim bu INPUT_PULLUP ve sonrasında OUTPUT yapmayı ve işe yaramıyor, çıkış 0 da kalıyor.
 

Çevrimiçi personel

Forum istatistikleri

Konular
5,654
Mesajlar
97,284
Üyeler
2,438
Son üye
İbrahimSönmez

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top