avatar_ete

Seri ve RF iletişim Sistemlerinde Master - Slave İlişkisi Üzerine bir Çalışma

Başlatan ete, 04 Eylül 2011, 16:33:47


Hattuşa

s.a.
ete hocam 1 haftadır iki işlemciyi haberleştiremedim. sizin yazılarınızı okuyorum, okuyorum fakat hala sorunumu çözemedim, artık sorunun yazılımda değilde kendimde olduğunu düşünmeye başladım, acaba bana yardımcı olurmusunuz?
ayrıca hocam şu verdiğiniz örnekte ki
Alıntı YapKESME:
    GIE=0
    HSERIN 5,ATLA, [WAIT("$RF"),KIME,GELEN]
    IF KIMLIK=KIME THEN YOLLA=1
ATLA:
    TEMP=RCREG
    GIE=1
    Resume
    enable
end         

TEMP =RCREG kısmını anlayamadım.

sözün özü hocam izin verirseniz şema ve bas dosyalarını buraya ekleyip sizin yardımınızı almak istiyorum.

ete

TEMP=RCREG bir zorunlu komuttur. Bu komut sayesinde RCREG registerinin içi boşaltılır ve USART kesme bayrağı sıfırlanır.

Dosyaları koy bakayım.
Ete

Hattuşa

tşk ederim usta ilginiz için, öncelikle yapmak istediğime kısaca değinmek istiyorum. SLAVE olarak çalışan 16F628A 7 adet pals gönderimi yapmaktadır. MASTER olarak çalışan 18F4553 ise çeşitli işlemleri yaparken 628A nın ürettiği palslerin aralarına (3 noktada) müdahale etmektedir. bu mudahale 4553 e ait butonlarla kullanıcı tarafından belirlenmektedir. hocam ben isisde simüle ettiğimde 4553 çıkışında gönderim değerlerini görebiliyorum. şuan ki 628A yazılımı ile bu değerler görünüyor mu bakmadım. ama sağlıklı göründüğü zamanda da gerçek uygulamada hiçbir tepki göremedim.  hocam master olan biraz karışık gibi geldi zira yazılımın ilgili kısımlarını aldığım için böyle oldu.
ilki RX olan 16F628A
Alıntı Yap
Device 16F628A
Xtal = 12
Config HS_OSC, BOREN_OFF, CP_OFF, DATA_CP_OFF, PWRTE_ON, WDT_ON, LVP_OFF, MCLRE_ON
'Declare HSER_RCSTA 90h ' Enable serial port & continuous receive
'Declare HSER_TXSTA 24h ' Enable transmit, BRGH = 1
'Declare HSER_SPBRG 77  ' 9600 Baud @ 4MHz, 0,16%
'Declare HSER_CLROERR 1 ' Clear overflow automatically
Declare Hserial_Baud  = 9600       ' Set baud rate to 9600
Declare Hserial_RCSTA = %10010000  ' Bit7 SPEN: Serial Port Enable bit
'Declare HSER_RCSTA 90h ' Enable serial port & continuous receive
'Declare HSER_TXSTA 20h ' Enable transmit, BRGH = 0                                   ' Bit4 CREN: Continuous Receive Enable bit
Declare Hserial_TXSTA = %00000100  ' Bit5 TXEN: tx enable , Bit2 BRGH: High Baud Rate Select = 1
Declare Hserial_Clear = On         ' Optionally clear the buffer before receiving
Declare Hserial_SPBRG = 77        ' 20MHZ osilatör ve 9600 baud rate için SPBRG=129 bkz.datasheet (BRGH=1 ise)   
Declare FSR_CONTEXT_SAVE = On 
TRISA=%00000000          'RA3-DI0, RA4-DI1, RA5-DI2 (Dijital In) giriş olarak kuruldu
TRISB=%00000010          'RB2, RB3, RB4, RB5 (Status led) çıkış olarak kuruldu 

PORTA=0                  'Tüm portlar sıfırlanıyor
PORTB=0
INTCON=%11000000       
'Declare PortB_Pullups =OFF
'Declare All_Digital =TRUE
CMCON=7
Dim I As Word
Dim PaLs As Word
Dim FreK As Word
Dim FrEkA As Word
Dim ArA As Byte
Dim sIfrE As Byte
Dim gEcIcI As Byte
Dim PaLsA As 10
Dim aA As 20
Dim fR As 30


FreK =310
PaLs =75
ArA =50




Symbol GIE  =INTCON.7      'General interrupt enable bit
Symbol PEIE =INTCON.6      'Peripheral(çevresel) interrupt enable bit
Symbol RCIE =PIE1.5        'Receiver interrupt enable bit
Symbol RCIF =PIR1.5        'Receiver interrupt flag

'--------------------------Interruptları devreye alırken en kısıtlı kontrolden en geniş kontrole doğru sıralıyoruz-----
GIE=0                      'General interrupt enable bit
RCIE=1                     'Receiver interrupt enable bit   
PEIE=1                     'Peripheral interrupt enable bit
GIE=1                      'General interrupt enable bit


