tmr0 kesme ayarları

Başlatan bimühendis, 14 Aralık 2017, 14:57:58

bimühendis

İyi günler ,

Ete hocamızın derslerinden kesme kısmına çalışıyordum .Timer0 kesmesi için vermiş olduğu örneğği Proton 'da pic 18f46k22 için uygulamaya çalıştım ancak=başarmadım Düzenlediğim kodlar şöyle nerde hatam var bilemiyorum .Birde option_reg.6 ve cmcon=7 yazınca bende hata veriyor nedenini anlayamadım protonda henüz yeniyim Şimdiden teşekkürler

  Device 18F46K22
    Xtal 4
   
On_Interrupt GoTo kesme


   
  PORTA=0:PORTB=0
  TRISB=%00000000   'PortB tamamı çıkış yapıldı.
  TRISA=%00000000   'A portu tamamı çıkış yapıldı.
    TRISC = %00000000
    TRISD = %10000000
    TRISE = %00001000
    Declare LCD_ENPin PORTE.2 
    Declare LCD_RSPin PORTE.0
    Declare LCD_DTPin PORTD.0   'lcd ekranın son 4 Bit data erişim portu nun 16f628 de belirtilen pin den başladığını ve 3 port daha devam ettiğini belirtir
    Declare LCD_Lines 2        'lcd ekranın 2 satır olduğunu belirtir)
    Declare LCD_Interface 4 '(lcd ekranla 16f628 in 4 Bit haberleşme yapacağını belirtir)

T0CON=%10000101   
INTCON=%10100000 
TMR0L=0
'----------------------------------------------------------------------------
Dim SAYAC As Byte 
Dim SN  As Byte
Dim DAK As  Byte
Dim SAAT  As   Byte
Dim GUN   As   Byte

'-----------------------------------------------------------------------------
BASLA:
Print $FE,$84,Dec2 SAAT,":",Dec2 DAK,":",Dec2 SN
GoTo BASLA

kesme:
Context Save
      SAYAC=SAYAC+1      'kesme sayacı  1 sn= 61(sayac) x 256 (Tmr0) x 64 (bölme)
      If SAYAC=61 Then      '61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
         SAYAC=0            'sayaç sıfırlanıyor
         SN=SN+1            'saniye değeri bir artırılıyor
            If SN=60 Then     'saniye 60 olmuş ise 1 dakika süre geçti o halde
               SN=0           ' 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
         INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
         Context Restore 
                       

         
End


ete

Program yazan kişi mutlaka çalıştığı işlemcinin Data sheet'ini önce bir incelemeli. Ne özellikleri var registerleri nelerdir mutlaka bakmalıdır. İlla İngilizce bilmekde gerekmiyor. Gerekse bile direk tercüme eden yerler de mevcut üstelik.
18F46K22 işlemcide CMCON registeri bulunmuyor. Bunun yerine CM1CON CM2CON  registerleri var ve her iki registere sıfır değerini verirsen komparatörler iptal edilmiş olacaktır.

Diğer işlemcilerde OPTION.6 biti PORTB.0 kesmesinin kenar seçme bitidir. Bu bit sıfır ise HIGH==>LOW geçişinde kesme oluşur veya bu bit 1 ise LOW==>HIGH geçişinde kesme oluşur.
Bu işlemcide Option Registeride bulunmuyor. Bu görevi INTCON2 regsiterinin 6 nolu biti yerine getiriyor. INTCON2.6=1 ise INT0 girişi LOW==> HIGH geçişte kesme oluşturur. INTCON2.6=0 ise bunun tersi olacaktır.

TMR0 kesmesine gelince, yapılması gerekenler sırası ile şunlar;
1. INTCON=%10100000 değeri verilmeli.
2. Kesme oluşunca programın yönlendirileceği kesme etiketi belirlenmeli (ON_INTERRUPT KESME veya ON INTERRUPT GOTO KESME)
3. Kesme içinde ise Yazılım kesmesi yada donanım kesmesi kullndığın duruma göre işler yapılmalı.
Kullandığın yöntem aslında donanım kesmesi gibi görülüyor.
ON_INTERRUPT bir donanım kesmesi yaratacaktır.  Proton da bu tür kesmeler genellikle programın başlangıç bölümüne yazılır ana bölüm kesmenin altına yerleştirilir. değişken tanımları ve   açılış gecikmesinden sonra program Goto Ana bölüm şeklinde ana program kısmına atlatılır.
Kesme içinde ise Context restore ile tüm işlemci registerleri önce kayıt altına alınır ardından yapacakların yerine getirilip enson da kesme bayrağı sıfırlanarak Context Restore ile kesmeden çıkılır.
Yazdıkların buna uyuyor gibi görülüyor. Sadece format da ON_INTERRUPT KESME yazmak yerine ON_INTERRUPT GOTO KESME yazmışsın farkedermi bilemiyorum bilenler söylesin.

Ete

 

bimühendis

#2
Cevabınız için çok teşekkür ederim .Sorunumu kesme programının  içinde TMR0L=0 diyerek çözdüm.Oysaki ben bunu programın üst kısımlarında ayarlamıştım.  kesmenin içine yazınca çalışıyor

ete

Timer kesmeleri aslında belirli ve hesaplanmış bir süre için ayarlanır genelde.
Bu durumda o timer'a ait bir ön yükleme değeri olmalıdır. Bunu hem programın başında TMR0 registerine hemde kesme içinde aynı registere yüklemek gerekir. Sen ise sıfırlayarak bir önyükleme değeri vermiş oluyorsun.
İşin mantığına bakacak olursan, Timer'a sıfırdan başla ve diyelimki 8 bitlik sayac için 255 e kadar say diyorsun. TMR0 sayacı durmayan bir sayactır. Saymaya sürekli devam eder. Bu nedenle yeniden sıfırdan başlatmak için kesmeden çıkmadan evvel sıfırlamak uygun olacaktır.

ete

Powered by EzPortal