Usart kesmesinde RCREG dan datayı alamıyorum?

Başlatan mustafa_cmbz, 24 Şubat 2020, 23:11:55

mustafa_cmbz

Merhabalar.

Daha önce nextion lcd ile usart kesmesi kullandım gayet iyi çalışıyordu.Fakat neden ise şuan simulasyonda usart kesmesi kurup RCREG1 ve RCREG2 den veriyi nextion_bılgı=RCREG1 dediğim de veriyi alamıyorum.

ama kesme içerisinde HSerIn [NEXTION_BILGI,DENEME] yazdığımda peşi sıra 1 tane byte, 1 tane de word gönderdiğimde gayet sağlıklı şekilde veriyi alıp lcd ye yazabiliyorum.


'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2020 [select VIEW...EDITOR OPTIONS] *                                                      
'*          : All Rights Reserved                               *
'*  Date    : 20.02.2020                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
  
  Device=18F25K22
  Declare Xtal=16
  
 
  
  
  Declare All_Digital = TRUE 
  

 '*************************************************************
 
   Declare LCD_Type 0
   Declare LCD_DTPin PORTB.0
   Declare LCD_ENPin PORTB.5 
   Declare LCD_RSPin PORTB.4 
   Declare LCD_Interface 4
   Declare LCD_Lines 2
    
	
   
  Symbol RCIE2 = PIE3.5          'Receiver interrupt enable bit
  Symbol RCIF2 = PIR3.5          'Receiver interrupt flag
  RCIE2 =0
  RCIF2 =0
  
  Symbol PEIE = INTCON.6         'Peripheral(çevresel) interrupt enable bit usart kesmesi için
  Symbol GIE  = INTCON.7         'global interrupt enable
  
  Symbol RCIE = PIE1.5           'Receiver interrupt enable bit
  Symbol RCIF = PIR1.5           'Receiver interrupt flag

 
  
  ;-------------------------------------------------------------------------------
  


  
  Declare Hserial_Baud  = 9600 ' Set baud rate to 9600
  Declare Hserial_RCSTA = %10010000 ' Enable continuous receive
  Declare Hserial_TXSTA = %00100000 ' Enable transmit and asynchronous mode       ' LCD İÇİN KULLANILACAK
  Declare Hserial_Clear  = On ' Clear the buffer before receiving

  'Declare Hserial2_Baud  = 9600
  'Declare Hserial2_RCSTA = %10010000 ' Enable continuous receive
  'Declare Hserial2_TXSTA = %00100000 ' Enable transmit and asynchronous mode      ' DIGER HABERLEŞME İÇİN KULLANILACAK
  'Declare Hserial2_Clear = On ' Clear the buffer before receiving
 
  
  PEIE   = 1
  GIE    = 1
  'RCIE2  = 1
  RCIE   = 1
  RCSTA1.4 = 1 
  'RCSTA2.4 = 1

  On_Interrupt GoTo KESME       'Hardware Interrupt oluştuğunda int etiketine dallan   
  
  
  '****************************
  
  Dim A As Word
  A=0
  
  Dim NEXTION_BILGI As Byte 
  NEXTION_BILGI=0
  
  Symbol LED = PORTC.2
  Output LED 
  
  
  Cls: GoSub MELODI
   
  Dim DENEME As Word 
  DENEME=0
   
 
 '*******************************
 
  GoTo ANA
   
   '-------------------USART Receiver kesmesi-----------------
     
  KESME:
  
  Context Save
  
  GIE=0
  PEIE=0
  
  If RCIF  = 1                 Then EKRAN_INTERUPT
  If RCIF2 = 1                 Then NEXTION_BILGI=0 :  GoTo  EXIT
  
  GoTo EXIT
 
 
  EKRAN_INTERUPT:
 'NEXTION_BILGI = RCREG1  : GoTo EXIT
  HSerIn [NEXTION_BILGI,DENEME]  
  GoTo EXIT
 
 

  

 '*******************/ KESME CIKIS /****************************************

  EXIT:
  
  GIE=1        ' GLOBAL KESMELER AKTİF
  PEIE=1       ' USART KESMESİ
  'RCIF2=0      ' USART BAYRAĞI
  RCIF=0       ' USART BAYRAĞI      
  RCIE  = 1
  'RCIE2 = 1   

  Context Restore
 
  End
 
   

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

  ANA:
  
  If NEXTION_BILGI>0 Then GoSub LCD : NEXTION_BILGI=0 
  
  GoTo ANA

  '***************************
     
  LCD:
  Print At 2,1,"DATA ",Dec4 NEXTION_BILGI
  Print At 3,1,"DATA ",Dec4 DENEME
  Return 
 

   
  MELODI:
  High LED : DelayMS 500 : Low  LED : DelayMS 500
  Return  
  
  '******************************
  '******************************
  '*******************************
  '******************************
 


