Uzun zaman bekletme Hakkında

Başlatan ByTEK, 03 Ocak 2018, 12:15:45

ByTEK

Merhaba,

30dk, 60dk 'da bir bir dc motoru 3sn çalıştırmak istiyorum. zaman seçeneğini bir switch ile değiştiriyorum. motorda ufak olduğu için BDX53 ile sürebiliyorum.

Sormak istediğim soru uzun zaman beklemek ve belirtilen süre gelince çalıştırma işlemi için hangi yol doğru olacaktır.

PIC12F683 ile demo yapttım. delay fonksiyonu ile deneme yaptım. Ufak sürelerde yapıyor ama 30dk veya 60dk olunca PIC kilitleniyor. Bundan dolayı Delay ile bu iş olmayacak diye düşünüyorum.

Devreyi arduino ile yapacağım. burada en doğru yol nedir ? zaman kesmesi mi kullanmak yoksa milis ile mi çözmek.

Amacım sw ile seçtiğim zaman doğrultusunda bir işlem olmaması ve zaman gelince 3sn çıkış almak. Çok hassas bir yapıya ihtiyacım yok.

Bu konuda fikirlerinizi alabilirmiyim ?

EFESU


ByTEK

@EFESU Hocam Timer kesmesi demek istediniz sanırım.


Netten 50 güne kadar millis ile çözüm üretilebileceğini gördüm.


Günde 1 kezde arduinoyu resetlemem gerekecek.

muhendisbey

delay + döngü kullanabilirsiniz.
Atıyorum 1 dk elde etmek için 1000ms'lik döngüyü 60 kez dönderdikten sonra bu döngüyü 30 kez döndererek 30dk elde edersiniz.
Pek hassas bir zamanlama olmasa da işinizi görür. Süre tutmanız gerekiyorsa da döngülerle oynayarak hassas süre ayarlaması yapılabilir. Mikrosaniye cinsinden yazılarak bir ayarlama yapılması mümkün.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

ByTEK

@muhendisbey


Deneme yaparken dediğiniz gibi yaptım. Fakat süre küçükken sıkıntı yok ama yarım saat gibi bir sürede pic kilitlendi. Şuanda kilitlenmese bile  bu Yolu tercih etmeyeceğim. Bana uzun zamanda sorun çıkarmasın dediğim yöntem için fikir verirseniz sevinirim.

mehmet

Herhangi bir Timer ile oluşabilecek en uzun
ve uygun kesmeyi oluşturun. Bir bayrak
tetiklensin.
Ana döngüde bu bayrak kontrol edilerek
istenilen uzunlukta gecikme sağlanabilir.

Ancak harici bir RTC kaynağı kullanıp, alarm
kurmak daha mantıklı değil mi?
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

OG

Kilitlenmeye sebep motor sparkları veya yazlım hataları vs olabilir.
Arduinoya gerek yok pin sayısının yeteceği (dipsw falan, mesela 628A, 1827 gibi) en küçük mcu bu işi rahat görür.

Zaman çok hassa değil demişsiniz, o zaman timer kullanmaya da gerek yok muhendisbey'in bahsettiği gibi döngülü delaylar işi basitce görür. Döngü işlem gecikmeleri için de 1000ms değil de atıyorum 999ms kullanır zaman doğruluğunu daha da arttırabilirsiniz.

Bu gibi işler için, gün seviyelerinde zamanlamaları bu basit yöntem ile sıkıntı çıkarmadan kullanıyorum.


FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ByTEK

Teşekkürler.


Delay işini Tekrar gözden geçireyim.

Deneme yapıp karar vereyim.[/size][size=78%] [/size]

muhendisbey

Değişkenleriniz global mi yoksa lokal mi?


Kodunuzda sıkıntı olduğunu düşünüyorum. Yoksa kilitlenmesi için hiçbir sebep yok.
ASM'de uzun uzuna bunun hesabını yapıp öyle kodunu yazardık döngü içerisinde döngü şeklinde. C++'da da bu uygulanabilir.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

ByTEK

@muhendisbey


Gözden kaçırdığım bir durum olabilir. Tekrar bakıp kontrol edeceğim.

fide

merhaba.
unsigned int16 sayac;

unsigned int16 sayac2;


while(1)
{
output_high(Pin_B0);//motor çalışsın
delay(3000);
output_low(Pin_B0);//motor dursun  
sayac=0;
  
  while(sayac<30)
  {
    sayac++;
    sayac2=0;
    while(sayac2<60)
    {
     sayac2++;
     delay(1000);
     output_toggle(Pin_A0);// sistemin ayakta olduğunu takip için
    }


  }
}

sanırım kuluçka makinası tarzı bir makina kontrol edeceksin.
çalışması gerekir.
kolay gelsin.

Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

ByTEK

@fide


Teşekkürler. kontrol edeceğim bir düzenek var motor 2 sn çalışınca ufak miktarda su veriyor. :) aslında basit bir düzenek. hobi olarak uğraştığım için yöntemleri merak etmiştim. minimum malzeme kullanmam gerekiyor. rtc kullanmak istemiyorum. Delay, kesme, millis ile bir şekilde çözerim.

foseydon

Zamanı saydığınız değişkenler tasiyor olabilir.Watchdog kurulu ise işlemciniz reset yiyor olabilir. Kilitlendigine nasıl kanaat getirdiniz?

Yapılacak iş basit bir Timer kurup kesmesi içerisinde bir değişkeni artırın. Ana döngüde bu değişkenin istediğiniz zamana denk gelen değerden büyük olup olmadığını kontrol edin, büyükse islemi yapıp değişkeni sıfırlayin.

MuratHp

Merhaba, pic için bilgim yok fakat ardiunoda micros kodu kullanarak yapsan? Aşağıda verdiğim örnekte ki gibi;
Fakat en sağlıklı olcak olan bana kalırsa daha öncede bahsedildiği gibi RTC kullanmak.

double now = 0;
void setup(){
}

void loop{
if(micros() - now >= 3600){
now = micros();
doSmth();
}
}

void doSmth(){
}

ByTEK

#14
Merhaba Arkadaşlar,


Millis fonksiyonu kullanarak yaptım. Şuanda stabil çalışıyor gibi geldi. 1-2 gün deneyeceğim. aşağıdaki kod ile 30 dk bekliyor ve 1,5 saniye motora çıkış veriyor. ve arduinoyu soft olarak resetliyor. çalıştığını 13. pin ile takip ediyorum.

setup içerisinde değişkenlerin başlangıç değerini atadım.


resetleme işlemini kilitlenmesin diye yaptım. şuanlık sorun yok gibi.


void loop() {
//------------------------------------------------------------
// Her 1dk geçince bekleme_suresi 1 artar.
//------------------------------------------------------------
 if(millis()-Zaman >= 60000) // Her 1dk olunca
   {
     bekleme_suresi++;
     Zaman = millis();
   } 


    if (bekleme_suresi >= 30)
      {
        digitalWrite(13 ,HIGH); // Durum Pini
        digitalWrite(4 ,HIGH); // Motor Pini
        delay(calisma_suresi);
        digitalWrite(4 ,LOW); 
        asm volatile ( "jmp 0");  // soft resetle
      }
     
     delay(25);
     digitalWrite(13 ,!digitalRead(13)); // çalıştığını görmek için
}