Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Random olarak dakika üretmek

Başlatan adiga, 15 Ağustos 2015, 20:55:12

adiga

arkadaşlar burada tıkandım kaldım. birçok kaynağa baktım fakat net bir cevap bulamadım. bu işte de yeni olduğum için biraz çaba edip bir şema ve bir parça kod ortaya çıkartabildim. Takıldığım yer ise;

Enerji verildiğinde ;
30 ile 90 dakika arasından random bir dakika seçecek.
Örneğin 42 dakikayı seçti ve 42 dakika geçtikten sonra GPO/AN0 enerjineliyor.
GPO/AN0 enerjilendiği anda;
enerjiyi kesmek için, tekrar 5 ile 15 dakika arasından random bir dakika seçecek.
Örneğin 13 dakikayı seçti ve 13 dakika geçtikten sonra GPO/AN0 enerjisini kesiyor.
Sürekli bu işlem tekrarlanıyor, fakat her seferinde random (aynı dakikayı seçmemeli) bir dakika seçilmelidir.

bunu nasıl yapabilirim. ayrıca şu ana kadar tamamladığım kod aşağıdadır. saçmalamış da olabilirim dediğim gibi yeniyim. yardımlarınızı beklerim.

#include <main.h>
#include <stdlib.h>

void main()
{

set_tris_a(0x00);
output_a(0x00);



int acik=rand() % 45500 + 250;

int kapali=rand() % 1500 + 250;



   while(TRUE)
   {
      output_high(pin_a0);
      delay_ms(acik);
      output_low(pin_a0);
      delay_ms(kapali);

   }

}

ziyaretci

#1
  Daha önce bu sorunla bende karşılaşmıştım. Serdar Çiçek 'in kitabını karıştırdım şimdi, şu bilgilere ulaştım:
   srand(deger); fonksiyonu ile istediğini yapabilirsin. Tek şart var, değer kısmı sürekli değişecek. Bunu da şu şekilde yapabilirsin; timer0,1 ayarlarsın sürekli saydırırsın. Saydırdığın değişkeni değer kısmına yazarak srand sayını üretirsin. Değer kısmının maksimum ne olması gerektiğine stdlib.h dosyasından bakarsın.
 
  İmkan varsa analog girişlerin tekine sinüsoidal bir sinyal uygula, oradan istenilen anda gelen analog sinyali okursun, işte gerisini ayarlarsın.


adiga

Alıntı yapılan: erkantr67 - 16 Ağustos 2015, 21:10:02
  Daha önce bu sorunla bende karşılaşmıştım. Serdar Çiçek 'in kitabını karıştırdım şimdi, şu bilgilere ulaştım:
   srand(deger); fonksiyonu ile istediğini yapabilirsin. Tek şart var, değer kısmı sürekli değişecek. Bunu da şu şekilde yapabilirsin; timer0,1 ayarlarsın sürekli saydırırsın. Saydırdığın değişkeni değer kısmına yazarak srand sayını üretirsin. Değer kısmının maksimum ne olması gerektiğine stdlib.h dosyasından bakarsın.
 
  İmkan varsa analog girişlerin tekine sinüsoidal bir sinyal uygula, oradan istenilen anda gelen analog sinyali okursun, işte gerisini ayarlarsın.
hocam kodlarda nasıl bir değişiklik yapmam gerekecek. konuda da belirttiğim gibi pek bilgi sahibi değilim. bir şeyler yapmaya çalışıyorum. yardımcı olursanız sevinirim.

kantirici

Eğer dışarıdan bir besleme ile random fonksiyonu beslemezsen sürekli aynı sayıları elde edersin. Forumda daha önce ramdom sayı üretmek konusu tartışılmıltı. Gerçek random sayı üretmek kolay değil. Örneğin bir analog giriş boşya bırakılarak analog değer okunmak süretiyle birşeyler yapılabilir. Yada içinde random sayı üreteci olan bir mcu seçilebilir.

adiga

Alıntı yapılan: kantirici - 16 Ağustos 2015, 21:52:51
Eğer dışarıdan bir besleme ile random fonksiyonu beslemezsen sürekli aynı sayıları elde edersin. Forumda daha önce ramdom sayı üretmek konusu tartışılmıltı. Gerçek random sayı üretmek kolay değil. Örneğin bir analog giriş boşya bırakılarak analog değer okunmak süretiyle birşeyler yapılabilir. Yada içinde random sayı üreteci olan bir mcu seçilebilir.

hocam aramalarda bulamadım konunun linkini yazar mısınız bir inceleyeyim.

Gökhan BEKEN

Forumun arama kısmı çok iyi çalışmıyor, google şu şekilde aratırsanız daha iyi sonuçlara ulaşırsınız: https://www.google.com.tr/?gfe_rd=cr&ei=xe7QVZqKDrOz8weD_L2wDQ&gws_rd=ssl#q=random+say%C4%B1+site:picproje.org
Özel mesaj okumuyorum, lütfen göndermeyin.

eemuratozan

