Elektronik / Mikrodenetleyici Projeleri/

RS232 Seri Portun PIC Mikro denetleyiciler ile Kullanımı

Sponsorlu Bağlantılar

Seri Portun PIC Mikro denetleyicilerle Pratik Kullanımı

Hazırlayanlar: Ali KILIÇ , Galip KILIÇ

Hatırlayacağınız gibi daha önceki makalede assambly dilini kullanarak PIC’i programlamıştık. Bu yazımda ise hem anlaması hem de üzerinde değişiklik yapması oldukça kolay olan C diliyle PIC programlayacağız. C bilmeyenler için yeri geldikçe bahsedeceğiz değişiklikleri yaparak programı kendi amaçlarına göre değiştirebilirler.

Bilgisayar yazılımı olarak Visual Basic veya başka bir programlama dili bilenler kendi programlarını yazabilirler. Bilgisayar programcılığı ile arası pek iyi olmayanlar Hyperterminal’i (Start>Programs>Accessories>Communications>Hyperterminal) kullanabilirler. Eğer belirttiğim yolda Hyperterminal’e ulaşamıyorsanız Program Ekle/Kaldır’dan Hyperterminal’i yüklemeniz gerekiyor.

Kullandığım C derleyicisi CCS PIC C adıyla download edilebilir. Bu derleyici ile ilgili sorunlarınızı bize bildirirseniz yardımcı olamaya çalışırız.

Seri portla haberleşmede kullanılacak PIC için C kodu aşağıda verilmiştir. Program 16F84 için yazılmış olmasına rağmen;

#include <16F84.h> satırını değiştirerek istediğiniz bir PIC mikro denetleyiciyi kullanabilirsiniz.

#use delay(clock=4000000), satırı ile kullandığınız kristal osilatörün hızını, #use rs232(baud=9600, xmit=PIN_A1, rcv=PIN_A2) satırı ile de seri haberleşmede kullanacağınız bacakları belirtiyorsunuz.

Hyperterminal’in iletişim hızı 9600 baud olarak ayarlanmış olmalıdır. İç USART’ı olan PIC’ler için RX ve TX bacaklarını kullanmanız daha verimli olacaktır (örneğin PIC 16F877 için RC7 RX ve RC6 TX bacakları kullanılmalıdır).

#byte port_b = 6 satırı PORTB’nin Register’lar (Register Map) arasındaki yerini gösterir. PORTA için bu satır #byte port_a = 5 şeklinde değiştirilmelidir. port_A veya port_B isimleri keyfidir siz bu isimleri programda da değiştirmek şartıyla istediğiniz gibi değiştirebilirsiniz. set_tris_b( 0x00 ); satırı PORTB’nin çıkış olacağını belirtiyor.

Bir portu giriş yapmak için bu satır set_tris_b( 0xFF ); şeklinde değiştirilmelidir.

While (TRUE) satırı sonsuz bir döngü yaratmak için kullanılmıştır.

Programda önce data adında bir değişken tanımlanıyor ve Hyperterminalden okunan tuş bu değişkene atanıyor. Daha sonra boş değişken PORTB’ye gönderiliyor. data değişkenini kullanmayıp port_b = getch(); satırı ile de aynı iş yapılmış olur. delay_ms(1000); satırı 1000 mili saniye yani 1 saniyelik gecikme sağlamak için kullanılmıştır.
Böylece basılan tuşun ascii değeri en az 1 saniye PORTB’deki LED’lerde görülür.

Herhangi bir tuşun ASCII karşılığını öğrenmek için aşağıda verdiğimiz tabloyu kullanabilirsiniz.

PIC mikro denetleyicinin bacaklarını seri portun Rx ve Tx girişlerine doğrudan girmek yerine arada MAX232 entegresini kullanmak verilerin hatasız iletimi açısından gereklidir.

MAX232 entegresi -12, +12 V seviyesindeki seri port sinyallerini TTL (+5, 0 V) seviyesine veya TTL seviyesini -12 V, +12 V sinyallerine çevirir. Resimde PA1 ve PA2 PIC16F84’ün PORTA 1 ve 2 bacaklarıdır.


PC seiportu ile PIC’in MAX232 ile birbirine bağlanması

Bilgisayardan PIC’e Seri Portla Bilgi Göndermek


Bilgisayardan PIC’e Seri Portla Bilgi Göndermek için gerekli devre

#include <16F84.h>

#fuses XT,NOWDT,NOPROTECT

#use delay(clock=4000000)

