16F877A ve 16F628A UART haberleşme sırasında zaman sorunu

Başlatan dcelektronik, 05 Haziran 2018, 09:58:57

dcelektronik

Arkadaşlar merhaba ben Doğan, pompalar ve basınç sensörleri ile birlikte çalışan bir sistem kurmak istiyorum. Sistem 16F877A üzerinde çalışıyor ancak 16F628A üzerinden uzaktan kumanda etmek ve değerleri ikinci bir displayde okumak istediğim zaman 16F877A üzerindeki zamanlamalar bozuluyor. Örneğin haberleşme yapmadan önce 290 saniyeyi 1'er 1'er geri sayarken haberleşmeden sonra her 4 saniyede 1 saniye geri sayıyor. Epey uğraştım ama sorunun çözümünü bir türlü bulamadım yardımlarınız için şimdiden teşekkür ederim.

ALICI

Device  16F628A
@ CONFIG_REQ
@ __config CP_OFF & DATA_CP_OFF & WDT_OFF & HS_OSC & MCLRE_OFF & LVP_OFF & BODEN_OFF & PWRTE_OFF


;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------
   
    Declare Xtal = 20
    Declare All_Digital true
    On_Hardware_Interrupt GoTo AL
                                                               
       CMCON=7
       OPTION_REG.7=0
       PORTA=0
       TRISA=%10000000
       PORTB=0
       TRISB=%00111110
         Symbol  GIE  =INTCON.7  'global intrrupt enable bit
        Symbol  PEIE =INTCON.6  'peripheral intrrupt enabe bit
        Symbol  RCIE =PIE1.5   
        Symbol  RCIF =PIR1.5
        Symbol dur PORTB.5
        Symbol basla1 PORTB.4
        Symbol Tx PORTB.7
       
         GIE=0
          RCIE=1
          PEIE=1
          GIE=1
     
        Declare LCD_DTPin PORTA.0
        Declare LCD_ENPin PORTB.3
        Declare LCD_RSPin PORTA.4
        Declare LCD_Interface 4
        Declare LCD_Lines 2
        'Declare LCD_RWPin PORTA.7       
        Declare LCD_Type 0
       
   
Declare Hserial_RCSTA =%10010000; 90h Enable continuous receive
Declare Hserial_TXSTA =%00100000; 20h Enable transmit, BRGH = 1                               
Declare Hserial_Baud = 9600 ; 4 Mhz, %0,16  ; Baud Rate Generator Value
Declare Hserial_Clear = On  ; Clear overflow automatically
Declare Hserial_SPBRG = 129

       
        Dim YBAS As Word
        Dim ABAS As Word
        Dim ISI As Word
        Dim TUZ  As  Word
        Dim W As Word
       
        Dim calis As Byte
        Dim temp As Byte
        Dim dur1 As Byte
        Dim ONDA As Word
        Dim DURDUR As Byte
        Dim CALISTIR As Byte
        Dim Mod As Byte
       
         
         
       
       
     
        Cls      'lcd ekranı temizlendi.
        DelayMS 100   'ekranın açılması için gerekli zaman.
        temp=RCREG
        Tx = 0
       
       
        calis=0
       
        Print At 2,5, "SYS READY "
        GoTo tus
       
      ' Disable 
AL:     
         Context Save
         Tx=0
         
         calis = 0
         dur1 = 0
         TUZ = 0
         YBAS = 0
         ABAS = 0
         ONDA = 0
         Mod = 0
         GIE=0       
           
       'HSerIn 10,cik, [Wait ("DCM"),logo,calis,dur1,TUZ,YBAS,ISI,ABAS.Byte0,ABAS.Byte1,ABAS.Byte2,ABAS.Byte3]
     
       HSerIn  15,cik, [Wait ("DCM"),calis,dur1,TUZ,YBAS,ISI,ABAS,ONDA,Mod]
     
     
cik:
     
       
        temp=RCREG 
        GIE=1
        Context Restore 
       ' Resume
        'Enable   
         

       
         
'---------------------------------------------------------------------------------- 


           
tus:     
           
           If calis = 11 Then
           Cls
            GoTo  basla
            EndIf
           If dur1 = 88 Then GoTo stp
           If Mod = 1 Then GoTo mod1   'LP Pomp
           If Mod = 2 Then GoTo mod2   'FLUSH
           If Mod = 3 Then GoTo mod3    'Alçak basınç
           If Mod = 4 Then GoTo mod4     'Geri yıkama
           If Mod = 5 Then GoTo mod5     ' preparing
           'if mod = 6 then goto mod6
           'if mod=7 then goto basla
           'if mod=8 then goto stp
          If basla1=0 Then
           CALISTIR = 55
            DURDUR = 0
             GoSub ver2
               
             Else       
          If dur=0 Then DURDUR = 66 : CALISTIR = 0 : GoSub ver2  ': GoTo stp
          EndIf         
           GoTo tus


       
stp:       
        Cls
       
     
        Print At 2,5, " HAZIR "
         dur1=0
         calis=0
   
        GoTo tus

        '--------------------------------------------------------------------------------       

basla:
         
         'Cls
       ' For W = 1 To 9000
       'Next
     
       Print At 1,8,"LP=",Dec1 ABAS,".",Dec ONDA    ',",",Dec1 ABAS1 'bunlar rakamsal ifadeler olduğu için desimal gösterge formatında verilmeli.
      'DelayUS 100
       Print At 1,1,"HP=",Dec2 YBAS       
       'DelayUS 100
       Print At 2,1,"C=",Dec2 ISI
      ' DelayUS 100
       Print At 2,8,"TUZ=",Dec4 TUZ 
           
         If dur1 = 88 Then
         calis =0
         GoTo mod6
         Else
         If dur = 0 Then DURDUR = 66:CALISTIR = 0:GoSub ver2 :GoTo stp
         EndIf
       GoTo basla

       
ver2:
      Tx = 1
       HSerOut [Rep $AA\5,Rep $00\5,Rep $ff\5] 'uyandırma işareti yolla
     
       HSerOut ["DCM",DURDUR,CALISTIR,13,10]
       Tx = 0
       Return                   
               
mod1:
       Cls
lp:    Print At 2,1,"LP PUMP WORKING"
       If Mod = 8 Then
       Mod = 0
       Cls
       GoTo stp
       Else
       GoTo lp
       EndIf
       
mod2:
       Cls
ft:    Print At 2,1,"FLUSH TIME"
       If Mod = 8 Then
       Cls
       GoTo stp
       Else
       GoTo ft
       EndIf
       
