Jal2 ile birbirinden bağımsız zaman döngüleri

Başlatan Erdinçbavaş, 15 Kasım 2014, 22:58:37

Erdinçbavaş

Jal2  pic16f628 içerisine 2 farklı zaman döngüsü koyabilir miyim.Yani içierisinde süre olan birbirinden bağımsız iki program çalıştırabilir miyim?Teşekkürler. 

OG

Aynı anda tek bir program çalışır.
Timer ile donanım desteği alırsan aynı anda birden fazla işlem yapmış gibi olunur.

Veya özel yöntemlerle birden fazla zaman takibi yapılabilir. Ama bu işlemde aynı anda tek programdır.

Kısıtlama JAL ile ilgili değil donanımın özelliği.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

Erdinçbavaş

Teşekkürler OG yani bir işlem bitmeden diğerine geçemem.Kullanmak istediğim zaman döngüsü çok uzun olacaktı program bu zaman döngüsüne girince bitmeden diğerine geçemeyecek.Ayrı ayrı entegreler kullanacağım ozaman.

OG

Belki ikinciye gerek kalmayacak, yapacağınız işe ve program yazma becerisine bağlı.

MCU program ihtiyaçlarının hemen hepsi, aynı anda çok işlem yapmaya yöneliktir ve iç içe program parçaları ile veya donanım destekleri ile çoğu zaman iş problemsiz hallolur.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

demket

S.A., ikinci işlemciye gerek yok.

If veya case ile timer kullanarak yapabilirsin.

Timer da delay_slots u kaç görev yapmak istiyorsan okadar seç.

forever loop içinde bu görevleri timerla kullan kullan. Slotlardan birini 1sn gibi ayarla (sana kalmış). while kullanma. while kullanacağın yerlerde if veya case ile denetlettir.

Örnek:


                               4: Block                                      -- 4 ile kastettiğim durum değişkeni

                                     lcd_cursor_position(1,0)
                                     print_string(lcd,ydinlen)
                                     dinlen = dinlen + 1              --sayacı bir arttır.
                                     if dinlen == 6 then               -- süre istediğin kadarsa sayacı sıfırla ve case içindeki bir sonraki duruma geç
                                         dinlen = 0
                                         durum = 5
                                     end if

                                     
                               End Block

ByTEK


Erdinçbavaş

include 16f628                 -- target PICmicro
pragma target clock 4_000_000 -- Kristal 4 MHZ
pragma target osc INTOSC_NOCLKOUT -- Dahili OSC
pragma target CP   enabled --  Şifreler
pragma target CPD  enabled --  Şifreler
pragma target WDT  disabled        -- no watchdog
pragma target LVP  disabled        -- no Low Voltage Programming
pragma target MCLR external        -- reset externally
enable_digital_io()                -- disable analog I/O (if any)
pin_a0_direction = input
pin_a1_direction = input
pin_a2_direction = input
pin_a3_direction = input
pin_a4_direction = input


pin_a6_direction = output     -- porta 6 cikis yapildi
pin_a7_direction = output     -- porta 7 cikis yapildi
portb_direction = all_output
portb = 0b00000000           -- portb baslangic degeri
pin_a6 = low
pin_a7 = low
forever loop
if pin_a0 == low then
            pin_b4 = high -- Buzzer ötsün
            _usec_delay  (3000000)
            pin_b4 = low  -- Buzzer dursun

if pin_a4 == low then
           for 4 loop
           pin_b4 = high -- Buzzer ötsün
           _usec_delay  (3000000)
           pin_b4 = low  -- Buzzer dursun
           for 25 loop
           pin_b0 = high
           pin_b1 = low
           pin_b2 = low
           pin_b3 = low
          _usec_delay  (60000)

           pin_b0 = low
           pin_b1 = high
           pin_b2 = low
           pin_b3 = low
        _usec_delay  (60000)

           pin_b0 = low
           pin_b1 = low
           pin_b2 = high
           pin_b3 = low
         _usec_delay  (60000)
           pin_b0 = low
           pin_b1 = low
           pin_b2 = low
           pin_b3 = high
        _usec_delay  (60000)
          end  loop
           pin_b3 = low
          _usec_delay  (3000000)
          end loop
          end if


end if
end loop


Arkadaşlar herkese teşekkür ederim. Yukarıdaki gibi basit bir step sürücü programım var.Benim kartımın üzerinde bir kaç çıkışım yedekte.O çıkışlarımı kullanarak bu programın akışını bozmayacak şekilde bir bir zaman döngüsü yapmak istiyorum.Örneğin 3 saat sonra b7 1 saat süre  çıkış verecek.Fakat bu 4 saatlik süre içerisinde a0 girişi aktif olunca benim ana program zaman programımdan bağımsız çalışacak.Nasıl olur.

demket

include 16f628                 -- target PICmicro
pragma target clock 4_000_000 -- Kristal 4 MHZ
pragma target osc INTOSC_NOCLKOUT -- Dahili OSC
pragma target CP   enabled --  Şifreler
pragma target CPD  enabled --  Şifreler
pragma target WDT  disabled        -- no watchdog
pragma target LVP  disabled        -- no Low Voltage Programming
pragma target MCLR external        -- reset externally
enable_digital_io()                -- disable analog I/O (if any)
pin_a0_direction = input
pin_a1_direction = input
pin_a2_direction = input
pin_a3_direction = input
pin_a4_direction = input