Bunun sebebi tam olarak nedir? yani aslında karşı taraftan data gönderdiğimde kesme oluşuyor ve bu kesme içinde hserin komutu ile gelen datayı alabiliyorum.Kesmenin oluşmasında sorun yok yani.

mustafa_cmbz

Yakın zamanda protonda usart kesmesi kullanıp derleyen varmı acaba ? konu arada kaynadı da..

mustafa_cmbz

#2
Kendi cevabımı kendim vereyim ama tam olarak nedenini anlayabilmiş değilim.

Bir önceki uygulamam ile kodlarımı tek tek satır satır gözden geçirip karşılaştırdığımda tek farkın " HSerOut2 " data gönderme kısmının şuan ki uygulamam da olmadığını farkettim ve Denedim ve "HSerOut2  " ile data göndermeden usart kesme çalışmıyor.

 Şuan ki uygulamam da sadece usart tan dinleme yapıyorum gelen dataya göre yine karşı tarafa farklı bir data göndereceğim.

Ama dediğim gibi programın başında ilk açılışta 

 
HSerOut2 [1234]
 

demeden usart kesmesi çalışmıyor.

Bunun sebebi nedir ?

datasheet te tam olarak kaçıncı sayfada geçiyor.

Yada neyi yanlış yapıyorum ?
 

OG

Mustafa, kodlara öylesine baktım çünkü çok yorgun ve uykusuzum,

her iki usart'a da kesme mi kullandın tam anlamadım.

Kodlarının dışındaki bazı prensipleri hatırlatayım.
Delayms 500 gibi uzun bekleme süreleri görünüyor, data bu arada geliyor ise, ardından gelen data usart taşmasına sebep olur. Datalar kaybolur.

Delay içinde iken kesme gelebilecek ise
düşük süre, çok kez döngü kullanmanı tavsiye ederim

mesela
x => word
y => word
y=500

for x = 1 to y
delayms 1
clrwdt
next

gibi.

Hattâ kesmeyi kapatıp usartın flagını takip edebilirsin
Mesela
(usart alış flagının ismini hatırlayamadım)

for x = 1 to y
delayms 1
if flag = 1 then
deger = RCREG
endif
clrwdt
next

data 1 adetden çok gelecekse
byte array kullanılır
Dim ARR_byte[7] As Byte
gibi, 7 bytelık dizin

bir de sayac
dim sayac as byte

delay'a girerken
sayac = 0
for x = 1 to y
delayms 1
if flag = 1 then
ARR_byte[sayac]= RCREG
if sayac =  falan_deger then data_degerlendir
sayac = sayac + 1
endif
clrwdt
next

gibi.

data hızına göre (yüksek hızlı geliyorsa) delayms 1 değil de delayus 10 gibi
beklemeler kısaltılır ki gelen değerin üstüne yeni değer gelmeden okunsun
tabi süre kısalınca 500ms 'yi tutturmak için belkide word den büyük donguler ile beklemen gerek
x => Dword
y => Dword

gibi

Çoğu zaman kesme kullanmam (açmam), yalnızca RX flagını takip ederim, böyle bir usul daha sağlam olmakta.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

mustafa_cmbz

#4
Hocam 3 gündür saç baş yolduruyor bana.

Kesme flaglarını proteus ta lcd koyup lcd ye yansıtıyorum deneme amaçlı durum nedir diye artık 3 gündür denemediğin örnek kod VS kalmadı

en son hserot komutunu ana program başına koyup açılışta sadece 1 kez gönderim yaptırın ca herşey normal kesmeden çalışıyor bayraklar da kalkıyor yani herşey çalışıyor

ama HSerOut komutunu silersem kesmeden eser yok bayraklar desen dalgalanmıyor bile 🤣

Bende Bi miktar uykusuz ve yorgunum hocam kafam da allak bullak oldu en iyisi kafaları toparlıyalım öyle bakarız.