#use rs232(baud=9600, xmit=PIN_A1, rcv=PIN_A2)  

#byte port_b = 6	//portb nin ramdeki yeri

main() {

   int data;

   set_tris_b( 0x00 );	//portb çıkış
printf("calisiyor…\n\r");

   while (TRUE)
   {
	
     data = getch();
     port_b = data;	//gönderilen sayıyı portb de göster
     delay_ms(1000);

   }//sürekli tekrarla 
}

PIC’ten Bilgisayara Seri Port ile Bilgi Göndermek

Şimdi de PIC’ ten bilgisayara seri port ile bilgi gönderelim. Bunun için gereken devre şeması ve C kodları aşağıda verilmiştir. Sekizli anahtarlarla istenen değer girilir. Pullup dirençleri PIC’in bacaklarının boşta kalıp hatalı değerler okumasını önlemek içindir. RESPAK 8 Sekiz adet direnç içeren pakettir.
Gönderilen bilginin ASCII değeri Hyperterminal de görülecektir. Gerektiğinde yazının sonunda verilen ASCII tablosundan yararlanabilirsiniz.


PIC’ten Bilgisayara Seri Port ile Bilgi Göndermek için gerekli devre

// portb deki data bilgisayara gönderilir

#include <16F84A.h>

#fuses XT,NOWDT,NOPROTECT

#use delay(clock=4000000)

#use rs232(baud=9600, xmit=PIN_A1, rcv=PIN_A2)

#byte port_b = 6	//portb nin ramdeki yeri

main() {

   int data;

   set_tris_b( 0x00 );	//portb çıkış

   printf("calisiyor...\n\r");

   while (TRUE)
   {

     data = port_b;  //bilgisayara gönderilecek data portb'de
     printf("%d", data);
     delay_ms(1000);

   }//sürekli tekrarla 
}

ASCII Tablosu

PIC16F84 İle seri portun pratik kullanımı

Hazırlayanlar: Galip kılıç

Bu yazımda seri portun pratik kullanımı üzerinde duracağım. Bu iş içinr bir PC, bir PIC 16F84 entegresine, bir DB9 konnektörüne, birkaç LED’e ve dirence ihtiyacımız olacak. Bir de porta bilgi göndermek için küçük bir yazılıma ihtiyacımız olacak.

PC’nizin arkasında bilgisayarın dünyayla haberleşmesini sağlayan çeşitli portlar vardır. Örneğin benim bilgisayarımın arkasında bir adet LTP (printer portu), iki adet RS232 DB9 (9 pinli) seri port (communication portu olarak da bilinir), iki USB portu (Universal Serial Bus) yüksek hızlı seri iletim için ve PS/2 bağlantı portları, mause ve klavye için bulunur. Bu portlar birçok yeni bilgisayar için standarttır.

Aşağıda RS232 için DB9 konnektörü görülüyor. 9 pinden RXD (Receive Data) ve TXD (Transmit Data) ve tabii ki GND (Ground) yani ikinci, üçüncü ve beşinci pinler bizi ilgilendiriyor. Bu pinler Türkçe’ye sırasıyla alıcı, verici ve toprak olarak çevrilebilir. Diğer pinler modem veya benzeri uygulamalar için kullanılır. Bizim uygulamamızda bir DB9 konnektörün ikinci, üçüncü ve beşinci pinlere kablo bağlantısı yapacağız. Diğer uçlar bağlantısız olabilir.

1. CD (Carrier Detect)
2. RXD (Receive Data)
3. TXD (Transmit Data)
4. DTR (Data terminal Ready)
5. GND (Ground)
6. DSR (Data Set Ready)
7. RTS (Request To Send)
8. CTS (Clear To Send)
9. RI (Ring Indicator)

Bilgi alışverişi yapacağımız entegre Microchip (www.microchip.com ) firması tarafından üretilen 16F84 entegresidir. PIC (Programmable Interface Controller) bircok defa progamlanabilen bir mikrodenetleyicidir. Bilindiği gibi mikrodenetleyici içerisinde CPU (işlenci), RAM (Rastgele erişimli bellek) ve giriş/çıkış birimleri olan bir entegredir. Yani bir nevi bir bilgisayardır. PIC16F84 (ayrıntılar için appendix’e bakınız) PIC öğrenmeye başlamak için en uygun entegredir. Bu entegreyi programlayabilmek için kendine has olan assambly dilini kullanmak gerekir. Yazılan kodları internetten ücretsiz indirebileceğiniz MPASM derleyicisi ile derleyebilirsiniz. Kodları yazmak için NOTPED kullanabileceğiniz gibi aynı zamanda simulatör içeren MPLAB editörünü de kullanabilirsiniz. Temel komut sayısı 34 tanedir. Eger assembly dili size zor geliyorsa aynı işi Pascal,C,BASIC gibi gelişmiş dilleri kullanarak da yapabilirsiniz. Bu dillerin PIC için özel geliştirilmiş derleyicileri vardır. Bu derleyicilerin demo versiyonları internetten bulunabilir.

