tek buton ile aynı anda 3 timer çalıştırmak

Başlatan dyonizos, 11 Mayıs 2011, 02:59:40

dyonizos

merhabalar,

aşağıdaki gibi bir sistem için nasıl bir kod yazmam lazım Pause kullanarak yapamadım bir türlü.

gecikmeA=2000
gecikmeB=1500
gecikmeC=3200
'bu değerler değişken

3 adet milisaniye gecikme değeri var. butona basıldığında A1,A2,A3 portlarındaki ledleri bu süreler kadar gecikme sonunda yakmak istiyorum.
pause ile yapınca her gecikme diğerinin süresine ekleniyor süreler tutmuyor. Farklı bir yolu varmı acaba bunun?

burak1000

aslında kesme kullanarak daha ayrıntılı bir şekilde yapabilirsin ancak pause komutu ile basitçe ;

P VAR WORD

HOME:
PAUSE 1

P=P+1
' bu ksıma istediğin kadar yakıp söndürme değerleri atayabilirsin ancak P maximum 65535 olabilir
'P 65535'den sonra 0 olacak ve tekrar saymaya başlayacakdır. P'yi istediğin yerde reset  ederek sisteminin ne 'kadar peryot ile tekrar edeceğini belirleyebilirsin
IF P=2000 THEN PORTA.0=1
IF P=1500 THEN PORTA.1=1
IF P=3200 THEN PORTA.2=1
'gibi
GOTO HOME
çalışmanda başarılar :D

dyonizos

Kesme ile yapmak dahamı sağlıklı olur peki?
bu yöntemle sanki program biraz karışacakmış gibi geliyor.

mufitsozen

Alıntı yapılan: dyonizos - 11 Mayıs 2011, 11:12:58
Kesme ile yapmak dahamı sağlıklı olur peki?
bu yöntemle sanki program biraz karışacakmış gibi geliyor.

Cok haklisiniz sayin @burak1000 bunu dusunememis herhalde.

Siz yine bildiginiz gibi yapin.

Kolay gelsin.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

dyonizos

Alıntı yapılan: mufitsozen - 11 Mayıs 2011, 11:25:46
Alıntı yapılan: dyonizos - 11 Mayıs 2011, 11:12:58
Kesme ile yapmak dahamı sağlıklı olur peki?
bu yöntemle sanki program biraz karışacakmış gibi geliyor.

Cok haklisiniz sayin @burak1000 bunu dusunememis herhalde.

Siz yine bildiginiz gibi yapin.

Kolay gelsin.

biliyor olsaydım sormazdım sanırım.
Ben hangisinin daha sağlıklı olacağını öğrenmeye çalışıyorum. Sanırım siz benim soruma cevap olarak yazmamışsınız bu yazınızı. İçinde cevap göremedim çünkü.

mufitsozen

#5
Alıntı yapılan: dyonizos - 11 Mayıs 2011, 11:38:25
Alıntı yapılan: mufitsozen - 11 Mayıs 2011, 11:25:46
Alıntı yapılan: dyonizos - 11 Mayıs 2011, 11:12:58
Kesme ile yapmak dahamı sağlıklı olur peki?
bu yöntemle sanki program biraz karışacakmış gibi geliyor.

Cok haklisiniz sayin @burak1000 bunu dusunememis herhalde.

Siz yine bildiginiz gibi yapin.

Kolay gelsin.

biliyor olsaydım sormazdım sanırım.
Ben hangisinin daha sağlıklı olacağını öğrenmeye çalışıyorum. Sanırım siz benim soruma cevap olarak yazmamışsınız bu yazınızı. İçinde cevap göremedim çünkü.

Ozur dilerim, acik acik yazmak lazim demekki.

Cok haklisiniz sayin @burak1000 size sagliksiz bir cozum onermis. Tecrubeli butun herkesin bilecegi bu durumu sizde tecrubesiz ama akilli bir uygulamaci oldugunuz icin hemen farkedip suphelenmissiniz.