On_Interrupt GoTo int      'Interrupt oluştuğunda int etiketine dallan
AnA:
        PORTB.3 =1
        DelayUS PaLs '75
        PORTB.3 =0
        DelayUS ArA
        PORTB.4 =1 '1. örnek
        DelayUS 5
        PORTB.4 =0
        DelayUS 5
        PORTB.5 =1 '2.örnek
        DelayUS 5
        PORTB.5 =0
        DelayUS 5
        PORTB.6 =1 '3.örnek
        DelayUS 5
        PORTB.6 =0
        DelayUS 5                       
        PORTB.7 =1  '4.örnek
        DelayUS 5
        PORTB.7 =0
        DelayUS 5
        PORTA.0 =1 '5.örnek
        DelayUS 5
        PORTA.0 =0
        DelayUS 5
        PORTA.1 =1  '6.örnek
        DelayUS 5
        PORTA.1 =0

If FrEkA =1 Then FreK =310
If FrEkA =2 Then FreK =810
If FrEkA =3 Then FreK =1810
If FrEkA =4 Then FreK =9000     
      GoSub DeLaY
       
  '2 Khz 500 uS frek= 310
  '1 Khz 1000 uS frek=810
  '500 hz =2000uS frek 1810
  '100 hz =10000uS frek=9810
       
        GoTo AnA
DeLaY:
For I=0 To FreK
DelayUS 1
       Next
       Return   
       

'---------------------------KESME RUTİNİ------------------------------------------------------------------------------------------------------   
int:                       'Kesme oluştuğu için int etine dallanıldı
Context Save
GIE=0                      'General interrupt enable bit
'PEIE=0                     'Peripheral interrupt enable bit
'RCIE=0                     'Receiver interrupt enable bit
'RCIF=0
HSerIn 5,ATLA,[Wait("$RF"),sIfrE, gEcIcI]
If sIfrE = PaLsA Then PaLs =gEcIcI
If sIfrE =aA Then ArA =gEcIcI
If sIfrE =fR Then FrEkA =gEcIcI
'HSerIn[gEcIcI]
'PaLs = PaLsA *2
'EWrite 10,[PaLs]
'EndIf

'HSerIn[Wait("B"),gEcIcI]

''EWrite 20,[ArA]

'HSerIn[Wait("C"),gEcIcI]
ATLA:

'RCIE=1                     'Receiver interrupt enable bit
'PEIE=1                     'Peripheral interrupt enable bit
GIE=1                      'General interrupt enable bit

Context Restore

'---------------------------------------------------------------------------------------------------------------------------------------------

End
Resume
Return



ikincisi ise MASTER olan 18F4553
bu arada çalışma frekansım, 16F628A =12 Mhz, 18F4553 ise 12Mhz kristal ve PLL aktifi ile 48Mhz de çalışıyor

Alıntı YapDevice 18F4553
TRISA =%11101111
TRISB =%00011000
TRISC =%10000001
TRISD =%00000000
TRISE =%00001111
PORTA =0 :PORTB =0 :PORTC =0  :PORTD =0  :PORTE =0


Symbol EnTeR =PORTC.0     
Symbol MeNu  =PORTE.2         
Symbol yUkA  =PORTB.4       
Symbol AsAg  =PORTB.3
Input EnTeR :Input MeNu :Input yUkA  :Input AsAg
Declare PortB_Pullups =0
ADCON0 =%00000011
ADCON1 =%00001000
ADCON2 =%10111110
Declare Hserial_Baud  = 9600      ' Set baud rate to 9600
Declare Hserial_RCSTA = %10010000  ' Bit7 SPEN: Serial Port Enable bit
Declare Hserial_TXSTA = %10101100  ' Bit5 TXEN: tx enable , Bit3 BRGH: High Baud Rate Select
' Declare Hserial_TXSTA = %00101000
Declare Hserial_Clear = On         ' Optionally clear the buffer before receiving
Declare Hserial_SPBRG =77' 255        ' 20MHZ osilatör ve 9600 baud rate için SPBRG=129 bkz.datasheet
Declare FSR_CONTEXT_SAVE = On   

Xtal =12
Config_Start
   PLLDIV = 3 ; Divide by 3 (12 MHz oscillator input)
   CPUDIV = OSC2_PLL3 ; [OSC1/OSC2 Src: /2][96 MHz PLL Src: /3]
   FOSC = HSPLL_HS ; HS oscillator, PLL enabled, HS used by US
   MCLRE = On ; MCLR pin enabled; RE3 input pin disabled
   LVP = On ; Single-Supply ICSP enabled
Config_End
Declare  PLL_Req TRUE


