Aynı anda 2 led kontrolü

heavenkhan

Yeni üye
Katılım
13 Ocak 2019
Mesajlar
1
Tepkime puanı
0
Puanları
1
Konum
Sakarya
1 kırmızı 1 sarı iki ledimiz olsun,
kırmızı led 1 saniye aralıklarla sürekli yanıp sönsün
sarı led 5 saniye aralıklarla sürekli yanıp sönsün.

bunu nasıl yapabiliriz?
teşekkürler...
 

xbrknx

Üye
Katılım
16 Tem 2019
Mesajlar
109
Tepkime puanı
19
Puanları
18
Konum
istanbul
konu eski ama google aramalarında çıkarsa ihtiyacı olanlar faydalansın :

Kod:
int sariled = 9;
int kirmiziled = 10;
unsigned long ktime;
unsigned long stime;
int sarigecikme = 5000;
int kirmizigecikme = 1000;
void setup() {
pinMode(sariled, OUTPUT);
pinMode(kirmiziled, OUTPUT);
}
void loop() {
unsigned long newtime = millis();
if ((newtime - ktime > kirmizigecikme)) { kirmizi(); ktime=newtime; }
if ((newtime - stime > sarigecikme)) { sari(); stime=newtime; }
}
void sari() {
if ( digitalRead(sariled) == HIGH ) { digitalWrite(sariled, LOW); }
else { digitalWrite(sariled, HIGH); }
}
void kirmizi() {
if ( digitalRead(kirmiziled) == HIGH ) { digitalWrite(kirmiziled, LOW); }
else { digitalWrite(kirmiziled, HIGH); }
}
 

amenofis

Üye
Katılım
18 Tem 2019
Mesajlar
40
Tepkime puanı
9
Puanları
8
Konum
Bursa
byte adim;

void loop()
{
digitalwrite(led1, !digitalRead(led1));
if(++adim % 5 == 0)
digitalwrite(led2, !digitalRead(led2));

delay(1000);
}
 

xbrknx

Üye
Katılım
16 Tem 2019
Mesajlar
109
Tepkime puanı
19
Puanları
18
Konum
istanbul
@amenofis selam

digitalwrite(led1, !digitalRead(led1));

aslında

if ( digitalRead(sariled) == HIGH ) { digitalWrite(sariled, LOW); }
else { digitalWrite(sariled, HIGH); }

bunun kısaltması oluyor değil mi ?

böylelikle if ve else e gerek kalmadan işlem tamamlanıyor ve sorguya gerek kalmıyor

bunu çözdüğüm iyi oldu :) şu anda bi projemi bu şekilde %50 hafifletirim
 

amenofis

Üye
Katılım
18 Tem 2019
Mesajlar
40
Tepkime puanı
9
Puanları
8
Konum
Bursa
@xbrknx
Aslında bu digitalRead/Write fonksiyonları bir sürü gereksiz iş yapıyor. Kullanması kolay olsun diye pin sayısı kadar numara vermişler. Gerçekte atmega çiplerinde A, B, C, D... diye giriş çıkış portları bulunur. Her port en fazla 8 pine sahiptir. digitalW.... fonksiyonları verilen pin numarasının hangi port ve pine denk geldiğini bulmak için bir sürü hesaplama yapar. Aşağıdaki resimde arduino pinlerinin hangi fiziksel port/pinlere karşılık geldiği yazıyor. Örneğin 13 numaralı pin aslında PORTB'nin 5 numaralı pini imiş. Bu pine bağlı olan ledi direkt register kullanarak çok daha az kaynak kullanacak şekilde kontrol edebiliriz.

Bu pini HIGH yapmak için
PORTB |= 1 << 5;

LOW yapmak için
PORTB &= ~(1 << 5);

Terslemek (toggle) etmek için
PORTB ^= 1 << 5

1 << 5 yerine 0x20 de yazılabilir. Aynı şey ama birincisi daha okunaklı. Yukarıdaki ilk 2 işlem sadece 1 cpu instruction'a tekabül eder. Terslemek ise 3 inst.

 
Son düzenleme:

xbrknx

Üye
Katılım
16 Tem 2019
Mesajlar
109
Tepkime puanı
19
Puanları
18
Konum
istanbul
peki bu mantık doğrumu ?
uint8_t pd;

bitSet(pd, 1);
bitClear(pd, 2);
PORTD = pd;

bu şekilde eski açık veya kapalı port varsa tek seferde diğerlerini değiştirmeden değişiklik yapabiliriz diye düşündüm ?
 

amenofis

Üye
Katılım
18 Tem 2019
Mesajlar
40
Tepkime puanı
9
Puanları
8
Konum
Bursa
Doğru ama bir eksik var.

uint8_t pd = PIND;
pd |= 1 << 1;
pd &= ~(1 << 2);
PORTD = pd;

Okuma yaparken PINx register'ını okumak tavsiye edilir. Eğer pin giriş olarak ayarlanmışsa PINx zorunlu.
 

xbrknx

Üye
Katılım
16 Tem 2019
Mesajlar
109
Tepkime puanı
19
Puanları
18
Konum
istanbul
74hc595 gibi kullanabilirm diye düşünmüştüm :) anladım teşekkürler öğrenmenin yaşı yok
 
Üst