HSERIN komutu ve değişken kullanımı....

Başlatan greatgonzo, 04 Temmuz 2012, 15:30:10

greatgonzo


HSERIN,10,CIK,[WAIT (ISRT),VARB,VARI] şeklinde kullandığım bir satırım var. ISRT bir değişken ve sayısal bir içeriği var. Fakat bir türlü basic e bu değişkeni gösteremedim. Acaba belli bir yöntemimi vardır yoksa mümkün değilmidir.

ete


HSERIN,10,CIK,[WAIT (ISRT),VARB,VARI]  şeklindeki bir komut satırında , ISRT geçerli bir değişken adı ise sorunsuz çalışması gerekir.
Sorun bir başka yerde olabilir. Ben elimdeki heserin komutunun yer aldığı programlardan birinde direk denedim. Sorunsuz derlendi program. O halde sorun yok demektir.

Ete

greatgonzo

Haklısınız hoca problemsiz çalışıyor. Vericiyede aynı değişkeni tanımlayıp,aynı içeriği yükleyince problem çözüldü.  Sanırım yollarken rakamları tırnak işaretlerinde yazmamdan kaynaklandı. Bazı programlama dillerinde zannedersem böyle ilginç huyları vardı ;rakamları harf gibi karakter tanıma şeklinde. Zannediyorumki böyle bir bürokrasiye takıldı ama son hali problemsiz.

Çok hızlı cevap için teşekkür ederim hocam :-)

İyi çalışmalar...

zeus48

;Herkese mrb. Arkadaşlar bir sorunum var  çözemedim .  Aşağıda vermiş olduğum bir verici
; birde alıcım var bunlar RF çalışıyor. Sorunum alıcı ve vericiyi haberleştiriyorum ama
; datalar doğru gitmiyor yada doğru alınmıyor.. Haberleşme protokolinde  SEROUT2 ile gönderdiğimi
; HSERIN ile alıyorum  bahsettiğim sorun  yani dataların düzgün gitmemesi yada alınmaması
;  Ama HSERIN  yerine SERIN2  ile deniyorum hiçbir sorun yok .. HSERIN kullanma zorunluluğum var
; timeout ihtiyacım var

;;;;;;;;;;;;;;;VERİCİ BÖLÜMÜ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


@ DEVICE pic16F628                      'işlemci 16F628                               
@ DEVICE pic16F628, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628, PROTECT_ON         'Kod Protek kapalı
@ DEVICE pic16F628, MCLR_off            'MCLR pini kullanılıyor.
@ DEVICE pic16F628, XT_OSC
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak

CMCON=7   
OPTION_REG=7
PORTA=0:portb=0
TRISB=%10001110   
TRISA=%00100000   

DEFINE LCD_DREG      PORTA   
DEFINE LCD_DBIT      0      
DEFINE LCD_EREG      PORTA   
DEFINE LCD_EBIT      7      
define LCD RWREG    PORTA   
define LCD_RWBIT    2       
DEFINE LCD_RSREG   PORTA   
DEFINE LCD_RSBIT   6      
DEFINE LCD_BITS      4      
DEFINE LCD_LINES   2      


A VAR BYTE
B VAR BYTE
W VAR BYTE
R VAR BYTE
Z VAR BYTE
Q VAR BYTE
I VAR WORD
Y VAR BYTE
T VAR BYTE
S VAR BYTE
A=0
B=0
S=0
T=0
Y=0
I=0
W=0
Z=0
Q=0
R=0

BASLA:


SEROUT2 PORTB.4,813,[REP$AA\5,REP$00\5,REP$FF\5]
SEROUT2 PORTB.4,813,["A","C","B",Q,W,Z,R,T,S]
SEROUT2 PORTB.4,813,["A","C","B",Q,W,Z,R,T,S]
SEROUT2 PORTB.4,813,["A","C","B",Q,W,Z,R,T,S]
SEROUT2 PORTB.4,813,["A","C","B",Q,W,Z,R,T,S]
pause 5
SEROUT2 PORTB.4,813,[REP$AA\5,REP$00\5,REP$FF\5]
SEROUT2 PORTB.4,813,["A","C","B",Q,W,Z,R,T,S]
SEROUT2 PORTB.4,813,["A","C","B",Q,W,Z,R,T,S]
SEROUT2 PORTB.4,813,["A","C","B",Q,W,Z,R,T,S]
SEROUT2 PORTB.4,813,["A","C","B",Q,W,Z,R,T,S]

