HSERIN DEN GELENİ NEDEN DEĞİŞKENE ATMAZ.

Başlatan F.T, 13 Aralık 2012, 22:10:11

F.T

'MASTER

Device 18F452
Xtal = 20
Optimiser_Level = 3            ' Full optimisation

Config_Start
   OSC = HS ; HS
   PWRT = On ; Enabled
   BOR = OFF ; Disabled
   WDT = OFF ; Disabled
   LVP = OFF ; Disabled
Config_End


Declare Hserial_Baud  = 9600       ' Set baud rate to 9600
Declare Hserial_RCSTA = %10010000  ' Bit7 SPEN: Serial Port Enable bit  Bit4 CREN: Continuous Receive Enable bit 
Declare Hserial_TXSTA = %00100100  ' Bit5 TXEN: tx enable , Bit2 BRGH: High Baud Rate Select = 1
Declare Hserial_Clear = On         ' Optionally clear the buffer before receiving
Declare Hserial_SPBRG = 129        ' 20MHZ osilatör ve 9600 baud rate için SPBRG=129 bkz.datasheet (BRGH=1 ise)
   
Declare CCP1_Pin PORTC.2

PortB_Pullups=TRUE

All_Digital = TRUE

LCD_DTPin = PORTD.4 'Lcd nin dataları Portd.3 en başlıyor
LCD_RSPin = PORTE.0'LCD RS pin Porte.0
LCD_ENPin = PORTD.3 'Lcd EN pin Porte.1
LCD_Interface = 4 '4-bit Interface
LCD_Lines = 2 'Lcd 2 satır
LCD_Type = 0  'ALCD
LCD_CommandUs = 2000
LCD_DataUs = 50

'**********GIRIS-CIKIS TANIMLAMALARI****************** 
       
TRISA=%11111111 :PORTA=0
TRISB=%11111111 :PORTB=0
TRISC=%10000011 :PORTC=0
TRISD=%00000000 :PORTD=0
TRISE=%00000000 :PORTE=0 

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

'---------------------------------------------------------------------------------------------------------------------
On Interrupt GoTo KESME      'Interrupt oluştuğunda int etiketine dallan
Symbol PEIE = INTCON.6 ' Peripheral Interrupt Enable
Symbol GIE = INTCON.7  ' Global Interrupt Enable
Symbol RCIE = PIE1.5   ' USART Receive Interrupt yetki
Symbol RCIF = PIR1.5   ' USART Receive Interrupt bayrağı


Symbol ISIKAYRM =PORTC.0
Symbol ISIKTSTM =PORTC.1
Symbol GNDR     =PORTC.5

Symbol DTA=PORTD.0
Symbol CLK=PORTD.1
Symbol ENB=PORTD.2

Symbol MA0  =PORTA.0
Symbol MA1  =PORTA.1
Symbol MA2  =PORTA.2
Symbol MA3  =PORTA.3
Symbol MA4  =PORTA.4
Symbol MA5  =PORTA.5

Symbol MB0  =PORTB.0
Symbol MB1  =PORTB.1
Symbol MB2  =PORTB.2
Symbol MB3  =PORTB.3
Symbol MB4  =PORTB.4
Symbol MB5  =PORTB.5
Symbol MB6  =PORTB.6
Symbol MB7  =PORTB.7


Dim GELEN  As Byte
Dim GIDEN  As Byte
Dim KIME   As Byte
Dim KIMLIK As Byte  '
Dim RCTEMP As Byte
Dim ISIKM  As Byte
Dim ZMN    As Byte
Dim LEDYKA As Byte
Dim LEDYKB As Byte


For ZMN=0 To 2
DelayMS 500
Print At 1,1,"LUTFEN BEKLEYIN " 
Print At 2,1,"............... " 
DelayMS 500
Cls
Next
ZMN=0

ISIKM= ERead 1            'ISIK DEĞERİ BASLANGIÇTA OKUNUR
If ISIKM=0 Then ISIKM=25  'ISIK DEĞERİ İLK YUKLEMEDE SIFIR GELİRSE 25 OLARAK AYARLANSIN

DelayUS 10

'--------------------------Interruptları devreye alırken en kısıtlı kontrolden en geniş kontrole doğru sıralıyoruz-----
GELEN=0
GIDEN=0
KIMLIK=0
KIME=0
LEDYKA=0
LEDYKB=0

GIE=0   'tüm kesmeler kapalı 
RCIF=0
PEIE=1  'Çevre birim kesmesi aktif
RCIE=1  'Usart alım kesmesi aktif 
GIE=1   'tüm kesmeler aktif  


 '--------------------------ANA PROGRAM----------------------------------------------------------------------------------------------------------


BASLA:


