protonda usart kesmesi

Başlatan bimühendis, 18 Aralık 2017, 16:39:43

bimühendis

İyi günler ,

Protonda kesme ile seri haberleşme yapmak için bir kaç deneme yaptım ancak başarılı olamadım .Bu kesmeler de neden bu kadar takılıyorum anlamadım.Herşeye dikkat ediyorum ama gözümden kaçan birşeyler var sanırım. Kodlar aşağıdadır .Yardımcı olursanız sevinirim .

verici kodları:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2017 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 12.12.2017                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
    Device 18F46K22
    Xtal 64
   
   
    TRISA = %11111111
    TRISB = %00000101
    TRISC = %10000111
    TRISD = %10000000
    TRISE = %00001000


    Declare LCD_ENPin PORTE.2 
    Declare LCD_RSPin PORTE.0
    Declare LCD_DTPin PORTD.0   
    Declare LCD_Lines 2     
    Declare LCD_Interface 4
   
       
    RCSTA2 = $90   ' Enable serial port & continuous receive
    TXSTA2 = $24   ' Enable transmit, BRGH = 1
    SPBRG2 = 130   ' 9600 Baud @ 64MHz, -0,02%
    SPBRGH2 = 6
    BAUDCON2.3 = 1 ' Enable 16 bit baudrate generator
   
    Dim say As Byte
    say=0

basla:

    If PORTB.0=1 Then
    say=say+1
    DelayMS 200
    EndIf
    If PORTB.2=1 Then
    HSerOut2["Sda",Dec3 say ]
    EndIf
    GoTo basla
     
End



alici kodlari:

    Device 18F46K22
    Xtal 64
    On_Hardware_Interrupt GoTo KESME 
    Declare LCD_ENPin PORTE.2 
    Declare LCD_RSPin PORTE.0
    Declare LCD_DTPin PORTD.0 
    Declare LCD_Lines 2       
    Declare LCD_Interface 4
    RCSTA2 = $90   ' Enable serial port & continuous receive
    TXSTA2 = $24   ' Enable transmit, BRGH = 1
    SPBRG2 = 130   ' 9600 Baud @ 64MHz, -0,02%
    SPBRGH2 = 6
    BAUDCON2.3 = 1 ' Enable 16 bit baudrate generator
    INTCON2.7=0 ;;;dahili pullupları iptal eder.
    Symbol peie=INTCON.6
    Symbol gie=INTCON.7
    Symbol rcif=PIR3.5
    Symbol rcie=PIE3.5
    Dim say As Byte
    Dim TEMP  As Byte

 
    TRISA=%11111111
    TRISB=%00000101
    TRISC = %10000111
    TRISD = %10000000
    TRISE = %00001000


gie=0:rcie=1:peie=1:gie=1

BASLA:

Print $fe,$c0,Dec2 say

GoTo BASLA
;---------USART KESME-----------
KESME:
Context  Save

rcif=0
HSerIn2 50,hata,[Wait("sda"),Dec say ]

Context Restore
End

hata:
Print $fe,2,"Veri alinamadi"
Return

ete

Kesme oluştuğunda programın hangi etikete gideceğini belirtmemişsin.
Kesme bayrağı olan RCIF biti normal şartlarda kullanıcı tarafından sıfırlanamaz. Bu işlemcide de aynımıdır bilmiyorum.
Sıfırlanması için RCREG registerini bir başka değişkene aktarman gerekir. Böylece RCREG içi boşalınca RCIF de sıfırlanır.
Bunu genellikle TEMP=RCREG şeklinde yaparım ben.

Kesme yaratabilmek için kesme nin aktif edilmeside gerekir. Bu işlemcide gelişmiş Usart (EUSART) bulunuyor. Hatta 2 adet USart portu olması gerekir. Bu nedenle ilgili registerleri kullandığın porta uygun set etmen gerekir. Sende hiç aktivasyon göremedim.
İlgili registerler şunlar;
- INTCON registerinden global kesmeleri ve peripheral  aktif etmen gerek. (Bit 7 ve 6)
- PIE1 regsiterinden iligli biti set ederek Usart kesmesi aktive edilecektir.
- PIR1 registerinden Kesme bayrağı RC1IF kontrol edilecek.
- IPR1 registerinden kesme önceliği ayarlanacak.
Ete


bimühendis

 Device 18F46K22
    Xtal 64
    On_Hardware_Interrupt GoTo KESME   
 
    Declare LCD_ENPin PORTE.2 
    Declare LCD_RSPin PORTE.0
    Declare LCD_DTPin PORTD.0 
    Declare LCD_Lines 2       
    Declare LCD_Interface 4

    RCSTA2 = $90   ' Enable serial port & continuous receive
    TXSTA2 = $24   ' Enable transmit, BRGH = 1
    SPBRG2 = 130   ' 9600 Baud @ 64MHz, -0,02%
    SPBRGH2 = 6
    BAUDCON2.3 = 1 ' Enable 16 bit baudrate generator
    INTCON2.7=0 ;;;dahili pullupları iptal eder.

    Symbol peie=INTCON.6
    Symbol gie=INTCON.7
    Symbol rcif=PIR3.5
    Symbol rcie=PIE3.5

    Dim say As Byte
    Dim TEMP  As Byte

 
    TRISA=%11111111
    TRISB=%00000101
    TRISC = %10000111
    TRISD = %10000000
    TRISE = %00001000


gie=0
rcie=1
peie=1
gie=1

BASLA:

Print $fe,$c0,Dec2 say

GoTo BASLA

KESME:
Context  Save

rcif=0
HSerIn2 50,hata,[Wait("sda"),Dec say ]

