16f648A USART Kesmesi

Başlatan ta3usl, 09 Şubat 2017, 13:00:32

ta3usl

Herkese iyi günler diliyorum :)

Elimde 16f648A var. Bunu değerlendirmek istedim. Fakat, 16f1827 de sorunsuz çalıştırdığım USART kesmesini 16f648A da çalıştıramadım.

Sorun şu ki, veri geldiğinde kesme'ye gidiyor. kesmeye başlarken INTCON = 0 ile kesmeleri kapatıyorum. kesmeden çıktığında INTCON registerını geri yüklediğim an tekrar kesmeye gidiyor. INTCON register değerini kesmeden çıkmadan geri verirsem de stack underflow hatası veriyor.

Yazılım tarafında proton 3.5.5.5  simülatör ise , Proteus 8.4 SP0

Datasheet'te anladığım kadarıyla , GIE (INTCON.7) , PEIE (INTCON.6) registerleri ve RCIF (PIR1.5) , RCIE (PIE1.5)  registeri USART kesmesinde kullanılacakmış.

GIE (R/W) set edildi.
PEIE (R/W) set edildi.

RCIE (R/W) set edildi.

RCIF (R) = bu register sadece okunabiliyor. Data geldiğinde otomatik set oluyor ve kesmeye gidiyor. Donanım tarafından silinmesi gerekirken silinmiyor. Ben de yazılımdan direkt ulaşamıyorum. Bu

Registerin otomatik silinmesi hakkında datasheette kaçırdığım bir nokta mı var ? Simülasyondaki bir hata mı acaba ?

Akşama devreyi bord üzerinde kurup deneyeceğim fakat, simülasyonda hatayla karşılaştığım için değerli fikirlerinizi almak istedim.




Device=16F648A

Config FOSC_INTOSCIO , WDTE_ON, PWRTE_ON, MCLRE_OFF, BOREN_OFF, LVP_OFF, CPD_OFF, CP_OFF

All_Digital = TRUE
Xtal = 4


TRISA=%00000000
TRISB=%00000010 
PORTA=0
PORTB=0
             
CMCON = 7 
       
Declare LCD_DTPin PORTB.4
Declare LCD_ENPin PORTA.6
Declare LCD_RSPin PORTA.7
Declare LCD_Interface 4
Declare LCD_Lines 2

Declare Hserial_Baud = 4800
RCSTA = %10010000
TXSTA = $20 ' Enable transmit, BRGH = 0
SPBRG = 12  ' 4800 Baud @ 4MHz, 0,17%
Declare Hserial_Clear = On


' Pinlerle ilgili tanımlar bunlar...
'***************************

Bu bölümde yazılımla ilgili değişken tanımları var...

'*******************************

'kesme ile ilgili parametreler

On_Hardware_Interrupt GoTo kesme
PIE1 = %00100000
INTCON = %11000000
       
GoTo BASLA
'
kesme:
Context Save
            INTCON = 0

            Print $FE,1
            DelayMS 5
            Print At 1,1,"Kesme var ", Dec PIR1.5           

            DelayMS 500 'bu bekleme gereksiz gibi olsa seri iletişimin tamamen bitmesini beklemek için koydum. Artık neleri deniyorum işte :)

Context Restore

BASLA:

INTCON = %11000000

        Print $FE,1
        DelayMS 5
        Print At 2,1," KESME YOK ", Dec PIR1.5

       delayms 1000


goto BASLA

ete

Kesmeden çıkmadan önce TEMP=RCREG derseniz RCIF silinecektir. Açıklamanızdan anlaşıldığına göre bayrak (flag) silinmediği için sistem sürekli kesmede kalmaya zaorlanmış oluyor.
Ulaşılamayan RCIF biti receiver resgisterininboşaltılmasından sonra otomatik silinir. Bunuda registeri kendi değişkeninize aktararak yapabilirsiniz.

Ete

ta3usl

Hocam teşekkürler.

Aynen dediğiniz gibi , kesmeden çıkmadan önce TEMP=RCREG satırını eklediğimde  RCIF biti sıfırlanıyor ve yazılım ana döngüde kalıyor.

Fakat , ikinci bir data gönderdiğimde RCIF set olmadı ve kesmeye gitmedi. Fazla vaktim yoktu nedeni hakkında mantık yürütemedim , akşama bord üzerinde de denemeler yapacağım.

Teşekkürler.

ete

Kesme içinde INTCON=0 demişsin bu tüm kesmeleri iptal eder.
Ama çıkarken tekrar set etmemişsin. Aslında o komutda orada gereksiz.
Kesme içine girildiğinde derleyici kesmeleri kapatıyor (DISABLE komutu bunu yapar) zaten. Çıkarken de Tekrar açar (bunuda ENABLE yapar). Ama sende ne yazıkki DISABLE ,ENABLE komutlarını göremedim. Protonda kullanılmıyormu acaba bilemiyorum.
Ama sorunun kesmeyi kapatım tekrar açmamış olman.

Ete 

ta3usl

#4
Sanırım işyerindeki bilgisayarda aceleden bir şeyi gözden kaçırdım.

Evde sorunsuz çalıştı. Hatta şu an board üzerine kurdum, sorunsuz çalışıyor.

Kulağıma küpe olsun, Proton basic USART kesmelerinde TEMP bir byte değişkeni olmak üzere Context Restore önüne TEMP=RCREG  ekleyerek programa şekil veriyoruz.

16f1827 de buna gerek olmadan çalışıyordu.

Teşekkürler.

Powered by EzPortal