If ISIKAYRM=0 Then ISIKM=ISIKM+25 :EWrite 1,[ ISIKM ] 'ISIK DEĞERİ 25 ER ARTTIRILIR AYARLANIR VE KAYDEDİLİR
If ISIKM>250  Then ISIKM=25                           'ISIK DEĞERİ 25 ER ARTIRILIR 250 DEN BUYUKSE 25 YAPILIR

HPWM 1,ISIKM,5000                                     'ISIK DEĞERİNE GÖRE PWM ÇIKIŞI ELDE EDİLİR 5KHZ LIK

If GELEN=GIDEN And KIMLIK=1 Then                      'EGER GELEN İLE GIDEN ESITSE KIMLIK BILLGISINE BAKILIR HANGI
Print At 1,1,"     KOMUT       "                      'ISTASYONDAN GELMİSSE BİLGİ O ISTASYONUN UYGULADIGI YAZAR
Print At 2,1,"   UYGULANDI     "                      'MASTERDEKI LEDLERIDE SONDURUR
LEDYKA=0
LEDYKB=0
GoSub LED
EndIf

'MA0 BUTONUNA BASILINCA EKRANDA KOMUT YAZACAK SLAVE ADRESİ KIME İSE VE GIDENDEDE SLAVEIN ALACAGI İŞLEM KODU YOLLANIR
'AYRICA MASTERDEKI LED ÇIKIŞI HANGI BUTONA AIT İSE LEDI YAKILIR 
If MA0=0 Then 
Print At 1,1,"     KOMUTU      " 
Print At 2,1,"     UYGULA      "
LEDYKA=1 'A PORTU İÇİN BASILAN BUTON LEDINI YAKMA 1,2,4,8,16,32,64
LEDYKB=0 'B PORTU İÇİN BASILAN BUTON LEDINI YAKMA
GoSub LED                 
GIDEN=10 
KIME=1                       
GoSub GONDER                   
EndIf 



GoTo BASLA
 
  
GONDER:
      GNDR=1
      HSerOut ["$","R","F",GIDEN,KIME]
      GoSub ZAMAN
      GNDR=0
      Return 
      
LED:
          
      SHOut DTA,CLK,1,[LEDYKB,LEDYKA]  'MASTERDA BASILAN BUTON POZİSYONU
      ENB=1
      GoSub ZAMAN
      ENB=0
      Return 
      
ZAMAN:  
      For ZMN=0 To 20
      DelayUS 1
      Next
      Return
      
'HATA:
       
'      Print At 1,1,"   HABERLESME    "
'      Print At 2,1,"     HATASI      "
'      Return 
  
  
'---------------------------KESME RUTİNİ------------------------------------------------------------------------------------------------------   
 Disable
KESME:                       'Kesme oluştuğu için int etine dallanıldı


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

HSerIn 10,HATA,[Wait("$RF"),GELEN,KIMLIK]
HATA:
RCTEMP = RCREG             'RCIF değeri sıfırlanması için RCREG değerinin okunması gereklidir.
                           'Okuma yapıldıktan sonra bu değer rctemp değişkenine aktarılır
RCIF=0 
RCIE=1                     'Receiver interrupt enable bit
PEIE=1                     'Peripheral interrupt enable bit
GIE=1                      'General interrupt enable bit

Resume
Enable



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

'SLAVE

Device 18F452
Xtal = 20
Optimiser_Level = 3            ' Full optimisation

Config_Start
   OSC = HS ; HS
   PWRT = On ; Enabled
   BOR = OFF ; Disabled
   WDT = OFF ; Disabled
   LVP = OFF ; Disabled
Config_End


Declare Hserial_Baud  = 9600       ' Set baud rate to 9600
Declare Hserial_RCSTA = %10010000  ' Bit7 SPEN: Serial Port Enable bit  Bit4 CREN: Continuous Receive Enable bit 
Declare Hserial_TXSTA = %00100000  ' Bit5 TXEN: tx enable , Bit2 BRGH: High Baud Rate Select = 1
Declare Hserial_Clear = On         ' Optionally clear the buffer before receiving
Declare Hserial_SPBRG = 129        ' 20MHZ osilatör ve 9600 baud rate için SPBRG=129 bkz.datasheet (BRGH=1 ise)
   
Declare CCP1_Pin PORTC.2

PortB_Pullups=TRUE

All_Digital = TRUE

LCD_DTPin = PORTD.4 'Lcd nin dataları Portd.3 en başlıyor
LCD_RSPin = PORTE.0'LCD RS pin Porte.0
LCD_ENPin = PORTD.3 'Lcd EN pin Porte.1
LCD_Interface = 4 '4-bit Interface
LCD_Lines = 2 'Lcd 2 satır
LCD_Type = 0  'ALCD
LCD_CommandUs = 2000
LCD_DataUs = 50

'**********GIRIS-CIKIS TANIMLAMALARI****************** 
       
