tmr1 kesmesindeki hata mantık hatası mı yoksa isis hatası mı.

Başlatan safaka123, 07 Eylül 2013, 23:01:07

safaka123

Buradaki arkadaşların yardımıyla 16f877 de tmr1 kesmesini harici clock ile çalıştırdım ve 100hz değişimi gördüm ana programa birleştirdim ve problem olduğunu gördüm. tek başına iken 100hz gösteren isis ana programa geçince farklı davranmaya başladı. Program çalıştığında 100 hz alabiliyorum. kronometre sayarken 65-70 hz alıyorum daha sonra kronometreyi durdurduğumda 100hz alabiliyorum. Eklediğim programda say bölümü ile dur bölümü arasında lcdout komutu var, bu da sayılan değeri ekrana vermeye yarıyor. LCDOUT komutu tmr1 in çalışmasını askıya alabilirmi yada başka bir deyişle harici clock tan ayarlanan TMR1 kesmesi içeride çalışan komuttan etkilenebilirmi. Bir yerde yazdığına göre tmr1 bir çalışma şekliyle komut çevrimine göre çalışır diye ifade var. acaba ayarlarım mı yanlış . Teşekkürler.

Ayrıca bu çalışmanın isis videosunu da   http://youtu.be/NN_NMu4mW0M   adresinden seyredebilirsiniz.
Yada yüksek çözünürlüklü olarak  http://youtu.be/ipEt7VjseFM     adresinden izleyebilirsiniz.(1-2 saat sonra)

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 29.07.2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
define OSC 8
'include"modedefs.bas"

#CONFIG
__config _XT_OSC & _WDT_OFF & _LVP_OFF & _CP_OFF 

#ENDCONFIG

DEFINE LCD_DREG		PORTB	'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT			4		'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG		PORTB	'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT			3		'LCD Enable Bacağı 3. bite bağlı	
'DEFINE LCD_RWREG    		PORTB	'LCD RW Bacağı PortB de bağlı
'DEFINE LCD_RWBIT     		2		'LCD RW Bacağı  2. bite bağlı
DEFINE LCD_RSREG		PORTB	'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT		1		'LCD RS bacağı 1. Bite bağlı		
DEFINE LCD_BITS			4		'LCD 4 bit  olarak bağlı
DEFINE LCD_LINES		2		'LCD 2 sıra olarak çalışıyor.


cmcon=7




TRISA=%00111111 

TRISB=%00000000         ' KESME BACAĞI AYARLA PORTB.0

TRISC=0 
TRISD=0 
TRISE=0 
ADCON1=7 
' ************************* KESME AYARLARI TMR1 İÇİN YAPILDI EXTERNAL CLOCK ***********

T1CON=%00001011    ' *******  BU DURUMDA EXTERNAL CLOCK ********
PIE1.0=1 
PIR1.0=0
tmr1h=$ff
tmr1l=$ff
INTCON=%11000000     ' GIE VE PIE ÇALIŞIYOR
ON interrupt goto kesme
ENABLE
' ********************  KESME AYAR SONU


'________________________________saat değişkenleri________________________________________________ 
SCL var PORTc.3
SDA var PORTc.4
gossaat var byte
TEMP VAR BYTE
SENSSAY VAR BYTE
bak1 var byte
bak2 var byte
bak3 var byte
bak4 var byte
bak5 var byte
bak6 var byte
atla var byte
lap var byte
lapnr var byte[10]
lapnrsn var byte[10]
lapnrdak var byte[10]
lapnrno var byte[10]
ladres var byte
kay var byte
TMR1IF VAR PIR1.0
clear 
'--------------------------ANA PROGRAM--------------------------------------
 
  'LOW PORTB.2     		'RW bacağı ekrana yazmaya imkan vermek için LOW yapıldı.


goto krono
   
Disable
    KESME:
  if PIR1.0=1 THEN 
   PIR1.0=0
    TOGGLE PORTB.2
    tmr1h=$FF
    tmr1l=$5C
    TMR1IF=0
   ENDIF

  'TOGGLE PORTB.2     '  kesmeye gelip gelmediği kontrol için konuldu.
    senssay=senssay+1

    resume
enable

KRONO:
I2CWrite SDA,SCL,$D0,$07,[%00010011]      'ds1307 32768 hz saysın diye control reg ayarı
bak1=0
bak2=0
bak3=0
bak4=0
ladres=9
lap=0
senssay=0
'disable
Lcdout $fe,1
lcdout $fe,$81,"KRONOMETRE"
lcdout $fe,$8D,"LAP"
lcdout $fe,$C0,dec2 bak2," : ",dec2 bak1," : ",dec2 senssay