pause 5
SEROUT2 PORTB.4,813,[REP$AA\5,REP$00\5,REP$FF\5]
SEROUT2 PORTB.4,813,["A","C","B",Q,W,Z,R,T,S]
SEROUT2 PORTB.4,813,["A","C","B",Q,W,Z,R,T,S]
SEROUT2 PORTB.4,813,["A","C","B",Q,W,Z,R,T,S]
SEROUT2 PORTB.4,813,["A","C","B",Q,W,Z,R,T,S]




;;;;;;;;;;;;;;;;;;;;;;ALICI BÖLÜMÜ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

@ DEVICE pic16F628                      'işlemci 16F628                               
@ DEVICE pic16F628, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628, PROTECT_ON         'Kod Protek kapalı
@ DEVICE pic16F628, MCLR_off            'MCLR pini kullanılıyor.
@ DEVICE pic16F628, XT_OSC
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak



define OSC          4
INCLUDE "modedefs.bas"
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 51 ' 1200 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically


CMCON=7   
PORTA=0:portb=0
TRISB=%00001010 
TRISA=%00000000   


DEFINE LCD_DREG      PORTB   'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT      4      'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG      PORTA   'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT      6      'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG   PORTA   'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT   7      'LCD RS bacağı Hangi Bite bağlı  ?

'-------------------------------------------------------------------------
A VAR BYTE
B VAR BYTE
W VAR BYTE
R VAR BYTE
Z VAR BYTE
Q VAR BYTE
I VAR WORD
Y VAR BYTE
T VAR BYTE
S VAR BYTE
A=0
B=0
S=0
T=0
Y=0
I=0
W=0
Z=0
Q=0
R=0



BASLA:
Q=0:W=0:Z=0:R=0:T=0:S=0

HSERIN 50,ALT,[WAIT("ACB"),Q,W,Z,R,T,S]

ALT:

GOTO BASLA

ete

KOmutlarda bir sorun gözükmüyor. Gözden kaçan bir şey olabilir.
ALıcı kısma çalışan SERIN2 komutunuda yaz ki ne kullandığını görebilelim. Ayrıca dosyalarıda buraya ekle bizde çalıştırabilelim.
Seri yolla data iletiminde çeşitli formatlar vardır. Bunları sıralayacak olursak,
1. Driven True denilen sistemde data olduğu gibi yollanır.
2. Driven Inverted sisteminde data bitleri ters çevrilerek yollanır
3. Open True
4. Open Inverted.

Bunun dışında HSERIN donanımsal seri portu kullandığı için 2 adet giriş buffer'ı ile çalışır. Bunlarda ilk data geldiğinde anında dolup tedbir alınmaz ise anında OVERFLOW (Aşıma uğrarlar) ve port başka bilgi alamaz olur. Bu oluştuğunda USART yeni bilgi alımını durdurur. Muhtemelen sende bu olay meydana geliyordur. Aslında bunu önlemek için RCSTA registerinin CREN biti toggle yapılması gerekir. Ancak programın başına ilave ettiğin DEFINE HSER_CLROERR  1 komutu bu işi otomatik yaptırır.
Şayet CREN biti ile aynı işi yapmak istersen;
RCSTA.4=0:RCSTA.4=1 şeklinde bir komut satırı yerleştirmen gerekiyor. Hemen HSERIN komutunun altına.

Programın Verici kısmına bakacak olursak , alıcıda OVERFLOW olmayı tetikleyecek şeyler yapmışsın.
Bir veri yollama işin bir sürü yollama komutu vermenin alışverişe zarar vermekten başka bir faydası yok. Senin sorununun bir nedenide bu komut fazlalığı.
Preambl denilen uyandırma bilgisi yalnızca bir kere verilmeli. Ardından 1 veya en fazla 2 adet veri yollama komutu yeterli olacaktır. Sistem almaya meyilli ise zaten yolladığını alacaktır. Değilse yüz defada yazsan almayacaktır.
Yazdığın bu kadar çok gönderme komutu muhtemelen alıcıdaki OWERFLOW olma durumunu tetikliyordur.
Ete

Powered by EzPortal