Declare LCD_DTPort = PORTD
Declare LCD_RSPin = PORTB.6
Declare   LCD_ENPin = PORTB.7
Declare   LCD_RWPin = PORTB.2
Declare LCD_CS1Pin = PORTB.0
Declare   LCD_CS2Pin = PORTB.1
Declare LCD_Type = GRAPHIC
      Internal_Font = On
      Font_Addr = 0
Declare GLCD_CS_Invert =0




'-------------------DEGISKENLER-----------------------------------------------
Dim  X    As Byte
Dim  Y    As Byte
Dim  Addr    As Word
Dim  char    As Byte
Dim bAr1 As Byte            'bar için adc değeri
Dim bAr2 As Byte            'bar için adc değeri
Dim bAr3 As Byte            'bar için adc değeri
Dim bAr4 As Byte            'bar için adc değeri
Dim bAr5 As Byte            'bar için adc değeri
Dim bAr6 As Byte            'bar için adc değeri

Symbol aDeT =20   'alınacak adc adet sayısı
Dim SaMp[aDeT +1] As Word  'alınan adc değerleri sıralaması Algı için
Dim sHoRt As Bit            'sayac
Dim sAmPlE As Word        'alınan takip değeri ortalaması
Dim GeCiCi As Word           'alınan değerlerin yerdeğiştirirken gecici olarak alınan adresi
Dim ToPlAm As Word          'alınan algı değeri toplamı
Dim sS As Byte              'ses on/off
Dim fR As Byte              'frekans değeri
Dim dIl As Byte             'dil seçeneği
Dim pAlS As Word            'guc değeri
Dim gPAlS As Byte            'ekran guc değeri
Dim gHaSs As Byte           'ekran Hassasiyet değeri
Dim HaSs As Byte             'hassasiyet değeri
Dim gEsI As Byte            'ekran eşik değeri
Dim EsI As Byte             'Eşik değeri
Dim gDuTy As Byte            'ekran ses seviye değeri
Dim dUtY As Byte             'ses seviye değeri değeri
Dim sEcIl As Byte            'mod secimi
Dim TsAy As Byte         'toprak sayacı
Dim SeSfR As Word        'ses frekans değeri
Dim h1A As Float          'hassasiyet secim sonucu
Dim H2b As Float           'hassasiyet toprak secim sonucu
Dim A1 As Word              'okunan  ADC değeri sonucu
Dim A2 As Word              'okunan  ADC değeri sonucu
Dim A3 As Word              'okunan  ADC değeri sonucu
Dim A4 As Word               'okunan  ADC değeri sonucu
Dim A5 As Word              'okunan  ADC değeri sonucu
Dim A6 As Word              'okunan  ADC değeri sonucu
Dim T1 As Float              'toprak adc değeri
Dim T2 As Float              'toprak adc değeri
Dim T3 As Float              'toprak adc değeri
Dim T4 As Float              'toprak adc değeri
Dim T5 As Float               'toprak adc değeri
Dim T6 As Float              'toprak adc değeri
'Dim fArK As Word           'algılama sonuç değeri
'Dim TfaRk As Word           'algılama ortalama değer
Dim tTf As Word
Dim dOngU As Byte           'bar döngü değişkeni
Dim bAt0 As Word         'pil ölçüm adcsi
Dim V As Word        'pil adc sonucu
Dim vV As Word       'pil bar değeri
Dim F1 As Word
Dim F2 As Word
Dim F3 As Word
Dim F4 As Word
Dim F5 As Word
Dim F6 As Word
Dim fT1 As Word
Dim fT2 As Word
Dim fT3 As Word
Dim fT4 As Word
Dim fT5 As Word
Dim fT6 As Word
Dim MeNuM As Byte
Dim pS As Byte
Dim hH As Byte
Dim ArA As Byte
Dim rR As Byte
Dim tUneM As Byte
Dim pAlSg As Byte
Dim bL As Byte
Dim oZ As Byte
Dim lGt As Byte
Dim mOdS As Byte
Dim moDa As Byte
Dim rReS As Byte
Dim SaY As Byte    'batarya sayacı
Dim SaYaC As Byte  'toprak sayacı
Dim aYr As Float
Dim AyB As Float
Dim aY As Float
Dim AyNa As Word
Dim aYr1 As Float
Dim AyB1 As Float
Dim aY1 As Float
Dim AyNa1 As Word
Dim mA1 As Word
Dim mA2 As Byte
Dim mA3 As Byte
Dim mA4 As Byte
Dim mA5 As Byte
Dim mA6 As Byte
Dim mA7 As Byte
Dim mA8 As Byte
Dim mA9 As Byte
Dim mA10 As Byte
Dim mA11 As Byte
Dim pIlsay As Byte
Dim bAt1 As Word
Dim sIfrE As Byte