krono1:
while porta.5=0   ' bu menü tuşuyla buraya gelindiğinde hala basılı ise işlem yapmasın bıraktığında yapsın.
wend
if porta.2=0 and bak3=0 then
bak3=1
bak4=1
goto say
endif
if porta.4=0 and bak3=1 then goto lap1
if porta.2=0 and bak3=1 then goto dur   'SAYMAYI DURDUR
if porta.2=1 and bak4=1 then goto say   'SAYMAYA BAŞLA
if porta.4=0 and bak3=0 then goto temiz
if porta.4=0 and bak3=1 then goto lap1
goto krono1

say:
while porta.4=0
'disable
wend
while porta.2=0
wend
'enable
if senssay>99 then senssay=0:bak1=bak1+1
if bak1>59 then bak1=0:bak2=bak2+1
lcdout $fe,$C0,dec2 bak2," : ",dec2 bak1," : ",dec2 senssay
goto krono1

dur:
while porta.2=0
wend
'disable
bak4=0
bak3=0
goto krono1

lap1:
while porta.4=0
wend
'disable
lap=lap+1
if bak3=0 then lapnrno[lap]=100
if lap>10 then goto lap2
if bak3=1 then lcdout $fe,$ce,dec2 lap
ladres=9
lapnr[lap]=senssay
lapnrsn[lap]=bak1
lapnrdak[lap]=bak2
if bak3=1 then lapnrno[lap]=lap
kay=lap<<2
ladres=ladres+kay
write ladres,lapnrno[lap],lapnrdak[lap],lapnrsn[lap],lapnr[lap]
ladres=ladres+2

lap2:
if bak6=2 then bak6=0:ladres=13:goto lapkontrol
goto krono1

temiz:
bak1=0
bak2=0
senssay=0
ladres=9
lcdout $fe,1
lcdout $fe,$80,"LAP"
LCDOUT $FE,$85,"ZAMANLAR "
ladres=13
read ladres,lapnrno,lapnrdak,lapnrsn,lapnr
lcdout $fe,$C0,DEC2 lapnrno,"==>",dec2 lapnrdak,":",dec2 lapnrsn,":",dec2 lapnr
while porta.4=0
wend
if lap=0 then bak5=0:goto krono
bak5=0
bak6=2:goto lap1

LAPKONTROL:
read ladres,lapnrno,lapnrdak,lapnrsn,lapnr
if lapnrno=100 then
    bak5=1
    goto lapkontrol2
endif
if bak5=0 then lcdout $fe,$C0,DEC2 lapnrno,"==>",dec2 lapnrdak,":",dec2 lapnrsn,":",dec2 lapnr

lapkontrol1:
if porta.4=0 then goto lapkontrol2
if porta.3=0 then
    while porta.3=0
    wend
    goto krono
endif
if porta.2=0 and bak5=0 then
    else
    goto lapkontrol1
endif
while porta.2=0
wend
if ladres<46 then
    ladres=ladres+4     
    goto lapkontrol
endif

lapkontrol2:
if porta.3=0 then
    while porta.3=0
    wend
    goto krono
endif
while porta.4=0
wend
bak5=0
if ladres>13 then ladres=ladres-4
goto lapkontrol

END




Kabil ATICI

Denemeni gerçek devre üzerinde yap. Bazı durumlarda isis gerçek zamanlı simülasyon yerine getirmeyebiliyor. O yüzen hatanın nereden kaynaklandığını bulamayabilirsin! (sanırım isis testlerinden üst düzey makinalarda deniyorlar veya belirli bir işlem adımına gerçek zaman olacağını gelirliyorlar!)
ambar7

salihonur

Kesme öncelikleri birbirini etkiliyor olabilir. Timer kesmesinin en öncelikli olduğunu kontrol edin.

safaka123

Alıntı yapılan: salihonur - 08 Eylül 2013, 02:58:32
Kesme öncelikleri birbirini etkiliyor olabilir. Timer kesmesinin en öncelikli olduğunu kontrol edin.

cevabınız için teşekkürler fakat ben sadece tmr1 kesmesini aktif yaptım diye biliyorum. Başka kesme aktif değil fakat aktif olduğunda öncelik nasıl verilir bunu bilmiyorum bu nasıl ayarlanır.

matador

16f877'de öncelik ( priority ) ayarlaması yok diye biliyorum. 18F452'de olduğundan eminim. INTCON registerinde priority ayar bitleri var bunlarla öncelik ataması yapabiliyorsun.