Arduino pin aynı anda output ve high yapmak

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
24,139
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.
 

Forum istatistikleri

Konular
6,952
Mesajlar
118,760
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top