Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Led Yanma Süresini Öteleme

Başlatan ercanatnr, 18 Ekim 2015, 14:48:29

ercanatnr

Merhaba arkadaşlar,
CCS C de timer0 ile RB1 portuna bağlı bir ledi 3 sn aralıklarla yakıp söndürüyorum. Buraya kadar bir sorunum yok takıldığım nokta ise RB1 e bağlı olan bu ledi picin RB0 kesmesi ile süresini ötlemek istiyorum. Yani normalde 3 sn aralıklarla yanıp sönen bu ledi herhangi bir zamanda RB0 kesmesine soktuğumuzda ledin yanma yada sönme süresi 3 sn ötelenecek. RB0 kesmesi olmadıgı durumlarda ise eskisi gibi 3 sn aralıklarla yanmaya devam edecek. Ben 3 sn yanıp sönme işini halletim ancak ötelemeyi yapamadım kodlar aşağıda.

#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(internal=4000000)
#define buton pin_b0
int i;
#INT_EXT
void diskesme()//Ledin yanıp sönme süresini 3 sn ötlemek için buraya nasıl bir kod yamalıyım.
{


}

#INT_TIMER0
void kesme() 
{
set_timer0(60);
i++;
if(i==60)
{
output_toggle(pin_b1);
i=0;
}

}

void main()
{  set_tris_b(0x01);
   output_b(0x00);
   
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   
   set_timer0(60);
   
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   
while(1);
}

iyildirim

void diskesme()//Ledin yanıp sönme süresini 3 sn ötlemek için buraya nasıl bir kod yamalıyım.
{
  i -= 60;  
}


ercanatnr

#2


mesaj birleştirme:: 19 Ekim 2015, 06:07:28

Alıntı yapılan: iyildirim - 18 Ekim 2015, 15:43:53
void diskesme()//Ledin yanıp sönme süresini 3 sn ötlemek için buraya nasıl bir kod yamalıyım.
{
  i -= 60;  
}


Denedim malesef çalışmıyor ben aslında oraya i=0; yazıyordum olmuyordu sizin veridiğiniz kodu da denedim oda olmadı.

tekosis

void diskesme()//Ledin yanıp sönme süresini 3 sn ötlemek için buraya nasıl bir kod yamalıyım.
{
  i = 0; 
set_timer0(60);
}
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

ercanatnr

Alıntı yapılan: tekosis - 18 Ekim 2015, 16:19:49
void diskesme()//Ledin yanıp sönme süresini 3 sn ötlemek için buraya nasıl bir kod yamalıyım.
{
  i = 0; 
set_timer0(60);
}
Denedim bu kod da işe yaramadı.

RaMu

void diskesme()//Ledin yanıp sönme süresini 3 sn ötlemek için buraya nasıl bir kod yamalıyım.
{
  i = 0;  
set_timer0(60);
output_low(pin_b1);
}


Birde ledi söndürsen olur herhalde.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

ercanatnr

Alıntı yapılan: RaMu - 19 Ekim 2015, 02:29:29
void diskesme()//Ledin yanıp sönme süresini 3 sn ötlemek için buraya nasıl bir kod yamalıyım.
{
  i = 0;  
set_timer0(60);
output_low(pin_b1);
}


Birde ledi söndürsen olur herhalde.

Ledi söndürürsem olmaz çünkü led yanıyorken bastığımda sönme süresini öteleyecek. Sönük iken bastığımda ise yanma süresini öteleyecek.

RaMu

#7
output_low(pin_b1);
kısmı ledi söndürüyor,
geri kalanı zamanlayıcıyı sıfırlıyor.

Algoritma doğru gibi bu haliyle.
Deneyin doğru çalışıyor mu test edelim.


Yanlış anlamışım.

@tekosis in verdiği örnek dediğini yapıyor olması lazım.
Yada yapılması isteneni anlayamadım ben.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

ercanatnr

Alıntı yapılan: RaMu - 19 Ekim 2015, 10:01:17
output_low(pin_b1);
kısmı ledi söndürüyor,
geri kalanı zamanlayıcıyı sıfırlıyor.

Algoritma doğru gibi bu haliyle.
Deneyin doğru çalışıyor mu test edelim.


Yanlış anlamışım.

@tekosis in verdiği örnek dediğini yapıyor olması lazım.
Yada yapılması isteneni anlayamadım ben.