mod3:
       Cls
ab:    Print At 2,1,"AB PUMP CALISTI"
       If Mod = 8 Then
       Cls
       GoTo stp
       Else
       GoTo ab
       EndIf
       
mod4: 
       Cls
gy:    Print At 2,1,"GERI YIKAMA "
       If Mod = 8 Then
       Cls
       GoTo stp
       Else
       GoTo gy
       EndIf                                           

mod5:
      Cls
pr:   Print At 2,1,"PREPARING"
      If Mod = 7 Then
      Cls
      GoTo basla
      Else 
      GoTo pr
      EndIf
mod6:
     
        Cls
atla1: Print At 2,1,"DURDURULDU"
       If Mod = 4 Then
       Cls
       GoTo mod4
       EndIf
       GoTo atla1
     
                 
        End




VERİCİ

Device 16F877A

@ CONFIG_REQ
@ __config CP_ALL & CPD_ON & WDT_OFF &HS_OSC & PWRTE_ON & BODEN_OFF & WRT_1FOURTH & LVP_OFF & DEBUG_OFF
Xtal 20
On_Hardware_Interrupt GoTo AL

'On_Hardware_Interrupt GoTo AL


CMCON=7
TRISA=%00011111
TRISB=%00000001
TRISC=%11001111
TRISD=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
OPTION_REG = %10000111
INTCON=%10110000



Declare Hserial_RCSTA =%10010000; 90h Enable continuous receive
Declare Hserial_TXSTA =%00100000; 20h Enable transmit, BRGH = 1                               
Declare Hserial_Baud = 9600 ; 4 Mhz, %0,16  ; Baud Rate Generator Value
Declare Hserial_Clear = On  ; Clear overflow automatically
Declare Hserial_SPBRG = 129

Declare LCD_DTPin PORTB.4
Declare LCD_ENPin PORTB.3
Declare LCD_RSPin PORTB.1
Declare LCD_Interface 4
Declare LCD_Lines 4
Declare LCD_RWPin PORTB.2
Declare LCD_Type 0
Declare LCD_CommandUs = 2000
Declare LCD_DataUs = 50

Declare Adin_Res = 10
Declare Adin_Tad = FRC
Declare Adin_Stime = 900'100
'Declare adin_clock =2
#define adc_clock 2
ADCON1=%10000010 '7. bit 1 yapıldı 10 bit sonuç almak için.

'Dim HAM As  Word  'ADC den okunan ham Digital değer.                                                                       
Dim TUZ As Word '16 bit değişken tipi seçtik kullanacağımız değer 10 bit olacak.
Dim I As Byte
Dim TOPLAM As Word
Dim TOPLAM1 As Word
Dim TOPLAM2 As Word
Dim TOPLAM3 As Word
Dim TOPLAM4 As Word
Dim ONDA As Word
Dim HAM  As Word  'tuzluluk
Dim HAM1 As Word  'yüksek basınç
Dim HAM2 As Word  'alçak basınç
Dim HAM3 As Word  'Sıcaklık
Dim HAM4 As Word  ' l/m
Dim YBAS As Word
Dim ABAS As Word
Dim ISI As Word
Dim SU  As  Word
Dim temp As Byte
Dim DURDUR As Byte
Dim CALISTIR As Byte
Dim calis As Byte
Dim dur1 As Byte
Dim BEKLE As Byte
Dim sayac As Byte
Dim lisan As Byte
Dim okuC As Byte
Dim saat As Dword
Dim dakika As Byte
Dim saniye As Byte
Dim adress As Byte
Dim saya As Byte
Dim t As Bit
Dim yb As Bit
Dim sn1 As Word
Dim YAZ As Byte

Symbol start PORTC.0
Symbol stp PORTC.1
Symbol F1 PORTC.2
Symbol F2 PORTC.3
Symbol RL1 PORTD.0   'alçakbasınç pompası
Symbol RL2 PORTD.1   'YÜKSEK BASINÇ POMPASI
Symbol RL3 PORTD.2   'YÜKSEKBASINÇ VANASI
Symbol RL4 PORTD.3    'TANK SELONOIDI
Symbol RL5 PORTD.4    'GERI YIKAMA
Symbol Tx PORTD.5      'RS485
Symbol GIE = INTCON.7 ' Global Interrupt Enable bit
Symbol PEIE = INTCON.6 ' \
Symbol RCIE = PIE1.5
Symbol RCIF = PIR1.5
Symbol GO = ADCON0.2
Symbol ADON =ADCON0.0                     

DelayMS 100

GIE=0
RCIE=1
PEIE=1
GIE=1
Tx = 0



Low PORTD.5
Low PORTB.2 ' LCD R/W line Low (W), şemada direkt GND ye bağlanabilir.
Cls ' LCD de CLS yapar
DelayMS 100    ' LCD nin açılması için gerekli süredir.
PORTD=0
calis = 0
adress = 8



     DURDUR = 0
     calis=11
     temp=RCREG
     Low RL3
     'GIE=0
   
     Print At 3,1, "SYS BASLATILDI"
 
     DelayMS 1500
   
     sayac = ERead 1
     If sayac = 255 Then
     saat = 0
     sayac = 0
     EWrite 8 , [saat]
     EWrite 1 , [sayac]               
      Else
      saat = ERead 8     
      EndIf         
       BEKLE = ERead 2
     
      saniye = ERead 3
     
      dakika = ERead 4
     
       saat = ERead 8
       Cls
       GoTo hazir_bekleme
AL:
        Context Save
        GIE=0
       If INTCON.1=1 Then
       INTCON.1=0
     
       DURDUR = 66
     
      GoTo cik
      EndIf

       
       If INTCON.2=1 Then
       
      BEKLE = bekle+1
      If BEKLE = 74 Then
      BEKLE = 0
      saniye = saniye+ 1
      sn1 = sn1 - 1
      If saniye =60 Then
      saniye=0
      dakika = dakika+1 
      If dakika = 60 Then
      dakika =0
      saat= saat+1
       EndIf
       EndIf
       EndIf
       INTCON.2=0
       GoTo cik
       EndIf
         
       HSerIn  8,cik, [Wait ("DCM"),DURDUR,CALISTIR]
       temp = RCREG
       
cik:       
        GIE=1
     
         Context Restore
   
     
   
   
hazir_bekleme:

Print At 3,8, "HAZIR"
PORTD = 0

    If start = 0 Then
    Cls
    High RL1 
    Print At 3,5, "HAZIRLANIYOR"
    DelayMS 1000
    Cls
    GoTo calisma_ekrani
    EndIf
    If F2 = 0 Then
    Cls
    GoTo geri_yikama
    EndIf
    If F1 = 0 Then
    Cls
    GoTo hava_alma
    EndIf
    GoTo hazir_bekleme
   
   
   
calisma_ekrani:

High RL2
High RL3
GoSub OKU

Print At 2,1,"HP:",Dec2 YBAS
Print At 2,11,"TUZ:",Dec4 TUZ
Print At 3,1,"LP:",Dec1 ABAS,".",Dec ONDA
Print At 3,11,"w/H:",Dec5 saat

calis = 11
dur1 = 0
GoSub gonder
If TUZ < 900 Then
Low RL4
Else
High RL4
EndIf
If stp = 0 Then
PORTD = 0
Cls
Print At 3,6,"DURDURULDU"
dur1 = 88
calis = 0
YAZ = 0
GoSub gonder
DelayMS 1000
GoTo geri_yikama
EndIf
If YBAS > 65 Then
PORTD = 0
Cls
Print At 3,5,"HP HATASI"
DelayMS 3000
Cls
GoTo hazir_bekleme
EndIf
If ABAS > 0 Then GoTo calisma_ekrani
If ONDA < 5 Then
PORTD = 0
Cls
Print At 3,5,"LP HATASI"
DelayMS 3000
Cls
GoTo hazir_bekleme
EndIf

hava_alma:

High RL1
Print At 3,2, "LP POMPA CALISIYOR"
If stp = 0 Then
Low RL1
Cls
GoTo hazir_bekleme
Else
GoTo hava_alma
EndIf


geri_yikama:

            PORTD = 0
            sn1 = 290
gy:
            dur1 = 0
            calis = 0
            YAZ = 4
            GoSub gonder
            Print At 3,4,"GERI YIKAMA:",Dec3 sn1
            If sn1 > 280 Then
            GoTo gy
            EndIf
            High RL5
           
            If sn1 = 0 Then
            Low RL5
            YAZ = 8
            dur1 = 0
            calis = 0
            GoSub gonder
            Cls
            GoTo hazir_bekleme
            EndIf
            GoTo gy
           
     
     '---------TUZLULUK OKUMA ----------------
OKU:
             
      TOPLAM=0
     
        For I=1 To 10       
        HAM = ADIn 0     
        TOPLAM = TOPLAM + HAM
  Next I
  HAM = TOPLAM / 10       
      TUZ = HAM *19 / 10
   
     
       
   '---------Yuksek Basınc Okuma------------
     
     TOPLAM1 = 0
    For I = 1 To 10
      HAM1 = ADIn 2
 
      TOPLAM1 = TOPLAM1 + HAM1
    Next I
    HAM1 = TOPLAM1 / 10
    YBAS = (HAM1 * 9) / 100
     
 
    '--------Alcak Basınc Okuma-----------
   
    TOPLAM2 = 0
    For I = 1 To 10 
      HAM2 = ADIn 1     
      TOPLAM2 = TOPLAM2 + HAM2
    Next I
    HAM2 = TOPLAM2 / 10
    ABAS = (HAM2 * 59 ) / 10000
    TOPLAM2 = TOPLAM2 + HAM2
    ONDA = TOPLAM2 // 10000
    ONDA =  ONDA / 1000
   
    Return   
   
     
     

 
   dur1=0
   calis=0
   DURDUR = 0
   GIE=0
      EWrite 2, [BEKLE]
    DelayMS 100
     BEKLE = ERead 2
     
     EWrite 3 , [saniye]
     DelayMS 100
     saniye = ERead 3
   
    EWrite 4 , [dakika]
    DelayMS 100
     dakika = ERead 4
     
     EWrite 8 , [saat]
     DelayMS 100
     saat = ERead 8     
     GIE = 1
   



gonder:

Tx = 1

HSerOut [Rep $AA\5,Rep $00\5,Rep $FF\5]


HSerOut ["DCM",calis,dur1,TUZ,YBAS,ISI,ABAS,ONDA,YAZ,13,10]

Tx = 0

Return
    End






ete

Bu saydırma işi 16F877A da TMR0 kesmesi aracılığı ile yapılıyor ise verdiğin ayarlarak birlikte bakmakta fayda var.OPTION registerde bölme ayarını 1/256 vermişsin. (%10000111 sondaki 111=1/256 demek)Bunabağlı olarak bir hesap yapalım,Pic 4 mhzde 256x256=her 65536 ms de bir kesme oluşacak. Bekle=74 olduğunda ise 74 adet kesme geçmiş olacak buda 74*65536=4.849.664 ms sonra senin saniye değerin 1 artmış oluyor. Yani 4.850 sn yada(4850/60) 80 dakika sonra artmış olacak. Sence bu hesapta bir yanlışlık yokmu?Başlangıçta doğru sayıp sonradan yanlış sayması neredeyse imkansız. başından sonuna yanlış zaman sayar bu kodlar.Düzgün saat saydırmak istiyor isen,
OPTION_REG=%10000101vermelisin. Bu 1/64 bölme oranına tekabül eder. Buna göre hesap şöyle olur;64x256=16384 ms de bir kesme oluşur. 1.000.000/16.384=61 kesme sonunda yaklaşık 1 sn geçmiş olur.O halde sen kesme içindeki;BEKLE = bekle+1
      If BEKLE = 74 Thensatırlarındaki 74 rakamı yerine 61 hatta komut gecikmelerinide dikkate alarak 60 vermen gerekir.Bu değişiklikleri yapıp yeniden dene istersen.Bu arada zaman sayımını nasıl görüp izliyorsun onuda açıkla lütfen.
Bu arada devrendeki kristal frekanslarınıda burada belirtmende yarar var. Bu sistem 4 Mhz e göre planlanmış gözüküyor.  16F628 de kristal takılı gözüküyor (XT_OSC) kaç Mhz olduğunu belirt. 16F877A da zaten kristal ile çalışır onuda belirt devrende kaç Mhz kristal var.
Ete

dcelektronik

Xtal frekanso 20Mhz son denemede dahili osc ile denemiştim.Onu düzeltmeyi unutmuşum.Stp tusuna basıldığında ektrana DURDURULDU yazdıktan sonra geri_yıkama:  eteketine dallanıyor orada geri sayma işiemini yapıyor.

ete

Programda xtal=4 yazıyor bu bir. İkincisi 20Mhz kristal kullanırsan XT_OSC kullanamazsın onun yerine HS_OSC kullanman gerekir.

