Picproje Elektronik Sitesi

DERLEYİCİLER => Proton+ => Konuyu başlatan: mustafa_cmbz - 26 Kasım 2018, 22:05:25

Başlık: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: mustafa_cmbz - 26 Kasım 2018, 22:05:25
Merhabalar..

Geçenlerde forumdaki konulardan yola çıkarak örnek kodları inceleyerek usart interrupt olayını isiste denedim ve gayet başarılı çalışıyordu.

Fakat 18F24K22 nin her iki usart ını da kullanacağım ve yeni gelişen durumlardan dolayı 2 usartı da interrupt ile okumak istiyorum.

Fakat bir türlü 2. interrupt ı kuramadım yada kesme oluştuktan sonra ayırt edemiyorum.bilemedim..

Diğer ıvır zıvır etiketler tanımlamalar ve değişkenler olmadan kodu sade bir şekilde paylaşıyorum.

Device=18F24K22
 Xtal=20


 All_Digital=TRUE
 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


 Symbol PEIE2 = INTCON2.6       'Peripheral(çevresel) interrupt enable bit usart kesmesi için
 Symbol GIE2  = INTCON2.7       'global interrupt enable
 Symbol RCIE2 = PIE2.5          'Receiver interrupt enable bit
 Symbol RCIF2 = PIR2.5          'Receiver interrupt flag


 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
 
 ' PIR1.5 ve PIR3.5
 
 GIE=0
 GIE2=0
 RCIE=1
 RCIE2=1
 PEIE=1
 PEIE2=1
 GIE=1
 GIE2=1

 On_Interrupt GoTo KESME       'Hardware Interrupt oluştuğunda int etiketine dallan



 
 BASLA:

 SENSORLERI_EKRANA_YAZ :  NEXTION_BILGI=0  ' EKRAN ACILDI DEGERLERI ILK OLARAK OKU
 GoSub SENSOR_OKU
 DelayMS 4000 : GoSub MELODI : GoSub MELODI
 ORTAM_SICAKLIK=10
 GoSub SENSORLERI_EKRANA_YAZ
 DelayMS 1000
 
 
 GoTo BASLA
 
 
 KESME:
 Context Save
 GIE=0                     
 GIE2=0
 PEIE2=0
 PEIE=0                     
 RCIE=0                     
 RCIE2=0
                       
 If RCIF  = 1 Then SERIAL_1_BAK
 If RCIF2 = 1 Then SERIAL_2_BAK
 GoTo KESME_BITTI
 
 SERIAL_1_BAK:
 HSerIn [NEXTION_BILGI]
 GoTo KESME_BITTI
 
 SERIAL_2_BAK:
 HSerIn2[ID,TORBA_SICAKLIK]
 GoTo KESME_BITTI                   
                     
                           

 
 KESME_BITTI:

 RCIE=1                     'Receiver interrupt enable bit
 RCIE2=1
 PEIE=1
 PEIE2=1                     'Peripheral interrupt enable bit
 RCIF=0
 RCIF2=0                     ''Receiver interrupt flag
 GIE=1
 GIE2=1
                   
                       

 Context Restore
 End 
Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: Maxim - 27 Kasım 2018, 09:06:43
RCSTAx registerlarını kontrol edermisin
rcsta1.7=1
rcsta2.7=1
Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: mustafa_cmbz - 27 Kasım 2018, 10:04:28
Alıntı yapılan: Maxim - 27 Kasım 2018, 09:06:43RCSTAx registerlarını kontrol edermisin
rcsta1.7=1
rcsta2.7=1

Kesmenin oluşup oluşmadığına mı bakacağız onu anlamadım ?

Declare Hserial2_RCSTA = %10010000

Başta tanımlı olan kısımda 7. Bit 1 olarak ifade edilmiş
Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: yas - 27 Kasım 2018, 12:40:04
@mustafa_cmbz hocam,

Alıntı YapHSerIn [NEXTION_BILGI]

Alıntı YapHSerIn2[ID,TORBA_SICAKLIK]