TRISA=%11111111 :PORTA=0
TRISB=%11111111 :PORTB=0
TRISC=%10000011 :PORTC=0
TRISD=%00000000 :PORTD=0
TRISE=%00000000 :PORTE=0 

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

'---------------------------------------------------------------------------------------------------------------------
On Interrupt GoTo KESME      'Interrupt oluştuğunda int etiketine dallan
Symbol PEIE = INTCON.6 ' Peripheral Interrupt Enable
Symbol GIE = INTCON.7  ' Global Interrupt Enable
Symbol RCIE = PIE1.5   ' USART Receive Interrupt yetki
Symbol RCIF = PIR1.5   ' USART Receive Interrupt bayrağı


Symbol ISIKAYRS =PORTC.0
Symbol ISIKTSTS =PORTC.1
Symbol GNDRS    =PORTC.5

Symbol DTAS=PORTD.0
Symbol CLKS=PORTD.1
Symbol ENBS=PORTD.2

Symbol SA0  =PORTA.0
Symbol SA1  =PORTA.1
Symbol SA2  =PORTA.2
Symbol SA3  =PORTA.3
Symbol SA4  =PORTA.4
Symbol SA5  =PORTA.5

Symbol SB0  =PORTB.0
Symbol SB1  =PORTB.1
Symbol SB2  =PORTB.2
Symbol SB3  =PORTB.3
Symbol SB4  =PORTB.4
Symbol SB5  =PORTB.5
Symbol SB6  =PORTB.6
Symbol SB7  =PORTB.7


Dim GELEN  As Byte
Dim GIDEN  As Byte
Dim KIME   As Byte
Dim KIMLIK As Byte  '
Dim RCTEMP As Byte
Dim ISIKS  As Byte
Dim ZMN    As Byte
Dim LEDYKA As Byte
Dim LEDYKB As Byte


For ZMN=0 To 2
DelayMS 500
Print At 1,1,"LUTFEN BEKLEYIN " 
Print At 2,1,"............... " 
DelayMS 500
Cls
Next
ZMN=0

ISIKS= ERead 1            'ISIK DEĞERİ BASLANGIÇTA OKUNUR
If ISIKS=0 Then ISIKS=25  'ISIK DEĞERİ İLK YUKLEMEDE SIFIR GELİRSE 25 OLARAK AYARLANSIN

DelayUS 10

'--------------------------Interruptları devreye alırken en kısıtlı kontrolden en geniş kontrole doğru sıralıyoruz-----
GELEN=0
GIDEN=0
KIMLIK=0
KIME=0
LEDYKA=0
LEDYKB=0

GIE=0   'tüm kesmeler kapalı 
PEIE=1  'Çevre birim kesmesi aktif
RCIE=1  'Usart alım kesmesi aktif
RCIF=0
GIE=1   'tüm kesmeler aktif  


 '--------------------------ANA PROGRAM----------------------------------------------------------------------------------------------------------


BASLA:


If ISIKAYRS=0 Then ISIKS=ISIKS+25 :EWrite 1,[ ISIKS ] 'ISIK DEĞERİ 25 ER ARTTIRILIR AYARLANIR VE KAYDEDİLİR
If ISIKS>250  Then ISIKS=25                           'ISIK DEĞERİ 25 ER ARTIRILIR 250 DEN BUYUKSE 25 YAPILIR
HPWM 1,ISIKS,5000                                     'ISIK DEĞERİNE GÖRE PWM ÇIKIŞI ELDE EDİLİR 5KHZ LIK


'SA0 BUTONUNA BASILINCA EKRANDA KOMUT YAZACAK SLAVE ADRESİ KIME İSE VE GIDENDEDE SLAVEIN ALACAGI İŞLEM KODU YOLLANIR
'AYRICA MASTERDEKI LED ÇIKIŞI HANGI BUTONA AIT İSE LEDI YAKILIR 
If GIDEN=10 And KIME=1 Then 
Print At 1,1,"     KOMUT          " 
Print At 2,1,"     UYGULANDI   "
LEDYKA=1 'A PORTU İÇİN BASILAN BUTON LEDINI YAKMA 1,2,4,8,16,32,64
LEDYKB=0 'B PORTU İÇİN BASILAN BUTON LEDINI YAKMA
GoSub LED
EndIf
If SA0=0 And KIME=1 Then                 
GELEN=10 
KIMLIK=1                       
GoSub GONDER
GELEN=0
GIDEN=0
KIME=0
KIMLIK=0
Print At 1,1,"   UYGULANDI    " 
Print At 2,1,"                "
LEDYKA=0 'A PORTU İÇİN BASILAN BUTON LEDINI YAKMA 1,2,4,8,16,32,64
LEDYKB=0 'B PORTU İÇİN BASILAN BUTON LEDINI YAKMA
GoSub LED                  
EndIf 


