seri iletişimle ilgili bir sorun

Başlatan private_korsan, 09 Kasım 2010, 18:36:59

private_korsan

Alıntı yapılan: neural - 13 Kasım 2010, 09:24:30
Kesme oluşması için USART modülünü kesmeleri açmadan ilgili değerlerle ayarlamanız gerekir. ( Baud hızı, sürekli alım gibi) Kullanmış olduğuz pic basic dilinde Hserin komutu bu iş için kullanılıyor. Ancak benim tavsiyem Hserin kolay olmasına rağmen kullanmamanız. Aşağıdaki örneği inceleyiniz.

Device 16F877
SYMBOL GIE  =INTCON.7   
SYMBOL PEIE =INTCON.6   
SYMBOL RCIE =PIE1.5     
SYMBOL RCIF =PIR1.5

' değişken tanınlamaları
dim sec as byte

on interrupt goto kesme

TRISA = %11111111
TRISB = %11111111
TRISC = %10111111
gosub usrinit

RCIF = 0
RCIE = 1
INTCON = %11000000  ' enable komutunu kullanmaya gerek yok çünkü 
					' intcon kaydediciyle açıyoruz

loop:
	nop
	'
	' Kontrol işlemlerini 
	' burada yapınız
	'
	'
	'
	goto loop

disable
kesme:
	if RCIF = 1 then
		RCIF = 0
		sec = RCREG
	endif
' Başka kesmeleride aktif yapıp kullanabilirsiniz
	'if BASKAKESMEBAYRAĞI = 1 then
	     '
	     '
	     '
	'endif  
	'
resume	
enable

usrinit:
	rcsta = 0b10010000	' spen=1 cren=1	
	Spbrg = 25			' baudrate ayarla 9600bps 
	txsta = 0b00000100	' txen=0 brgh=1
return
	

	end

peki RCREG hangi tip değrleri alacak herhangi bir karakter yada onluk sayı veya bir string

neural

RCREG 8 bitlik bir kaydedici bu yüzden gelen veri 8 bitlik bir karakter yada byte tipinde bir değerdir. Yani siz klavyeden hangi tuşa basarsanız o tuşa karşılık gelen byte değeri yollanır. Yani gelen ve giden veriler aslında hep 8 bitlik sayılardır.

Char veya string olması sizin programınızdaki yoruma kalmıştır.
Örnek vermek gerekirse
PC üzerinden "1" tuşuna bastığımızı varsayalım. Bu değerin ASCII karşılığı 0x31 (49) dir. Alıcı tarafta bu değeri aldığında yine 0x31 (49) değerini alır.  Ancak alıcı tarafında yapacağınız bir karşılaştırma ifadesinde ;

IF sec = 0x31 THEN
ile
IF sec = "1" THEN ifadesinin sonuçları aynı olacaktır.