A1 =1 :A2 =1 :A3 =1  :A4 =1  :A5 =1  :A6 =1
F1 =1 :F2 =1 :F3 =1  :F4 =1  :F5 =1  :F6 =1
pAlS =50
fR =2
dIl =1
HaSs =2
EsI =12
dUtY =60
sEcIl =1
SeSfR =1000
sS =1
MeNuM =1
pS =1
hH =2
ArA =50
rR =2
bL =1
oZ =1
mOdS =1
lGt =1
moDa =1
rReS =2
SaY =1
SaYaC =1


bAsLa:
Cls
DelayMS 100
GoSub cErC
GoSub InMe
If dIl =1 Then
    Print At 1,4,Inverse 0, "AYARLAR MENUSU" :DelayMS 10
    Else
    Print At 1,6,Inverse 0, "SETTINGS" :DelayMS 10
    EndIf
eKrAn:
GoSub EkRaNoKu
If yUkA =0 Then
DelayMS 100
MeNuM = MeNuM +1
If MeNuM >3 Then MeNuM =1
EndIf

If AsAg =0 Then
DelayMS 100
MeNuM =MeNuM -1
If MeNuM <1 Then MeNuM =3
EndIf


If EnTeR =0 Then
DelayMS 100
DelayMS 10
If MeNuM =1 Then Cls :GoTo gUc
If MeNuM =2 Then Cls :GoTo HaSsAs
If MeNuM =3 Then Cls :GoTo FreKaNs

EndIf

GoTo eKrAn   

EkRaNoKu:   
If MeNuM =1 Then
    Print At 3,1,Inverse 1,"GUC       "  :DelayMS 10
    Else
   Print At 3,1,Inverse 0,"GUC       "   :DelayMS 10

    EndIf
If MeNuM =2 Then   
Print At 4,1,Inverse 1,"HASSASIYET"   :DelayMS 10

    Else
Print At 4,1,Inverse 0,"HASSASIYET"   :DelayMS 10

    EndIf

If MeNuM =3 Then
Print At 5,1 ,Inverse 1,"FREKANS  "   :DelayMS 10

    Else
Print At 5,1 ,Inverse 0,"FREKANS  "   :DelayMS 10

    EndIf


Return
'--------------------------------G U C AYAR RUTINI------------------------------------
gUc:
Cls
GoSub cErC
GoSub BaRcE
Print At 1,5,"  GUC AYARI  "   :DelayMS 1

gUcA:
     
If yUkA =0 Then
'While yUkA ==0 :Wend
pAlS =pAlS +1
If pAlS >=100 Then pAlS =100
sIfrE =10
HSerOut ["$","R","F",sIfrE,pAlS]
'GoSub gGg
EndIf
If AsAg =0 Then
'While yUkA ==0 :Wend
pAlS =pAlS -1
If pAlS <=10  Then pAlS =10
sIfrE =10
HSerOut ["$","R","F",sIfrE,pAlS]
EndIf 

If MeNu =0 Then
While MeNu ==0 :Wend
GoTo bAsLa
EndIf   

Print At 4,9,"%",Dec pAlS," "
DelayUS 100
pS = pAlS  +15   
GoSub bArRa
GoTo gUcA
HaSsAs:
DelayMS 10
GoSub cErC
Print At 1,3,Inverse 0, "HASSASIYET AYARI "
OrneKa:

Print At 5,9,"%",Dec ArA," "  :DelayUS 100

If yUkA =0 Then
ArA =ArA +1
If ArA >=100 Then ArA =100
sIfrE =20
HSerOut ["$","R","F",sIfrE,ArA]
EndIf

If AsAg =0 Then
ArA =ArA -1
DelayUS 300
If ArA <=10  Then ArA =10
sIfrE =20
HSerOut ["$","R","F",sIfrE,ArA]
EndIf

If MeNu =0 Then
While MeNu ==0 :Wend
Cls
GoTo HaSsAs
EndIf

GoSub bArRa       
GoTo OrneKa
FreKaNs:
Cls
DelayMS 10
GoSub cErC
Print At 1,3,Inverse 0,"  FREKANS AYARI  " :DelayUS 100
 
FrEkA:
If MeNu =0 Then
While MeNu ==0 :Wend
Cls
GoTo bAsLa
EndIf
If yUkA =0 Then
While yUkA ==0 :Wend
fR = fR +1
If fR >4 Then fR =1
sIfrE =30
HSerOut ["$","R","F",sIfrE,ArA]
EndIf
If AsAg =0 Then
While AsAg ==0 :Wend
fR =fR -1
If fR <1 Then fR =4
sIfrE =30
HSerOut ["$","R","F",sIfrE,ArA]
EndIf
If fR =1 Then
    Print At 3,8,Inverse 1,"2 KHz " :DelayUS 100
    Else
    Print At 3,8,Inverse 0,"2 KHz " :DelayUS 100
    EndIf
If fR =2 Then
    Print At 4,8,Inverse 1,"1 KHz " :DelayUS 100
    Else
    Print At 4,8,Inverse 0,"1 KHz " :DelayUS 100
    EndIf