PIC16F84 entegresi ile ilgili genel bilgiler aşağıda verilmiştir. Ayrıca bacaklarla ilgili ayrıntılı bilgiyi aşağıda bulabilirsiniz.

Yukarıdaki dökümandan da anlaşılacağı gibi 14. bacağa +5 Voltluk gerilim uygulanır, 5. bacak ise toprağa bağlanır. 16F84 ün 5 adet A, 8 adet B bacağı giriş veya çıkış olarak kullanılabilir. Yani toplam 13 giriş veya çıkışımız vardır. –MCLR girişi PIC’i resetlemek için kullanılır. PIC için gerekli saat darbeleri ise 15. ve 16. bacaklara bağlana osilatör ile sağlanır. Farklı osilatör çeşitleri olmasına rağmen kristal tipi (XT) osilatörler hem zamanlama açısından güvenilirdir hem de kullanımı pratiktir. Benim bu uygulamada kullandığım XT osilatör 4 MHz’lik bir osilatördür.

Yazılan kodu MPASM ile hexadecimal koda dönüştürdükten sonra PIC programlayıcı ile (Ben PIC Prog kullandım.) PIC programlanır. PIC programlayıcı çeşitli devreler

Bu yazımızın asıl amacı seri port ile haberleşmek olduğundan PIC hakkında genel bilgiler verdim. Daha ayrıntılı bilgi için bana e-posta gönderebilirsiniz.

Şimdi 16F84 ile yapacağımız devrelerimize bakalım. Birinci devre bilgisayardan alınan bilgiyi B portuna bağlı 8 LED’de gösterecektir. İkinci devrede ise B portuna girilen 8 bitlik bilgi bilgisayara girilecektir. Aşağıda sırasıyla 8 bitlik bilginin PIC’e gönderilmesi ve daha sonra 8 bitlik bilginin PIC yardımıyla bilgisayara alınması anlatılacaktır.

Bilgisayar ile PIC haberleşmesinde arayüzü Visual Basic ile yaptım. Arayüzün görünümü aşağıda (Şekil 3) görülmektedir. testver butonu text penceresine yazılan sayıyı veya karekteri PIC’e göndermek için kullanılacaktır. testalal butonu PIC’ten alınan 8 bitlik bilgiyi text penceresine yazdıracaktır. exit butonu ise programdan çıkmamızı sağlayacaktır.

Arayüzde görünmeyen ve comm port ile ilgili işlemler yapmamızı sağlayan Mscomm kontrolörü çalışma alnında görülür. Bu kontrolörü yüklemek için sırasıyla projects > componenets > microsoft comm control seçilir. Bu işlem yapıldıktan sonra vb çalışma alanının görünümü aşağıda görüldüğü gibidir. (Şekil 4)

Program ile ilgili kodlar sırasıyla şöyledir (Şekil 5). testver butonu için :

Private Sub ver_Click()

    MSComm1.Settings = "9600,N,8,1"
    'rs232 ile ilgili ayarlar
    MSComm1.PortOpen = True
    'port açiliyor
    MSComm1.Output = Text1.Text
    'text penceresine yazilan deger pic'e gonderiliyor
    MSComm1.PortOpen = False
    'port kapatiliyor
    
End Sub

Yorumlardan da anlaşılacağı gibi önce comm port ile ilgili ayarlar yapılmaktadır. Bu ayarlar bilginin 9600 baud (bit per second), parity bitsiz (no parity), 8 bitlik data ve bir stop biti ile gönderildiğini veya alındığını gösteriyor. MSComm1.PortOpen=True deyimi portun açıldığını MSComm1.Output porta bilgi gönderildiğini (Gönderilen bilgi text1’e yazılan sayı veya karekterdir) ve MSComm1.PortOpen=False portun kapandığını belirtiyor.

Buton testal için yazılan kodkar şunlardır.

