avatar_inventor

PROTON USART KESMESI

Başlatan inventor, 17 Şubat 2013, 01:39:36

inventor

Merhaba arkadaşlar,

Son bir kaç haftadır proton ile yazdığım bir programla uğraşıyorum. İsiste sorunsuz çalışmasına rağmen gerçek devrede çalışmayan bir proje. Bu program ile uğraşırken protonda ne kadar sorun çıkabileceğini de görmüş oldum. Kısa programlar için sıkıntı çıkarmayan pek çok konu uzun ve ağır programlarda sorun yaratabiliyor. Burada karşılaştığım sorunlarla ve çözümleri ile ilgili bilgileri paylaşayım dedim.

İlk olarak protonda kesme konusuna değinelim. Çoğumuz programlarımızda kesme rutinini programımızın en altına yazıyoruz. Bu belki pbp dan kalan bir alışkanlık. Kısa döngülerde bu alışkanlık protonda da kullanılabiliyor. Ama portb kesmesi ile usart kesmesini bir arada kullandığınız zaman kesinlikle KESME rutininin programın en üstünde olması gerekiyor. Yani programınıza BASLA ile değil KESME ile başlamanız gerekiyor. KESME: satırının hemen üstüne GOTO BASLA yazarak normal çalışma yaptırabilirsiniz. Eğer bunu yapmazsanız büyük ihtimalle benim yaşadağım bir sıkıntıyı yaşarsınız. Programınızda kullandığınız bütün DelayMs komutlarında programınız USART kesmesi yapar. Bununla da kalmaz print at 1,1,"........" gibi komutları peş peşe kullandığınızda da kesmeye girecektir. Bu durumlarda tek yapmanız gereken KESME rutinini programın en üstüne almak olacaktır. Bu konu protonun kendi veb sitesinde ve manualde de öneriliyor.Örnek verelim;
GoTo BASLA
   
KES:               
Context Save
        HSerIn 5,CIK,[Wait ("~"),BILGIAL]
        HSerOut [BILGIAL]
        A=1             
CIK:
    TEMP=RCREG   ' USART Kesme bayragi sifirlandi (RCIF)
Context Restore

BASLA:     
    If A=1 Then HESAP 

Diğer bir konu da Temp=RCREG konusu. PBP da karşılaşmadığım ama protonda zaman zaman sorun çıkaran bir konu var. Temp=RCREG komutunu programın başına eklemeniz gerekiyor. Aksi halde RCRIF set olarak geliyor. Ve sistem kesmeye gitmiyor. Genelde bizler RCREG registerini  KESME rutini içerisinde sıfırlıyoruz. RCRIF ilk açılışta SET olarak gelince program kesmeye girmiyor. Girmeyince RCREG boşaltılamıyor ve siz usart kesmesi olacak diye bekliyorsunuz. RCRIF in niye set olarak geldiğini hala anlamış değilim ama PBP da yazdığım bir programı protonda yazınca yine set olarak başladı. Aslında bir inceleme yapmak lazım bu konuda. Örnek verelim;
ORAN=ERead 10
If ORAN>2 Then ORAN=1
Print  $fe,1
DelayMS 200
I=0 : BILGIAL=0 : VIN=0 : VCIK=0 : A=0   : EN_Pin=0
TEMP=RCREG
'****************************************************************************************************************
GoTo BASLA
   
KES:               
Context Save
        HSerIn 5,CIK,[Wait ("~"),BILGIAL]
        HSerOut [BILGIAL]
       

Protonda kesmeleri ayarlarken de uyulması gereken kurallar var. Mesela ilk kural sıralama. Kesme ile ilgili registerları ayarlarken ilk olarak genel kesmeleri kapatmanız gerekiyor. Sonra sırası ile önce SW kesmelerini ,sonrasında da HW kesmeleri ayarlayıp en son olarak genel kesmeyi açmalısınız.
Symbol GIE  =INTCON.7   'genel interruptlar  aciyor
Symbol PEIE =INTCON.6   'Cevresel kesmeleri  aciyor
Symbol INTE =INTCON.4   'RB0 Kesmesini aciyor
Symbol INTF =INTCON.1   'RB0 kesme bayragi
Symbol RCIE =PIE1.5     'USART kesmesini aciyor
Symbol RCIF =PIR1.5     'USART Receive interrupt flag bit
GIE=0     'Butun kesmeler devrede
INTE=1    'RB0 kesmesi devrede       
RCIE=1    'USART kesmesi devrede
PEIE=1    'Cevresel kesmeler devrede
GIE=1     'Butun kesmeler devrede

Başka bir konu da On interrupt ile On_interrupt arasındaki fark. Genelde bilinen bir konu ama ben yine de bildiklerimi aktarayım. pbp da tek olan komut On interrupt Goto .... iken bu komut protonda üç adet. İlki PBP ile aynı.
On interrupt Goto ......
Bu Software kesmesi oluyor. Protonda donanımsal kesme var. Bunu iki komut satırı ile yazabiliyoruz.
on_interrupt .......   ya da
on_hardware_interrupt ........
Burada şunu bilmek gerekiyor. Eğer yazılımsal kesme kullanıyorsak KESME rutininin hemen üstüne Disable komutunu ekliyoruz. Kesmeden çıkarken de eneble resume diyerek çıkıyoruz. Bu pbp ile aynı. Donanımsal kesmede ise kesme rutinine girince Context Save diyoruz. Çıkarkende Context Restore yazıp çıkıyoruz. Manuale bakınca bu komutların sadece 16f serisi için geçerli olduğunu yazmışlar. Her iki kesmeye de örnek verirsek;
Disable
KES:               
        HSerIn 5,CIK,[Wait ("~"),BILGIAL]
        HSerOut [BILGIAL]
        A=1             
CIK:
    TEMP=RCREG   ' USART Kesme bayragi sifirlandi (RCIF)
enable
resume

KES:               
Context Save
        HSerIn 5,CIK,[Wait ("~"),BILGIAL]
        HSerOut [BILGIAL]
        A=1             
CIK:
    TEMP=RCREG   ' USART Kesme bayragi sifirlandi (RCIF)
Context Restore

Başka bir konu da Hserout komutunun kullanımı. Bu konu PBP için de geçerli. ETE hoca da dile getiriyor bu konuyu. Göndereceğiniz komutun sonuna mutlaka başka bilgilerde ekleyin. Aksi halde veri zaman zaman eksik gidebiliyor.Aşağıdaki kod da 10,13 bu amaçla kullanıldı.
GONDER:
    EN_Pin=1
    GoSub GECIKME
    KOD=118
    HSerOut [Rep $AA\5,Rep $00\5,Rep $FF\5]'uyandirma sinyali preamble
    HSerOut ["~",KOD,10,13]
    EN_Pin=0         
    Return

Proton Delay komutlarında beklerkende donanım kesmesine girebiliyor. Bunu da aklınızın bir köşesinde bulundurun. Örneğin aşağıdaki programda 10 sn lik bekleme sırasında gelen bir usart bilgisi anında kesmeye neden oluyor. Kesme işi tamamlandıktan sonra zaman sayacı kaldığı yerden saymaya devam ediyor.

BASLA:
    DelayMS 10000
    '****  olcme talebi gelince yapilacaklar  ****     
     If A=1 Then
        A=0
        RCIE=0
        BILGIAL=0

Şimdilik aklıma gelenler bunlar. Gerekirse yazıyı editleriz.
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

ete

Protonla uğraşanlar için altın değerinde bilgiler. Anladığım kadarı ile sorunlarını eşeleye eşeleye aşmışsın. Zaman zaman bazı kodlarda kesme bölümünün en üste yazılıp goto basla denildiğine şahit olurum ve banada çok saçma gelirdi. Demekki bir sebebi var bu işin. Ama proton da böyle kurallar olması ve bunların gerçekten işe yaramasıda bir enteresan durum. Bunların manuel de açıklanmamış olmasıda ayrı bir enteresanlık. Gerek Pbp da gerekse Proton da komut açıklamalarını pek çok defa okudum ama bu tür açıklamalara rastlamadım. O nedenle tecrübeye dayalı bu bilgiler bence önemli.
Bu arada bir hususu düzelteyim. Seri haberleşmede rs485 kullanıyorsanız veri nin sonuna bir line feed (10) ve bir return (13) ekleyin bu işlem normal seri haberleşmede geçerli değil. Yani normalde eklesenizde eklemesenizde veriniz karşıya ulaşır ama RS485 de mutlaka eklemeniz gerekiyor aksi halde veri 2 byte ise tek byte gidiyor diğeri hatta kayboluyor. Bu bilgide bir yerlerde yazmıyor. Ama doğruluğunu pek çok kez kanıtladım.
Ete

hakıkat

merhaba  inventor hocam
Uzun zamandır aradığım ama bir türlü bulamadığım bir konuydu şunu belirteyim çok yerinde bir konu açmışsınız.
Çünkü daha önce porotonla donanım kesmesiyle berabar
TMR0 kesmesini kullandım ama bir türlü sonuç alamadım.Acaba iki kesme berabar istikrarli kullanılmıyormu.Çünkü aynı programı
serın yada serout ta kullandım sorunsuz çalıştı.

inventor

#3
İkisi bir arada kullanılabiliyor ancak proton ufak şeylere çok önem veriyor. Mesela Kesme rutininin ilk sırada olması gibi. Eğer donanım kesmesi varsa mutlaka ilk sıraya girecek. Aksi halde sorun çıkarıyor.  Yazılımı buraya eklerseniz nerelerde sıkıntı olduğuna bakabiliriz. Belki burada belirtmediğimiz başka önemli noktalarda ortaya çıkar.

Başka bir konu da High Low komutları ile ilgili. Sanırım bu konu PBP içinde geçerli olmalı. Çoğumuz pinlerin durumunu değiştirmek için bu komutları kullanıyoruz. Gözden kaçırdığımız nokta ise manuallerde belirtilmiş aslında. Bu komutlar kullanıldığı anda ilgili pin çıkış yapılır  diyor. Bu komutu kullanmak için zaten pini çıkış yapmış oluyoruz ne fark eder gibi bir şey aklınıza gelebilir. Neyin farkettiğini kullandığınız picin hafızası dolmaya başladığında görüyorsunuz. Örnek verecek olursak;
basla:
    High PORTA.1
   End     

Proton ile  derlenen yukarıdaki komutların derleme sonrasında Assembler karşılığı şu şekilde oluyor;
basla
        bsf STATUS,5
        bcf TRISA,1
        bcf STATUS,5
        bsf PORTA,1
        end

High Low komutları yerine porta.1=1 komutunun assembler karşılığına bakalım;
basla
        bsf PORTA,1
        end


Aradaki farkı net şekilde görebiliyoruz. Eğer bellek sorununuz varsa bu komutları kullanmamaya çalışın. Son projemde picin hafızası yetmediği çin bir üst seriye geçtim. Sonrasında bu olayı farkettim ve aynı programı high low kullanmadan tekrar yazdım. Meğer eski pice sığıyormuş.
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

hakıkat

Hocam donanım kesmesini ilk sırada alınca program hiç çalışmadı.Son şekli budur.
verici kısmı
Device=16F628A
Config BOREN_OFF, CP_OFF, DATA_CP_OFF, PWRTE_ON, WDT_OFF, LVP_OFF, MCLRE_OFF, XT_OSC, CPD_OFF, WDT_OFF
Xtal=4
' Declare OSC 4
Declare Hserial_Baud=9600
Declare Hserial_RCSTA=$90h
Declare Hserial_TXSTA=$24h
Declare Hserial_SPBRG= 25
Declare Hserial_Clear   =   On

CMCON=7           '16F628 de komparatör pinleri iptal hepsi giriþ çýkýþ
OPTION_REG.7=1    'Dahili pull-up lar AKTÝF yapýldý
TRISB=%11010000
PORTB=0
TRISA =%00000000
PORTA=0

Dim VER1 As Byte
Dim VER2 As Byte

Symbol UYANDIRMA=PORTB.0
Symbol LED=PORTB.3
Symbol BUTON1=PORTB.4
Symbol BUTON2=PORTB.6
Symbol BUTON3=PORTB.7
Clear
DelayMS 200

START:   
LED=0
If BUTON1=0 Then
VER1=11:VER2=72
UYANDIRMA=1
GoSub GONDER
UYANDIRMA=0:LED=1
DelayMS 200
EndIf

If BUTON2=0 Then
VER1=21:VER2=82
UYANDIRMA=1
GoSub GONDER
UYANDIRMA=0:LED=1
DelayMS 200
EndIf

If BUTON3=0 Then
VER1=51:VER2=112
UYANDIRMA=1
GoSub GONDER
UYANDIRMA=0:LED=1
DelayMS 200
EndIf       
DelayMS 100
GoTo START
           
'-------------------------ALT PROGRAMLAR---------------------------------------

  GONDER:
HSerOut [Rep $AA\5,Rep $00\5,Rep $FF\5]'uyandirma sinyali preambl
HSerOut ["A","R","A",VER1,VER2] 
Return
End

alıcı kısmı
Device=16F628
Config CP_OFF, CPD_OFF, PWRTE_ON, WDT_OFF, LVP_OFF, MCLRE_ON, XT_OSC, BOREN_OFF, DATA_CP_OFF, WDT_OFF, XT_OSC

Xtal=4
' Declare OSC 4
Declare Hserial_Baud=9600
Declare Hserial_RCSTA=$90h
Declare Hserial_TXSTA=$24h
Declare Hserial_SPBRG= 25
Declare Hserial_Clear   =   On

Symbol GIE  =INTCON.7   'genel interruptlarý açiyor
Symbol PEIE =INTCON.6   'peripheral interruptlarý açiyor                       

Symbol RCIE =PIE1.5     'USART Recive interrupt enable bit
Symbol RCIF =PIR1.5     'USART Receive interrupt flag bit
Symbol T0IE =INTCON.5    'TMR0  interrupt enable bit
Symbol T0IF =INTCON.2    'TMR0  interrupt flag bit CLEAR

On_Hardware_Interrupt GoTo KESME   'kesme olu?ursa KESME adl? etikete git
OPTION_REG=%10000101    '1/64
CMCON=7     'Dahili pull-up lar pasif yapildi   
TRISB=%00000010
PORTB=0
TRISA =%00000000
PORTA=0

Symbol LED=PORTA.3                   
Symbol LAMBA=PORTA.2
' Symbol BAS=PORTB.6

Dim AL1   As Byte
Dim AL2   As Byte
Dim SART  As Bit
Dim TEMP  As Byte
Dim US    As Bit
Dim SURE  As Bit
Dim Direk As Bit
Dim DAK   As Byte
Dim SN    As Byte
Dim SAYAC As Word
Dim  I    As Word
  DelayMS 200

Clear
GIE=0:T0IE=0:RCIE=1:PEIE=1:GIE=1
BASLA:
If US=1 Then  'veri alýnmýþ ise
    If  AL1=11 And AL2=72 Then   'Buton1 e basýlmýþ ise SART=1 yapýlýyor.
        LED=1:SART=1
         For I=0 To 40000
        DelayUS 2
        Next
        LED=0         
    EndIf
    If SART=1 And AL1=21 And AL2=82 Then  'Buton2 ye basýlmýþ ise
       LED=1:T0IE=1:SURE=1
        For I=0 To 40000
         DelayUS 2
        Next
       LED=0
    EndIf
   
    If SART=1 And AL1=51 And AL2=112 Then  'buton 3'e basýlmýþ ise
       LED=1:SART=0:INTCON.5=0:SURE=0:DAK=0:SN=0
        For I=0 To 40000
          DelayUS 2
        Next
       LED=0
    EndIf   
EndIf
GoTo BASLA
;---------USART KESME-----------
KESME:
Context  Save
GIE=0 'tüm interruptlar? kapat yani INTCON.7=0
If T0IF=1 Then
SAYAC=SAYAC+1
  If SAYAC=67 Then      '61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
         SAYAC=0             'sayaç sifirlaniyor
         SN=SN+1            'saniye degeri bir artiriliyor
            If SN=60 Then     'saniye 60 olmus ise 1 dakika süre geçti o halde
               SN=0           ' saniye sifirlaniyor
               DAK=DAK+1       ' dakika degeri bir artiriliyor
               If  SN=0 And  DAK=0 Then  BAK
                  If SURE>0 And SURE=DAK Then   'dakika 1 olmus 
                  LAMBA=1:LED=1:T0IE=0
                   For I=0 To 40000
                  DelayUS 2
                    Next I
                  LAMBA=0:LED=0   
                     DAK=0:SN=0:SAYAC=0             ' dakika sifirlaniyor
                EndIf     
            EndIf
         EndIf
BAK:               
T0IF=0 'kesme bayragi sifirlanacak                           
GoTo CIK
EndIf
HSerIn 5,BIR,[Wait("ARA"),AL1,AL2]
TEMP=RCREG                                                                       
US=1
GoTo CIK
BIR:US=0
CIK:
RCIF=0
GIE=1 'Yani INTCON.7=1 kesmeleri açt?k.
Context Restore
End


inventor

Kesme rutinini ilk sıraya alınca  kesmenin üstüne goto basla demeniz gerekiyor bunu böyle mi yaptınız?
goto basla  ; BURAYADIKKAT ETMEK GEREKIYOR
KESME:
Context  Save
GIE=0 'tüm interruptlar? kapat yani INTCON.7=0
If T0IF=1 Then
SAYAC=SAYAC+1
  If SAYAC=67 Then      '61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
         SAYAC=0             'sayaç sifirlaniyor
         SN=SN+1            'saniye degeri bir artiriliyor
            If SN=60 Then     'saniye 60 olmus ise 1 dakika süre geçti o halde
               SN=0           ' saniye sifirlaniyor
               DAK=DAK+1       ' dakika degeri bir artiriliyor
               If  SN=0 And  DAK=0 Then  BAK
                  If SURE>0 And SURE=DAK Then   'dakika 1 olmus 
                  LAMBA=1:LED=1:T0IE=0
                   For I=0 To 40000
                  DelayUS 2
                    Next I
                  LAMBA=0:LED=0   
                     DAK=0:SN=0:SAYAC=0             ' dakika sifirlaniyor
                EndIf     
            EndIf
         EndIf
BAK:               
T0IF=0 'kesme bayragi sifirlanacak                           
GoTo CIK
EndIf
HSerIn 5,BIR,[Wait("ARA"),AL1,AL2]
TEMP=RCREG                                                                       
US=1
GoTo CIK
BIR:US=0
CIK:
RCIF=0
GIE=1 'Yani INTCON.7=1 kesmeleri açt?k.
Context Restore
End


Olmazssa isis dosyaları falan tamamını verin ben bakayım
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

hakıkat

#6
Hocam belirttiğiniz gibi kesmeden önce goto basla komutunu vermiştim.program ve ısıs şeması aşağıda

inventor

programın amacını  (çalışmasını ) yazarmasınız?
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

hakıkat

#8
Hocam program donanım kesmesıyle tmr0 kesmesini kullanarak uzaktan 1.tuşla alıcıyı açmak 2.tuşla ise
TMR0 kesmesiyle programda
belirlenen zamanı başlatarak zaman dolduğunda lambayla leddi beraber yakmak 3.tuşla ise devreyi kapatmaktır.
Yani bu programla aslında iki kesmenin beraber neden istikrarlı çalışmadığını göstermek için yapılan  bir örnektir.

Yukarıdaki verdiğim programı ve ısıs şemasını burada yeniden veriyorum.

verici
Device=16F628A
Config BOREN_OFF, CP_OFF, DATA_CP_OFF, PWRTE_ON, WDT_OFF, LVP_OFF, MCLRE_OFF, XT_OSC, CPD_OFF, WDT_OFF
Xtal=4
' Declare OSC 4
Declare Hserial_Baud=9600
Declare Hserial_RCSTA=$90h
Declare Hserial_TXSTA=$24h
Declare Hserial_SPBRG= 25
Declare Hserial_Clear   =   On

CMCON=7           '16F628 de komparatör pinleri iptal hepsi giriş çıkış
OPTION_REG.7=1    'Dahili pull-up lar AKTİF yapıldı
TRISB=%11010000
PORTB=0
TRISA =%00000000
PORTA=0

Dim VER1 As Byte
Dim VER2 As Byte

Symbol UYANDIRMA=PORTB.0
Symbol LED=PORTB.3
Symbol BUTON1=PORTB.4
Symbol BUTON2=PORTB.6
Symbol BUTON3=PORTB.7
Clear
DelayMS 200

START:   
LED=0
If BUTON1=0 Then
VER1=11:VER2=72
UYANDIRMA=1
GoSub GONDER
UYANDIRMA=0:LED=1
DelayMS 200
EndIf

If BUTON2=0 Then
VER1=21:VER2=82
UYANDIRMA=1
GoSub GONDER
UYANDIRMA=0:LED=1
DelayMS 200
EndIf

If BUTON3=0 Then
VER1=51:VER2=112
UYANDIRMA=1
GoSub GONDER
UYANDIRMA=0:LED=1
DelayMS 200
EndIf       
DelayMS 100
GoTo START
           
'-------------------------ALT PROGRAMLAR---------------------------------------

  GONDER:
HSerOut [Rep $AA\5,Rep $00\5,Rep $FF\5]'uyandirma sinyali preambl
HSerOut ["A","R","A",VER1,VER2] 
Return
End



alıcı
Device=16F628
Config CP_OFF, CPD_OFF, PWRTE_ON, WDT_OFF, LVP_OFF, MCLRE_ON, XT_OSC, BOREN_OFF, DATA_CP_OFF, WDT_OFF, XT_OSC

Xtal=4
' Declare OSC 4
Declare Hserial_Baud=9600
Declare Hserial_RCSTA=$90h
Declare Hserial_TXSTA=$24h
Declare Hserial_SPBRG= 25
Declare Hserial_Clear   =   On

Symbol GIE  =INTCON.7   'genel interruptları açiyor
Symbol PEIE =INTCON.6   'peripheral interruptları açiyor                       

Symbol RCIE =PIE1.5     'USART Recive interrupt enable bit
Symbol RCIF =PIR1.5     'USART Receive interrupt flag bit
Symbol T0IE =INTCON.5    'TMR0  interrupt enable bit
Symbol T0IF =INTCON.2    'TMR0  interrupt flag bit CLEAR

On_Hardware_Interrupt GoTo KESME   'kesme olu?ursa KESME adl? etikete git
OPTION_REG=%10000101    '1/64
CMCON=7     'Dahili pull-up lar pasif yapildi   
TRISB=%00000010
PORTB=0
TRISA =%00000000
PORTA=0

Symbol LED=PORTA.3                   
Symbol LAMBA=PORTA.2
' Symbol BAS=PORTB.6

Dim AL1   As Byte
Dim AL2   As Byte
Dim SART  As Bit
Dim TEMP  As Byte
Dim US    As Bit
Dim SURE  As Bit
Dim Direk As Bit
Dim DAK   As Byte
Dim SN    As Byte
Dim SAYAC As Word
Dim  I    As Word
  DelayMS 200

Clear
GIE=0:T0IE=0:RCIE=1:PEIE=1:GIE=1
BASLA:
If US=1 Then  'veri alınmış ise
    If  AL1=11 And AL2=72 Then   'Buton1 e basılmış ise SART=1 yapılıyor.
        LED=1:SART=1
         For I=0 To 4000
        DelayUS 2
        Next
        LED=0         
    EndIf
    If SART=1 And AL1=21 And AL2=82 Then  'Buton2 ye basılmış ise
       LED=1:T0IE=1:SURE=1
        For I=0 To 4000
         DelayUS 2
        Next
       LED=0
    EndIf
   
    If SART=1 And AL1=51 And AL2=112 Then  'buton 3'e basılmış ise
       LED=1:SART=0:INTCON.5=0:SURE=0:DAK=0:SN=0
        For I=0 To 40000
          DelayUS 2
        Next
       LED=0
    EndIf   
EndIf
GoTo BASLA
;---------USART KESME-----------
KESME:
Context  Save
GIE=0 'tüm interruptlar? kapat yani INTCON.7=0
If T0IF=1 Then
SAYAC=SAYAC+1
  If SAYAC=67 Then      '61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
         SAYAC=0             'sayaç sifirlaniyor
         SN=SN+1            'saniye degeri bir artiriliyor
            If SN=60 Then     'saniye 60 olmus ise 1 dakika süre geçti o halde
               SN=0           ' saniye sifirlaniyor
               DAK=DAK+1       ' dakika degeri bir artiriliyor
               If  SN=0 And  DAK=0 Then  BAK
                  If SURE>0 And SURE=DAK Then   'dakika 1 olmus 
                  LAMBA=1:LED=1:T0IE=0
                   For I=0 To 40000
                  DelayUS 2
                    Next I
                  LAMBA=0:LED=0   
                     DAK=0:SN=0:SAYAC=0             ' dakika sifirlaniyor
                EndIf     
            EndIf
         EndIf
BAK:               
T0IF=0 'kesme bayragi sifirlanacak                           
GoTo CIK
EndIf
HSerIn 5,BIR,[Wait("ARA"),AL1,AL2]
TEMP=RCREG                                                                       
US=1
GoTo CIK
BIR:US=0
CIK:
RCIF=0
GIE=1 'Yani INTCON.7=1 kesmeleri açt?k.
Context Restore
End

inventor

Programın çalışmasında bir sorun göremedim. Kesme rutininde tanımladığınız 2us lik gecikmeler ile 40000 lik sayıcı hariç tabii ki. Bu kısmı kesmeden kaldırıp toggle lamba komutunu verdiğinizde program çalışıyor. İlk olarak aç butonuna basıyorum. LED yanıyor. Sonra tmr0 kesmesi ile bir dk lık süre çalışmaya başlıyor. Bu arada kapat butanuno basarsam hemen usart kesmesi oluşuyor ve ledi söndürüyor. Basmazsam 1 dakika sonra lamba yanıyor. Lamba yandıktan sonra kapat butonuna basarsam yine usart kesmesi oluyor ve sistem kapanıyor. Bunların önündeki tek engel KESME rutini içerisine koyduğunuz for next döngüsü ve orada ki gecikmeler. Yoksa tmr0 kesmesi gerçekleşirken usart kesmesine de tepki veriyor programınız
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

F®T

selamlar  inventor hocanın dediği gibi herşey güzelde ,kesme içindeki o  for I=0 TO 40000 gibi döngü kesme kullanma mantığına çok uymuyor.kesmede bu işler için bayraklar setlenip, normal program içinde bu mantıkların işletilmesi gerekli.yoksa bi kere keser sonra kesme diye bişi ortada kalmaz. :)
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

hakıkat

Program için belirttiğiniz noktalara katılıyorum pratikte program for next lede çalışıyordu. Ama
bir türlü aç tuşuna bastığımda yanan led kapanmadı surekli sabit yanıyor zaman girincede aynı durumdur . Sadece kapat tuşuna basınca led kapanıyor.
halbuki belirlenen zaman diliminde leddin yanıp sönmesi gerekmiyormu.Bu nedenini bir türlü anlayamadım.

inventor

Ledin yanıp sönsüğünü görmek için isis te adım adım çalıştırmanız gerekiyor. O zaman ledin yanıp söndüğünü görebilirsiniz. Normalde farkedilmiyor çünkü 40000*2=80000 US lik gecikme koymuşsunuz. Sizin ledin flaş yapması için kurduğunuz döngü;

For I=0 To 40000
        DelayUS 2
        Next

şekilnde. Yani 100 mS nin altında. Bunu isiste farkedemiyorsunuz.
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

hakıkat

Hocam anlatımlarınızla konuyu daha iyi anladım ve böylece program takibi daha iyi gelişti
anlatımınız ve yardımınız için teşekkürler. Sorun çözüldü programın If US=1 Then hemen
altına US=0 yapınca sorun çözüldü. Teşekkürler.

Powered by EzPortal