9 Şubat 2011 Çarşamba

Max232 Kullanarak basit seri iletisim

Ozet:
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:


Gereken Malzemele:
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.
Ayrica buna ek olarak, PORTB:7 ve PORTB:2 bacaklarina LED devreleri baglanir. Bu devrelerin kurulum sekli icin suraya bakiniz .


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 icin
satiri 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