Burada kayıtsız şartsız bilgi gelmesi bekleniyor. Koda timeout eklemenizi öneririm.
Birde uart bayraklar yani "RCIF" lere sıfır atanınca temizlenmiyor. "RCREG" ler okunduğunda temizleniyor.
Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: yas - 27 Kasım 2018, 12:47:02
Alıntı yapılan: mustafa_cmbz - 27 Kasım 2018, 10:04:28Kesmenin oluşup oluşmadığına mı bakacağız onu anlamadım ?

Declare Hserial2_RCSTA = %10010000

Başta tanımlı olan kısımda 7. Bit 1 olarak ifade edilmiş

@Maxim in söylediği de ihtimaller arasında bazı durumlarda uart hataya düşerek donanımı kapatıyor. Tekrar kontrol etmek gerekiyor. Yalız ben şu şekilde kontrol ediyorum

If RCSTA.1=1 Then
  RCSTA.4 = 0
  RCSTA.4 = 1
EndIf
Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: fide - 27 Kasım 2018, 14:30:58
http://fidenetgaraj.blogspot.com/2018/11/masa-lambas-donanm-ve-yazlm.html?m=0

Aynı programlama dili değil ama yukardaki linkte bu İşlemcinin iki seri port kullanım örneği var.
Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: mustafa_cmbz - 27 Kasım 2018, 15:32:01
Alıntı yapılan: yas - 27 Kasım 2018, 12:40:04@mustafa_cmbz hocam,

Burada kayıtsız şartsız bilgi gelmesi bekleniyor. Koda timeout eklemenizi öneririm.
Birde uart bayraklar yani "RCIF" lere sıfır atanınca temizlenmiyor. "RCREG" ler okunduğunda temizleniyor.

Hocam timeout a gerek varmı ki kesme kullanırken?

Kesmeye girmesi için zaten serialden bilgi gelmesi lasım. Geldiyse buraya dallanıyor veriyi alıp kesmeleri tekrar açıyor vs vs vs.


Son olarak alayli hocamla görüştüm öncelik vermelisin falan dedi kesmelere aynı anda gelirse falan diye o kısımlar nasıl olmalı acaba ?
Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: Maxim - 27 Kasım 2018, 17:56:23
18 serisinde int kesmeleri için öncelik sıralaması tanımlayabiliyorsun
tanımlamazsan 16F serisi gibi standart olur

bu olay RCON registerından yapılıyor
önce RCON.7=1 diyorsun ve (Enable priority levels on interrupts) oluyor
artık her kullandığın interrupta öncelik verebiliyorsun.

mesela bu uart kesmesini high interrupt yaparsın
ama basit bir timer vardır onu low yaparsın
eğer çok interrupt yoksa sadece serial varsa bence bunlara gerek yok.

mesela diyelim timer1 high interrupt yapıcaz
IPR1.0=1 (TMR1IP: TMR1 Overflow Interrupt Priority bit)
bu sıfır ise low interrupt oluyor (yani düşük seviyeli interrupt)

uart da aynı registerdaymış
RC1IP: EUSART1 Receive Interrupt Priority bit
IPR1.5=1 dersen eusart 1 alma int high seviyede oluyor

TX1IP: EUSART1 Transmit Interrupt Priority bit
IPR1.4=1 dersen usart 1 gönderim int high oluyor..

ama dediğim gibi bu durum çok interrupt kullanıyorsan sana fayda sağlar.
2 tane serial
3 tane timer
2 tane ccp
zaten o zaman işin oldukça zor

Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: mustafa_cmbz - 28 Kasım 2018, 19:40:47
Benim yapmak istediim kısaca şu şekilde hocam :

18f24k22 nin her iki usart girişini interupt ile dinlemek istiyorum.kısacası ama biraz açmak gerekirse:

2 tane kartım var biri nextion lcd nin olduğu ana kartım birde uzakta olan ve üzerinde 2 adet ds18b20 ve 1 adet dht22 olan bir kartım var.

Senaryo şöyle :

ana program koşarken nextion dan butonlara basıldığında bilgiyi almalıyım. ( buraya kadar sorun yok )

