çalışan ana programdan bağımsız zamanlama ( gecikme ) sağlamak 10sn 1dk felan

Başlatan fatihbaysu, 25 Haziran 2015, 22:47:45

fatihbaysu

 Ete Hocam, değerli arkadaşlar,

Takıldığım bir sorunum var picbasic ve ETE hocamın dersleriyle başladığım W7 64bitte derleme sorunundan Proton basic e geçtim bir süredir ufak tefek işler yaptım ama bir projemde zamanlama cözümüne ihtiyacım var fikir verebilirmisiniz.
Ekte bir kısmını gönderdiğim dosyada 2 satır lcd ile araç içi lpg kontrolü sağlamaktayım bazı hatalarda sistem o mesajı ekrana getirmesi gerekmekte ekteki AKU_HATA10: gibi ama ekrandaki bilgiler geçerken akü voltajı 10voltun altına düştüğünde bu satıra gidip oradaki hata mesajını ekrana yazması 3sn sonrada ana ekranda normal biligileri vermeye devam etmesi hata devam etsede buna her döngüde değil mesala 10-15 sn sonra tekra hata mesajını verip gene ana ekran verilerini göstermesini istiyorum hatta bu gecikmeyi başka hata mesajlarınada uygulamak için ortak bir gecikme döngüsü felan olurmu for next gibi. Yardımcı olabilirmisiniz şimdiden teşekkürler, selamlar.

Hattuşa

yapman gereken geciktirme yapacağın programda bir sayac çalıştırmak ve bu sayacın kaç dakika yada saniyeye tekabul ettiği anda sayacı sıfırlayarak istediğin işlemi ekrana bastırmaktır.
örneğin;
gaz durumunu ölçtüğün bir alt programın var,  sayac adı altındaki bir degişkenini bu alt programda saydırırsın.

inc sayac
if sayac =10000 then
sayac =0
gosub ekrana yaz
endif


gibi.....

fatihbaysu

Sevgili Pro-TR,

Hızlı cevabınız için çok teşekkürler fakat kızmayın henüz yeniyim ve yeterince anlayamadım. Ben ana ekran için bir döngüyle bazı verileri okuyup akü voltajı, devir, ısı vs bu arada bazı veriler kontrol aralıkları belirledim örneğin okuduğu voltaj değeri 10 voltun altına düştüğünde tanımladığım gibi voltajı kontrol edip değerin sınırın altında olduğu için hata mesajını verdiğim satıra dallanıp kaldığı yerden devam etmekte buda tüm döngünün hızına orantılı olarak ekran devamlı değişmekte delayms ile gecikme veriyorum buda işlemi yavaşlatmakta istediğim bir kere hata satına gitmesi hata devam etse de hata satırına mesela 30sn sonra gitmesi sizin örneği nerede kullanmam gerekir. Selamlar.

ete

Programda bir sorun var gibi geliyor bana. SKONTROL alt programına bir yerden GSUB ile gelmişsin bu belli altta Return var çünki.
Ama bu alt programdan başka yerlere Goto ile gidiyorsun ve oralarda ipin ucu kaçıyor. Bu programın mutlak surette stack hatası vermesi kuvvetle muhtemel.Bir noktada kilitlenir. İç içe geçmiş 4 tane Gosub saydım 1 tane daha olsa stack taşma yapar. Belkide var programın gerisini görmeyince anlaşılmıyor.

Bu zincirleme reaksiyon tekniği ile program yazmak pek akıllıca değil. Bir şey yapıyorsun bir yere bak diye yolluyorsun. Oradan başka yere oradan başka yere sürekli program atlama yapıyor. Bu hiç iyi değil kontrolü kaybedersiniz ve sonunda stack hatası verir program. Bazen bu hatayı farketmezsiniz işlemci stackta kalan bir adrese rastgele gider. Buda program akışını engellemez ama bir noktada kilitlenir mutlaka. Program daima bir merkezden yönetilmeli. Bu merkez BASLA satırı ile Goto BASLA satırı arasındaki program parçasıdır. Bir alt pograma gidiliyor ise oradan başka bir alt programa zorunlu olmadıkça gidilmemelidir. Hele hele ikincisine hiç gidilmemelidir. Çok gerekiyor ise flag kullanıp dönüşte gideceği yer yollanmalı ama nereden Merkezden bu yollama işi yapılmalıdır. Bu dediğim şekilde çalışan bir program yazsa idin istediğin zamanlamayıda yapmak çok kolay olacak idi. Zira BASLA-GOTO BASLA arasında gidip gelen programda ZAMAN isimli bir sayacı saydıracaktın. Sana ne lazım 15 sn. 15 sn 15000 ms eder. demekki 1ms gecikme koyup 15000'e kadar saydırırsan sonuta 15 sn lik süreye ulaşabilirsin. Bu aşamadan sonra kime ne istiyorsan yaptırabilirsin. Ama nerede merkezde tabiiki.
Merkez dıiında iişin kontrolünü yapmak çok zor. Bu hali ile birde zamanlamalar koyarsan içinden çıkılmaz hal alacaktır program.