Private Sub al_Click()

    MSComm1.Settings = "9600,N,8,1"
    'rs232 ile ilgili ayarlar
    MSComm1.PortOpen = True
    'port açiliyor
    deger = Asc(MSComm1.Input)
    'pic'ten okunan 8 bitin ascii karsiligi aliniyor
    Text1.Text = deger
    'okunan bilgi text penceresinde görünüyor
    MSComm1.PortOpen = False
    'port kapatiliyor
    
End Sub

Yukardaki kaynak kodunda testver butonunda kullanılan kodlara benzer kodlar vardır. Dışardan gelen bilgiyi almak için MSComm1.Input deyimi kullanılmıştır. Asc fonksiyonu alınan karekterin ascii değerini almak için kullanılmıştır. Ascii tablosunu herhangi bir programlama kitabının arkasında bulabilirsiniz. deger değişkenin dim deger as integer olarak tanımlanması daha uygun olabilir. Portun MSComm1.PortOpen = False satırı ile kapatılması programın “port zaten açık” hatası vermemesi açısından önemlidir.

exit butonu programdan çıkılmasını sağlamaktadır.

Şimdi sıra kullanacağımız devrede. Şekil 6’da kurulacak devre görülüyor. Devrede kullanılan PIC’e daha önce programlama devresi ve programlama yazılımıyla seri porttan gelecek bilgiyi alması için programlanması gerekmektedir

İlgili asm kodu aşağıda verilmiştir. Bu kodu bir NOTPED’e asm uzantılı kaydedebilir ve daha sonra MPASM derleyicisi ile hex uzantılı koda dönüştürebilirsiniz.

PIC’e bilgi göndermek için kullanılacak asm kodu şöyledir:

	list p=16f84		;**************************************************************
;*
;*	----------------------------------	
;*	PORTA: 
;*		0 
;*		1 
;*		2 
;*		3 seri Input txd pin3 of rs232 
;*		4 
;*	PORTB:
;*		0 LED	   
;*		1 LED
;*		2 LED
;*		3 LED 
;*		4 LED
;*		5 LED
;*		6 LED
;*		7 LED
;*

; Include date for 16F84 

	#include 	


cycl_1 		Equ	0x20		; sayıcı
cycl_2		Equ	0x21		; sayıcı
rs232in	Equ	0x22		;temp variable to pass its value to portb
Byte		Equ	0x23		;variable used to locate 8 bit
Temp		Equ	0x24		;temp variable for pause time
in		Equ	3		;RA3 is input

;**************************************************************

; Port B is set as output
;porta and portb is clearified

Init
	bsf     		STATUS, RP0	; bank1 git
	movlw		B'00000000'		; portb çıkış
	movwf		TRISB
	bcf     		STATUS, RP0	; bank0 git
	clrf		PORTA		; portA temizle
	clrf		PORTB		; portB temizle

;main program starts here

Loop
	call		ser_RX		; ser_RX dallan
	movfw		rs232in		
	movwf		PORTB		; w içeriğini portB ‘e göster 
	goto		Loop

;**********************************************************
;receive one Byte to 'byte', 'rs232in' and w respectively

ser_RX
clrf		Byte			; byte temizle
	movlw		8
	movwf		cycl_1			; 8 times for 8 bits
	btfss		PORTA, in		; wait until Startbit
	goto		ser_RX		; if no startbit goto ser_RX
	call		Pause			; pause for 1/2 Bit (48 usec)
	btfss		PORTA, in		; test porta again
	goto		ser_RX
RX_2	
call		Wait			; wait 1 Bit (94 usec)
	btfsc		PORTA, in		;
	bcf		STATUS, C		; high -> 0
	btfss		PORTA, in		;
	bsf		STATUS, C		; low  -> 1
				;
	rrf		Byte, f			; pass carry flag to Byte reg.
	decfsz		cycl_1, f		; 8 bits
	goto		RX_2			; 
	
	call		Wait			; wait 1 Bit (94 usec)
	btfsc		PORTA, in		; Stop-Bit 1
	goto		ser_RX		; if no StopBit 1
	call		Wait	
	btfsc		PORTA, in		; Stop-Bit 2
	goto		ser_RX		; if no StopBit 2

	movf		Byte, w
	movwf		rs232in		; Byte pass through rs232in
	return

;**********************************************************
;one bit waiting time
;
; receive           4 MHz    10 MHz
; 2400 Bps =          69d    173d
; 4800 Bps =          34d     86d
; 9600 Bps =          15d     43d 

Wait	movlw		D'15'			; 9600 / 4 MHz receive
	movwf		cycl_2			; 

Wait1	
	nop
	nop
	nop
						; 
	decfsz		cycl_2, 1	
	goto		Wait1
	
	return