ama 2. usartıda interupt tan almak istersem yani:

ana programda atıyorum 2dk da bir sensör kartına basit bir 10 bilgisi gönderiyor sensör kartı bunu alınca sensörleri ölçüp tekrar ana karta ölçtüğü değerleri gönderiyor.

bunu interupt ile yapmak istiyorum ki ana programı kullanması daha kolay olsun.ana program içerisinde devam lı HSERın ile data beklemek istemiyorum.

yani kısacası 2. usartı ta intertup ile almak istiyorum ama aynı anda nextionda gelen bilgiyi de yine aynı şekilde interupt tan almam gerek.Öncelik bu durumda gerekir mi onuda bilmiyorum.

register ayarları konusunda yardımcı olabilirmisiniz ?

Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: OG - 29 Kasım 2018, 03:42:13
Data gelmiş
Kesme oluşmuş
Kesme için gittiğin yerde

tekrar data beklemişsin, üstelik birisi için 2 byte beklemişsin

HSerIn [NEXTION_BILGI]
HSerIn2[ID,TORBA_SICAKLIK]

Kesmenin oluşmasına sebep data alınmış olması,
data gelmiş ki kesme oluşmuş.

Gelen data nerede?  RCREG içeriğinde, gelen datayı değişkenine almak için
NEXTION_BILGI = RCREGx  (x = usart 1 için 1, diğeri için 2 )
demelisin.
mantık böyle olmalı.

Diğer kesmeye giriş, çıkış, bayrak temizleme falan onlara bakmadım.
Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: Hattusa - 29 Kasım 2018, 12:05:00
tek usart ve farklı ID adresleri ile bu iş olmuyor mu?
Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: mustafa_cmbz - 03 Aralık 2018, 23:01:50
Alıntı yapılan: OG - 29 Kasım 2018, 03:42:13Kesmenin oluşmasına sebep data alınmış olması,
data gelmiş ki kesme oluşmuş.

Gelen data nerede?  RCREG içeriğinde, gelen datayı değişkenine almak için
NEXTION_BILGI = RCREGx  (x = usart 1 için 1, diğeri için 2 )
demelisin.
mantık böyle olmalı.


Hocam incelediğim örneklerde öyle idi.

Yani kesme içinde:
dediğiniz gibi kesme olduysa data gelmiştir onu değişkene çek diyorsun.

Peki benim örnekteki gibi 2 tane word gelecekse nasıl olacak onu anlamadım.

Yani Hserout [var1,var2] diye 2 word gönderdiğimde alıcı tarafta bu 2 word ü nasıl alacağım ?

Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: OG - 04 Aralık 2018, 05:04:52
Öncelikle, usart kesmesi kullanılıyorsa, yani datanın alımı kesme ile sağlanıyor ise HSerIn gibi komutlar kullanılmaz.
Kesmeli calismada;
Yazılımın içinde bir şeyler birşeyler ile uğraşırken, usart donanımı datayı aldı ise, yazılımında o an yaptığın işten bağımsız olarak kendisi kesme rutinine zıplar,
o rutin içinde ne işler yapacağımızı da biz daha önceden belirlemişizdir.

Birden fazla data alınıyorsa (elbet genelde öyle olur) bir data sayac degiskeninden yardim alinir.
Gelen dataları depolamak icin de array (dizi) kullanılırsa islem kolaylasir.
Dizi'nin indexi de data sayac için atadigin degiskendir, ve her data alistan sonra +1 yapılıp sayac ilerletilir.

Yani kesme rutininde

gelen_data[sayac] = RCREG
Inc sayac  '' data alındıktan sonra sayac 1 artti