Bravo, dogrudur, program biraz degil cok fazla karisir, hatta bazi PIC modelleri bu durumda calisamaz duruma gelir.

Size onerilen sagliksiz durumu kaale almayiniz. Bildiginiz gibi yapiniz.

Kolay Gelsin, Allah zihin acikligi versin.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

burak1000

 ;) inanın bana kafam karıştı yazdıklarınızdan hiç birşey anlamadım. iyimi yaptım kötümü yaptım. neyse..
neden bu şekilde kullandım? çünki arkadaş sadece 3 tane gecikme yapacağını söylüyor bu şekilde yapabilir sonuç olarak çıkışına led bağlayacak :D bu kadar abartmaya gerek yok. ister TMR0 ile yapar ister pause ile bu şekilde yardımcı olmaya çalıştım sadece ben

dyonizos

Alıntı yapılan: burak1000 - 11 Mayıs 2011, 12:44:15
;) inanın bana kafam karıştı yazdıklarınızdan hiç birşey anlamadım. iyimi yaptım kötümü yaptım. neyse..
neden bu şekilde kullandım? çünki arkadaş sadece 3 tane gecikme yapacağını söylüyor bu şekilde yapabilir sonuç olarak çıkışına led bağlayacak :D bu kadar abartmaya gerek yok. ister TMR0 ile yapar ister pause ile bu şekilde yardımcı olmaya çalıştım sadece ben

burak arkadaşım çok teşekkürler. sen kesinlikle iyi birşey yaptın buna emin olabilirsin. senin bahsettiğin şekilde yaptım çalışıyor ancak yukarıda da yazdığım gibi program biraz karışık oldu yada bana öyle geliyor. Sonuçta bunu uzun bir program parçasının içinde kullanmaya çalışıyorum belkide bu yüzdendir. birde TRM0 ile deneyerek yapmaya çalışıyorum şimdide.
Bu arada benimde kafam karıştı bende yazılanlardan birşey anlamaz hale geldim. Yazılanların altında farklı bir anlam varmı yokmu çözemedim. Varsa da yoksa da artık yapacak birşey yok uzatmanın anlamı olmadığı gibi.

Sana tekrar teşekkürler.

burak1000

#8
rica ederim. ancak büyük bir program parçasını içerisinde kullanıyorsan  evet ilk cevabımın iyi bir çözüm olduğu söylenemez. o zmn;
3 tane bit şeklinde değişken tanımla
ve kesme alt programının içerisinde değişik periyotlar ile bu değişkenleri set yap.
program içerisinde ise bu değişkenleri "IF" komut ile kontrol et eğer "1" ise ledleri yak gibi.
ben bu bu şekilde kullanıyorum örnek vermek gerekirse. mesela karışık sistemdeki bir saat ayar menüsünde saat bilgisindeki  (12:35:46) hem saniye değeri sayarken hemde yarım saniye peryot ile ":"  yanıp sönüyor bunlar farklı peryotdlaar ancak kesme alt programındaki set ettiğin değişkenleri ana program içerisinde kontrol ederek bu işi yapabilirsin. :D

tekrar kolay gelsin


ayrıca kesme sürelerini hesaplayabilmek için bunu kullanabilirsin:
TMR0 hesaplayıcı
https://www.picproje.org/index.php/topic,33453.msg234450.html#msg234450

dyonizos

Alıntı yapılan: burak1000 - 11 Mayıs 2011, 04:47:32
aslında kesme kullanarak daha ayrıntılı bir şekilde yapabilirsin ancak pause komutu ile basitçe ;

P VAR WORD

HOME:
PAUSE 1

P=P+1
' bu ksıma istediğin kadar yakıp söndürme değerleri atayabilirsin ancak P maximum 65535 olabilir
'P 65535'den sonra 0 olacak ve tekrar saymaya başlayacakdır. P'yi istediğin yerde reset  ederek sisteminin ne 'kadar peryot ile tekrar edeceğini belirleyebilirsin
IF P=2000 THEN PORTA.0=1
IF P=1500 THEN PORTA.1=1
IF P=3200 THEN PORTA.2=1
'gibi
GOTO HOME
çalışmanda başarılar :D