If fR =3 Then
    Print At 5,8,Inverse 1,"500 Hz" :DelayUS 100
    Else
    Print At 5,8,Inverse 0,"500 Hz"  :DelayUS 100
    EndIf
If fR =4 Then
    Print At 6,8,Inverse 1,"100 Hz"  :DelayUS 100
    Else
    Print At 6,8,Inverse 0,"100 Hz"  :DelayUS 100
    EndIf
GoTo FrEkA   

cErC:
For X=0 To 127    'DIS CERCEVE CIZILDI
      Plot 0,X
      Plot 63,X
      DelayUS 100
      Next X
For Y= 0 To 63
      Plot Y,0
      Plot Y,127
      DelayUS 100
      Next Y   
For X =0 To 127
      Plot 20,X
      DelayUS 100
      Next X
For X=1 To 126    '2.DIS CERCEVE CIZILDI
      Plot 1,X
      Plot 62,X
      DelayUS 100
      Next X
For Y= 1 To 62
      Plot Y,1
      Plot Y,126
      DelayUS 100
      Next Y 
For X =1 To 126
      Plot 19,X
      DelayUS 100
      Next X     
Return

InMe:
For X=21 To 62    'alt inme
      Plot X,66 
      Plot X,67
      DelayUS 100
      Next X
Return
BaRcE:
For X=15 To 115     
Plot 50,X
Plot 56,X
DelayUS 100
Next X
For Y= 50 To 56
Plot Y,15
Plot Y,115
DelayUS 100
Next Y
Return 

bArRa:
If pS <=16 Then pS =16
If pS >= 115 Then pS =115   
  For X = 15 To pS
    Plot 51,X
    Plot 52,X
    Plot 53,X
    Plot 54,X
    Plot 55,X
    DelayUS 100
    Next X
    For X = pS To 114
    UnPlot 51,X 
    UnPlot 52,X
    UnPlot 53,X
    UnPlot 54,X
    UnPlot 55,X
    DelayUS 100
    Next X
Return
End
Include "FONT.INC"
ve son olarakta şema ve bas dosyaları
hocam yanlış anladığım veya eksik bilgilerimi söylerseniz bu konuda bir daha hata yapmam

Hattuşa

ete hocam usartta dataları gönderirken ondalık olarak gönderemiyormuyuz? dataları başka bir formatta mı göndermek gerkiyor, ASCII gibi

ete

Pbp da zaten ondalık işlem yok. Oldugu durumlarda sayı virgülden kurtarılarak kullanılır. Bence bu kaide proton icinde gecerli.  Şöyle bir şey yapılabilir. Örnekle açıklayayım. 4,123 sayısını yollayacağımızı düşünelim. 4,123 x 1000 =4123 eder.
4123 sayısıni 2adet 8 bit olarak yollariz. Yanında birde 3 sayısını yollarsın. Buda o sayının kaca bölünecegini gösterir (10 uzeri 3 gibi). Baska yollarda bulunabilir.
Ete

Hattuşa

hocam ondalık derken 10 luk desimalı kasteddim, yazılıma dikkat ettinizse şayet 0-100 arası değerler gönderiyorum ve hala sorunumu çözmüş değilim.

ete

Pro-TR,
Programlarınada baktım. Protonda yazılmış olması işimi zorlaştırıyor. Ancak bazı tespitlerim oldu aşağıdadır.
Alıcıda USART ayarları aşağıdaki gibi olmalı. Bir sürü ayar koymuşsun kimini kapatmışsın.
yalnızca aşağıdaki lere gelen leri Proton dilinde yaz yeterli.

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 77  ' 9600 Baud @ 12MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

Program Kesme kısmında USART kesme bayarağı ancak RCREG registerinin içi boşalırsa otomatik sıfırlanır.
Bu nedenle kesmeden çıkmadan evvel TEMP=RCREG şeklinde bir eşitlik kullanmanı öneririm.
RCIF doğrudan ulaşılan bir register değil. Direk sıfırlayamazsın (öyle biliyorum) bu nedenle Temp=RCREG komutu bu işi otomatik yaptırmaktadır.
Bunu kullanman gerekiyor.

Verici kısmı çok uzun ve hemen anlaşılacak kadar sade değil. O yüzden yalnızca verme komutlarına baktım.
Acaba kullandığın RF modül bir UDEA Tranceiverlerinden birimidir. $RF şeklinde başlık kullandığına göre bu fikre kapıldım.
Şayet doğru ise onun birde bitiş komutu olması gerekiyor. Data sheete bakmanı öneririm.

"Onluk Desimal'i kast ettim" ne demek acaba. Desimal zaten onluk sistemi belirtiyor. 10 tabanına göre sayı sistemidir.
Ondalık sayılardan bahsetmiştin şimdi onluk desimal diye bir tabir kullanmışsın. Açıklarsan anlayabilirim belki.

Ete