Gönderilen data da genelde 1'den fazladir ve bunlar ardi ardina gelir
Onemli olan bunlarin kacirilmadan alinmasidir.
USART kacirmaz ama gelen data usarttan cekilmez ise (RCREG okuyarak cekilmis olur) usart tasma hatasi verir.
Datayi kaciran USART donanimi degil, bizim yeterince hizli davranmamamiz olur.
Neler icin?
Kesme geldiginde kesme rutinine otomatik zipladik,
orada zaman kaybetmeden
-kesmeyi kapatma
-gereken bayraklari kontrol (tasma veya frame error gibi durumlar) ve temizleme
-error yok ise datayi RCREG'den cekme,
-tekrar kesmeyi acip o rutinden cikma
(kesmeyi kapatma ve acma otomatik yapiliyormu idi su an tam hatirlayamadim)
gibi, bunlar hic vakit kaybetmeden yapilmali.

Datayi gonderme hizina gore islemcin yeterince hizli ise bunlari problemsiz yaparsin
Veya,
Datayi gonderen taraf da zaten senin kendi yazilimin ise,
gonderimlerinin arasına 5-10 usn veya ne her kadar gerekli ise o kadar bekleme ilave edersin ki alis tarafinda bu isleri sıkıntısız yapabilesin.

Mesela 9600 hızda data gonderiyorsun ve islemcin 20MHz calisiyor, bu durumda alis genelde sorunsuz olur.

Emin olmadigim bir not daha;
Gecmis yillarda konusulmustu, delay rutinleri icinde isenve bu anlarda kesme olusursa delay'in bitmesini bekler gibi.
Emin degilim ama bu durumlarda data kacabilir, zaten usart ust uste data alip RCREG okunmadigi icin tasma hatasi verir (flag ile).
Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: OG - 04 Aralık 2018, 05:16:00
Alıntı YapPeki benim örnekteki gibi 2 tane word gelecekse nasıl olacak onu anlamadım.
burayi atlamisim,
Word veya daha buyuk degiskenler de 8Nx gibi yapilarda byte byte gider, adı üstüne 8 bit yani byte.
Once en dusuk degerlikli byte gider, sonra daha yuksek degerlikli byte.

tx word yapida degisken olsun
Hserout [tx]
dersen aslinda sunu demissin anlamidadir
Hserout [tx.LowByte, tx.HighByte]

Alışda da
once tx.LowByte 'ı
sonra tx.HighByte'ı
alacagini bilerek islem yapmalisin.
Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: Hattusa - 04 Aralık 2018, 12:42:20
OG ustam,usart alımında biz dataları gelenyani java da şöyle bir örnek var;


 for (int i = 0; i < b.length; i++) {
                            deger[i] = b[i] & 0xff;    //convert to int
                        }

burada b.length gelen datanın byte cinsinden adedini belirtmekte, protonda gelen datanın adedini nasıl biliriz? yada nasıl yapabiliriz?


Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: mustafa_cmbz - 04 Aralık 2018, 21:30:38
@OG hocam

KESME:
 
 Context Save
 GIE=0
 GIE2=0   
 
 
                 
 'hserin [NEXTION_BILGI]
 NEXTION_BILGI   = RCREG1
 CO2             = RCREG2
                 
 RCIF2=0
 RCIF=0
 GIE2=1
 GIE=1
 
 Context Restore
 End


kesme kısmım bu şekilde fakat 2. rx ten gelen bilgiyi alamıyorum.

CO2             = RCREG2
ya kesmeyi kuramadım yada datayı alamıyorum bilemedim.Ufak bir örneğiniz varmıdır kesmeleri kurma açma kapama ile ilgili..

Ayrıca;

Ds18b20 kullanacağım için sıcaklık bilgisini word olarak karşıya göndermem gerekiyor bunu sayaç kurup 2 byte şeklinde almalısın dediğin kısma da örnek verme şansın varmıdır ?

çıkamadım işin içinden..