pin_a6_direction = output     -- porta 6 cikis yapildi
pin_a7_direction = output     -- porta 7 cikis yapildi
portb_direction = all_output
portb = 0b00000000           -- portb baslangic degeri
pin_a6 = low
pin_a7 = low


const word timer0_isr_rate = 1000
const DELAY_SLOTS = 2
include timer0_isr_interval
timer0_isr_init()
var word prev_interval_counter


var byte durum = 0
var word bekle = 0


forever loop


      if (isr_counter != prev_interval_counter) then
         prev_interval_counter = isr_counter
      end if


      if (check_delay(0)) then
         set_delay(0, 100)


                  if pin_a0 == low then
                              pin_b4 = high -- Buzzer ötsün
                              _usec_delay  (3000000)
                              pin_b4 = low  -- Buzzer dursun

                  if pin_a4 == low then
                             for 4 loop
                             pin_b4 = high -- Buzzer ötsün
                             _usec_delay  (3000000)
                             pin_b4 = low  -- Buzzer dursun
                             for 25 loop
                             pin_b0 = high
                             pin_b1 = low
                             pin_b2 = low
                             pin_b3 = low
                            _usec_delay  (60000)

                             pin_b0 = low
                             pin_b1 = high
                             pin_b2 = low
                             pin_b3 = low
                          _usec_delay  (60000)

                             pin_b0 = low
                             pin_b1 = low
                             pin_b2 = high
                             pin_b3 = low
                           _usec_delay  (60000)
                             pin_b0 = low
                             pin_b1 = low
                             pin_b2 = low
                             pin_b3 = high
                          _usec_delay  (60000)
                            end  loop
                             pin_b3 = low
                            _usec_delay  (3000000)
                            end loop
                            end if


                  end if
    end if
   
      if (check_delay(1)) then
         set_delay(1, 1000)

                      bekle = bekle + 1             --saniyede ~1 artar
                      if (bekle == 1800) then     --süreyi ayarla
                      pin_b7 = on
                      end if
                     
                      if (bekle == 2400) then
                      pin_b7 = off
                      bekle = 0
                      end if
                     
                     

                     
                     
         
      end if
   
   
   
   
   
end loop







Erdinçbavaş

#8
Demket sağolasın kardeşim. Senin programdan yola çıkarak bişeyler yaptım.Aşağıdaki gibi.Yalnız jal2 nin zaman süreleri gerçek zamana ne kadar yakın.Ayrıca _usec_delay  (-----------) içerisine yazabileceğimiz en büyük değer (1000000=1sn old. göre) ne olur.

mesaj birleştirme:: 19 Kasım 2014, 03:19:39

include 16f628                 -- target PICmicro
pragma target clock 4_000_000 -- Kristal 4 MHZ
pragma target osc INTOSC_NOCLKOUT -- Dahili OSC
pragma target CP   enabled --  Şifreler
pragma target CPD  enabled --  Şifreler
pragma target WDT  disabled        -- no watchdog
pragma target LVP  disabled        -- no Low Voltage Programming
pragma target MCLR external        -- reset externally
enable_digital_io()                -- disable analog I/O (if any)
pin_a0_direction = input
pin_a1_direction = input
pin_a2_direction = input
pin_a3_direction = input
pin_a4_direction = input


pin_a6_direction = output     -- porta 6 cikis yapildi
pin_a7_direction = output     -- porta 7 cikis yapildi
portb_direction = all_output
portb = 0b00000000           -- portb baslangic degeri
pin_a6 = low
pin_a7 = low

var word saat = 0

forever loop
_usec_delay  (60000000)       -- 60 sn
saat = ( saat + 1 )            --  60 sn de  1 dk ver.
if ( saat > 6 ) then            --  6. dk dan sonra yan
pin_b7 = high
_usec_delay  (120000000)        -- 2 dk yanık kal. 8
var word saat = 0
else
pin_b7 = low                     -- 2480(2 günde) dk sonra 360 (6saat) dk şarj etmeli


                  if pin_a0 == low then
                              pin_b4 = high -- Buzzer ötsün
                              _usec_delay  (2000000)
                              pin_b4 = low  -- Buzzer dursun

                  if pin_a1 == low then
                             for 1 loop
                             pin_b4 = high -- Buzzer ötsün
                             _usec_delay  (2000000)
                             pin_b4 = low  -- Buzzer dursun
                             for 25 loop
                             pin_b0 = high
                             pin_b1 = low
                             pin_b2 = low
                             pin_b3 = low
                            _usec_delay  (60000)

                             pin_b0 = low
                             pin_b1 = high
                             pin_b2 = low
                             pin_b3 = low
                          _usec_delay  (60000)

                             pin_b0 = low
                             pin_b1 = low
                             pin_b2 = high
                             pin_b3 = low
                           _usec_delay  (60000)
                             pin_b0 = low
                             pin_b1 = low
                             pin_b2 = low
                             pin_b3 = high
                          _usec_delay  (60000)
                            end  loop
                             pin_b3 = low
                            _usec_delay  (2000000)
                            end loop
                            end if

