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
RCSTAx registerlarını kontrol edermisin
rcsta1.7=1
rcsta2.7=1
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ş
@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.
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
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.
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 ?
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
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 ?
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.
tek usart ve farklı ID adresleri ile bu iş olmuyor mu?
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 ?
Ö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).
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.
OG ustam,usart alımında biz dataları gelen
- =RCREG olarak çektiğimizi belirtmişsiniz,gelecek olan datanın adedini X belirliyor yani kaç byte olduğunu bilemiyoruz, bunu protonda belirleyebilirmiyiz?
yani 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?
@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...
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.
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.
@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 ?
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
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...
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
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)
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.