Merhaba, Ziyaretçi. Lütfen giriş yapın veya üye olun.

Kullanıcı adınızı, parolanızı ve aktif kalma süresini giriniz

  Gelişmiş Arama
insanın içinde varsa, commodore.gen.tr açığa çıkarır bunu.. bir nevi retro olaylarının dolunayıyız.(Arda)
Sayfa: [1]   Aşağı git
Yazdır
Gönderen Konu: Arduino ile .....  (Okunma Sayısı 7646 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
malik
Deneyimli
*****
Mesaj Sayısı: 687



Üyelik Bilgileri
« : Ocak 21, 2015, 05:02:14 ÖÖ »

Arduino ile İki adet LED i birbirinden bagimsiz

Birini 1000 ms ile digerini 500 ms ile  nasil On-Off yapabilirim.






Logged
Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 7.763


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #1 : Ocak 21, 2015, 09:42:25 ÖÖ »

Hayırdır örtmen ödev mi verdi. Kahkaha

İki yöntemle yapılabilir:

Birincisi ve basit olan delay() yerine millis() kullanarak (Arduino IDE'de File->Examples->02.Digital->BlinkWithoutDelay sketch'inde tek led için nasıl yapıldığı var) iki led için kopyala yapıştır ve birkaç değişkenin ismini değiştirmeyle yapılabilir. Hatta burda yapılmışı var.

const int LED1 =  12;
const int LED2 =  13;

int LED1State = LOW;
int LED2State = LOW;

unsigned long LED1Millis = 0;
unsigned long LED2Millis = 0;

const long LED1Interval = 1000;
const long LED2Interval = 500;

void setup()
{
  pinMode(LED1, OUTPUT);     
  pinMode(LED2, OUTPUT);     
}

void loop()
{
  unsigned long CurrentMillis = millis();

  if(CurrentMillis - LED1Millis >= LED1Interval)
  {
    LED1Millis = CurrentMillis;   
    if (LED1State == LOW) LED1State = HIGH; else LED1State = LOW;
    digitalWrite(LED1, LED1State);
  }

  if(CurrentMillis - LED2Millis >= LED2Interval)
  {
    LED2Millis = CurrentMillis;   
    if (LED2State == LOW) LED2State = HIGH; else LED2State = LOW;
    digitalWrite(LED2, LED2State);
  }
}


İkinci ve daha karışık olan yöntem de interrupt kullanmaktan geçiyor. Bunun için önce interruptların çalışma mantığını öğrenmen gerekiyor. Hazır kütüphane kullanarak veya TCCR1A gibi AVR register'ları kullanılarak yapılabiliyor.

Kritik zamanlaması olmayan işlerde millis() kullanmak yeterli gelse de daha kritik zamanlaması olan işlerde interrupt kullanmak gerekebilir.
Logged

https://retrodergi.com - https://e-turay.com - https://karizmawow.e-turay.com

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PS Vita, Nintendo 3DS, Nintendo 2DS
malik
Deneyimli
*****
Mesaj Sayısı: 687



Üyelik Bilgileri
« Yanıtla #2 : Ocak 21, 2015, 12:00:21 ÖS »

Her yerde bir LEDi Delay komutu ile açıp kapamayı anlatmışlar.
Multitasking i çok merak ettim.

Google de arduino çoklu görev yazdım, multitasking yazdım, birden fazla led yakma falan filan yazmadığım şey kalmadı.

Hiç bir şey bulamadım yada anlamadım.

Millis() komutunu gördüm Delay a alternatif Diye. Ama olmaz diye düşündeüm geçtim.

Bu örneği verdiğin için teşekkürler.

Mevcut zamanı farklı değişkenlere atayarak ve ilerleyen zaman sayesinde zaman farklarını hesaplayarak ve buna bağlı her değişkenin koşulu ile bir zaman döngüsünde bir iş yapılabilirken diğer bir zaman döngüsünde aynı anda diğer bir işin yapılabileceğini anladım.

Zaman döndüsü dediğim Değişkene atanan zamanın hesabı.


Dediğin gibi Millis() LED ler için ve kritik olmayan işlemler için yeterli oluyor ozaman.

Birden fazla döngü ve her döngüde aynı anda bir iş yaptırmak karışık heralde.

En iyisi kafayı daha fazla karıştırmayalım.

Bu yeterli teşekkürler simon.
« Son Düzenleme: Ocak 21, 2015, 12:17:46 ÖS Gönderen: malik » Logged
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #3 : Ocak 21, 2015, 15:01:48 ÖS »

Bir alternatif olarak counter kullanabilirsin.
Counter'ın D0 biti her clock sinyalinde 0 ile 1 arasında gidip gelirken, D1 biti her iki clock sinyalinde 1 olur. Hatta bu şekilde D2 biti ile 1'e 4, D3 biti ile 1'e 8 oran da yakalayabilirsin. Clock sinyali tek olacağı için timing sıkıntısı da yaşamazsın.

Counter kullanmak yerine basitçe flip flop'larla da yapabilirsin. Counter da zatem flip flop'lardan müteşekkil bir devre.

Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.798


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #4 : Ocak 21, 2015, 15:06:39 ÖS »

Benzer bir soru stackexchange de de sorulmuş. Cevap olarak donamımsal multiple thread desteği olmadığı için interruptları kullanarak bir şeyler yapmak gerekeceği söylenmiş.

Link ve cevap aşağıda.

http://arduino.stackexchange.com/questions/286/how-can-i-create-multiple-running-threads
Alıntı
AVR based Arduino's do not support (hardware) threading, I am unfamiliar with the ARM based Arduino's. One way around this limitation is the use of interrupts, especially timed interrupts. You can program a timer to interrupt the main routine every so many microseconds, to run a specific other routine.


Şurada da arduino üzerinde multiple thread çalıştıran bir proje var. Kodu incelemedim. O iş sana kalıyor.
https://github.com/ivanseidel/ArduinoThread


Logged

GnoStiC
Ziyaretçi
« Yanıtla #5 : Ocak 23, 2015, 00:09:12 ÖÖ »

https://arduinocode.codeplex.com/releases/view/115258

arduino ile yapmak zorunda degilsen 8 core'lu parallax propeller'i onerebilirim bu is icin. her core ile ayri led surebilirsin.
« Son Düzenleme: Ocak 23, 2015, 00:28:27 ÖÖ Gönderen: GnoStiC » Logged
Sayfa: [1]   Yukarı git
Yazdır
Gitmek istediğiniz yer: