Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

TMR1 KESMESİ İÇİN YARDIM

Başlatan border, 02 Nisan 2009, 00:41:02

border

Arkadaşlar sitenin nerdeyse her yerini gezdim. ellde ettiğim bilgiler dorultusunda TMR1 interrupt kesmesini kullanarak yapmış olduğum saati daha hassas yapmak istedim.basit örnek bir programla denemek istedim 1 sn aralıklarla yanıp sönen bir led fakat  ISIS'DEN kaynaklanan bir hatamı yoksa bendenmi anlamadım. led yanıp sönüyor. fakat hata mesajıda veriyor." pc=0x000085  stack overflow executıng CALL instruction"
program bu şekilde ete hocanın bu iş için yazmış olduğu bir program parçası

ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
    PIE1.0 = 1
 INTCON=%11000000
 
 TMR1H=55535            
  TMR1L=0
  T1CON=%00000101  
CMCON=7    '16F628 de komparatör pinleri iptal hepsi giriş çıkış
'----------------------------------------------------------------------------
Comm_Pin    VAR   PortA.4     ' One-wire Data-Pin "DQ" PortB.0 da
Busy        VAR BIT         ' Busy Status-Bit
POZ         var BIT        
HAM         VAR   WORD        ' Sensör HAM okuma değeri
ISI         VAR WORD        ' Hesaplanmış ISI değeri
Float       VAR WORD        ' Holds remainder for + temp C display
X           VAR WORD  
Y           VAR BYTE  
SAYI        VAR BYTE  
SIGN_BITI   VAR HAM.Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
NEGAT_ISI   CON 1           ' Negatif_Cold = 1
Deg         CON 223         ' ° işareti
SIGN        VAR BYTE        '  ISI değeri için  +/-  işaret
TEMP        VAR BYTE         ' Div32 bit hesap için geçici değişken
SAYAC       VAR WORD
SN          VAR BYTE
DAK         VAR BYTE
SAAT        VAR BYTE
GUN         VAR BYTE
symbol  SEC   =PORTA.0
SYMBOL  ASAGI =PORTA.1
SYMBOL  YUKARI=PORTA.2
'-----------------------------------------------------------------------------
CLEAR  'tüm değişkenler sıfırlandı
PAUSE 200

'-----------------------------------------------------------------------------
PORTB=0  
BASLA:
PAUSE 100
GOTO BASLA      
DISABLE
KESME:

   
        SAYAC=SAYAC+1          
        IF SAYAC=100 THEN  
       
       
       sayac=0
         
         SN=SN+1
         
           IF SN=60 THEN  'saniye 60 olmuş ise 1 dakika süre geçti ohalde
             SN=0
           TOGGLE porta.3          ' saniye sıfırlanıyor
              DAK=DAK+1   ' dakika değeri bir artırılıyor
                 IF DAK=60 then   'dakika 60 olmuş ise 1 saat süre geçti
                    DAK=0         ' dakika sıfırlanıyor
                    SAAT=SAAT+1   ' saat değeri bir artırılıyor
                       IF SAAT=24 THEN  'saat 24 olmuş ise 1 gün geçti
                          SAAT=0        'saat sıfırlanıyor
'                           GUN=GUN+1     'gün değeri bir artırılıyor
'                              IF GUN=365 THEN GUN=0  'gün 365 olmuş ise
                       endif                    'gün sıfırlanıyor 1 yıl geçti
                 ENDIF
           ENDIF
           ENDIF
      PIR1.0=0
        ENABLE
        RESUME
       
       
END
yorum yapma, üret

ete

Birinci hata, kesme kullanılan programlarda Pause yerine Pauseus 5 değerinden fazlasını kullanmayın. Daha büyük gecikme yaratmak için;
For I=0 to 1000
pauseus 5
next
şeklinde bir komut satırı kullanın. Burada 1000x5=5000 us=5 ms lik bir gecikme yaratılmıştır. Dikkat  edin gerçekte gecikme daha fazladır. Herbir FOR-Next döngüsü komutlarından dolayıda biraz gecikme gelir.
Daha büyük gecikmeler için döngü yü büyütün. I değişkeni WORD cinsiden olacaktır. 1000 yerine 10.000 veya 65500 gibi değerler alabilir.
Daha büyük gecikmeler için iki adet pauseus komutu al alta kullanın
Bunun sebebi Basic de bir kesme emri geldiği zaman o anda hangi basic komutu işletiliyor ise o bitmeden kesme alt programına geçilemez. Bu nedenle zaman alan Pause gibi komutların süresi mümkün olduğunca kısa tutulmalıdır. Örnekte olduğu gibi Pause 100 komutunun hemen başında kesme oluşsa 100 ms dolmadan kesme kısmına geçilmeyecek buda saatin yanlış çalışmasına sebep olacaktır.

İkinci ve en önemli hata ise;
Kesme kısmında en son satırlarda;
PIR1.0=0
ENABLE
RESUME

şeklinde ki ifade dir. Burada kesmeyi enable yapmadan önce Resume komutunu vermen gerekir halbuki sen tersini yapmışsın.
Doğrusu;
PIR1.0=0
RESUME
ENABLE

şeklinde olacaktır.

Kolay Gelsin
ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

fractal

kesmeler olunca birde gerçek zaman simülasyonda proteusta sorun cıkabiliyor.ama 1 sn yanım sönme olayı cok rahat hatasız yapabilirsin devrende.cünkü ben ms mertebesinde çalıştım pic ile hiç bir sorun çıkmadı.gayettte hassas.
Restantum cogniscutur Quantum deligutur

border

ete hocam yaptığın açıklama için teşekkür ederim .sayende basıc ile ilgili bilgilerimizi genişletiyorum. benim  gibi bir amatör için önemli. elektronik ve program yazma işini kendi kendine öğrenmeye çalışan biri olarak.
 sanırım yazdığınız hatalar dışında tmr1 çalışması ile ilgili başka sorun yok, söylediklerinizi hemen uygulayacağım.
 teşekkürler.
yorum yapma, üret

fractal

şu komut işleme süresi bitmeden kesmeye gitmeme olayı sedece basic içinmi geçerli yoksa ccs c gibi başka derleyicilerdede varmı?
Restantum cogniscutur Quantum deligutur

alayli

Alıntı yapılan: "ete"....................................
Bunun sebebi Basic de bir kesme emri geldiği zaman o anda hangi basic komutu işletiliyor ise o bitmeden kesme alt programına geçilemez. Bu nedenle zaman alan Pause gibi komutların süresi mümkün olduğunca kısa tutulmalıdır. Örnekte olduğu gibi Pause 100 komutunun hemen başında kesme oluşsa 100 ms dolmadan kesme kısmına geçilmeyecek buda saatin yanlış çalışmasına sebep olacaktır.
.................................................................

Ete Hocam PBP'nin eksikliğini ve hatta bence en büyük kusurunu tüm Basic programlarına ve derleyicilerine genellemişsiniz farkında olmadan. Bu dediğiniz olay Proton+ Basic derleyici için geçerli değil. Proton+'da gerçek donanım kesmesi veya PBP'de olduğu gibi yazılım kesmesi kullanmak opsiyoneldir. Gerçek donanım kesmesi kullandığınızda hem kodunuz daha az yer kaplar, hem gerçek zamanlı kesme oluşturabilir ve hem de dilediğiniz uzunlukta gecikme komutunu for-next döngüsü olmaksızın kullanabilirsiniz.

Düzeltme ihtiyacı hissettim...
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

alayli

Alıntı yapılan: "fractal"şu komut işleme süresi bitmeden kesmeye gitmeme olayı sedece basic içinmi geçerli yoksa ccs c gibi başka derleyicilerdede varmı?

Bu sadece PBP ye özgü bir eksiklik. Proton+ Basic derleyicide yada c derleyicilerde bu durum geçerli değil...
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

ete

Aslında sözüm PBP için idi ama PBP sini eksik yazmışım .
Düzeltme için teşekkürler.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

border

pbp 'da işin kalemle yapılan hesabı programda nedense tutmuyor. yani basitce 10 ms lik yapılan gecikmenin 100 kere tekrarı il e1 sn lik gecikme tamam. program  içinde bu böyle değil.deneme yolu ile yaptığım program aşağıda, bunun hesabını bir türlü yapamadım. ama gerçek çalışmada 1sn lik tam olmasada yaklaşık değeri yakaladım.fakat mantıklı hesabı nasıl bulamadım
porta=0:portb=0
trisa=%00001100:trisb=00000000
;-------------------------------------------


ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
    PIE1.0 = 1
       
 INTCON=%11000000
 

  T1CON=%00000001  
CMCON=7    '16F628 de komparatör pinleri iptal hepsi giriş çıkı aktif hale getirild
;-------------------------------------
i var word
a var byte
sayac var word
sn var byte
dak var byte
saat var byte
role1 var porta.0
role2 var portb.3
sivic1 var porta.1
sivic2 var  portb.4
kontrol1 var byte
kontrol2 var byte
porta.2 = kontrol1
porta.3 = kontrol2
porta.1 = sivic1
portb.4 = sivic2

;portb.3=role2

w var byte
;-------------------------------------
clear

a=0
 
portb.3=0
porta.0=0
;-------------------------------------------
 basla:
 
 while porta.2=0              ;kontrol butonuna basldıdğında
    role1=1
       wend
while porta.3=0                ;kontrol2 butona basılınca
       role2=1
           wend
 

if portb.0=0 then
role1=1

goto sag
endif

if portb.0=1 then
portb.4=1
goto sol
endif


sol:
 
gosub tus      
       
if sn=10 then
portb.4=0
endif
if portb.0=0 then
goto basla

endif
goto sol


sag:

 gosub tus      
       
if sn=10 then
 role1=0
 endif
 if portb.0=1 then
  goto basla
 
  endif
 goto sag
 
 tus:
 portb.7=0
 portb.6=0
  while porta.2=0              ;kontrol butonuna basldıdğında
    portb.7=1
       wend
while porta.3=0                ;kontrol2 butona basılınca
       portb.6=1
           wend
     return


   
DISABLE
KESME:
TMR1H=45529
TMR1L=0
    sayac=sayac+1    )
     IF SAYAC=100 then        
        SAYAC=0            
     
        SN=SN+1
            IF SN=60 THEN
            SN=0
           toggle portb.0                
               ' saniye sıfırlanıyor
              DAK=DAK+1                      
                 IF DAK=60 THEN                                i
                    DAK=0
               
             
                                     
                    SAAT=SAAT+1   '
                       IF SAAT=24 THEN  
                          SAAT=0
                         
                          pauseus 10
 ENDIF
  ENDIF
          endif
          endif        
       
      PIR1.0=0    
             
     
        RESUME
        ENABLE
       END


ım.
yorum yapma, üret