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.
Yakın zamanda protonda usart kesmesi kullanıp derleyen varmı acaba ? konu arada kaynadı da..
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 ?
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.
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.