Hattuşa

hocam alıcıda ki bu çentikli fazla yazma işi başaramayınca anlamsız kopyalardankaynaklı, onluk taban tabirim ondalık sistemi kasteddim, kafam döndü k. bakmayın
hocam alıc katında problem olduğu kanaatindeyim zira isisde debug işleminde alıcıdaki değerleri 0 olarak görüyorum. masterden gelen veriler doğru gözüküyor tabi emin olmamakla birlikte, hocam sizden ricam, baund değerinin 2400,9600 gibi değer almalarının anlamanı izah edebilirmisiniz?
ayrıca
Alıntı YapHSerIn 5,ATLA,[Wait("$RF"),sIfrE, gEcIcI]
If sIfrE = PaLsA Then PaLs =gEcIcI
If sIfrE =aA Then ArA =gEcIcI
If sIfrE =fR Then FrEkA =gEcIcI

ATLA:

RCIE=1                     'Receiver interrupt enable bit
PEIE=1                     'Peripheral interrupt enable bit
GIE=1                      'General interrupt enable bit

ben bu kısımı tam anlayamadım. şimdi Hserin komutumuz işlemeye başladı 5 mS data gelmezse atla ile etikete dallanıp kaydedicileri aktif edip kesmeden çıkıyoruz. eğer data gelirse o zaman ne olacak wait dedik bekledik ("$RF") bir şifre koyduk ama ondan sonra ki değişken sifre değeri ve gecici değer işte bu noktada kopuyorum abi, sanki bir hatam var gibi...
ayrıca PBP ve protonu kullanabilen arkadaşların
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 77  ' 9600 Baud @ 12MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
kısmını rica etsem tam olarak protona çevirebilirler mi?

ete


DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 77  ' 9600 Baud @ 12MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
komutlarının karşılığı senin yazdığın kodların içinde var zaten.
Declare HSER_RCSTA 90h ' Enable serial port & continuous receive
Declare HSER_TXSTA 24h ' Enable transmit, BRGH = 1
Declare HSER_SPBRG 77  ' 9600 Baud @ 4MHz, 0,16%
Declare HSER_CLROERR 1 ' Clear overflow automatically

Hepsi bu kadar. Diğerlerini silebilirsin.
Baud rate birim zaman içinde yollanan bit sayısını ifade eder. Bit sayısı azaldıkça ver haberleşmesi daha garanti hale gelir.
9600 demek bir saniye içinde 9600 bit yollanıyor demektir. Bu nednele hem alıcının heöde vericinin aynı baud değerine ayarlanması gerekir ki anlaşabilsinler.

Hserin komutunda 5 ms içinde istenen veri gelirse hserin komutu altındaki satırlar icra edilir. İstenen veri gelmez ise yanlış kesme demek olur ve ATLA satırına gidilerek kesmeden çıkılır. Bazen 5 ms gelen verinin alınması için yeterli olmayabilir. Bu durumda haberleşme sağlayıncaya kadar 5 ms lik süreyi 20 ms yapabilir sorunsuz haberleşme sağladıktan sonra deneyerek o rakamı küçültebilirsin. Kesildiği noktada bir önceki değeri kullanman yeterlidir.

Kesme kımsında eksik olan şey temp=RCREG komutudur. Muhtemelen bir kere kesme oluşuyor ama bayrağı sıfırlamadığın için program sürekli kesmede kalıyordur.

Ete

Hattuşa

slm ETE hocam, iki işlemci ile yapmak istediğimi kısaca anlatmak istiyorum, aşağıya şemayı ve yapmak istediğimi anlatır resim ekledim, hocam fikirlerinizi bekliyorum.
iki işlemci arasında hiç bir eklenti yoktur. masterin Tx i Slavenin Rx inde, masterin Rx i slavenin Tx de direk bağlı (ki slaveden mastere bilgi yollamayacağım bu sebeble masterin Rx i ile slavenin Tx bağlantısını yapmama gerek varmı?)
yapmak istediğim şu abi;
628A tarafından üretilen 6 adet pals vardır ilk pals ana pals olup devamında küçük palsler bulunmaktadır.
ilk palsin duty değerine müdahale etmem gerekiyor, buna değişken olarak "PALS" dedim, bu duty değerim 10uS ile 100uS arası,
628A da ilk ana pals ile devamındaki ikinci pals arasına da müdahale etmem gerekiyordu buna da "ARA" dedim ve 15uS ile 115 uS arası değişebilecek
diğer değişken olarak ta; bu palsleri belirleyen frekans değerim yani iki ana pals arası süre buna da "FR" dedim, bu fr değerim 4 değişken olmalı, bunlar 310uS, 810uS,1810uS ve 9800uS