;**********************************************************
;1/2 bit waiting time
;                4 MHz       10 MHz
; 2400 Bps =  416T =  63d    157d
; 4800 Bps =          31d     78d
; 9600 Bps =          15d     39d 
;	
Pause	movlw		D'15'			; 9600 / 4 MHz
	movwf		Temp			;	
Pause2	
	decfsz		Temp, f		; Pause for 1/2 Bit	
	goto		Pause2			;	
	return					;

;**********************************************************

	end

PIC programlandıktan sonra Visual Basic ile hazırladığımız programımızda text penceresine bir sayı yazıp testver butonuna tıklandığında yazılan sayı 8 LED’de görülecektir.

PIC’ten bilgisayara bilgi almak için Şekil 7 deki devre kullanılabilir.

1 kiloohmluk dirençlere lojik 0 veya lojik 1 verildiğinde ve Visual Basic programımızda testal butonuna tıklandığında dirençlere uygulanan 8 bitlik bilgi ile ilgili bir sayı text penceresinde görünür. PIC’e yüklememiz gereken hex kodu aşağıda verilen asm kodun derlenmesiyle elde edilir.

PIC’ten bilgi almak için kullanılacak asm kodu şöyledir:

	list p=16f84
;**************************************************************
;*
;*   
;*	----------------------------------	
;*	PORTA: 	0 
;*		1 
;*		2 seriel input	
;*		3 
;*		4 
;*	PORTB:	0 resistor	   
;*		1 resistor
;*		2 resistor
;*		3 resistor 
;*		4 resistor
;*		5 resistor
;*		6 resistor
;*		7 resistor
;*
;**************************************************************

; Include data for 16F84 processor

	#include 

;Variab defined

Temp		Equ	0x20
cycl_1		Equ	0x21			; counter
cycl_2		Equ	0x22			; counter
Byte		equ	0x23
out		EQU	2			;RS-232 is output from RA2

;**************************************************************
; 
; Pin RA2 is output pin

Init
	bsf     		STATUS, RP0		; goto bank1
	movlw		B'00111011'			; RA2 output 
	movwf		TRISA				; 
	bcf     		STATUS, RP0		; return to bank0
	clrf		PORTA			; 

;this asm firstly send "a" to computer i changed it to send data 
;applied to portb (alisur)
Loop
	movf		PORTB,w			;pass portb to w reg. 
	call		Send_RS			; Data sent via RS-232
	goto		Loop

;***************************************************************
;send Bytes, in Register W 
Send_RS					; give one Byte serielly	
	movwf		Byte			; Byte in w
	movlw		8			; it will send 8 bit
	movwf 	cycl_1
	bcf		PORTA, out
	call		Wait_s			; 1 Stopbit (1)
	bsf		PORTA, out
	call 		Wait_s			; 1 Startbit (0)

Send_1
rrf		Byte, f			; bit will be send pass thruogh carry flag
	btfsc		STATUS, C
	bcf		PORTA, out		; Low when Bit = 1
	btfss		STATUS, C
	bsf		PORTA, out		; High when Bit = 0
	call		Wait_s			; 1 Bit duration wait
	decfsz		cycl_1, f		; is it 8 bit?
	goto		Send_1		; no
	bcf		PORTA, out		; Byte ended, 2 Stopbit (1) send
	call 		Wait_s			;
	call		Wait_s			; (Mod.1)
	return

;**********************************************************
;wait duration of one bit
;
; send              4 MHz    10 MHz
; 2400 Bps =          69d    173d
; 9600 Bps =          15d     43d

Wait_s	
movlw		D'15'			; 9600 / 4 MHz send
	movwf		cycl_2			; 
Wait1	
	nop
	nop
	nop
	decfsz		cycl_2, 1	
	goto		Wait1
	return

	end

PIC16F877 İle data bus (verİ yolu) uygulaması

Hazırlayan: Galip KILIÇ

Bilgisayar veya ana makine (ana makine mikro denetleyici içeren bir kart olabilir) ile diğer uydu makinelerin haberleşmesi çeşitli yollarla gerçekleştirilebilir. Bu makineler bir fabrikadaki seri üretim makineleri olabileceği gibi bir evdeki televizyon, müzik seti, klima, fırın, ışıklar, kombi gibi ev aletleri olabilir. PIC16F877 mikro denetleyici içeren bir kontrol kartı ile uydu makinelerden bilgiler toplanabilir veya onlara komutlar gönderilerek iş yaptırılabilir. Ana makine veya bilgisayar (PC) ile uydu makineler arasındaki iletişim için çeşitli protokoller kullanılabilir.

Bu protokollerden en uygunu RS232’dir. RS232 hakkında ayrıntılı bilgi için Seri Portun PIC mikro denetleyicilerle pratik kullanımı (ETMD Bizden Haberler Şubat 2004 Sayı 15), Paralel Portun Kullanımı, Seri Portun PIC mikro denetleyicilerle pratik kullanımı (http://www.etmd.org.tr/yazilar.asp ). Uydu makineler ile ana makine veya bilgisayarın birbirine bağlanmasında data bus (veri yolu) denilen bağlantılar kullanılır (Şekil 1). PIC kartları ile bilgisayar arasındaki bağlantı Şekil 2’de gösterilmiştir.
Bu yazının amacı yukarıdaki şekilde görüldüğü gibi iki iletken ile bir çok mikroişlemciyi birbirine bir BUS üzerinden birbirine bağlayarak seri port üzerinden bilgisayar veya ana makine ile haberleştirmektir.

Seri port üzerinden PIC ile haberleşme bu konularla uğraşan meraklılar için önemli konulardan biridir. Bu konuya bir ışık tutmak ve amatör olarak bu işi uğraş edinen insanlara yardımcı olmak için bu küçük uygulamayı denemelerden sonra yayınlamaya karar verdim. Devre denenmiş ve çalışması kontrol edilmiştir.

Bu uygulamada bir yada birden çok PIC’in iki kablo ile bilgisayar ile haberleşmesini sağlayacağız. RS232 protokolü ile haberleşme yapıldığı, için arka arkaya bağlanacak PIC sayısı kullanılacak bağlantı iletkeninin uzunluğunu 12 metre ile sınırlandırmaktadır. Eğer bu mesafenin daha uzun olması istenirse RS485 protokolü ile ( yaklaşık 800-1000 mt.) PIC’ler arasında daha iyi bir Data Bus (Veri Yolu) sistemi kurulabilir.

Aşağıdaki assambly kodlar Data Bus (Veri Yolu) sisteminin birinci PIC’in kodlarıdır.

Özetle çalışma sistemi şöyledir: Kodlar PIC16f877’ye doğru yüklenip devre doğru kurulduğunda bilgisayarın klavyesinde “1” tuşuna basıldığında uydu makinedeki PIC mikro denetleyici

DT	"<** Su anda klavyede 1 tusuna bastiniz **>"

Satırında yazılı olan bilgiyi Hyper teminale gönderecektir. Hyper terminalde aşağıdaki yazı görünecektir.
	<** Su anda klavyede 1 tusuna bastiniz **>

“1” değerini PIC aşağıdaki satır ile anlamakta, gönderilen değeri bu satır ile karşılaştırdıktan sonra gelen değerin kendisine gönderdiğini anlayıp DT satırındaki değeri hyper terminalle göndermektedir. 

SUBLW	D'49'			;klavyeden gönderilen 1’in ascii karşılığı 49’dur.

BUS sistemine 2. işlemcisine aşağıdaki kodlarda şu değişiklikler yapılarak 2. işlemci programlanır.

SUBLW	D'49' 

satırındaki 49 yerine “2” nin ascii değeri olan 50 yazılmalı yani bu satır 

SUBLW	D’50’ ile değiştirilmelidir. 

DT	"<** Su anda klavyede 1 tusuna bastiniz **>"

Satırı yerine 2. PIC’in göndereceği satır ise 

DT	"<** Su anda klavyede 2 tusuna bastiniz **>"

Şeklinde değiştirilmelidir.

Diğer BUS sistemindeki PIC16f877’ler içinde buna uygun değişiklikler yapılarak istenildiği kadar işlemci BUS sistemine bağlanabilir.

Diyelim ki 3 16F877 bağladınız durumda:

Klavyeden “1” tuşuna bastığınızda hyper terminale 
DT	"<** Su anda klavyede 1 tusuna bastiniz**>" bilgisi
Klavyeden “2” tuşuna bastığınızda hyper terminale 
DT	"<** Su anda klavyede 2 tusuna bastiniz**>" bilgisi
Klavyeden “3” tuşuna bastığınızda hyper terminale 
DT	"<** Su anda klavyede 3 tusuna bastiniz**>" bilgisi
gönderilecektir.

Not: 
1 ascii değeri 49
2 ascii değeri 50
3 ascii değeri 51

Progam

;Windows hyper Terminali 19200 bps, N,8,1 ile bilgi gönderme bu göndermede el sıkışması YOK olarak	
; Program adı : Seri port üzerinden birden çok PIC ile haberleşme.

LIST	P=16F877,C=140
	ERRORLEVEL	1,-(305)
	#INCLUDE	"P16F877.INC"
	__CONFIG  _PWRTE_ON&_XT_OSC&_LVP_OFF&_WDT_OFF

TEMP			EQU	7FH
SAYAC1		EQU	8FH


	ORG	0			;program başlangıç satırı
	GOTO		MSTART

MSTART

	BCF		STATUS,RP1
	BCF		STATUS,RP0		;BANK0 geç.

	MOVLW	0X00
	MOVWF	PORTA
	MOVWF	PORTB
	MOVWF	PORTC
	MOVWF	PORTD
	MOVWF	PORTE
	
	BCF		STATUS,RP1
	BSF		STATUS,RP0		;BANK1 bank geç.
	
	CLRF		TRISA
	CLRF		TRISD
	CLRF		TRISE
	MOVLW	0XFF
	MOVWF	TRISB
	MOVLW	0XFF
	MOVWF	TRISC		
	

;  Baud Values with BRGH = 0
;  ((20000000/9600)/64)-1 = 32


;    movlw     d'6'          		;  9600 baud @ 4 Mhz Fosc brgh=0
;    movlw     d'25'          		;  9600 baud @ 4 Mhz Fosc brgh=1
;    movlw     d'207'         		;  1200 baud @ 4 Mhz Fosc brgh=1
;    movlw     d'2272'         		 ;  110 baud @ 4 Mhz Fosc brgh=1
;    movlw     d'103'          		;  2400 baud @ 4 Mhz Fosc brgh=1
;    movlw     d'52'          		;  4800 baud @ 4 Mhz Fosc brgh=1
;    movlw     d'12'          			;  19200 baud @ 4 Mhz Fosc brgh=1

                    		
	MOVLW	D'12'			;19200 BAUD AT 4 MHZ FOSC
	MOVWF	SPBRG
	MOVLW	B'00100100'		
MOVWF	TXSTA		;Enable Async Transmıssıon,Brgh=1 Hıgh Speed
	BCF		STATUS,RP1
	BCF		STATUS,RP0		;BANK0
	MOVLW	B'10010000'
	MOVWF	RCSTA		;ENABLE ASYNC RECEPTION 
	CLRF	 	TEMP

SETTLE

     	DECFSZ  	TEMP
     	GOTO		SETTLE

MAIN

	CLRF		TEMP
	CALL		RXLOOP
	SUBLW	D'49'			;klavyeden gönderilen 1’in ascii karşılığı 49’dur.
	BTFSC	STATUS,Z
	CALL		PRN
	GOTO		MAIN

PRN	

	MOVF		TEMP,W
	CALL		TABLE
	CALL		TXLOOP
	INCF		TEMP,F
	SUBLW	D'62'			; '>' GREATER SYMB
	BTFSS		STATUS,Z
	GOTO		PRN
	CALL		TAB
	MOVF		PORTB,w
	CALL		TXLOOP
	CALL		ENTER
	CALL		LF
	RETURN

ENTER

	MOVLW	D'13'		;code for return
	CALL		TXLOOP
	RETURN


TAB

	MOVLW	D'9'		;code for tab
	CALL	TXLOOP
	RETURN

LF

	MOVLW	D'10'		;code for linefeed
	CALL		TXLOOP
	RETURN

TXLOOP	

	NOP
	BTFSS		PIR1,TXIF		; Verinin hazır olup olmadığı kotrol edilir.
	GOTO		TXLOOP
	MOVWF	TXREG		; giriş verisi W registerine aktarılır. 
	RETURN

RXLOOP

	NOP
	BTFSS		PIR1,RCIF
	GOTO		RXLOOP
	MOVF		RCREG,W
	RETURN

TABLE

	ADDWF	PCL,F
	
		DT	"<** Su anda klavyede 1 tusuna bastiniz: haberlesme icin**>"

	RETURN

	END

Uygulama Devresi

Tüm seri port kullanım makaleleri: RS232 Seri Portun PIC Mikro denetleyiciler ile Kullanımı

Dosya indirme LINK listesi (TXT formatında) link-1868.zip şifre-pass: 320volt.com

Emeği geçen kişilere Teşekkürler

  • sakif

    Bu devreyi LSC232F ile kod değişikliği yapmadan yapabilirsin
    usb rs232 çevirici seriport olmayan bilgisayarlar için

  • ada arhan

    bunun interneten kullanılması mumkunmu

  • recep

    Merhaba ben pic uygulamalarında yeniyimde bu c ile yazılmış pic kodunu hex kodlarını nasıl çevirebilirim ? yardımcı olursanız sevinirim.

  • ben

    recep onu microbasic yapıyor

  • omur

    Bu programı ısıste nasıl deneriz.Veya klavyeden verilen komutu ısısten alabilirmiyiz.
    Ben kayan yazı yapmak istiyorum ve klavyeden verilen harfleri ekranda görmek istiyorum. Ama bunu ısıste önce denemek istiyorum. İsis programıyla klavyeyi nasıl birleştirebilirim.

  • doğan can

    gardaş sağ olun ellerinize sağlık

  • bülent sarıkaya

    bilgiler için teşekkür ederim ben de herhangi bir sensörden rs 232 vasıtasıyla akan yazıları lcd de göstermek için bir devre tasarlamak istiyorum fakat bu konuda fazla bilgim yok yardımcı olursanız teşekkür ederimm

  • mehmet

    Ellerinize saglık çok faydalı bilgiler verilmiş.

    Ben bir pcb kazıma; baskı devre makinesi yapmaya çalışıyorum mekanizma tamam devrede tamam tek sıkıntım çizim programıyla bu devreyi nasıl uyumlu hale getireceğiz programın adı önemli değil han gisi bu iş için uygunsa onu kullanırız yeterki çizdiğim resmi plakete basabileyim konu hakkında bilgisi ya da elinde dokümanı olan arkadaşların yardımını bekliyorum emeği geçen herkeze şimiden teşekkürler
    mail adresim qolleksiyoncu@hotmail.com

  • Alican

    hocam linkler ölü kontrol edermisin

    • linkler yenilendi

  • Alican

    hocam ilginize teşekkürler önce sizden bir isteğim daha var ben c# bilmiyorum eğer sakıncası yoksa arayüzün kodlarını ve exe sini bana atabilirmisiniz mailim alicanbesci@gmail.com
    iyi çalışmalar

  • muhammed menap

    Öncelikle merhabalar arkadaşlar
    ben uzun zamandır bilgisayar usb portuyla haberleşicek bi pic18f2550 ya da 4550 ile lanet bi led açıp kapatmak istiyorum ancak hiçbir yerde ne driver yazmayı öğrenebildim ne de C# da yazılımı yazmayı ya bu konuda basitçe yardımcı olabilicek kimse yokmu ?

  • Alican

    arayüz kullanmadan hyper terminal vasıtasıyla iletişim arayüzünü kullanabilirsin kurulum ve kullanımı nette bir çok yerde var.ancak ben arayüzümü kendim yapıp kullanmak istiyorum dersen üstteki c# kodları yeterli olacaktır.bir buton bir textfield ile işini halledebilirsin.yukarıda ise c# için serialport komutları var buda bağlantını sağlayacaktır.geriye ise sadece denemek kalır ;)kolay gelsin

  • Muhammed menap

    Şimdi şunu sorayım o zaman Hyper terminalde drivere ihtiyaç yokmu mesela ben Pic i programladıktan sonra kalan tek şey bilgisayara bağlayıp “hyper terminal” den komut göndermek mi oluyor bu kadar mı driver falan ihtiyaç yokmu ?

  • Alican

    tabi ki usb to rs232 dönüştürücü kullanmak gerekiyor bu donusturucunun driver i zaten ayrı olarak cihazı aldıgında veriliyor usb nin hangi portuna taktıysan hyper terminalde o com port u seçip o şekilde bilgi gönderebilirsin.nete yazarsana rs232 ile ilgili bir çok bilgi var örnek bir video;

    [youtube]http://www.youtube.com/watch?v=E6Bsr0y9Qsw[/youtube]
    http://www.youtube.com/watch?v=E6Bsr0y9Qsw

  • muhammed menap

    Şimdi her şey tamam pic e komut gönderip led açıp kapatabiliyorum şimdiki hedefim bir fırçasız bruscless motora seviyeli akım göndermek yani esc sine hız kontrol sisteminin bağlı olduğu alıcıya Bi şekilde pic i uydurup bilgisayardan hızını arttırabilmek eğer bunuda yaparsam hayalimi gerçekleştirebilirim :)

  • Mümin

    bu mantık ile tankalara bağlı sensörlerden gelen bilgileri bilgisayara kaydedebilirmiyiz otomatik olarak