Ayrıca extra bilgi hatırlayamadım demiştin.Beklemeler kesmede gecikmeler yaratıyor...

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: OG - 05 Aralık 2018, 06:32:39
Alıntı yapılan: undefinedgelecek olan datanın adedini X belirliyor yani kaç byte olduğunu bilemiyoruz, bunu protonda belirleyebilirmiyiz?
X belirlemiyor, data geldikce X'i 1 arttırıp kaç data geldiğini görüyoruz. Beklediğimiz yeterli sayıda data geldi ise değerlendirmelerimizi yapıyoruz.
Data onunde bir header bilgisi koyulursa değerlendirmek kolaylaşır.
Mesela header bilgisi string olarak 3 byte ve "PRO" olsun
X = 0 için (ilk alınacak değer) "P" değil ise X arttırılmaz
X=0 için gelen illa "P" olmalı, değise X = 0, "P" ise X=X+1
X=1 için gelen illa "R" olmalı, değise X = 0, "R" ise X=X+1
X=2 için gelen illa "O" olmalı, değise X = 0, "O" ise X=X+1
gibi,
bu header yöntemi işi kolaylaştırır

- - -
Alıntı yapılan: undefinedkesme kısmım bu şekilde fakat 2. rx ten gelen bilgiyi alamıyorum.
2. usartın kesmeleri doğru yönetilemiyordur. Şu an hemen paylaşabileceğim örnek hazırda yok.
Alıntı yapılan: undefinedbunu sayaç kurup 2 byte şeklinde almalısın dediğin kısma da örnek verme şansın varmıdır ?
Soru sayac ve onu ilerletme ise üstte verdiğim örnekteki gibi basit bir yöntem
word bilginin geliş sırasına dikkat edilirse (önce low sonra high byte) ve doğru değerlendirilirse basitce cözülür


mesela data dizinin şöyle olsun
"PRO", word_bilgi
Aslında bu şöyledir
"P","R","O", word_bilgi.lowbyte , word_bilgi.highbyte
yani toplam 5 byte
5 byte array 'imiz var, adi gelen olsun,
sayac 0'dan başlayacak.

Baslangicta sayaci temizledik
sayac = 0

kesmeyi aktifledik,
kesme oluştu
gittik

gelen[sayac] = RCREGx
datayi aldik, kesme ayarlarini hemen tekrar kurduk çıktık,
ama vakit geçirmeden kontrolleri yaptık ki sayac doğru değerde
(kontrolleri sonradan da yapabilirsin ama, hatalı alışları dikkate alırsak bu durumda array boyutunu daha büyük tutmak gerekir)
sayac = 0 ise gelen[0] = "P" midir kontrol ettik
evet "P" imis, sayac = sayac + 1 yaptık
hayir "P" değil imis, sayac = 0

sayac = 1 ise gelen[1] = "R" midir kontrol ettik
evet "R" imis, sayac = sayac + 1 yaptık
hayir "R" değil imis, sayac = 0

sayac = 2 ise gelen[2] = "O" midir kontrol ettik
evet "O" imis, sayac = sayac + 1 yaptık
hayir "O" değil imis, sayac = 0

sonraki sırada doğal olarak
gelen[3] = word_bilgi.lowbyte
gelen[4] = word_bilgi.highbyte

olacak.
Ancak bu bilgi yanlış gelmiş de olabilir. Bir kontrol yöntemi de buna uygulamak gerekir.
Bu kontrolün en basit yöntemi
word_bilgi 'yi 2 defa gondermek, ve alınanların aynı bilgi olup olmadığını birbiri ile karşılaştırmaktır.
2 defa göndermek yöntemini seçersen gönerme
Hserout ["P","R","O", word_bilgi.lowbyte, word_bilgi.highbyte, word_bilgi.lowbyte, word_bilgi.highbyte]

olur.
Bu durumda Array de 5 değil en az 7 indexli olmalı
we
gelen[3] = word_bilgi.lowbyte
gelen[4] = word_bilgi.highbyte
gelen[5] = word_bilgi.lowbyte
gelen[6] = word_bilgi.highbyte

gelen[3], gelen[5] e eşitmi
gelen[4], gelen[6] ya eşitmi
şeklinde kontrol edip doğru gelip gelmediğine karar verilmeli.

Daha güvenilir CRC gibi yöntemler de kullanabilirsin elbet, biraz daha işlem ilavesi getirir,
üstteki en basit yöntemdir,
bu en basit yontem ile daha guvenilir iş yapmak istersen bilgiyi 2 değil, 3 defa, 4 defa da gönderip o kadar eşitlik kontrolu yapabilirsin.