end if

      end if
     
end loop

demket

#9
S.A., süreler ne kadar doğru olur hiç denemedim.

Süreleri uzatmak istersen döngü kullanabilirsin.

Kesinlik istersen (ve aynı zamanda uzatmak) rtc kullan ve süreyi kontrol ettir.

Böylece programında sadeleşir.


RTC ye pil de bağlarsan enerji kesintilerinden de etkilenmezsin. Tabiki kodun nerede kaldığını eprom a yazmak kaydıyla.



Selametle,

Erdinçbavaş

Demket kardeşim A.S.Benim devre sağlıklı çalışmadı.Senin devre üzerinden gittim fakat şöyle bir sıkıntı var.
Zaman döngüsü benim program çalışınca kaldığı yerden saymıyor başa dönüyor.Örneğin programı b7 yi 5 sn yak 5sn sön yaptığımda.b7 söndükten 4 sn sonra step devresini çalıştırınca step sürücü bittiğinde zaman döngüsüne girince yeniden 0 dan saymaya başlıyor.4.sn den devam edemezmiyiz.(Bu şekilde olursa ilk 5sn içinde  step devreye girecek olursa döngü işlevini yerine getiremiyor.aşağıdaki gibi revize edebilir miyiz programı.
--b7 biti önce (21600sn=6saat ) onn (172800sn=48 saat) olsun sonra off olsun istersem program nasıl olur.
Yardımlarınız için Allah razı olsun.

 

demket


Erdinçbavaş

#12
Sizin gönderdiğiniz yazılım.RTC uyg. sonra düşünüyorum.Şimdilik sadece pic ile çözebilir miyim?

include 16f628                 -- target PICmicro
pragma target clock 4_000_000 -- Kristal 4 MHZ
pragma target osc INTOSC_NOCLKOUT -- Dahili OSC
pragma target CP   enabled --  Şifreler
pragma target CPD  enabled --  Şifreler
pragma target WDT  disabled        -- no watchdog
pragma target LVP  disabled        -- no Low Voltage Programming
pragma target MCLR external        -- reset externally
enable_digital_io()                -- disable analog I/O (if any)
pin_a0_direction = input
pin_a1_direction = input
pin_a2_direction = input
pin_a3_direction = input
pin_a4_direction = input


pin_a6_direction = output     -- porta 6 cikis yapildi
pin_a7_direction = output     -- porta 7 cikis yapildi
portb_direction = all_output
portb = 0b00000000           -- portb baslangic degeri
pin_a6 = low
pin_a7 = low


const word timer0_isr_rate = 1000
const DELAY_SLOTS = 2
include timer0_isr_interval
timer0_isr_init()
var word prev_interval_counter


var byte durum = 0
var word bekle = 0


forever loop


      if (isr_counter != prev_interval_counter) then
         prev_interval_counter = isr_counter
      end if


      if (check_delay(0)) then
         set_delay(0, 100)


                  if pin_a0 == low then
                              pin_b4 = high -- Buzzer ötsün
                              _usec_delay  (3000000)
                              pin_b4 = low  -- Buzzer dursun

                  if pin_a4 == low then
                             for 4 loop
                             pin_b4 = high -- Buzzer ötsün
                             _usec_delay  (3000000)
                             pin_b4 = low  -- Buzzer dursun
                             for 25 loop
                             pin_b0 = high
                             pin_b1 = low
                             pin_b2 = low
                             pin_b3 = low
                            _usec_delay  (60000)

                             pin_b0 = low
                             pin_b1 = high
                             pin_b2 = low
                             pin_b3 = low
                          _usec_delay  (60000)

                             pin_b0 = low
                             pin_b1 = low
                             pin_b2 = high
                             pin_b3 = low
                           _usec_delay  (60000)
                             pin_b0 = low
                             pin_b1 = low
                             pin_b2 = low
                             pin_b3 = high
                          _usec_delay  (60000)
                            end  loop
                             pin_b3 = low
                            _usec_delay  (3000000)
                            end loop
                            end if


                  end if
    end if
   
      if (check_delay(1)) then
         set_delay(1, 1000)

                      bekle = bekle + 1             --saniyede ~1 artar
                      if (bekle == 1800) then     --süreyi ayarla
                      pin_b7 = on
                      end if
                     
                      if (bekle == 2400) then
                      pin_b7 = off
                      bekle = 0
                      end if
                     
                     

                     
                     
         
      end if
   
   
   
   
   
end loop

demket

Bu kodlar zaten benim gönderdiklerim. Kastım, senin, benim kodlara bakarak yaptıklarındı.

Neyse. Söylediklerini yapmak mümkün fakat bu senin kod becerinle alakalı. Sana şu kadar söyleyeyim. Eğer bu işi çözemezsen sonrasını da yapamazsın. Biraz kafa patlat. Hazır olan şeyler sana hiçbir şey katmaz...


Erdinçbavaş