şimdi abi yapmaya çalıştığım şu;
masterden 2 veri yollanacak bu iki veriden ilki değişimin bu 3 lüden hangisinde yapılacağını belirtmek bu maksatla ben "SıFrE" die bir değişken koydum. şifre değerim örneğin 10 iken duty değerini, 20 iken ArA değerini, 30 iken de frekans değerini belirleyecek, burada frekans değerim byte boyutundan büyük olduğu için ben 628A içerisinde başka bir word tipi değişkende eğer masterden 1 gelirse =310, 2 gelirse 810, 3 gelirse 1810 ve 4 gelirse 9800 değerini yükle dedim. umarım yapmak istediğimi anlamışsınızdır.
Alıntı YapHSerIn 5,ATLA,[Wait("$RF"),sIfrE, gEcIcI]
If sIfrE =PaLsA Then PaLs =gEcIcI
If sIfrE =aA Then ArA =gEcIcI
If sIfrE =fR Then FrEkA =gEcIcI
hocam zaten söylemek istediğim bu şekilde yazdımdı yani sifre =palsa ise ki palsanın tanımlaması 10, aA nın ki 20 gibi devam ediyor. hocam HSerIn 5,ATLA,[Wait("$RF"),sIfrE, gEcIcI] bu kısım nasıl olmalı tam olarak  :D


ete

Aslında karmaşık bir konu. Programın tüm mantığına hakim olmayınca kısmi düşünmek zor oluyor.
Her neyse programın Proton da yazılmışolması deneme yapmamıda engelliyor.
Bu nedenle yalnızca düşündüklerimi söyleyeceğim.
Anladığım kadarı ile gelen her bir verinin karşılığı en fazla 4 adet olabiliyor. Yani,
Veri=10 geldi değişim aralığı 10us ile 100us ama bu mesela 10 -40 - 60 - 100 şeklinde olabiliyor ve hangisi olduğna gecici değişkenindeki değer karar veridiriyor. Yani gelen veri 10 ise ve gecici=3 ise duty=60 olacak demek oluyor.
Gelenveri 20 ise bu seferde pals aralığına müdahale etmen gerekiyor anlamına gelecek ama oda 4 kademede olacak. Dolayısıyla gecici değeri önem kazanıyor gecici kaç ise ona karılık gelen aralık alınıyor.
Gelen veri 30 ise bu sefer frekansa müdahale ediyorsun ve gecici=1 ise 1 nolu frekans değeri olan 310 değerini kullanıyorsun.
Bu kadar tantanaya ne gerek var idi anlamadım doğrusu. Birincide hangi veriye müdahale edileceğini belirtir ikincidede direk o değeri yollardın olur biterdi. Yollayacağın bilgi word tipinde (2 byte halinde yollanır)  olurdu. Bazı değerler 16 bitlik oluyor çünki. Her neyse;
Diyelimki bilgi master'dan doğru bir şeilde geldi. Gelen veri  Sifre=10 ve Gecici=2
Bu durumda ne yapılacak;?. Önce sen ne yapmışsınona bakalım.
IF SIFRE=PULSA then PULS=GECICI
Sence bu doğrumu. Bir defa yalnızca 3 değişik Sifre bilgisi geliyor ise orada artık değişken kullanmanın bir anlamı yok. Bu nedenle eşitlik şöyle olmalı idi.
IF SIFRE=10 then .....
İkincisi PULS=Gecici demekle yine yanlış bir iş yapıyorsun. Gecici bir index değişkenidir. HAngi değerin alınacağına dair sıra bilgisini taşıyor. O halde o sıradaki değişkeni direk Puls değişkenine eşitlemek daha doğru olmazmı?. Şimdi gelelim nasıl olması gerektiğine;
IF SIFRE=10 then DUTY=PULS[GECICI]  şeklinde bir tanımlama yapmak bence en doğrusu olurdu.
Program başında
For I=0 to 3
Lookup I,[10,40,60,100],SAYI
  PULS[I]=SAYI
Next şeklinde dizi değişkenine gereken değerleri vermen gerekiyor. Index değişkenleri daima 0 dan başlar. Sen 1 den başlamak istersen sıfır sırasına bir değer yazman gerekir. Yani [255,10,40,60,100] şeklinde olabilir. I döngüsünü 1 den başlatırsan doğru değerler 1-2-3-4 şeklinde yerleşmiş olacaktır.

Aynı mantığı diğer seçenekler içinde kullanmak gerekecek. Dolayısıyla ARA değerleri için bir ayrı dizi değişkeni kullanıp ;
IF SIFRE=20 THEN ARA=DIZI_ARA[GECICI] demen yeterli olacaktır.
Yine IF SIFRE=30 THEN FREKA=DIZI_FREK[GECICI] şeklinde bir yerleştirme yapman doğru olacaktır.
Sonucta kesmeden çıktığın zaman elinde olması gereken değerler olmuş olacaktır.
Anlattıklarından anladığım bunlar.
Ancak bana kalırsa sen kesmeni doğru biçimde çalıştırmaya bak en önce.

Ete

Hattuşa