20 Mhz üzerinden TMR0 kesme hesabı yapalım bu sefer;20 Mhzde bir komut çevrimi 20/4=5 ve 1/5=0,2 us dir. Bu durumda senin kesme süren,256*256*0,2=13.107 us olacaktır. Bu ise yaklaşık 13 ms demektir. hr 74 kesmede bir saniye bir arttığı için,74 x 13=962 ms de bir saniye artacaktır. Bu durumda komut gecikmeleri ile bilirikte bu 1000 ms gibi kabul edilebilir. Burası tamam. Ancak sigorta ayarların ve Xtal=4 komut satırın nedeni ile sistemin doğru çalışmayacaktır.XT_OSC yerine HS_OSC yaz ve Xtal=20 olarak değiştir ve tekrar dene bakalım.
Ete

dcelektronik

Dediğiniz gibi yaptım OSC HS moduna aldım.Xtal 20Mhz olarak düzelttlm.Stp tusuna bastıktan sonra ekrana DURDURULDU yazısı çıkıyor normalde 1 ile 1,5 sn bekledikten sonra geri sayma işlemini baslatıyor gerisayma yaklasık 3-4sn de bir atıyor normalde her 1 sn bir eksiltmesi lazım.Nekadar ilgisi var bilemiyorum ama seri iletisimi kaldırdığımda geri sayma düzeliyor.

ete

Programın son halini koy yeniden bakalımNormalde seri iletimin gecikme yaratmaması gerekiyor ama bağlantılar nasıl bilemiyorum. Şayet hatta parazit varise sürekli o kesmeye girer program ve elbette gecikme yaratır.
Normal şartlarda veri yok ise USART kesmesi oluşmaz ama alan veren olarak yeniden inceelemek gerek. Şayet sürekli veri yolluyorsan bu gecikme yaratabilirProton bilen birisi kesme komut satırlarını bir incelesin. Etiket öncesi Disable olması gerek diye bikliyorum ama sen yine onu kaldırmışsın. Çıkışta da Resume Enable olması gerekir ama protonda ne olması gerekiyor bilmiyorum.Yalnızca Context Restore satırı programı geriye döndürebiliyormu merak ediyorum doğrusu. Çünki o satırı işleyip program otomatikkesmeden çıkmıyor ise alt satırlara devam ediyordur. Orada da "hazir_bekleme:" etiketi ve altındakiler yer alıyor.
Ete


dcelektronik

programın son halini düzeltim.ON_HARDWARE_INTERRUPT komutu PROTONDA interrrup geldiğinde etekete yönlendiriyor Context save girişte çıkıştada Context restore ile işlemi yapıyor (Dısable ve Resume,Enable yerine geçiyor) diye biliyorum.Gödermede bir hata olusmuyor bilgi diğer tarafa gidiyor.similasyonda ve realde sorunyok.Sorun sadece zamanda geri sayma ve DelayMs de zamanlar uzuyor.
ANA KAART  '****************************************************************
'*  Name    :                                   *
'*  Author  : Dogan Akdog                                       *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 05.03.2018                                        *
'*  Version : 1.0.1.182                                         *
'*  Notes   : saat ilavesi                                               *
'*          :                                                   *
'****************************************************************
Device 16F877A

@ CONFIG_REQ
@ __config CP_ALL & CPD_ON & WDT_OFF &HS_OSC & PWRTE_ON & BODEN_OFF & WRT_1FOURTH & LVP_OFF & DEBUG_OFF
Xtal 20
On_Hardware_Interrupt GoTo AL

'On_Hardware_Interrupt GoTo AL


CMCON=7
TRISA=%00011111
TRISB=%00000001
TRISC=%11001111
TRISD=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0
OPTION_REG = %10000111
INTCON=%10110000



Declare Hserial_RCSTA =%10010000; 90h Enable continuous receive
Declare Hserial_TXSTA =%00100000; 20h Enable transmit, BRGH = 1                               
Declare Hserial_Baud = 9600 ; 4 Mhz, %0,16  ; Baud Rate Generator Value
Declare Hserial_Clear = On  ; Clear overflow automatically
Declare Hserial_SPBRG = 129

Declare LCD_DTPin PORTB.4
Declare LCD_ENPin PORTB.3
Declare LCD_RSPin PORTB.1
Declare LCD_Interface 4
Declare LCD_Lines 4
Declare LCD_RWPin PORTB.2
Declare LCD_Type 0
Declare LCD_CommandUs = 2000
Declare LCD_DataUs = 50

Declare Adin_Res = 10
Declare Adin_Tad = FRC
Declare Adin_Stime = 900'100
'Declare adin_clock =2
#define adc_clock 2
ADCON1=%10000010 '7. bit 1 yapıldı 10 bit sonuç almak için.

'Dim HAM As  Word  'ADC den okunan ham Digital değer.                                                                       
Dim TUZ As Word '16 bit değişken tipi seçtik kullanacağımız değer 10 bit olacak.
Dim I As Byte
Dim TOPLAM As Word
Dim TOPLAM1 As Word
Dim TOPLAM2 As Word
Dim TOPLAM3 As Word
Dim TOPLAM4 As Word
Dim ONDA As Word
Dim HAM  As Word  'tuzluluk
Dim HAM1 As Word  'yüksek basınç
Dim HAM2 As Word  'alçak basınç
Dim HAM3 As Word  'Sıcaklık
Dim HAM4 As Word  ' l/m
Dim YBAS As Word
Dim ABAS As Word
Dim ISI As Word
Dim SU  As  Word
Dim temp As Byte
Dim DURDUR As Byte
Dim CALISTIR As Byte
Dim calis As Byte
Dim dur1 As Byte
Dim BEKLE As Byte
Dim sayac As Byte
Dim lisan As Byte
Dim okuC As Byte
Dim saat As Dword
Dim dakika As Byte
Dim saniye As Byte
Dim adress As Byte
Dim saya As Byte
Dim t As Bit
Dim yb As Bit
Dim sn1 As Word
Dim YAZ As Byte

Symbol start PORTC.0
Symbol stp PORTC.1
Symbol F1 PORTC.2
Symbol F2 PORTC.3
Symbol RL1 PORTD.0   'alçakbasınç pompası
Symbol RL2 PORTD.1   'YÜKSEK BASINÇ POMPASI
Symbol RL3 PORTD.2   'YÜKSEKBASINÇ VANASI
Symbol RL4 PORTD.3    'TANK SELONOIDI
Symbol RL5 PORTD.4    'GERI YIKAMA
Symbol Tx PORTD.5      'RS485
Symbol GIE = INTCON.7 ' Global Interrupt Enable bit
Symbol PEIE = INTCON.6 ' \
Symbol RCIE = PIE1.5
Symbol RCIF = PIR1.5
Symbol GO = ADCON0.2
Symbol ADON =ADCON0.0                     