peki bu verdiğin örneğe gecikme ile beraber led yanış süresi ekleme şansı varmı?
yani
IF P=2000 THEN PORTA.0=1:pause 2000:porta.0=0
IF P=1500 THEN PORTA.1=1:pause 2000:porta.1=0
IF P=3200 THEN PORTA.2=1:pause 2000:porta.1=0

gibi ancak bu şekilde değil tabi :)
programda gecikme yapmadan led yanış süreleride ayarlanabilirmi?
Bu şekilde olduğunda her gecikme süresi sonuna 2000ms gecikme ekliyor mecburen.



tyildizak

Önce gecikme sürelerinde kullanılabilecek en küçük birim zamanı hesaplayın, yani en büyük ortak çarpanı,
mesela gecikme süreleriniz 2000,1500 ve 3200 ms ise en küçük birim zamanınız 100 ms'dir.

her gecikme için bir değişken oluşturun
İster 100 ms'de bir  kez bir döngü içinde, ya da bu sürede bir oluşan bir kesme içinde, her seferindedeğişken değerlerini bir yukarı arttırın.
örneğin değişken1 , 20 olduysa ilk gecikmede ne oluyorsa onu yapın, mesela led yakın vs., sonra değişkeni sıfırlayın
değişken2= 15 olunca onunla ilgili işlemi yapın
bu şekilde sonsuz döngü devam etsin, her döngüde değişkenlerin durumlarına bakılıp, zamanı gelmişse çıkışlar değiştirilsin
Umarım anlaşılır biçimde anlatabilmişimdir. iyi çalışmalar dilerim.

burak1000

Alıntı yapılan: dyonizos - 11 Mayıs 2011, 14:25:10
Alıntı yapılan: burak1000 - 11 Mayıs 2011, 04:47:32
aslında kesme kullanarak daha ayrıntılı bir şekilde yapabilirsin ancak pause komutu ile basitçe ;

P VAR WORD

HOME:
PAUSE 1

P=P+1
' bu ksıma istediğin kadar yakıp söndürme değerleri atayabilirsin ancak P maximum 65535 olabilir
'P 65535'den sonra 0 olacak ve tekrar saymaya başlayacakdır. P'yi istediğin yerde reset  ederek sisteminin ne 'kadar peryot ile tekrar edeceğini belirleyebilirsin
IF P=2000 THEN PORTA.0=1
IF P=1500 THEN PORTA.1=1
IF P=3200 THEN PORTA.2=1
'gibi
GOTO HOME
çalışmanda başarılar :D

peki bu verdiğin örneğe gecikme ile beraber led yanış süresi ekleme şansı varmı?
yani
IF P=2000 THEN PORTA.0=1:pause 2000:porta.0=0
IF P=1500 THEN PORTA.1=1:pause 2000:porta.1=0
IF P=3200 THEN PORTA.2=1:pause 2000:porta.1=0

gibi ancak bu şekilde değil tabi :)
programda gecikme yapmadan led yanış süreleride ayarlanabilirmi?
Bu şekilde olduğunda her gecikme süresi sonuna 2000ms gecikme ekliyor mecburen.


ilk cevabımda söylediğim gibi "bu kısımda istediğin kadar yakıp söndürme değerleri atayabilirsin. aynı kısım içerisinde başka pause komutu kullanmamalısın.
örn:


P VAR WORD

HOME:
PAUSE 1

P=P+1 ' ayrıca @tyildizak'ın söylediği gibi artış miktarını 10 yada 100 ms yaparak daha ufak değerler kullanabİlirsin

IF P=2000 THEN PORTA.0=1  'böylece porta.0 2000'den 4000'e kadar çıkış verir yani 2000ms led yanar ;)
IF P=4000 THEN PORTA.0=0  bu şekilde ikili "IF" komutları kullanarak yapabilirsin

GOTO HOME

fakat programın büyük ise kesme yapmanı öneririm :D