vermiş olduğunuz bilgiler için tşk ederim. söyledikleriniz mantıklı, bu sizin kod yazmada ki mantığa hükmetmenizden kaynaklı,
şimdi HSerIn 5,ATLA,[Wait("$RF"),sIfrE, gEcIcI] dediğimizde bu ("$RF") işlemin mantığı nedir, tek slavede gereklimidir.
HSerIn 5,ATLA,[sIfrE, gEcIcI], dersek yeterli olur mu? ve bir gönderimde kaç adet byte gönderebiliriz? ben burda 2 farklı byte değişkeni göndermeye kalktım. olabilirliği varmı?

ete

$RF bir işaretçidir. Bunu koymadan da haberleşme yapabilirsin. Ama doğru haberleşme şansın epeyce azalır.
Sebepleri şunlar. Her Serout komutu bir bilgi paket şeklinde yollanır. Komut bittiğinde paket de bitmiş olur. Bu arada haberleşme boşluğu olduğu anlamına gelir. Haberleşmede temel amaç  bu paket başını yakalamaktır. Düşünsene Hserout komutu ile 6 adet byte yolladın ama senin programın 2.byte dan itibaren Hserin komutunu gördü. Gelmesi gereken 6 byte olmasına rağmen birinci byte kaçmış oldu. Onu hiç bir zaman alamayacaksın anlamına gelir. Ancak geriye kalan 5 adet byte bilgisini alırsın. Onlarda yanlış değişkenlere yerleşeceği için yanlış bilgi almış olursun. Ama paketin başına bir işaretçi koyarsan "$RF" gib ve önce onu yakalayıp sonra ardından gelenleri alırsan hiç bir zaman veri kaçırma söz konusu olmaz. Zira sistem önce paket başındaki işaretçiyi yakalamaya çalışır. Yakaladığı anda geriden gelen 6 byte bilgisini alır ve dolayısıyla kusursuz bir haberleşme sağlanmış olur. Bu nedenle işaretçilerin önemi büyüktür. İŞaretçi her hangi bir karekter yada karekter dizisi olabilir. Ama tek karekter kullanırsan parazit sinyallerde de aynı karekterin olma ihtimali yüksek olur. Ama en azından 3 karekter yan yana kullanırsan doğru işaretçiyi yakalama şansın yüksek olur. 4 adet karekter kullanırsan lüzümsuz fazlalık kullanmış olursun. Oda ekstra gecikme yaratırki hiç gerek yok. İdeal işaretçi sayısı 3 karekterdir.
Bir kere işaretçiyi bulduktan sonra gerisine ister 1 istersen 2 istersen 5 istersen 10 byte ekle. Bunlar çok önemli değil. Sadece alım süresi uzar o kadar. Önemli olan işaretçidir.
Birde preambl ve uyandırma işi vardır. USART kesmesi kullandığın zaman seri portdan RX ucuna bir sinyal (karekter) geldiği zaman USART hemen kesme oluşturur. Ama sen gelenleri alıncaya kadar aradan zaman geçer ve ilk gelenleri kaçırabilirsin.
Bu nedenle akıllaca yapılması gereken USART kesmesini oluşturacak bir ön sinyal yollayıp ardından işaretçiyi yollamak en doğrusudur. Bu nedenle asıl sinyal yollanmadan önce 5 byte $AA , 5 byte $FF ve 5 byte $00 sinyali önden uyandırma olarak yollanır. USART bu bilgi RX pinine ulaşır ulaşmaz hemen kesmeyi oluşturur. Kesme içinde Sende HSERIN [Wait ($RF)....
şeklinde komut verdiğin için gelen karekterlerin içinde $RF aramaya başlar. yakaladığı anda da paket başı yakalanmış olur ve geriside zincir gibi gelir. İşin esası budur.

Ete

Hattuşa

slm
ete hocam isisde yine usart gönderimini başardım, deneme bir şema ile artık akşama gerçekte denerim, inş. çalışır zira stress yapmaya başladı bu kadar başarısızlık, 18F4553 ü 12MHz kristalle PLL yi aktif ederek kullanıyordum, şimdi direk 40MHz kristal bağladım şemada sorun yaratmadı, hocam vaktiniz olursa şu kristali PLL ile çalıştırmayı anlatırmısınız? yani neden 48Mhz kristal takmak yerine 12MHz kristal takılıp PLL yi aktif ederek 48MHz de çalışılıyor, yoksa kendimizi mi kandırıyoruz. PLL var biliyorum zira 18F4520 ile 2-3 tane devre yaptım ve 10Mhz kristal takıp PLL ile 40 MHzde çalıştırdım. sonuç olarak bizim için 10mhz veya 40 mhz kristal takmanın farkı yok, bu kadar soru sormamın nedeni bu her iki kristalde bizim için temin edilebilir kristaller ve bize farketmiyor ancak işlemci için ideal olan nedir?

Powered by EzPortal