PİC 16F628A kesme sorunu - yardım lütfen

Başlatan vlkncn, 17 Nisan 2014, 23:53:41

vlkncn

herkese merhabalar.

16F628 ile rf termometre yapımı ile uğraşıyorum. ete hocamızın bu konudaki projesini alarak üstüne eklemeler yaptım.

fakat alıcı kısmında hem tmr0 kesmesi hemde harici bir kesme(veri alımı için) kullanmak isterken sorunla karşılastım ve çözemedim.

orjinalinde ben tmr0 kesmesi koymadığım da kesme komutu böyleydi : INTCON=%11000000
tmr0 kesmesi için INTCON=%10100000 olarak yazmam gerekiyormuş bu kodu.verici kısmında aynı bu şekilde denedim ve çalıştırabildim.(verici kısımda tmr0 dışında başka bir kesme yok) ama alıcı kısımda bu tmr0 kesmesini de koymak istediğim için çok fazla bilgim olmadığından düz mantık olarak bu kodu INTCON=%11100000 olarak değiştirdim.ama bu seferde sanırım program tmr0 kesmesi içinde sıkışıp kalıyor.
kesme sonunda kesmeyi bitirip başka kesme açma için gerekli olan kodları koyarak da denedim fakat yanlış yapıyorum herhalde.


projeyi ek kısmına koydum.bir göz atıp yardımcı olabilirseniz çok sevinirim.



Alıcı kodları:

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [E.T.E]                                           *
'*  Notice  : Copyright (c) 2007 Ete]                           *
'*          : All Rights Reserved                               *
'*  Date    : 28.11.2007                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ __config _XT_OSC & _WDT_OFF & _MCLRE_ON & _LVP_OFF & _CP_OFF

PORTA=0:TRISA=0
PORTB=0:TRISB=%00000010
CMCON=7
OPTION_REG = %10000101 
INTCON=%11100000
TMR0 = 0
DEFINE OSC 4

DEFINE LCD_DREG PORTB    'LCD data bacaklari hangi porta bagli ?
DEFINE LCD_DBIT 4       'LCD data bacaklari hangi bitten basliyor ?

DEFINE LCD_EREG PORTB    'LCD Enable Bacagi Hangi Porta bagli ?
DEFINE LCD_EBIT 3      'LCD Enable Bacagi Hangi bite bagli ?

DEFINE LCD_RSREG PORTB    'LCD RS Bacagi Hangi Porta bagli ?
DEFINE LCD_RSBIT 0       'LCD RS bacagi Hangi Bite bagli ?

DEFINE LCD_BITS 4       'LCD 4 bit mi yoksa 8 bit olarak ba?ly ?
DEFINE LCD_LINES 2       'LCD Kaç syra yazabiliyor ?

DEFINE LCD_COMMANDUS 2000 'Command delay time in us
DEFINE LCD_DATAUS 50 'Data delay time in us   

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 4MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically


ISI1    VAR     BYTE       
ISI2    VAR     BYTE 
SIGN    VAR     BYTE
TEMP    var     BYTE
I       VAR     WORD
SAYAC   VAR     BYTE
SN      VAR     BYTE
DK      VAR     BYTE
YUKSEK1 var     byte 
YUKSEK2 VAR     BYTE
DUSUK1  VAR     BYTE
DUSUK2  VAR     BYTE
A       VAR     BYTE
B       VAR     BYTE
C       VAR     BYTE
YUKSEK1 = 0
YUKSEK2 = 0

SYMBOL YUK=PORTA.1
SYMBOL DUS=PORTA.2
SYMBOL HAF=PORTA.3
   
SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit

LCDOUT $FE, $40, $06, $09, $09, $06, $00, $00, $00, $00 '
RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO INT
ON INTERRUPT GoTo KESME


lcdout $FE,1
lcdout $FE,2,"LUTFEN BEKLEYIN"
LCDOUT $FE,$C0,"ERCIYES UNI"
PAUSE 5000 

FOR I=0 TO 10200
PAUSEUS 5
NEXT

LCDOUT $FE,1
BASLA:

      lcdout $FE,2,"SICAKLIK:",SIGN,dec ISI1,",",DEC ISI2,0,"C  "
      LCDOUT $FE,$C0,"ERCIYES UNI"
     
      DUSUK1 = ISI1
      DUSUK2 = ISI2
     
      GOSUB KIYASLA
     
      IF YUK=1 THEN
          lcdout $FE,1
          GOSUB BIR
          ENDIF
         
          IF DUS=1 THEN
          lcdout $FE,1
          GOSUB IKI
          ENDIF
         
          IF HAF=1 THEN
          lcdout $FE,1
          GOSUB UC
          ENDIF
         
      GOTO BASLA
     
DISABLE
KESME:
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)
    SN = SN+1
    SAYAC=0
ENDIF
IF SN=2 THEN
    DK = DK+1
    SN=0
    C=B
    B=A
    A=ISI1