Context Restore
End

hata:
Print $fe,2,"Veri alinamadi"
Return



aslında deikleriniz hepsi var kesme etiketine en başta belirtiyorum . PEİE VE GİE tanımlarını verip aktif etmiştim  ama sanırım düzgün hizalayamadığımdan dolayı göremediniz

ete

Bakar kör oldum sanırım. Şimdi görüyorum ama ilk baktığımda görememiştim.
Bu duurmda diyecek bŞka bir laf bulamıyorum. Data sheete de baktım rcif i(PIR3.5) read only denilmiş. Bu durumda Rcif=0 şeklinde siz onu sıfırlayamazsınız. Temp=RCREG2 şeklinde sıfırlamanız gerekir. Muhtemelen sorununuz budur.
Ete

bimühendis

Dediğiniz yaptım ancak hala veri alamadım.Donanımımı da kontrol ediyorum bir problem yok gibi gözüküyor ama gözden kaçırdığım birşey var illaki

Hattuşa

#5
slm ustacım; usart kesmesini picten pice mi yaptınız? açıkcası isis şeması vs olmuş olsaydı bir protoncu olarak yardımcı olurdum

mesela iki pic in usarttan bilgi alışverişi yaptığı bir örneği burada 3. iletide paylaşmışım size yardımcı olmaz mı?

http://etepic.com/index.php/topic,3620.msg34356.html#msg34356

bimühendis


ete

Şu önden verdiğin programı bir yenile istersen. Dikaktimi çekti;
rcif=0
HSerIn2 50,hata,[Wait("sda"),Dec say ]
öncelikle daha alım yapmadan kesme bayrağını sıfırlamaya çalışman yanlış. En son çıkarken sıfırlanmalı.
Hserin komutunda Hata isimli etiket kesme dışında bir yerde buda bir hata. Bu etiket kesme içinde olmalı . Kesmeden ancak context restore  ve kesmeyi enable yaparak çıkmak gerekir.


DISABLE
KESME:
Context  Save

HSerIn2 50,hata,[Wait("sda"),Dec say ]
goto CIKIS
hata:

Print $fe,2,"Veri alinamadi"

CIKIS:
temp=rcreg2
Context Restore
ENABLE
End


Proton da Kesme ye girmeden önce bir DISBLE ve çıktıktan sonra ENABLE komutu verilmiyormu?

Ete

bimühendis

yeniledim hatta disable enable da yaptım ancak hala haberleştiremedim

Hattuşa

#9
ancak musait olup bişeyler karalayabildim. vaktimin çoğu isis şemasını çizmekle harcadım, gerçekten yardım etmek istiyor insan ama yardıma yönelik ne bir şema nede yardımcı olan çıkmıyor. her nekadar isis şemam ektedir desenizde ben resimden başka bişey göremedim. ve simülasyon dosyasını indiremedim.
herneyse
yaptığım işlem;
bu işlemcide iki adet usart girişi bulunmakta ben usart1 i tercih ettim, usart2 yi tercih edebilmek için PIE2 registerinden aktif etmek gerekiyordu. sprg değeri 64 mhz e göre datasheetinde 103 değeri vermek gerekiyor buna dikkat etmek lazım.

yazdığım programda 1. işlemciden butona basınca say değeri artıyor ve 2. işlemciye gönderiyor ekranda da 1. ekranda 1. işlemciye ait say değerini yazıyor 2. ekranda ise g1 yani gelen1 değerinde bu sayıyı görebilirsiniz. her iki işlemcide hem usarttan bilgi alıyor hemde bilgi veriyor. iki yönlü yapmamın nedeni lazım olursa düşüncesiyle yapılmıştır.
umarım işe yarar

Maxim

pro-tr, birşey eklemek istiyorum
eusart olmayan donanımlı mesela 16F serisi işlemcide 64mhz osc 103 vermek lazım o zaman 9600 bps de hata 0.16% oluyor.
ama eğer işlemcimiz 18F ve yukarı birşey ise o zaman BRGH=1, SPBRGH=6, SPBRG=130 diyoruz ve hata -0.02% oluyor.

*multi-calc programına göre

bimühendis

Verdiğiniz bilgiler için teşekkür ederim.
Pro_tr verdiğin kodlar için sağol kendime göre ayarladım ve anlamaya çalıştım çünkü bende adım adım yaklaşık aynı şeyleri yapmıştım neden veri alamadığım konusunda hala anlayamadım.Bir sorum daha olacaktı eğer ki uart1 ve uart2 yani ikisindede haberleştirme yapmak istersem o zaman uart1 içinde kesme oluşucak bunu nasıl yapabilirim ?

ete

Hangi kesme olursa olsun program KESME etiketine gidecektir. Orada ayrımı farklı olan kesme bayrakları ile yapacaksınız.
Ete

Hattuşa

slm;
iki ayrı usartda
1.usart alıcı konumu için PIE1.5 aktif edilmelidir.PIR1.5  ise 1.usart flag bayragı olup, kesme içinde bu takip edilmelidir.
2.usartı aktif etmek için PIE3.5 aktif edilmelidir.PIR3.5  ise 2.usart flag bayragı olup, kesme içinde bu takip edilmelidir.

siz neden çalıştıramadığınız konusunda bir fikrim yok zira kodunuzu incelemedim. şy var kullandığınız MCU gelişmiş bir MCU config ayarları biraz fazla ve karışık, isisde çalışan kodunuz gerçekte çalışmazsa yazılan kodun config ayarlarını kontrol edin.zira OSC ayarları biraz dikkat istiyor.

Powered by EzPortal