DelayMS 100

GIE=0
RCIE=1
PEIE=1
GIE=1
Tx = 0



Low PORTD.5
Low PORTB.2 ' LCD R/W line Low (W), şemada direkt GND ye bağlanabilir.
Cls ' LCD de CLS yapar
DelayMS 100    ' LCD nin açılması için gerekli süredir.
PORTD=0
calis = 0
adress = 8



     DURDUR = 0
     calis=11
     temp=RCREG
     Low RL3
     'GIE=0
   
     Print At 3,1, "SYS BASLATILDI"
 
     DelayMS 1500
   
     sayac = ERead 1
     If sayac = 255 Then
     saat = 0
     sayac = 0
     EWrite 8 , [saat]
     EWrite 1 , [sayac]               
      Else
      saat = ERead 8     
      EndIf         
       BEKLE = ERead 2
     
      saniye = ERead 3
     
      dakika = ERead 4
     
       saat = ERead 8
       Cls
       GoTo hazir_bekleme
AL:
        Context Save
        GIE=0
       If INTCON.1=1 Then
       INTCON.1=0
     
       DURDUR = 66
     
      GoTo cik
      EndIf

       
       If INTCON.2=1 Then
       
      BEKLE = bekle+1
      If BEKLE = 74 Then
      BEKLE = 0
      saniye = saniye+ 1
      sn1 = sn1 - 1
      If saniye =60 Then
      saniye=0
      dakika = dakika+1 
      If dakika = 60 Then
      dakika =0
      saat= saat+1
       EndIf
       EndIf
       EndIf
       INTCON.2=0
       GoTo cik
       EndIf
         
       HSerIn  8,cik, [Wait ("DCM"),DURDUR,CALISTIR]
       temp = RCREG
       
cik:       
        GIE=1
     
         Context Restore
   
     
   
   
hazir_bekleme:

Print At 3,8, "HAZIR"
PORTD = 0

    If start = 0 Then
    Cls
    High RL1 
    Print At 3,5, "HAZIRLANIYOR"
    DelayMS 1000
    Cls
    GoTo calisma_ekrani
    EndIf
    If F2 = 0 Then
    Cls
    GoTo geri_yikama
    EndIf
    If F1 = 0 Then
    Cls
    GoTo hava_alma
    EndIf
    GoTo hazir_bekleme
   
   
   
calisma_ekrani:

High RL2
High RL3
GoSub OKU

Print At 2,1,"HP:",Dec2 YBAS
Print At 2,11,"TUZ:",Dec4 TUZ
Print At 3,1,"LP:",Dec1 ABAS,".",Dec ONDA
Print At 3,11,"w/H:",Dec5 saat

calis = 11
dur1 = 0
GoSub gonder
If TUZ < 900 Then
Low RL4
Else
High RL4
EndIf
If stp = 0 Then
PORTD = 0
Cls
Print At 3,6,"DURDURULDU"
dur1 = 88
calis = 0
YAZ = 0
GoSub gonder
DelayMS 1000
GoTo geri_yikama
EndIf
If YBAS > 65 Then
PORTD = 0
Cls
Print At 3,5,"HP HATASI"
DelayMS 3000
Cls
GoTo hazir_bekleme
EndIf
If ABAS > 0 Then GoTo calisma_ekrani
If ONDA < 5 Then
PORTD = 0
Cls
Print At 3,5,"LP HATASI"
DelayMS 3000
Cls
GoTo hazir_bekleme
EndIf

hava_alma:

High RL1
Print At 3,2, "LP POMPA CALISIYOR"
If stp = 0 Then
Low RL1
Cls
GoTo hazir_bekleme
Else
GoTo hava_alma
EndIf


geri_yikama:

            PORTD = 0
            sn1 = 290
gy:
            dur1 = 0
            calis = 0
            YAZ = 4
            GoSub gonder
            Print At 3,4,"GERI YIKAMA:",Dec3 sn1
            If sn1 > 280 Then
            GoTo gy
            EndIf
            High RL5
           
            If sn1 = 0 Then
            Low RL5
            YAZ = 8
            dur1 = 0
            calis = 0
            GoSub gonder
            Cls
            GoTo hazir_bekleme
            EndIf
            GoTo gy
           
     
     '---------TUZLULUK OKUMA ----------------
OKU:
             
      TOPLAM=0
     
        For I=1 To 10       
        HAM = ADIn 0     
        TOPLAM = TOPLAM + HAM
  Next I
  HAM = TOPLAM / 10       
      TUZ = HAM *19 / 10
   
     
       
   '---------Yuksek Basınc Okuma------------
     
     TOPLAM1 = 0
    For I = 1 To 10
      HAM1 = ADIn 2
 
      TOPLAM1 = TOPLAM1 + HAM1
    Next I
    HAM1 = TOPLAM1 / 10
    YBAS = (HAM1 * 9) / 100
     
 
    '--------Alcak Basınc Okuma-----------
   
    TOPLAM2 = 0
    For I = 1 To 10 
      HAM2 = ADIn 1     
      TOPLAM2 = TOPLAM2 + HAM2
    Next I
    HAM2 = TOPLAM2 / 10
    ABAS = (HAM2 * 59 ) / 10000
    TOPLAM2 = TOPLAM2 + HAM2
    ONDA = TOPLAM2 // 10000
    ONDA =  ONDA / 1000
   
    Return   
   
     
     

 
   dur1=0
   calis=0
   DURDUR = 0
   GIE=0
      EWrite 2, [BEKLE]
    DelayMS 100
     BEKLE = ERead 2
     
     EWrite 3 , [saniye]
     DelayMS 100
     saniye = ERead 3
   
    EWrite 4 , [dakika]
    DelayMS 100
     dakika = ERead 4
     
     EWrite 8 , [saat]
     DelayMS 100
     saat = ERead 8     
     GIE = 1
   



gonder:

Tx = 1

HSerOut [Rep $AA\5,Rep $00\5,Rep $FF\5]


HSerOut ["DCM",calis,dur1,TUZ,YBAS,ISI,ABAS,ONDA,YAZ,13,10]

Tx = 0

Return
    End



ALICI
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 06.10.2016                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
;-------------------------------------------------------------------------------
;**** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings

Device  16F628A
@ CONFIG_REQ
@ __config CP_OFF & DATA_CP_OFF & WDT_OFF & HS_OSC & MCLRE_OFF & LVP_OFF & BODEN_OFF & PWRTE_OFF


;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------
   
    Declare Xtal = 20
    Declare All_Digital true
    On_Hardware_Interrupt GoTo AL
                                                               
       CMCON=7
       OPTION_REG.7=0
       PORTA=0
       TRISA=%10000000
       PORTB=0
       TRISB=%00111110
         Symbol  GIE  =INTCON.7  'global intrrupt enable bit
        Symbol  PEIE =INTCON.6  'peripheral intrrupt enabe bit
        Symbol  RCIE =PIE1.5   
        Symbol  RCIF =PIR1.5
        Symbol dur PORTB.5
        Symbol basla1 PORTB.4
        Symbol Tx PORTB.7
       
         GIE=0
          RCIE=1
          PEIE=1
          GIE=1
     
        Declare LCD_DTPin PORTA.0
        Declare LCD_ENPin PORTB.3
        Declare LCD_RSPin PORTA.4
        Declare LCD_Interface 4
        Declare LCD_Lines 2
        'Declare LCD_RWPin PORTA.7       
        Declare LCD_Type 0
       
   
Declare Hserial_RCSTA =%10010000; 90h Enable continuous receive
Declare Hserial_TXSTA =%00100000; 20h Enable transmit, BRGH = 1                               
Declare Hserial_Baud = 9600 ; 4 Mhz, %0,16  ; Baud Rate Generator Value
Declare Hserial_Clear = On  ; Clear overflow automatically
Declare Hserial_SPBRG = 129

       
        Dim YBAS As Word
        Dim ABAS As Word
        Dim ISI As Word
        Dim TUZ  As  Word
        Dim W As Word
       
        Dim calis As Byte
        Dim temp As Byte
        Dim dur1 As Byte
        Dim ONDA As Word
        Dim DURDUR As Byte
        Dim CALISTIR As Byte
        Dim Mod As Byte
       
         
         
       
       
     
        Cls      'lcd ekranı temizlendi.
        DelayMS 100   'ekranın açılması için gerekli zaman.
        temp=RCREG
        Tx = 0
       
       
        calis=0
       
        Print At 2,5, "SYS READY "
        GoTo tus
       
      ' Disable 
AL:     
         Context Save
         Tx=0
         
         calis = 0
         dur1 = 0
         TUZ = 0
         YBAS = 0
         ABAS = 0
         ONDA = 0
         Mod = 0
         GIE=0       
           
       'HSerIn 10,cik, [Wait ("DCM"),logo,calis,dur1,TUZ,YBAS,ISI,ABAS.Byte0,ABAS.Byte1,ABAS.Byte2,ABAS.Byte3]
     
       HSerIn  15,cik, [Wait ("DCM"),calis,dur1,TUZ,YBAS,ISI,ABAS,ONDA,Mod]
     
     
cik:
     
       
        temp=RCREG 
        GIE=1
        Context Restore 
       ' Resume
        'Enable   
         

       
         
'---------------------------------------------------------------------------------- 


           
tus:     
           
           If calis = 11 Then
           Cls
            GoTo  basla
            EndIf
           If dur1 = 88 Then GoTo stp
           If Mod = 1 Then GoTo mod1   'LP Pomp
           If Mod = 2 Then GoTo mod2   'FLUSH
           If Mod = 3 Then GoTo mod3    'Alçak basınç
           If Mod = 4 Then GoTo mod4     'Geri yıkama
           If Mod = 5 Then GoTo mod5     ' preparing
           'if mod = 6 then goto mod6
           'if mod=7 then goto basla
           'if mod=8 then goto stp
          If basla1=0 Then
           CALISTIR = 55
            DURDUR = 0
             GoSub ver2
               
             Else       
          If dur=0 Then DURDUR = 66 : CALISTIR = 0 : GoSub ver2  ': GoTo stp
          EndIf         
           GoTo tus


       
stp:       
        Cls
       
     
        Print At 2,5, " HAZIR "
         dur1=0
         calis=0
   
        GoTo tus

        '--------------------------------------------------------------------------------       

basla:
         
         'Cls
       ' For W = 1 To 9000
       'Next
     
       Print At 1,8,"LP=",Dec1 ABAS,".",Dec ONDA    ',",",Dec1 ABAS1 'bunlar rakamsal ifadeler olduğu için desimal gösterge formatında verilmeli.
      'DelayUS 100
       Print At 1,1,"HP=",Dec2 YBAS       
       'DelayUS 100
       Print At 2,1,"C=",Dec2 ISI
      ' DelayUS 100
       Print At 2,8,"TUZ=",Dec4 TUZ 
           
         If dur1 = 88 Then
         calis =0
         GoTo mod6
         Else
         If dur = 0 Then DURDUR = 66:CALISTIR = 0:GoSub ver2 :GoTo stp
         EndIf
       GoTo basla

       
ver2:
      Tx = 1
       HSerOut [Rep $AA\5,Rep $00\5,Rep $ff\5] 'uyandırma işareti yolla
     
       HSerOut ["DCM",DURDUR,CALISTIR,13,10]
       Tx = 0
       Return                   
               
mod1:
       Cls
lp:    Print At 2,1,"LP PUMP WORKING"
       If Mod = 8 Then
       Mod = 0
       Cls
       GoTo stp
       Else
       GoTo lp
       EndIf
       
mod2:
       Cls
ft:    Print At 2,1,"FLUSH TIME"
       If Mod = 8 Then
       Cls
       GoTo stp
       Else
       GoTo ft
       EndIf
       
mod3:
       Cls
ab:    Print At 2,1,"AB PUMP CALISTI"
       If Mod = 8 Then
       Cls
       GoTo stp
       Else
       GoTo ab
       EndIf
       
mod4: 
       Cls
gy:    Print At 2,1,"GERI YIKAMA "
       If Mod = 8 Then
       Cls
       GoTo stp
       Else
       GoTo gy
       EndIf                                           

mod5:
      Cls
pr:   Print At 2,1,"PREPARING"
      If Mod = 7 Then
      Cls
      GoTo basla
      Else 
      GoTo pr
      EndIf
mod6:
     
        Cls
atla1: Print At 2,1,"DURDURULDU"
       If Mod = 4 Then
       Cls
       GoTo mod4
       EndIf
       GoTo atla1
     
                 
        End

ete

Bu denemeleri Simulasyondamı yoksa gerçek devredemi yapıyorsun.Öte yandan ne yazıkki Proton derleyicim yok ve hex dosyalarını elde imkanım yok.Komple dosya koysaydın daha kolay olurdu.
Haberleşme paremetreleride yanlış gibi. Benim hesabıma göre 20Mhz de çalışan bir sistemde;Hserial_RCSTA=90h   Bu doğru sende de $90
Hserial_TXSTA =24h ' Bu sende 20h verilmiş burayı düzeltmen gerek.
Hserial_SPBRG = 129 'bu da doğru

Debug yapıp RCREG değerine bakıyorum sürekli değer alıyor ve sıfırlanıyor. Bu sürekli veri alındığını gösterir. Ancak programda bu nu yaptıracak kod göremiyorum. Açıkçası anlamadığım şeyler var.Simulasyonda Haberleşme bacaklarına etiket vermişsin. Biri HB1 diğeri HB1.1 ve biri HB2 diğeri HB1.2 gibi değer almış ama haberleşiyorlar. Üstelik bunları silip pinleri direk bağlarsam bu sefer çalışmıyor sistem.Var bir terslik ama göremedim.Haberleşmede sorun yok gibi gözükmekle beraber sen yinede 20h değerini 24h olarak değiştir her iki tarafta.Ete

Ete

dcelektronik

Hem similasyonda hemde gerçek devrede yapıyorum.Dediğiniz gibi değerleri düzelttim ama değişen birşey olmadı.Bu arada PBP kurup birde orda deneyeyim dedim ama.Derlerken hata veriyor.MPASM penceresi acılıyor üstüne Error mesajı geliyor Error in parameter "Programlar\deneme.asm". diye windows10 la ilgilimi bilmiyorum.C:\PBP  diğeride c:\programfiles(x86)\microchip\mpasm suit use MPASM seçili

ete

Ben değişkenleri izlemek amacı ile programları çevirdim. Verisyon PBP3 dür. Yalnızca Config satırları farklıdır.Onları kendine göre değiştirirsen PBP2.60 da da çalışır.Gördüğüm şu, PBP Hserin , Hserout komutlarında word değişkenini bir seferde yollayamıyor. Yada yollamıyor. Word değişkeni illaki Byte1 , Byte0 şeklinde iki byte halinde yazılması gerekiyor. Bütün bunlara riayet edince haberleşme gayet güzelçalışıyor. Saat de güzel çalışıyor gibi gözüküyor. Gerçek devrende ne olur bilemiyorum.
Programlar ilişiktedir.Ete
NOT: tek bir uyumsuzluk var oda Saat değişkenini Dword olarak tanımlamışsın PBP 16F serisi için Dword kullanımına müsaade etmediği için onu word olarak kullandım.

ete

Proton sanırım bazı şeylere itiraz etmiyor ve kafasına göre hareket ediyor. Ver uzantılı programda LCD pinlerinin bağlı olduğu B portundaki pinler giriş olarak ayarlanmış ve çalıştırınca 16F628 in bağlı olduğu LCD ekranı bir müddet sonra bozuluyor.Bu doğal çünki çıkış olması gereken pin giriş ayarlanmış.
Bunun yanında programdaki asıl zaman sorununu yaratan sebep kesinlikle USART kesmesi ve senin sürekli ard arda veri yollaman. Bu tür işlerde tedbir alıp verilerden en azından birisi değiştiği zaman veri yollanmalıdır.İlişikteki test programlarınıda bir incele istersen. Bu tür bir tedbir alarak sürekli veri yollanmasını engelledim. Böylece zaman saati daha stabil çalışmaya başladı.Bu yaptığım değişiklikleri programlarına uygularsan daha stabil çalıştığını görebilirsin.Bazı değerleri görebilmek adına ekrana bazı fazladan bilgiler yazdırmıştım. Onları kaldırmadım. İşin o ksımını kendi ekran tanımlamalarından kullanabilirsin. Kısaca yalnızca düzeltmeleri yapmanı öneririm.
Bir şey daha dikkatimi çekiyor. Sistemi durdurduğun zaman saat geri saymaya başlıyor. Bu arada da sürekli veri yolluyor. Ama hep aynı verileri yolluyor. Analog girişler okunmuyor sadece saat sayıyor neden veri yollama gereği duydun ? üstelik ardışık yollama sürekli. Buna gerek varmı. Bence yok o nedenle durdurdum orayı.Temel prensip hep aynı. Veri değiştiği zaman yollanmalı yoksa sürekli veri yollama bu sisteme zarar veriyor.
Ete

dcelektronik

Erol Hocam gönderdiğiniz programı çalıştırdım ondada durdurulduktan sonra geri sayma işlemi 5-6 sn de bir atıyor.Ancak haberleşme bağlantılarını iptal etiğimde düzeliyor.Word bilgilerini Byte1 ve Byte0 olareak gönderiyorum.Programdaki değişiklikleride dediğiniz gibi yaptım.Sürekli göndermiyor değer değiştikçe gönderiyor.16F628 tarafındaki değişiklikleride yaptım.Ama yine aynı.Gerçekte de aynı Bazen motorlar devreye girince LCD de yazılar karşıyor.PIC lerin powerlarında 100nf bağlı.Program normal çalışmaya devam ediyor ekran sapıtıyor.Programın son hali ekte incelerseniz sevirim.

ete

Simulasyonda ekranda debug yapıyorum ve hem BEKLE hem Saniye Hemde Dakika değişkenlerini gözlemleyebiliyorum.BEKLE değişkeninin sayma hızı her konumda değişmiyor. Tavsiyem yarım yamalak da olsa benim verdiğim dosyadaki hex leri piclere yükle ve bir dene bakalım. Aynı sonucu mu alacaksın çok merak ediyorum.
Program çalıştığı andan itibaren start tuşuna basmasan da saat çalışmaya başlıyor zaten. Orada haberleşmede yok ve hızını görebiliyorum. Starta basınca hız az bir şey yavaşlamış gibi gözüksede tamamen simulasyonun gecikmesinden kaynaklanıyor. Gerçekte aynı hızda çalışacaklarından eminim.Stop konumunda ise değişen bir şey olmuyor.
Ekran sapıtması 16F628A ya bağlı ekranda oluyor. Kesin olarak sebebini bulamaış olmakla birlikte peş peşe verilen LCD komutları bu sorunu yaratıyor. Bunun bir sebebide open collector olan PORTA.4 e pullup ile bağlı bir pinden de kaynaklanıyor olabilir. Bunları bugün değiştirip deneyeceğim. Sorunu yaratan satırlar şunlar;       Print At 1,8,"LP=",Dec1 ABAS,".",Dec ONDA   
       Print At 1,1,"HP=",Dec2 YBAS       
       Print At 2,1,"C=",Dec2 ISI
       Print At 2,8,"TUZ=",Dec4 TUZBurada dikkat edersen, Önce 1 satır 8 ci karekterden itibaren LP=... yazdırııp sonra aynı satırın 1. cikarekterinden itibaren HP=.. yazdırıyorsun. Önce sonunu sonra başını yazdırrmak pek mantıklı değil.
Bu satırı şöyle kullanırsan sorun olmuyor;PRINT AT 1,1,"HP=",Dec2 YBAS,"   LP=",Dec1 ABAS,".",DEC ONDAböylece yadırma işi baştan sonra doğru sıralı gitmiş oluyor ve ikini yazdırma için ayrıca bir komut verme ihtiyacı duymuyorsun. zaten sorun bir komut icra edilmeden diğerinin peşinden gelmesinden kaynklanıyor. Bu şekil kullanım o sorunu ortadan kaldırıyor. Diğer satırlarıda benzer şekilde,       Print At 2,1,"C=",Dec2 ISI,"   TUZ=",Dec4 TUZşeklinde yazdırman sorunu büyük ihtimal ile çözecektir.
Ver isimli programda (16F628A) kesme kısmında bazı değişkenleri sıfırlıyorsun. Bu ekranda bunların değerlerini görmeyi engelliyor. Dikkat edersen Heserin komutu başında bir işaretçi var  Wait ("DCM") şeklinde bu veri paketi başının bulunması amacı ile oraya koyulmuştur. Bazen verinin ortasına denk gelirsen yine kesme oluşur ama sistem DCM yi bulamayınca hiç bir veri almadan kesmeden çıkar. Bu durumda senin değişkenlerin sıfırlanmış olur. Ekranda da değerleri sıfır görürsün. Özellikle ekran formatında yer alan değişkenleri sıfırlamamalısın. Zaten bir bilgi alınır ise o değişkenler yeni değerlere eşitlenecektir otomatikman. Onları sıfırlaman hiç bir işine yaramıyor aksine sana zarar veriyor.Benim programı çalıştırdığın zaman veri akışı zamanında yapılıyor ve ekranda bilgiler anında tazeleniyor. Senin hex'ini uyguladığım zaman TUZ değerini hep sıfır görüyorum. Virtual terminalden veri akışına baktığım zaman gelen verinin doğru olduğunu görebiliyorum. Ama ya Proton temp=RCREG ile RCIF bitini sıfırlamıyor ve tekrar kesmeye giriyor ve gelen veri olmadığı için değerler sıfırlanıyor yada başka bir sebebi var henüz bulamadım.Ama o değişken sıfırama işini oradan kaldırırsan sistem sorunsuz çalışabiliyor.
Bir tavsiye de kesme içindeki PORTB.0 kesmesini kaldırmanı öneririm. Zaten bir işe yaramıyor. Böylece kesme satırlarını azaltarak olası gecikmeleri asgariye indirmiş olursun.  Yapılacak iş INTCON=%10110000 yerine INTCON=%10100000 şeklinde değer vermek ve aşağıdaki satırları oradan silmek.       
      If INTCON.1=1 Then
           INTCON.1=0     
           DURDUR = 66   
           GoTo cik
      EndIf
Ete

dcelektronik

Günaydın,Erol Hocam dediklerinizi programda düzeltince gerisayma işlemi de düzeldi.Sorunun LCD displaylere yazmada olduğu ortaya çıktı ben programı yazarken bukadar etkileyeceğini bilmiyordum.Sürekli yazma yerine gerektiği zaman yazınca işler düzeldi.Verdiğiniz bilgiler için çok teşekkürler benim içinde iyibir deneyim ve öğrenme süreci oldu.Dün denemeye fırsatım olmadı similasyonda düzgün çalışıyor.Bu gün deneyeceğim imşallah bir aksilik olmazsa onun sonucunuda paylaşırım.Prg.son hali ekte incelerseniz fikirlerinizden faydalanmak isterim.Şimdilik iyigünler

ete

Program epeyce şekil değiştirdi olumlu yönde. Pek fazla yapacak bir şey göremiyorum. Bu aşamadan sonra ancak sorun çıkaran yer var ise onun üzerinde tartışıp ne yapılması gerektiği araştırılabilir.Ancak bir şeyi söylemeden geçemeyeceğim. Program yazma kuralları vardır. Bunlara pek uyduğun söylenemez.Birincisi IF ve döngü (FOR X...) komutlarında bir başlangıç sonra ara komutlar ve son vardır. Byunların hepsini aynı hizada yazarsanız hem takibi  çok zorlaşır hemde hata yapma olasılığınız artar. Örnek vererek devam edelim.
           If F2 = 0 Then 
            Cls
            GoTo geri_yikama
            EndIf
şeklinde kod yazmışsın. Her şey alt alta aynı hizadan başlıyor. Yalnızca bu kodlar olsa sorun yok nerede If var nerede Endif var görebiliyorum. Ama alt alta bir çok if olursa işler karmaşık hale geliyor. Doğrusu ne dersen aşağıdaki şekilde olmalı.
           
If F2 = 0 Then      Cls
     GoTo geri_yikama
EndIf

Bu şekilde IF nerede başlıyor arasındaki işlenecekkomutlar hangileri ve nerede bitiyor kolaylıkla görebiliyorum. Şunu söyleyeyim programı anlamak için ben yazdıklarınızı bu hale getirip incelemek zorunda kalıyorum hep. Diğer türlü iki katı dikkat ve zaman harcamak orunda kalıyorum.Benzer şekilde IF satırlarında else de var ise onu da IF ile aynı hizaya koyup ayormak faydalı oluyor.
           
If F2 = 0 Then       Cls
      GoTo geri_yikama           
Else             
      Goto başkayere
EndIf

gibi.Yine for next döngülerinde;
FOR X= 1 to 100     
   GOSUB Geri_Yıkama     
   Y=Y+1     
   Delayus 100
Next 
şeklinde yazılması uygun olacaktır.Benzer kaideyi While - wend , Do - loop gibi komutlarada uygulamak gerekir.

Ete

Powered by EzPortal