Bu yazida PIC16F877A'nin Max232 entegresi kullanilarak bir PC ile iletisime gecirebilen donanim ve yazilim orneklenecektir.Kurulan iletisimde PC, PIC'e A karakteri gonderdiginde PORTB:7'ye bagli bulunan LED yakilacaktir. Bunun disinda bir karakter gonderildiginde PORTB:2'ye bagli bulunan LED yakilacaktir.
On Gereksinim:
Basit bir LED devresi icin buraya bakiniz.
L78XX serisi kullanimi icin buraya bakiniz.
MPLAB IDE: Programin yazilmasi/hata ayiklanmasi icin gerekli ortamdir.
PIC16F877A programlayicisi: Yazilan programin islemciye aktarilmasi icin gereklidir.
Kabuller:
- PIC16F877A programlamaya ve kullanima hazirdir.
- 4Mhz titresimli saat kullanilmistir
- PortB:7 ve PortB:2 bacaklarina LED devreleri baglanmistir.
- PC tarafinda Seri iletisim icin gerekli programlar vardir.
- PC tarafinda gonderme: Seri porta istenilen karakterleri yazan bir program vardir. Benim ornegimde seri porta her iki saniyede bir A ve daha sonra baska bir karakteri yazan ve boylece sonsuza kadar devam eden bir basit program vardir.
- PC tarafinda dinleme: PIC'in gonderdigi karakterleri algilayacak bir program vardir. Windows ortamlari icin windows ile birlikte gelen hyperterminal kullanilabilir. Linux icinse putty kullanilabilir. Hyperterminal icin COM baglantisinin ozellikleri asagidaki gibidir:
Adet | Eleman | Aciklama |
---|---|---|
1 | Max232N | Diger Max232 entegreleri de olabilir. Ancak bu durumda kullanilan kapasitor degerleri degisebilir. Bu yuzden uretici firmanin sagladigi datasheet'ten baglanti semasini kotrol etmek gerekir |
2 | 4N35 Optoisolator | |
1 | L7805 voltaj Regulatoru | |
5 | 1uF kapasitor | |
2 | Kirmizi LED | |
2 | 330 Ohm direnc | |
4 | AA pil | LEDler icin kullanilacak |
1 | 9V pil | PIC16F877A icin kullanilacak |
1 | Seri iletisim kablosu | 9 pinli. Bilgisayarinizin seri portuna uyumlu olmasi gerekiyor |
Neden Max232?
Seri iletisimde +/- 15V degerleri kullaniliyor. Bu, TTL devrelerinin anladigi 5V diliminin uzerinde oldugu icin Max232 adli cevriciye ihitiyac duyulur. Bu devre elemani, TTL dunyasindaki digital sinyalleri seri iletisim dunyasindaki digital sinyallere cevirir.
Max232 baglantilari asagidaki sekildeki gibi yapilir:
Burada dikkat edilmesi gerekenleri soyle siralayabilirim:
- kapasitor degerleri ve polarizasyonlari onemli. Eger kullandiginiz MAX-232 turevi, benim kullandigim Texas Instruments tarafindan uretilen MAX-232N'den farkli ise, ureticinin yayinladigi data sheet'e basvurun.
- Sekildeki baglanti bacaklari numaralarla verilmistir. Bu namaralar, bacaklarin fiziksel yerlesiminden farklidir. Yaniltici olmamasi icin farkinda olunmalidir
- Sekilde verilen 9 pinli seri baglanti elemani semasi, bilgisayarinizdaki seri port icindir. Eger siz de benim gibi bir seri port baglanti kablosu kullanacaksaniz, kablonun pin eslestirmesini degistirdigini unutmayin. Buyuk bir olasilikla cross cable denen kablo alacaksiniz. Bu durumda 5 ayni kalacak, ama 2 ve 3 nolu pinler yer degistirmis olacaktir. Test edin, ve ona gore kullanin.
Baglantilar yapildikan sonra PIC16F877A'da calistirilacak olan program asagidaki gibidir:
list p=16F877A
include P16F877A.inc
__config _XT_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _DEBUG_OFF & _CP_OFF
; SimpleRs232ReaderWriter.asm
; Alp Tunc - 2011. Tum Haklari saklidir.
; Bu program, kesme (interrupt) kullanmadan RS232 iletisimi yapar.
; Yazma: Rs232'ye A karakteri gonderir.
; Test icin hyperterminal'den ilgili COM portunda 9600, no Parity, 1 stop secilmelidir.
; Okuma: RS232'den gelen verileri okur.
; Eger gonderilen A karakteri ise PORTB:7'ye bagli LEDi yakar. Baska bir karakter ise
; PORTB:2'ye bagli LEDi yakar
;
#define CharA 0x41
buffer equ 0x20 ; Okunan verinin saklandigi gecici alan
org 0x0000
banksel TRISB
clrf TRISB ; PORTB'yi cikis olarak tanimla
Initialize
clrf PORTB
call initSerialPort ; Seriport baslangic ayarlarini yap
Loop
call ReadCharFromSerial ; Seri porttan okumak icin
;call SendCharToSerial ; Seri porta yazmak icin
goto Loop
initSerialPort
banksel SPBRG
movlw d'25' ; 9600 baud @ 4 Mhz Fosc +0.17 err
movwf SPBRG
movlw b'00100100' ;
movwf TXSTA ; brgh =1 ve Async Transmission
banksel RCSTA
movlw b'10010000'
movwf RCSTA ; Async iletisimi ac
return
SendCharToSerial
btfss PIR1, TXIF ; Gonderme tamponu bos mu?
goto SendCharToSerial ; degilse, bosalana kadar bekle
movlw CharA
movwf TXREG ; 'A' karakterini gonder
return
ReadCharFromSerial
btfss PIR1, RCIF ; Alma tamponu bos mu ?
goto ReadCharFromSerial ; degilse, bosalana kadar bekle
movf RCREG, W
movwf buffer ; Okunan karakteri buffer alanina yaz
call process ; gelen karakteri isle
return
process
movlw CharA
subwf buffer, W ; Gelen Karakter 'A' mi?
btfsc STATUS, C
btfss STATUS, Z
goto notEqual ; 'A' Degil
goto equal ; 'A' karakteri
returnPoint
return
notEqual
movlw b'00000010' ; set PORTB:2
movwf PORTB ; PORTB:2 ye bagli LEDi yak digerlerini sondur
goto returnPoint
equal
movlw b'10000000' ; set PORTB:7
movwf PORTB ; PORTB:7'e bagli LEDi yak digerlerini sondur
goto returnPoint
end
Bu Program herhangi bir kesme (Interrupt) kullanmamaktadir. Yukaridaki haliyle sadece alici durumundadir.
call ReadCharFromSerial ; Seri porttan okumak icinsatiri yorum satiri yapilip, asagidaki satir aktif hale getirilirse sadece gonderici moduna gecer.
;call SendCharToSerial ; Seri porta yazmak icin
Eger Tum baglantilar dogru olarak yapildiysa:
Alici modu: Devre asagidaki videoda oldugu gibi calisir:
Videoda baslangicinda arkadaki monitorden de gorulebilecegi gibi, PC tarafinda seri porta 2 sn araliklarla A ve ( karakterini yazan program calistirilir. PIC, A karakterini aldiginda PORTB:2'deki LEDi sondurup PORTB:7 deki LEDi yakar. A disinda bir karakter gordugunde, bu ornekte ( karakteridir, PORTB:7 yi sondurup, PORTB:2'deki LEDi yakar.
Gonderici modu: Hyperterminal (ya da benzeri) bir program kullandiginda, asagidaki gibi bir davranis gozlemlenecektir:
Hiç yorum yok:
Yorum Gönder