Alıntı yapılan: undefinedAyrıca extra bilgi hatırlayamadım demiştin.Beklemeler kesmede gecikmeler yaratıyor...
Böyle ise
uzun bekleme süreleri değil de
kısa ve tekrarlı bekleme süreleri döngüleri işine yarar.
mesela 100ms beklemen gerek
Delayms 100 değil de
2000 kere 50 usn lik bekleme dongusu kurarsın (for next ile)
O zaman Delayus 50 olan bekleme süren ile
her bekleme süresi olan 50 usn de bir çıkmış olursun,
kesme oluştu ise o bekleme süresi sonunda datayı kaçırmamayı sağlarsın. Tabi bu 50 usn örneği düşük hızlı gönderimler için.
Mesela 9600 hız için (8N1) 1 Byte gitme süresi 1/960 = 0,00104166 sn yani 1,042 ms gibi bir süredir.
Sen ise üstteki durumda 50 usn de bir kesme rutinine gitmeyi garantilemiştin. Gelen datayı alıp taşmayı engellemeiş oldun.
gibi.
Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: mustafa_cmbz - 05 Aralık 2018, 22:50:53
Symbol PEIE2 = INTCON2.6        'Peripheral(çevresel) interrupt enable bit usart kesmesi için
 Symbol GIE2  = INTCON2.7        'global interrupt enable
 Symbol RCIE2 = PIE3.5          'Receiver interrupt enable bit
 Symbol RCIF2 = PIR3.5          'Receiver interrupt flag


 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
 
 ' PIR1.5 ve PIR3.5

 
  On_Interrupt GoTo KESME       'Hardware Interrupt oluştuğunda int etiketine dallan     
 


 RCIE=1
 RCIE2=1
 
 PEIE=1
 PEIE2=1
 
 GIE=1
 GIE2=1
 
 RCIF=0
 RCIF2=0




'*************************/ ANA PROGRAM /*****************************

  BASLA:
 
  For A=0 To 1000
 
  If NEXTION_BILGI = ANA_SAYFA_DON  Then GoSub NEXTION_ANA_SAYFAYA_GEC       :  NEXTION_BILGI = 0
  If NEXTION_BILGI = CO2_TUS        Then GoSub NEXTION_CO2_SAYFAYA_GEC       :  NEXTION_BILGI = 0
  If NEXTION_BILGI = NEM_TUS        Then GoSub NEXTION_NEM_SAYFAYA_GEC       :  NEXTION_BILGI = 0
  If NEXTION_BILGI = SICAKLIK_TUS   Then GoSub NEXTION_SICAKLIK_SAYFAYA_GEC  :  NEXTION_BILGI = 0
  If NEXTION_BILGI = FAN_TUS        Then GoSub NEXTION_FAN_SAYFAYA_GEC       :  NEXTION_BILGI = 0
 
  DelayMS 50 : GoSub SENSOR_OKU : GoSub MELODI
  Next
  GoTo BASLA

'------------------------------------------USART Receiver kesmesi-----------------

 KESME:
  'Disable
 Context Save
 GIE=0
 GIE2=0   
 PEIE=0
 PEIE2=0
 
 NEXTION_BILGI            = RCREG1
 USART2_DATA              = RCREG2
 
 CO2=USART2_DATA : GoSub SENSORLERI_EKRANA_YAZ :  CO2=0  : USART2_DATA=0
                 
 RCIF2=0
 RCIF=0
 GIE2=1
 GIE=1        'Yani INTCON.7=1 kesmeleri açtik.
 'Resume                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
 'Enable
 Context Restore
 End 

kodun genel hatları bu şekilde.

--------------------------

2. usartı girişini interupt a bağladım..

Symbol RCIE2 = PIE3.5          'Receiver interrupt enable bit
 Symbol RCIF2 = PIR3.5          'Receiver interrupt flag

yukarıdaki PIR3.5 VE PIE3.5 i data sheetten bakarak düzenledim.

Fakat:

Data alıyor ama aldıktan sonra takılıp kalıyor.Kesmeden mi çıkmıyor nerde kalıyor nerde donuyor isis te simulasyonda da göremiyorum.Sanki programda bekleme yaptığında simulasyon bekleme süresince duruyor ya o nun gibi simulasyon duruyor gibi geldi.



Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: mustafa_cmbz - 08 Aralık 2018, 13:22:22
@OG hocam merhabalar..

KESME:
 Context Save
 GIE=0
 GIE2=0   
 PEIE=0
 PEIE2=0
 RCIF2=0
 RCIF=0
 
 
 'NEXTION_BILGI            = RCREG1
 USART2_DATA               = RCREG2
 'HSerIn2 [CO2]
 
 If SAYAC = 0 Then USART2_DATA[0] = "M" : SAYAC = SAYAC + 1
 If SAYAC = 1 Then USART2_DATA[1] = "C" : SAYAC = SAYAC + 1

 If USART2_DATA[2] = USART2_DATA[4] And  USART2_DATA[3] = USART2_DATA[5]  Then USART2_WORD.LowByte  = USART2_DATA[2] : USART2_WORD.HighByte = USART2_DATA[3] : CO2=USART2_WORD  : USART2_DATA=0 : SAYAC=0  :  High KOD_LED



 SAYAC=0

 GIE=1
 GIE2=1   
 PEIE=1
 PEIE2=1
 RCIF2=1
 RCIF=1             'General interrupt enable bit
 
 Context Restore
 
 End

Verdiğin örnekleri kod'a uyarlamaya çalıştım...

Data geliyor alıyorum datayı bahsettiin şekilde teyit edip kontrol ediyorum o kısımdan da doğru bir şekilde geçip karşılığında LED yaktırıyorum fakat elde ettiğim değeri bir türlü kesme etiketinin dışında kullanamıyorum.

Nerede yanlış yapıyorum ?
Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: Hattusa - 08 Aralık 2018, 17:32:15
RCIF2=1
 RCIF=1

usart kesmelerinin bayraklarını sıfırlaman gerekirken neden bayrakları 1 de tutuyorsun? normalde RCIF usart kesmesi oluştuğunda otomatik olarak 1 oluyor, biz kesme içinde o bayrağa göre kesme içinde etiketleniyoruz sonrada  o bayrağı siliyoruz. yani çıkışta 0 laman gerekiyor
Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: mustafa_cmbz - 08 Aralık 2018, 17:37:59
  On_Interrupt GoTo KESME      'Hardware Interrupt oluştuğunda int etiketine dallan   
 

 
 RCIE=1
 RCIE2=1
 
 PEIE=1
 PEIE2=1
 
 GIE=1
 GIE2=1
 
  DelayMS 2000
  GoSub SENSOR_OKU


'*************************/ ANA PROGRAM /*****************************

  BASLA:
 
  For A=0 To 10
  DelayMS 10
 
  Next
  GoSub SENSOR_OKU :GoTo ANA
 
  ANA:
  If SAYAC=4 Then SAYAC=0 : USART2_WORD.LowByte = USART2_DATA[2] : USART2_WORD.HighByte = USART2_DATA[3] : CO2= USART2_WORD : GoSub SENSORLERI_EKRANA_YAZ  :  High KOD_LED
  GoTo BASLA

 '------------------------------------------USART Receiver kesmesi-----------------

 KESME:
 Context Save
 GIE=0
 GIE2=0   
 PEIE=0
 PEIE2=0
 RCIF2=0
 RCIF=0
 
 
  'NEXTION_BILGI            = RCREG1
 
 USART2_DATA[SAYAC]= RCREG2 : SAYAC=SAYAC+1
 
 GIE=1
 GIE2=1   
 PEIE=1
 PEIE2=1
 RCIF2=1
 RCIF=1            'General interrupt enable bit
 
 Context Restore
 
 End

@OG Hocam yardımların için çok teşekkür ederim.

Sonunda usart2 kesmesinden datayı almayı başardım.

En başta anlamadığım şuymuş:

Ben usart kesmesindeki byte byte gelen datayı HSERİN komutundaki gibi direkt

