PIC ile Seri Port İletişimi ve Display Kontrolü
PIC ile öğretici bir uygulama vermek istedim. Bu uygulamada PIC ile seri port iletişimi ve 3 digit 7 segment display kontrolü yaptım. Yazılım için de assembly dili yazılımı ve aynı işi yapan CSS ile yazılmıs C yazılımı örneği verdim.
Çalışma Sistemi:
Devrenin kullanımı çok kolaydır. Sistem bilgisayardan hyper terminal ya da başka herhangi bir seri port terminal programından 3 er 3 er gönderilen rakamları 7 segment displaye yazar.
PCDevre bağlantısını yaptıktan sonra devreye enerji verildiğinde bilgisayara devre tarafından “sistem hazır” mesajı gönderilir. Bu mesajı gördükten sonra devreye 4 karakter girmek gerekir. İlk üçü displayde görünecek rakamlar, son karakter ise displaydeki rakamların yanıp sönmesini ya da sürekli yanık kalmasını sağlayan karakterdir. 4. karakter olarak “A” gelirse displaydeki rakamlar yanıp söner, değilse sürekli yanık kalır. 4. karakter muhakkak gönderilmelidir ki zaten devre bu karakter gelmeden işleme başlamaz. Örnek olarak displaye “234” yazdıralım. Seri port terminal programına “sistem hazır” mesajından sonra “234c” yazarsak devre son gelen karaktere bakar “A” olmadığını görünce displaye rakamları sürekli yanık kalacak şekilde yazar. Eğer “234A” yazarsak ki “A” mutlaka büyük karakter olmalıdır, displayde rakamlar yanıp sönmeye başlar. Sürekli yanık konumuna getirmek için aynı rakamlar (gerekiyorsa farklı rakamlar da olabilir) girilir son karakter olarak “A”dan farklı bir karakter girilir. Mesela “a” olabilir. ;)
Devrede DISPLAY (1–3) ksımı 3 digit displayin seçmelerine, DISPLAY (A-G) kısmı da displayin segmentlerine gitmektedir.
;**********************************************
; RS232 ile PIC-PC iletisimi
; Hazırlayan: Ahmet Güloğlu (aguloglu@mail.com)
;**********************************************
LIST P=16F628
INCLUDE “P16F628.INC”;***–*** Register Adreslerinin Tanitilmasi ***–***
VERI equ h’20’
SAY equ h’21’
SAY1 equ h’22’
MEM equ h’23’
COUNT equ h’24’
BEKLE1 equ 0X25
BEKLE2 equ 0X26
BLINKER equ 0X27
BEKLE3 equ 0X28
BEKLE4 equ 0X29
SAY2 equ 0X2A
SAY3 equ 0X2B
SAY4 equ 0X2C
BEKLE5 equ 0X2D
REG EQU 0X7CORG 00
GOTO BASLA
ORG 04
BCF STATUS,GIE
RETFIEBASLA
CLRF PORTA
CLRF PORTB
CLRF VERI
CLRF SAY
CLRF SAY1
CLRF MEM
CLRF COUNT
CLRF BEKLE1
CLRF BEKLE2
CLRF BLINKER
CLRF BEKLE3
CLRF BEKLE4
CLRF SAY2
CLRF SAY3
CLRF SAY4
CLRF BEKLE5
CLRF REGBCF STATUS, GIE
MOVLW 0x07
MOVWF CMCON
movlw b’00000100′
movwf PORTBBANKSEL TRISB
movlw 0x18
movwf TRISAmovlw b’00000010′
movwf TRISBBANKSEL TXSTA
MOVLW 0x19
MOVWF SPBRG
MOVLW b’00100100′
MOVWF TXSTA
BANKSEL RCSTA
MOVLW b’10010000′
MOVWF RCSTACLRF BLINKER
CLRF SAY2
CLRF SAY3
CLRF SAY4CALL message
RECEIVE ;RECEIVE 3 BYTE
MOVLW 4
MOVWF COUNT
MOVLW h’7F’
MOVWF FSR
loop CALL receive
MOVWF INDF
DECF FSR,F
DECFSZ COUNT,F
GOTO loop;SART KONTROL
MOVLW 0X41
MOVWF MEM
MOVF REG,W
SUBWF MEM,W
BTFSC STATUS,2
BSF BLINKER,0 ;BLINK KONTROL
BTFSS STATUS,2
BCF BLINKER,0;SEND 3 BYTE
MOVLW 4
MOVWF COUNT
MOVLW h’7F’
MOVWF FSR
SEND
MOVF INDF,W
call send
DECF FSR
DECFSZ COUNT,F
GOTO SENDSERI_GONDER_3BYTE
MOVLW 0X03
MOVWF SAY1
MOVLW h’7F’
MOVWF FSRSERI_GONDER
MOVF INDF,W
MOVWF VERIBTFSS VERI,0
BCF PORTB,7
BTFSC VERI,0
BSF PORTB,7BTFSS VERI,1
BCF PORTB,6
BTFSC VERI,1
BSF PORTB,6BTFSS VERI,2
BCF PORTB,5
BTFSC VERI,2
BSF PORTB,5BTFSS VERI,3
BCF PORTB,3
BTFSC VERI,3
BSF PORTB,3DECF FSR,F
MOVLW 3
MOVWF MEM
MOVF SAY1,W
SUBWF MEM,W
BTFSC STATUS,2
GOTO YAK1MOVLW 2
MOVWF MEM
MOVF SAY1,W
SUBWF MEM,W
BTFSC STATUS,2
GOTO YAK2MOVLW 1
MOVWF MEM
MOVF SAY1,W
SUBWF MEM,W
BTFSC STATUS,2
GOTO YAK3YAK1
BCF PORTA,0
BCF PORTA,1
BSF PORTA,2
DECF SAY1,F
CALL BEKLE
BCF PORTA,2
GOTO SERI_GONDERYAK2
BCF PORTA,2
BSF PORTA,1
BCF PORTA,0
DECF SAY1,F
CALL BEKLE
BCF PORTA,1
GOTO SERI_GONDERYAK3
BCF PORTA,1
BCF PORTA,2
BSF PORTA,0
CALL BEKLE
BCF PORTA,0
DECFSZ SAY1,F
GOTO SERI_GONDERBTFSC PIR1,RCIF
GOTO RECEIVE; BLINK KONTROL
BTFSC BLINKER,1
GOTO BLINKED_ON
BTFSS BLINKER,0
GOTO BLINK_CONTINUEBLINKED
MOVLW 0XAA
MOVWF SAY3 ; YANIK KALMA SURESI AYARI
MOVLW 0X02
MOVWF SAY4 ; YANIK KALMA SURESI AYARI (SAY3XSAY4)BLINKED_ON
BSF BLINKER,1BLINK_LOOP
DECFSZ SAY3,F
GOTO BLINK_CONTINUE
DECFSZ SAY4,F
GOTO BLINK_LOOPBCF BLINKER,1
GOTO GECIKME1 ;BLINKED OFF
GECIKME_ENDBLINK_CONTINUE
GOTO SERI_GONDER_3BYTE
receive
BCF PORTA,0
btfss PIR1,RCIF
GOTO receive
movf RCREG,W
RETURN
send movwf TXREGTransWt bsf STATUS,RP0
WtHere btfss TXSTA,TRMT
goto WtHerebcf STATUS,RP0
return
BEKLE
MOVLW 0X01
MOVWF BEKLE1
LOOP
MOVLW 0XFF
MOVWF BEKLE5
LOOP_decfsz BEKLE5
GOTO LOOP_
DECFSZ BEKLE1,F
GOTO LOOP
RETURNGECIKME1 ; BEKLE
MOVLW 0X02
MOVWF BEKLE2
LOOP2
MOVLW 0XFF
MOVWF BEKLE3
BTFSC PIR1,RCIF
GOTO RECEIVE
LOOP3
MOVLW 0XFF
MOVWF BEKLE4
LOOP1
BTFSC PIR1,RCIF
GOTO RECEIVE
DECFSZ BEKLE4,F
GOTO LOOP1
DECFSZ BEKLE3,F
GOTO LOOP3DECFSZ BEKLE2,F
GOTO LOOP2GOTO GECIKME_END
;
; ——-
; MESAJ
; ——-
;
message movlw ‘S’
call send
movlw ‘i’
call send
movlw ‘s’
call send
movlw ‘t’
call send
movlw ‘e’
call send
movlw ‘m’
call send
movlw ‘ ‘
call send
movlw ‘H’
call send
movlw ‘a’
call send
movlw ‘z’
call send
movlw ‘i’
call send
movlw ‘r’
call send
movlw 0x0D ; CR
call send
movlw 0x0A ; LF
call sendRETURN
END
RS232_PIC_assembly. hex dosyası: rs232_pic_assembly-hex
hex Derlenmiş dosya
/////////////////////////////////////////////////////////////////////////
//// RS232 ile PIC iletisimi – CSS C yazılımı ////
//// Hazırlayan: Ahmet GÜLOĞLU ////
////////////////////////////////////////////////////////////////////////#include <16F628.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=8000000)
#use rs232(baud=9600, xmit=PIN_A3, rcv=PIN_A4)#byte port_b=6
BYTE CONST TABLO[10] = {0x90,0xb7,0x19,0x15,0x36,0x54,0x50,0xb5,0x10,0x14};
char b[5],c;
int i;
char dig1, dig2, dig3;void wait() {
int sayac;sayac=200;
while((–sayac!=0)&&!kbhit())
delay_us(10);
}void display_segs(char c) {
if((c>’9′)||(C<‘0’))
port_b=0x7F;
else
port_b=TABLO[c-‘0′];
}void display( char bir, char iki, char uc) {
display_segs(bir);
output_high(PIN_A0);
wait();
output_low(PIN_A0);
display_segs(iki);
output_high(PIN_A1);
wait();
output_low(PIN_A1);
display_segs(uc);
output_high(PIN_A2);
wait();
output_low(PIN_A2);
}void wait_1sn(void) {
int sayac;sayac=100;
while((–sayac!=0)&&!kbhit()) {
int sayac1;
sayac1=250;
while((–sayac1!=0)&&!kbhit())
delay_us(30); }
}void main() {
char dig1, dig2, dig3;set_tris_b(0);
port_b=0;dig1=’f’;
dig2=’f’;
dig3=’f’;printf(“Sayıyı Girin….:”);
while(TRUE) {
if (b[3] == ‘A’) {
int sayac;
sayac=900;
while( !kbhit() && (–sayac!=0) ){
display(dig1,dig2,dig3);
}wait_1sn();
goto devam;
}else {
display(dig1,dig2,dig3);
devam:
if(kbhit()) {
i=0;do {
c=getch();
b[i] = c;
i=i+1;
}
while( c != ‘r’ );printf(“%c%c%c”,b[0],b[1],b[2]);
dig1=b[0];
dig2=b[1];
dig3=b[2];}
}}
}
RS232_PIC_CSS_C.hex Derlenmiş dosya: rs232_pic_css_c-hex-hex
Bu devrede dikkat edilmesi gereken birkaç nokta var:
Ø Bu devrede ayrıca bir RS232 interface(ST232 gibi) kullanmadım. Assembly yazılımıyla verdiğim örnekteki devre şemasındaki interface’i kullanabilirsiniz. Ayrıca ST232 yerine Max232 kullanabilirsiniz. Tabi bu durumda max232’nin datasheet’ine bakıp oradaki şemaya göre bağlantıları yapmalısınız.
Ø DISPLAY(1–3) seçmeleri için de yine önceki devrede verdiğim transistorlü yapıyı kullanmalısınız.
Ø Önceki devreden farklı olarak bu devrede 8MHz crystal kullanmalısınız.
Ø Karakter girerken 4. karakterden sonra “Enter”a basmalısınız.
Son olarak benim için önemli olan bir şeyi hatırlatmak istiyorum. Eğer bu projeleri herhangi bir yayınınız (kitap, internet sitesi… vb.) içinde kullanacaksanız lütfen “Ahmet Güloğlu” referansını belirtin. Emek verdiğim bir projenin başkaları tarafından sanki kendi projeleriymiş gibi gösterilmesi beni üzüyor.
Herkese başarılar…
Ahmet GÜLOĞLU
aguloglu@mail.com