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.
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.
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.
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.
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
aşağıdaki linki incelerseniz faydası olacağını düşünüyorum.
http://justanotherlanguage.org/node/167 (http://justanotherlanguage.org/node/167)
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.
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 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
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,
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.
Kodları görelim.
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
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...
Haklısın biraz daha çalışmalıyım.
var dword san = 0
forever loop
_usec_delay (1000000) -- 1 sn
san = ( san + 1 ) -- 1sn ver.
if ( san < 3600 ) then pin_b7 = high else pin_b7 = low end if
if ( san == 240000 ) then san = 0 else end if
Programın başına bu şekilde bir ifade yazdığımda (zamandan sayıcıya aktarma yaptıgımda ) ana programım çalışsa bile (zaten kısa süre çalışıyor) Sayıcım kaldıgı yerden devam ediyor.Bu şekilde yaklaşık 5 günde 1 (3600 sn) bir çıkışla istediğimi yaptırabildim.Tabi ana programdan kaynaklı gecikmelerden dolayı zaman olarak gercek zamandan sapıyorum ama olsun benim için sorun değil.Bu arada jal2de 1 saatte 2sn den az bir sapma var.Emeği geçen herkese teşekkür eder ve saygılar sunarım.