Ete

fatihbaysu

Sayın ETE hocam,

Aydınlatıcı bu cevabınız için çok teşekkür ederim programın bir parçasını gönderdim karmaşa olmasın diye ama siz görmediğiniz kısımlardaki hatalarımı bile yakaladınız, tekrar sizin dediğiniz şekilde yazmaya çalışacağım. İsterseniz tamamınıda gönderebilirim ama sizi fazlaca meşgul etmeyeyim, iyi günler dilerim. Selamlar,

Fatih Bayşu

est32

merhaba,
bahsettiğiniz cihaz için en doğru ve kararlı çalışan yöntem timer kesmesi yöntemi olduğunu düşünüyorum.
Timer kesmesi ile kesme bölümüne birkaç milisaniye aralıkla gidersiniz, bunları bir sayaca yerleştirdiğinizde saniyeye ulaşır, bunları da saydığınızda dakikalar,saatler diye artarak gider.
örneğin birkaç tane değişken kesme etiketi altında her saniyede 1 artsın. buna göre ana programda yönlendirme yapmanız lazım.

IF TUP_SAY>9 THEN GOTO TUP_KONTROL' 10. saniyede Tüp kontrol etiketine git (orada da değişken sıfırlanmalı tup_say=0 şeklinde)
IF SICAKLIK>4 THEN GOTO ISI_KONTROL' 5. saniyede ısı kontrol etiketine
IF XXX>YYY THEN GOTO ZZZZ

=(eşittir) ifadesi ile de olur ancak program bir yerde/etikette uzun süre takılır kalırsa o sayı atlanabilir, bu durumda işlem asla o satıra gelmez, bu nedenle en sağlıklısı >(büyük/küçük) işaretidir diye düşünüyorum.
En iyisi yarın müsait olursam bununla ilgili birkaç çalışmam olmuştu, ona göre size örnek kod vereyim.

fatihbaysu

Sayın est32,

İlginiz için çok teşekkür ederim, yarın göndereceğim dediğiniz örnekler de sanırım faydalı olacaktır. Siz, diğer arkadaşlar ve sayın ETE hocanın önerileri doğrultusunda yeni baştan yazacağım umarım sizlerinde desteğiyle daha da güzel olur. Bu tarz projeler yapıp bilgimi artırmak istediğimden gazlı aracıma ekranlı kontrol sistemi yaptım birde etrafımdaki eş dost ve arkadaşlarıma da verdiğim oldu onlardan dönüşlerle ve kendi gözlemlerimle geliştirmeye çalışmaktayım. Katkıda bulunan herkeze çok teşekkür ederim. Selam ve saygılarımla.

Fatih Bayşu

fatihbaysu

Sayın ETE Hocam,


Öneriniz üzere yamalı bohçaya dönmüş kodumu BASLA GOTO BASLA arasında yazdım Gosub kalmadı henüz deneme şansım olmadı ama est32 arkadaşımızında önerisinden yararlandım hata olduğunda bir sayaç ile ana gövdede saydırıp arada bir uğrar hale getirdim başlangıçta ise sayaç = 8 dedim if sayac >9 goto Aku_hata burada da sayacı sıfırladım ilk hata da bir uyarı ekranı verip sayacı 0 layıp sonrakilerde 10sn sonra verecek şekilde yazdım ISIS için 16F1826 yok diye bir test tasarlamadım canlı sistemi direk programlama cihazım PicKit2 ye takıp sistem çalışırken yapıp deniyorum akşam deneyip size dönerim. Yardımlarınız için size ve formdaki tüm arkadaşlara çok teşekkür ederim. Saygı ve selamlarımla.

Fatih Bayşu

est32

tekrar merhaba,
timer0 kesmesi ile uyduruk bir program karalayıverdim. ekranda yazanlara aldanmayın, programın birşey yaptığı yok sadece geri sayım yapıyor ve bu sayım sonuçlarına göre menüler arasında geziniyor. arada saniyeler kesişiyor program ana ekrana döndüğü gibi başka bir menüye atlıyor. buna takılmayın bu nedenle de kusur aramayın(var zaten) maksat programın işleyişini anlatmaktı. programı kendine göre derlemek isteyen daha dikkatli bir şekilde buna özen gösterecektir. anlaşılmayan yer olursa vakit geçirmeden sorun, unutkan biri olarak ileride işleyişi hatırlamakta güçlük çeker zorlanırım.
kolay gelsin,
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [ESAT METİN ERDOĞAN]                              *
'*  Notice  : Copyright (c) 2015 [İZİNSİZ KULLANMAK HARAMDIR]   *
'*          : All Rights Reserved                               *
'*  Date    : 27.06.2015                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device =16F628A
Xtal=4
Config BOREN_OFF, CP_ON, DATA_CP_ON, PWRTE_ON, WDT_OFF, LVP_OFF, MCLRE_ON, INTRC_OSC_NOCLKOUT
CMCON=7'KOMPARATÖR KAPALI
INTCON=%10100100'HARİCİ KESME YOK SADECE TİMER0 KESMESİ AKTİF
OPTION_REG=%00000111'PULL UPLAR DEVREDE
'**************************************************************************************
Dim TMR0_SAY As Byte,BENZIN As Byte,TUP As Byte,ISI As Byte