ben de aynı sorunu dahili eepromu kullanarak halletmiştim. srand() fonksiyonunun seed değerini sürekli artırın ve bu değeri sürekli bir adrese kaydetsin program başlarken de bu adresi okuyup srand() fonksiyonuna kaynak olarak atasın böylece srand() kaynağı sürekli değişeceği için aynı random dakikaları üretmeyeceksin. Bir başa çözüm de srand(y) fonksiyonundaki y yani kaynağı değiştirmek için bir döngü ile x adet random sayı üretip bir diziye ata daha sonra bu dizi elemanlarını da yine bir döngü ile sırasıyla srand() fonksiyonuna kaynak olarak atarsan rand() fonksiyonu aynı sayıları üretmeyecektir fakat dahili eeprom bence söylediğim 2. çözümden daha kullanışlı olacaktır. kodlarda sıkıntı yaşarsan sana bir örnek atabilrim
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

boreas

Şöyle birşey yapabilirsin  2 array düşün. Birinde açılış diğerinde kapanış süreleri var. 10 adet ardarda sıraladın farklı rakamları. Ve 1 ile 10 arası bir değer seçip arrayden okudun. Okuduktan sonra arrayin seçtiğin değerini tekrar değiştirdin. Ve bir sonrakini yine arrayden seçtin. Array'a atmanın nedeni arraya sayıları attıktan sonra taratıp aynı sayıdan olmasını engelleyebilirsin. Bu şekilde hep farklı sayılarla ilerlersin.

adiga

#8
üstadlar öncelikle hepinize teşekkürler. şöyle bir kod yazdık fakat pic e attığımda GOP/AN0 pinini çok kısa sürelerde enerjilendirip enerjiyi kesiyor. bir yerde hata mı yapıyorum yoksa dahili osilatör ile ilgili bir sorun olabilir mi?

main.h
#include <12F675.h>

#fuses INTRC_IO, NOWDT, NOMCLR, NOPROTECT, NOCPD, NOBROWNOUT

#use delay(internal=4MHz)



main.c
#include <main.h>
#include <stdlib.h>

int16 adc_value;

int deger,deger2;
boolean dgr=true;
boolean dgr2=false;

int16 enerji_var()
{
   DO
   {
      deger = rand ();
   } WHILE (deger >= 5 &&deger <= 15) ;

   dgr = true;
   RETURN deger;
}

int16 enerji_yok()
{
   DO
   {
      deger2 = rand ();
   } WHILE (deger2 >= 30 &&deger2 <= 90); 

   dgr2 = true;
   RETURN deger2;
}

void main()
{
   setup_adc_ports (NO_ANALOGS|VSS_VDD); //ANALOG girdi yok
   setup_adc (ADC_OFF); //  ADC birimi devre dışı
   setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1 (T1_DISABLED); // Timer1 devre dışı
   setup_comparator (NC_NC); 
   setup_vref (FALSE);

   WHILE (1)
   {
      
      IF (dgr == true)
      {
         output_high (pin_A0);
         deger = enerji_var ();
         delay_ms (1000 * 60 * deger);
         dgr = false;
         dgr2 = true;
      }

      IF (dgr2 == true)
      {
         output_low (pin_A0);
         deger2 = enerji_yok ();
         delay_ms (1000 * 60 * deger2);
         dgr2 = false;
         dgr = true;
      }
   }
}

eemuratozan

Daha önce yaşadığım problem ve eeprom kullanarak çözdüğüm rand() fonksiyonu incelemende fayda var.Direk kodu yapıştırmıyotum çünkü kodun ne yaptığını anlaman güçleşir konuyu incelersen faydalı olacaktır:
https://www.picproje.org/index.php/topic,60547.15.html
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

adiga

Alıntı yapılan: eemuratozan - 09 Eylül 2015, 09:32:20
Daha önce yaşadığım problem ve eeprom kullanarak çözdüğüm rand() fonksiyonu incelemende fayda var.Direk kodu yapıştırmıyotum çünkü kodun ne yaptığını anlaman güçleşir konuyu incelersen faydalı olacaktır:
https://www.picproje.org/index.php/topic,60547.15.html

hocam ben aynı değerlerin random olarak dönmesini sorun olarak görmüyorum şuan için. şuanki sorunum ;

yukarıda son yazdığım kod 5 ile 15 ve 30 ile 90 dakika arasında random dakika üretmeli. fakat pic e yazıp devreyi açtığımda GPO/AN0 pin i belirtilen 5 ile 15 ve 30 ile 90 dakika arasındaki dakikalardan değil de çok kısa zamanlar arasında enerjilenip enerjiyi kesiyor.

2. sorun olarak aynı random değerleri üretilmesi olabilir fakat 1. sorunum budur. belirtilen değerlerde pin in enerjilenmesi ve enerjiyi kesmesi gerekirken çok kısa sürelerde enerjilenip enerjiyi kesiyor.

eemuratozan

hocam isis şemasını da yükleyebilir misin?
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

adiga

Alıntı yapılan: eemuratozan - 09 Eylül 2015, 15:36:26
hocam isis şemasını da yükleyebilir misin?

hocam isis dosyasını indirmek için tıklayınız. yukarıdaki regülatör devresini silersiniz. yanımda isis programı olmadığı için silemedim.

cosine

Hocam döngüde hata var gibi. deger mesela 2 ise döngüden çıkacak.

DO
   {
      deger = rand ();
   } WHILE (deger >= 5 &&deger <= 15) ;

adiga

Alıntı yapılan: cosine - 09 Eylül 2015, 16:38:50
Hocam döngüde hata var gibi. deger mesela 2 ise döngüden çıkacak.

DO
   {
      deger = rand ();
   } WHILE (deger >= 5 &&deger <= 15) ;

hocam kod nasıl olmalı?