GoTo BASLA
 
  
GONDER:
      GNDRS=1
      HSerOut ["$","R","F",GELEN,KIMLIK]
      GoSub ZAMAN
      GNDRS=0
      Return 
      
LED:
          
      SHOut DTAS,CLKS,1,[LEDYKB,LEDYKA]  'MASTERDA BASILAN BUTON POZİSYONU
      ENBS=1
      GoSub ZAMAN
      ENBS=0
      Return 
      
ZAMAN:  
      For ZMN=0 To 20
      DelayUS 1
      Next
      Return
      

'---------------------------KESME RUTİNİ------------------------------------------------------------------------------------------------------   
Disable
KESME:                       'Kesme oluştuğu için int etine dallanıldı


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


HSerIn 10,HATA,[Wait("$RF"),GIDEN,KIME]
HATA:
RCTEMP = RCREG     
RCIF=0 
RCIE=1                     'Receiver interrupt enable bit
PEIE=1                     'Peripheral interrupt enable bit
GIE=1                      'General interrupt enable bit

Resume
Enable


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


End



hardware kesme kullandım kesmeye girmedi bi türlü yazılımsal ile girdi bu seferde değerlerle ilgili sıkıntı var.Kesmeye girmesine ragmen kesmedeki hserin komutunu uyguluyor ama değişkenlerin değerlerini alamıyorum

dsn dosyası

http://www.dosya.tc/server24/qFgbJg/masterslave.rar.html
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

isikyasar

HSerIn 10,HATA,[Wait("$RF"),GELEN,KIMLIK]      ' Bekleme Süresi çok kısa.

HSerIn 1000,HATA,[Wait("$RF"),GELEN,KIMLIK]    ' bu şekilde dene. duruma göre arttır veya düşür. bende böyle bir sıkıntı yaşamıştım bir ara.

OG

#2
F.T,
Kodları inceleme vaktim yok ama isikyasar'ın söylediği konuya bir ekleme yapayım,

EĞER DÜZELTMEDİYSELER, protonda bu komut sıkıntılı, pbp da da aynı sıkıntı var, şudur;

HSerIn 10,HATA,[Wait("$RF"),GELEN,KIMLIK]

Burada 10ms lik süre işlemiyor, Wait("$RF") öncelikli dikkate alınıyor. Yani 10ms nin bir önemi yok. İDİ. Yukarıda söylediğim gibi, düzeltmedilerse.

Ben onu çözmek için wait içinde yazmıyorum,

dim hata as bit
dim low_saviye as bit
dim data_ucu as PORTx.x

Basla:


''''' Burası WAIT ve 10ms lik fonksiyonu birleştiriyor.
gosub data_bak
if low_saviye = 1 then bunu yap
if hata = 1 then şunu şunu yap
if deger <> "$" then Basla   

gosub data_bak
if low_saviye = 1 then bunu yap
if hata = 1 then şunu şunu yap
if deger <> "R" then Basla

gosub data_bak
if low_saviye = 1 then bunu yap
if hata = 1 then şunu şunu yap
if deger <> "F" then Basla
'''''''''''''''''


data_bak:
low_saviye = 0
hata = 0
if data_ucu = 0 then seviye_uygun_değil   ''' data hattı 0 iken HSerIn'e girerse, HSerIn altında çakılır, onu engellemek için

HSerIn 10,gelmedi,[deger]
return

gelmedi:
hata=1
return

seviye_uygun_değil:
low_saviye = 1
return
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

F.T

#3
Alıntı yapılan: isikyasar - 14 Aralık 2012, 00:21:19
HSerIn 10,HATA,[Wait("$RF"),GELEN,KIMLIK]      ' Bekleme Süresi çok kısa.

HSerIn 1000,HATA,[Wait("$RF"),GELEN,KIMLIK]    ' bu şekilde dene. duruma göre arttır veya düşür. bende böyle bir sıkıntı yaşamıştım bir ara.

Denedim ama yine olmuyor.bir türlü slave değerleri almıyor.

mesaj birleştirme:: 14 Aralık 2012, 19:42:08

OG hocam bu programı ana programamı yoksa kesme içinemi yazalım.

Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

OG

SERIN/HSERIN öncesi kullanılır.

Donanımsal alış yapıyorsan "RX portunun" H mı L mi olduğunu gözlemleyemiyebilirsin. Fazladan bir portu RX ucu ile birleştirip gözleme işlemini ondan yapman gerekebilir.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

F.T

Evet OG hocam donanımsal usart.hocam en sağlıklı proton sürümü hangisi acaba.bende ıde 2.0.1.0 compıler 3.5.2.5 kurulu sıkıntılı olabilir diye düşünüyorum.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

OG

Bilmiyorum, yukarıdaki gibi yöntemlerle eksiğini kapatmaya çalışıyoruz.

Üstteki Akışı editledim.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.