Symbol LED=PORTA.3

'**************************************************************************************
Declare LCD_DTPin PORTB.4
Declare LCD_ENPin PORTA.6
Declare LCD_RSPin PORTA.7
Declare LCD_Interface 4
Declare LCD_Lines 2
On Interrupt GoTo KESME
'***********Özel Karakter Tanımlamaları************************************************
'Print $FE,$40, 6, 9, 9, 6, 0, 0, 0, 0 'Derece İşareti
'Print $FE,$48, 4, 14, 4, 4, 4, 4,14,0 'İ Harfi
'Print $FE,$50, 14, 17, 16, 16,16,17,14,4 'Ç Harfi
'Print $FE,$58, 14, 17, 16, 14,1, 17,14,4 'Ş Harfi
'Print $FE,$60,10,0,14,17,17,17,14,0'Ö harfi
'Print $FE,$68,10,0,17,17,17,17,14,0'0.KARAKTER Ü HARFİ
'Print $FE,$70,14,0,14,16,23,17,14,0'1. KARAKTER HAFIZASI Ğ HARFİ
'***********Port Ayarları**************************************************************
TRISA=0
TRISB=%00000111
PORTA=0
PORTB=0
DelayMS 500
BENZIN=60:TUP=30:ISI=10
'***********************BAŞLANGIÇ*****************************************************
BASLA:
Print At 1,1,"SAYACLAR  BNZ:",Dec2 BENZIN
Print At 2,1,"TUP:",Dec2 TUP,"    ISI:",Dec2 ISI
    If BENZIN=0 Then Cls:BENZIN=5:GoTo BENZIN_KONTROL'DAKİKADA 1 KEZ BENZİN KONTROL ET,EKRANI 5 SANİYE GÖSTER
    If TUP=0 Then Cls:TUP=3:GoTo TUP_KONTROL'30 SANİYEDE 1 KEZ TÜP KONTROL,EKRANI 3 SANİYE GÖSTER
    If ISI=0 Then Cls:ISI=3:GoTo ISI_KONTROL'HER 10 SANİYEDE 1 KEZ ISI KONTROL


GoTo BASLA
'**********************************BENZİN**********************************************
BENZIN_KONTROL:'BURADAKİ İŞLEMLER YAPILIR
    Print At 1,1,"BENZIN KONTROL"
    Print At 2,1,"EDILIYOR  Bnz:",Dec2 BENZIN
    If BENZIN=0 Then Cls:BENZIN=60:GoTo BASLA'5 SANİYE BURADA KAL

GoTo BENZIN_KONTROL
'************************************TÜP***********************************************
TUP_KONTROL:
    Print At 1,1,"TUP KONTROL"
    Print At 2,1,"EDILIYOR  TUP:",Dec2 TUP
    If TUP=0 Then Cls:TUP=30:GoTo BASLA'3 SANİYE BURADA KAL
   
GoTo TUP_KONTROL
'************************************ISI***********************************************
ISI_KONTROL:
    Print At 1,1,"ISI KONTROL"
    Print At 2,1,"EDILIYOR  ISI:",Dec2 ISI
    If ISI=0 Then ISI=10:Cls:GoTo BASLA
   
GoTo ISI_KONTROL
'*********************************KESME************************************************
Disable
KESME:
       
        TMR0_SAY=TMR0_SAY+1'her 50 milisaniyede bir kesme
        If TMR0_SAY<20 Then ERKEN_CIK'20. kesme 1 saniye yapar, 1 saniye olmamışsa işlemleri atla
'...................................1 SANİYE...........................................
        TMR0_SAY=0'1 saniye dolmuşsa sayacı sıfırla
        Toggle LED'saniyede 1 kez yan sön
       
        BENZIN=BENZIN-1'SAYAÇLARI AZALT
        TUP=TUP-1
        ISI=ISI-1
        If BENZIN>60 Then BENZIN=0' SAYAÇ 0 İKEN EKSİLTME OLURSA SAYAÇ 255 OLUR, BUNU ENGELLE
        If TUP>30 Then TUP=0
        If ISI>10 Then ISI=0



ERKEN_CIK:'1 saniye dolmamışsa aradaki işlemleri atla ve çık
        INTCON.2=0'kesme bayrağını sıfırla
        TMR0=61'timer0 önyükleme değeri 61
Resume
Enable
'**************************************************************************************
End

Powered by EzPortal