#INT_TIMER0
void kesme()                      //Her 50 ms de bir kesmeye giriyor.
{
set_timer0(60);
i++;                                  //her kesmede i 1 artıyor.
if(i==60)                          //i degeri 60 oldugunda 50*60=3sn
{
output_toggle(pin_b1);   //ledi toggle yapıyor.
i=0;
}

}

Yani benim yapmak istediğim butona herhangi bir zamanda bastıgımda i=0 olsun böylece 3sn kazanılmış olur.

ercanatnr

Sorun çözüldü,
Aslında tam olarak çözülmedi ancak idare eder. "i" değişkenini if fonksiyonu içinde 0 ladıgımda istediğim gibi çalışıyor. RB0 kesmesinde öteleseydi daha çok işime yarayacaktı ama yinede idare eder.
if(input(pin_b0))
{
i=0;
}

dursuncemal

led yanikken 3 saniye ekledik diyelim. interrupt led sonmeden bir daha gelse bir 3 snye mi eklenecek yoksa  her durumda sadece 1 kere mi eklenecek?
Alıntı yapılan: ercanatnr - 20 Ekim 2015, 01:12:24
Sorun çözüldü,
Aslında tam olarak çözülmedi ancak idare eder. "i" değişkenini if fonksiyonu içinde 0 ladıgımda istediğim gibi çalışıyor. RB0 kesmesinde öteleseydi daha çok işime yarayacaktı ama yinede idare eder.
if(input(pin_b0))
{
i=0;
}

:=

ercanatnr

Alıntı yapılan: dursuncemal - 12 Ocak 2016, 04:16:52
led yanikken 3 saniye ekledik diyelim. interrupt led sonmeden bir daha gelse bir 3 snye mi eklenecek yoksa  her durumda sadece 1 kere mi eklenecek?
Led yanıkken basıldığında 3 sn ekleyecek sönükken de aynı şekilde olacak. 1 kereye mahsus olmayacak her basıldığında 3 sn öteleyecek.

dursuncemal

simdi led yanikken veya her bastiginda 3 sn uzatacaksak;
bir degisken daha tamimlayalim adinada toogle_suresi diyelim;bunlarin deger lerini main den once atamayi unutma !

#INT_TIMER0
void kesme()                      //Her 50 ms de bir kesmeye giriyor.
{
set_timer0(60);
i++;                                  //her kesmede i 1 artıyor.
if( i  > = toogle_suresi)                          //i degeri 60 oldugunda 50*60=3s // kesmede   toogle_suresi ne ekledigin her 60 sana eski degerini bozmadan 3 sn kazandiracak
{
output_toggle(pin_b1);   //ledi toggle yapıyor.

i=0;

toogle_suresi _60;

//not eger bir kere artsin diyosan kesmeyi burada ac kesme gelince kapat

}

}


void diskesme()//Ledin yanıp sönme süresini 3 sn ötlemek için buraya nasıl bir kod yamalıyım.
{
toogle_suresi = toogle_suresi + 60; ////// i degiskenin arttik icindeki deger + 60 yani 3 sn daha artmaya devam edecek   

//not;eger 1 kere artirmak istiyorsan kesme interruptını burda kapat pinini togale yapınca ac ama her kesme gelince artsin diyorsan BURASI COK ONEMLİ İ; VE toogle_suresi  DEGİSKENLERİNİ TANIMLARKEN int16 veya ihtiyacina gore tanimla
}

simdi musaade edersen sana bir karkas olusturalim

timer0 i 4 ms kurarlim;
int 8 salise = 250 ; //diyelim
int8 saniye = 3;//diyelim

#INT_TIMER0
void kesme()                      //Her 4 ms de bir kesmeye giriyor.
{

if(salise){salise--;}else{

                                      if(saniye) {saniye--;}else{saniye = 3;  output_toggle(pin_b1); }

                                     salise = 250;

                                     }/// kaba hesap ile 4*250 = 1000 ms yaklasık 1 saniye eder bu 1 sn yeyi baska yerlerdede rahatca kullanabilirsin

}
/////////////////////
void diskesme()//Ledin yanıp sönme süresini 3 sn ötlemek için buraya nasıl bir kod yamalıyım.
{

saniye = saniye + 3;//
}

benim yazdigim karkasta degiskenlerin 8 bit olabilir


not;fonksiyon lari denemedim mantik olsun diye anlatmaya calistim umarim yardimci olmusumdur
:=