USART2_DATA= RCREG2
diyince alacağımı sanıyordum ve sonra sırası ile array dizinine koymak gerektiğini sanıyordum.OYSA öyle değilmiş..:

karşıdan Hserout ["M","C",SICAKLIK.LOWBYTE,SICAKLIK.HIGHBYTE] diye bilgi gönderdiğimizde

Bu sırası ile "m" harfini 1 byte olarak gönderip alıcı kısmı kesmeye sokup bilgiyi alıp kesmeden çıkıp gönderici tarafın "c" harfini aradan zaman geçmeden tekrar gönderip alıcı tarafı tekrar kesmeye soktuğunu ( diğerleri için de aynı şey geçerli) gözlemlemem ile iş değişti...

yani byte byte gönderip her gelen byte paketinde bir kez kesmeye gidip gelen byte paketini RCREG2 tan almak ve tanımladığımız byte dizinine dizmek  gerekiyormuş..

Geriye güvenlik önlemleri kaldı.Çok teşekkür ederim...
Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: mustafa_cmbz - 08 Aralık 2018, 22:59:49
Alıntı yapılan: pro-TR - 08 Aralık 2018, 17:32:15RCIF2=1
 RCIF=1

usart kesmelerinin bayraklarını sıfırlaman gerekirken neden bayrakları 1 de tutuyorsun? normalde RCIF usart kesmesi oluştuğunda otomatik olarak 1 oluyor, biz kesme içinde o bayrağa göre kesme içinde etiketleniyoruz sonrada  o bayrağı siliyoruz. yani çıkışta 0 laman gerekiyor

Selami abi 2. usart aktif fakat şöyle bir sıkıntım var şuan 1. usarttan bilgiyi alamıyorum yada kesme olduğunda hangi değeri alacağımı karıştırıyorum.

Senin bahsettiğin flaglar kesme oluştuğunda 1 oluyorsa şayet bunlara bakarak hangi porttan bilgi geldiğine bakayım dedim olmadı.

KESME:
 Context Save
 GIE=0
 GIE2=0   
 PEIE=0
 PEIE2=0
 
 If RCIF=1  And RCIF2 =1  Then EXIT
 If RCIF=1  Then EKRAN_INTERUPT
 If RCIF2=1 Then SENSOR_INTERUPT
 GoTo EXIT
 
 
 EKRAN_INTERUPT:
 NEXTION_BILGI = RCREG1 : High  LED_3 : GoTo EXIT
 
 
 SENSOR_INTERUPT:
 USART2_DATA[SAYAC]= RCREG2 : SAYAC=SAYAC+1  : NEXTION_BILGI=0 : GoTo EXIT
 
 
 EXIT:
 GIE=1
 GIE2=1   
 PEIE=1
 PEIE2=1
 RCIF2=0
 RCIF=0             'General interrupt enable bit
 
 Context Restore
 
 End
Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: Hattusa - 09 Aralık 2018, 12:43:53
mustaafa senin için üşenmedim  3. pic arası usarttan haberleşen bir kod yazdım, her pic okuduğu değeri ekrana yazan ayrıca ana işlemciye okuduğu adc yi gönderen, ana picinde okuduğu değeri de diğer işlemcilere gönderen bir yapı, acele ile yazdığım için açıklama yazamadım. ilgili resmi buraya, kaynaak kodunuda yükleme sitesine ekledim.
http://dosya.co/60oog6zkqu93/cift_usart.rar.html (http://dosya.co/60oog6zkqu93/cift_usart.rar.html)

(https://i.ibb.co/RQy17Bf/3-PIC-HABERLES.jpg) (https://ibb.co/RQy17Bf)


Başlık: Ynt: 18F24K22 çift USART interrupt yapısı,çalışma şekli ve tanımlamaları ?
Gönderen: mustafa_cmbz - 10 Aralık 2018, 14:56:16
Sağolasın abi bi yukarda verdiğin flag kontrolü nedense benim koddaki for next dçngüsünden dolayı çalışmıyormuş.değiştirince 2 usart kesmeni de kullanbildim.