ENDIF
IF DK=3 THEN
    DK=0
   
INTCON.2=0 'TMR0 Kesme bayragı sıfırlanıyor
RESUME
ENABLE   
ENDIF

     
DISABLE
INT:
    GIE=0
    hSerIn , [WAIT("ERU"),ISI1,ISI2,SIGN] 
    TEMP=RCREG
    GIE=1
    Resume
    enable
   
   
    '---------------------KIYASLAMA--------------------------------------------------   

KIYASLA:
    if ISI1 >= YUKSEK1 then
        YUKSEK1 = ISI1
        IF ISI2 >= YUKSEK2 THEN
            YUKSEK2 = ISI2
        ENDIF       
    ENDIF
   
    IF  DUSUK1 >= ISI1 THEN
        DUSUK1 = ISI1
        IF DUSUK2 >= ISI2 THEN
        DUSUK2 = ISI2
        ENDIF
    ENDIF       
    return
   
   
'---------------------MENU--------------------------------------------------   

BIR:       
WHILE YUK=1
        LCDOUT $FE,$2,"YUKSEK SICAKLIK"   
        lcdout $FE,$C0,DEC YUKSEK1,",",DEC YUKSEK2,0,"C"   
WEND
        lcdout $FE,1
        GOSUB BASLA
   
IKI:
WHILE DUS=1
        LCDOUT $FE,$2,"DUSUK SICAKLIK"   
        lcdout $FE,$C0,DEC DUSUK1,",",DEC DUSUK2,0,"C"   
WEND
        lcdout $FE,1
        GOSUB BASLA
       
UC:
WHILE HAF=1
        lcdout $FE,1
        LCDOUT $FE,$2,"HAFIZA"   
        LCDOUT $FE,$C0,"KAYITLAR"
        PAUSE 2000
        lcdout $FE,1
        LCDOUT $FE,$2,"1.KAYIT"   
        LCDOUT $FE,$C0,DEC A,0,"C"
        PAUSE 3000
        lcdout $FE,1
        LCDOUT $FE,$2,"2.KAYIT"   
        LCDOUT $FE,$C0,DEC B,0,"C"
        PAUSE 3000
        lcdout $FE,1
        LCDOUT $FE,$2,"3.KAYIT"   
        LCDOUT $FE,$C0,DEC C,0,"C"
        PAUSE 3000
WEND
        lcdout $FE,1
        GOSUB BASLA
       
       

ete

Bir program içinde iki ayrı kesme kullanılabilir. Ancak her ayrı kesme için iki ayrı kesme etiketi kullanılmaz. Kesme oluştuğu zaman program tek bir kesme etiketine gider orada hangi kesmenin oluştuğuna kesme bayraklarına bakarak karar verilir ve hangi bayrak set edilmiş ise o bölüme gidiilir.
Kısaca tek kesme etiketi içinde iki kesme etiketi yer alabilir. Genellikle iki kesme kullanılıyor ise ve program kesme etiketine gelmiş ise bayraklardan birine bakılır o değilse otomatikman diğeridir.
Örnek vereyim
Disable
Kesme:
If intcon.2=1 then.  'Yani tmr0 kesmesi oluşmuş ise
   Sayac=sayac+1
...
...
Intcon.2=0
Goto CIKIS
Endif
Bu satırdan iti baren ise usart kesmesi işlemleri yer almalıdır
Temp=rcreg
CIKIS:
Resume
Enable
Şeklinde yapılmalıdır
Ete
 

vlkncn

sağolun hocam soylediğinizi yapınca oldu.bi sorum daha olacak bu  seferde bekleme süreleri aynı olamsına ragmen alıcı kısım verici kısma gore daha yavaş tepki veriyor bunun sebebi simülasyondan kaynaklı mıdır yoksa alıcı kısımda 2 farklı kesme olması işlemciyi zorladıgından dolayı mıdır?

ete

kesme kısmına eklenen her satır programın kesmeden çıkmasını geciktirir.
Buna birde USART gibi kesmelerde oluşabilecek yanlış alarm kesmelerinide eklersek iki kesmeli programın daha yavaş çalışması doğaldır.
USART kesmesi için işaretçi ve 5 ms lik timeout değerini kullanın (hSerIn ,5,ATLA,[WAIT("ETE"),ISI1,ISI2,SIGN] gibi)
gelen yanlış bilgide işlemci 5 ms bekler istenen gelmemiş ise kesmeden çıkar. Zaten oraya bir bilgi gelince gidecektir. Gelen bir parazit ise ETE bilgisi (işaretçi) gelmeyecektir. İşlemcide 5 ms bekler ve geri çıkar. Ama ETE gelmiş ise geriden gelenleri almaya devam eder.

Ayrıca simulasyonun bütün bunları gösterebilmek için epeyce zorlandığını gözlemleyebilirsiniz. Onun yavaşlığınıda göz ardı etmemek gerekir. Gerçekte daha hızlı çalışır sistem.

Ete

vlkncn


Powered by EzPortal