Senkron iletişim yardım

Başlatan Lütfi AYYILDIZ, 13 Aralık 2005, 13:08:21

Lütfi AYYILDIZ

Klavyeyi Pic'e okutup değerlerini LCD de yazdırmak istiyorum. Bir kaç sitede var fakat programlarının HEX kodları veriyorlar sadece. Bunu PBP de nasıl yapabiliriz.

ete

Bana kalır ise olaya yanlış yönden bakıyorsun. İhtiyacın olan yalnızca pic programı değil. Öncelikle PC de bir programa ihtiyacın olacak. Bu program basılan her tuşu sana seri port dan veua USB den ASCII değeri olarak gönderecek. Pic de bu seri bilgiyi yorumlayıp senin görebileceğin veya kullanabileceğin hale getirecek.
,
Bu iş için öncelikle bir RS232 çevirici devre kurman gerekiyor. Yani PC den gelen TX - GND bilgilerini bir MAX232 endtegresine girip TTL seviyesine çevireceksin. Sonra bu uçları pic'e bağlayacaksın.

Sen PC kısmını ve ara bağlantı işini hallet gerisini birlikte yapalım

ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

picusta

Bi de ben PC'siz klavye - PIC'le iletisim yapan devre görmüstüm. Antrak gazetesinde, yani PS/2i dogrudan PIC'e baglaniyordu.

XX_CİHAN_XX

PC siz klavye kontrolu için gerekli birkaç bilgi sunayım

Bilgisayar klavyesi, senkron seri iletişim protokolünü kullanır. Klavyenin herhangi bir tuşuna bastığınızda 1 byte' lık hex kodu, aynı tuşu bıraktığınızda 2 byte' lık bir hex kodu üretir. Böylece bilgisayar hangi tuşa basıldığını veya hangi tuşun bırakıldığını kendisine gönderilen kodlardan anlamaktadır. Örneğin klavtede "A" tuşuna basıldığında "1C" hex kodu üretilirken aynı tuşa basma işlemi sona erdiğinde önce"F0" sonrada "1C" hex kodları klavyeden bilgisayara gönderilmektedir. Klavyede bazı özel tuşlar bulunmakta ve bu tuşlar standart kodlardan farklı kodlar üretirler. Örneğin "INSERT" tuşuna basıldığında 2 byte'lık "E0,70" hex kodu üretilirken, tuşun bırakılmasıyla birlikte 3 byte' lık "E0,F0,70" hex kodu gönderilir.

klavyelerde DATA, CLOCK, +5 V ve GND olmak üzere kullanılan 4 pin bulunmaktadır. Diğer uçlar boş kalmaktadır. Klavye konnektörleri 5 pinli ve 6 pinli olabilmektedir. Bunlara ait pin numaraları ve karşılıkları aşağıdaki resimde verilmiştir. Elinizde bulunan klavyeye uygun bağlantıyı yapmanız gerekmektedir.
Klavyeler içerisinde bulunan bir osilatör ile clock sinyallerini kendileri üretmektedirler. Data bilgileri her tuş (karakter) için ASCII kodunda clock sinyalleri üzerinden gönderilmektedir.  
Bu veri gönderilmesindeki protokolde sırasıyla :

1 Start Biti   (daima 0)
8 Data biti  
1 Parity Biti
1 Stop biti     (daima 1),           arka arkaya  gönderilmektedir.

Klavye devresi bazı durumlarda 300mA kadar akım çekebilmektedir. Yapacağımız uygulamalarda bu akımı verebilecek regüleli güç kaynağımızın olması gerekir. Bu iş için 7805 regüle entegresi kullanılabilir. Klavyenin data ve clock uçları açık kollektör (Open Collector ) özelliği gösterir. Data ve clock uçları 4K7 lik veya 10K lık pull-up dirençleriyle lojik-1 (+5V) seviyesine bağlanmalıdır. Herhangi bir sinyal alış-verişi olmazsa data ve clcok uçlarında lojik-1 potansiyeli gözlenmelidir.

Klavye her veri byte için 11 bit gönderir. 1 bit start biti, 8 bit data biti, 1 bit parity biti ve son bit olarakta stop biti gönderir. 8 data biti gönderilirken daima LSB (Least Significant Bit) öncelikli yani en değerliksiz bit gönderilir.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Petek

Alıntı yapılan: "XX_CİHAN_XX"
Klavye devresi bazı durumlarda 300mA kadar akım çekebilmektedir. Yapacağımız uygulamalarda bu akımı verebilecek regüleli güç kaynağımızın olması gerekir. Bu iş için 7805 regüle entegresi kullanılabilir. Klavyenin data ve clock uçları açık kollektör (Open Collector ) özelliği gösterir. Data ve clock uçları 4K7 lik veya 10K lık pull-up dirençleriyle lojik-1 (+5V) seviyesine bağlanmalıdır. Herhangi bir sinyal alış-verişi olmazsa data ve clcok uçlarında lojik-1 potansiyeli gözlenmelidir.
Güzel derlenmiş bilgiler. Eline sağlık. Data ve Clock open collector olmasının sebebi, herhalde PC den klavyeye olan veri transferini kolaylaştırmak için olsa gerek (açılışta numlock on off konumunu belirlemek gibi).
Alıntı Yap
Klavye her veri byte için 11 bit gönderir. 1 bit start biti, 8 bit data biti, 1 bit parity biti ve son bit olarakta stop biti gönderir. 8 data biti gönderilirken daima LSB (Least Significant Bit) öncelikli yani en değerliksiz bit gönderilir.
Haberleşmenin senkron olduğunu söyledin. Benim bildiğim ve denediğim ve sonucundan emin olduğum senkron haberleşmede start, stop ve parite biti yoktu. Bunu 16F628 de ve senkron slave olarak denedim. Master 16F877 idi ve SPI çıkışından bilgi gönderdim. (SPI MSB önce gönderirken SCI LSB önce gönderip aldığı için bilgiler ayna simetrisi gibi aktarılıyordu :)

Klavyede kullanılan bu senkron haberleşmede start ve stop bitlerinin varlığı konusunda kesin bilgi edinmek isterdim. Eski bilgilerimle çelişince şüpheye düştüm. Bu konuda bana kaynak gösterebilirseniz çok memnun olacağım. Hani teoride de senkron haberleşme daha hızlıdır (en azından start ve stop bitlerinin eksikliği haberleşmenin aynı bps te asenkron haberleşmeye göre %25 daha hızlı olmasını sağlardı)
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

XX_CİHAN_XX

Alıntı yapılan: "Petek"
Haberleşmenin senkron olduğunu söyledin. Benim bildiğim ve denediğim ve sonucundan emin olduğum senkron haberleşmede start, stop ve parite biti yoktu. Bunu 16F628 de ve senkron slave olarak denedim. Master 16F877 idi ve SPI çıkışından bilgi gönderdim. (SPI MSB önce gönderirken SCI LSB önce gönderip aldığı için bilgiler ayna simetrisi gibi aktarılıyordu :)

Klavyede kullanılan bu senkron haberleşmede start ve stop bitlerinin varlığı konusunda kesin bilgi edinmek isterdim. Eski bilgilerimle çelişince şüpheye düştüm. Bu konuda bana kaynak gösterebilirseniz çok memnun olacağım. Hani teoride de senkron haberleşme daha hızlıdır (en azından start ve stop bitlerinin eksikliği haberleşmenin aynı bps te asenkron haberleşmeye göre %25 daha hızlı olmasını sağlardı)

PC klavyesinden veriyi senkron yada asenkron olarak alabilirsin.Sanırım clock frekansı 10Khz di yanlış hatırlamıyorsam.Dolayısıyla klavye her iki durumdada start ,parity ve stop bitlerini gönderir.Bu konuda şüphen olmasın çünkü bizzat kendim pıc ile pc klavyesinden data aldım senkron olarak ve yukarıda anllattıklarım tamamen dogrudur.Yine de içinde bir şüphe kalmasın sana bir kaynak göstereyim

http://www.antrak.org.tr/gazete/012003/adnan.htm

                        Saygılar&Sevgiler
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Petek

Denenmiş ise sorun yok demektir. Teşekkürler.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

XX_CİHAN_XX

Arkadaşlar size ccs c de en son yazdığım ve denediğim sorunsuz çalışan pc klavyesinden basılan veya basılı tutulan herhangi bir tuşun kodunu portd ye gonderen programı sunuyorum.Bu programla klavyedekı butun tusların kodunu ogrenebılırsınız.Bunun için tusa basıp portd dekı dataya bakmanız yeterlı ;)
Program sorunsuz calısıyor denedım.Umarım işinize yarar.
#include <16F877.H>
#BYTE    PORTA       =0X05
#BYTE    PORTB       =0X06
#BYTE    PORTC       =0X07
#BYTE    PORTD       =0X08
#BYTE    PORTE       =0X09
#BYTE    INTCON      =0X0B
#BYTE    ADCON1      =0X9F
/////////////////////////////////////////////////////////////////
//#reserve 0xA0:0xE6      //bank1de 70 bytelık ram alanını ayır
//#reserve 0x120:0x166    //bank2de 70 bytelık ram alanını ayır
//#reserve 0x1A0:0x1BC    //bank3de 28 bytelık ram alanını ayır
#fuses HS,NOWDT,NOPROTECT  //toplam ayrılan ram alan 168 byte
#use delay(clock=20000000)
unsigned int8  verireg,sayac;
/////////////////////////////////////////////////////////////////
#DEFINE		KLV_CLK      	  	PORTB,0
#DEFINE		KLV_DATA	        	PORTA,4
/////////////////////////////////////////////////////////////////
void main (){
SET_TRIS_A(0x10);
SET_TRIS_B(0x01);
SET_TRIS_C(0);
SET_TRIS_D(0);
SET_TRIS_E(0);
ADCON1=6;
port_b_pullups(FALSE);
ext_int_edge( H_TO_L );
PORTA=0;
PORTB=0;
PORTC=0;
PORTD=0;
PORTE=0;
verireg=0;
//////////////////////////////////
for(sayac=0;sayac<10;sayac++)delay_ms( 150 );//150ms*10=1,5sn kadar bekle
bit_clear(INTCON,1);          //INTF=0
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
for(;;){
//SONSUZ DONGU
}
}
/////////////////////////////////////////////////////////////////
KLV_OKU (){
verireg=0;
while( !input(PIN_B0) ){ //START BİTİNİ PAS GEC
}
while( input(PIN_B0) ){  //START BİTİ GONDERILDI
}
while( !input(PIN_B0) ){
if( input(PIN_A4) )bit_set(verireg,0);//DATANIN ILK BITINI AL
}
while( input(PIN_B0) ){
}
while( !input(PIN_B0) ){
if( input(PIN_A4) )bit_set(verireg,1);//DATANIN IKINCI BITINI AL
}
while( input(PIN_B0) ){
}
while( !input(PIN_B0) ){
if( input(PIN_A4) )bit_set(verireg,2);
}
while( input(PIN_B0) ){
}
while( !input(PIN_B0) ){
if( input(PIN_A4) )bit_set(verireg,3);
}
while( input(PIN_B0) ){
}
while( !input(PIN_B0) ){
if( input(PIN_A4) )bit_set(verireg,4);
}
while( input(PIN_B0) ){
}
while( !input(PIN_B0) ){
if( input(PIN_A4) )bit_set(verireg,5);
}
while( input(PIN_B0) ){
}
while( !input(PIN_B0) ){
if( input(PIN_A4) )bit_set(verireg,6);
}
while( input(PIN_B0) ){
}
while( !input(PIN_B0) ){
if( input(PIN_A4) )bit_set(verireg,7);//DATANIN SON BITINI AL
}
while( input(PIN_B0) ){    //DATANIN SON BITI ALINDI
}
while( !input(PIN_B0) ){   //PARITY BITINI PAS GEC
}
while( input(PIN_B0) ){    //PARITY PAS GECILDI
}
while( !input(PIN_B0) ){   //STOP BITINI PAS GEC
}
}              //BUTUN BITLER GONDERILDI
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
#INT_EXT
ISR (){
LOOP1:
KLV_OKU ();
if(verireg==0xF0)goto LOOP2;
while( input(PIN_B0) ){
}
if(verireg==0xE0)goto LOOP1;
KLV_OKU ();
LOOP2:
while( input(PIN_B0) ){
}
if(verireg==0xE0)goto LOOP1;
if(verireg!=0xF0)goto LOOP1;
KLV_OKU ();
/////////////////////////////////////////////////////////////////
PORTD=verireg;
bit_clear(INTCON,1);    //INTF=0
}
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Petek

#BYTE    ADCON1      =0X9F

işte bank 1 de tanımlanmış bir değişken :)
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

Lütfi AYYILDIZ

Öncelikle ilginize teşekkür ederim. Projem Bir barkod okuyucuyu PIC le birleştirip kartlı geçiş sistemi tasarlamaktı. Klavyeyle barkod okuyucu aynı prensipte çalıştığı için öncelikle klavyeyi yani basit tarafından işe başlamak istedim. Fakat pic le kalavyeyi bir türlü senkronize edemedim. Clk palsi ben göndersem datayı SHITFIN komutuyla alıcam, klavye gönderdiği için datayla birlikte clk yi de takip etmek gerekiyor. Çünkü Clk palsin düşen kenarında bit ler gönderiliyor. Başka bir problemde gelen data yı start,stop ve parity bitlerinden ayıklamak. Ben daha datayı alamadığım için bu fazla bitleri düşünmüyorum.Arkadaşlar anlattıklarınız  http://www.bbilisim.com.tr.tc/ sitesinde açık bir şekilde yazıyor. Ben PBP ile klavye okuma tekniği hakkında yardım bekliyorum.

XX_CİHAN_XX

Alıntı yapılan: "Petek"#BYTE    ADCON1      =0X9F

işte bank 1 de tanımlanmış bir değişken :)
Epey bir süre asm kullandıktan sonra pat diye c ye gecınce biraz afalladım mı desem çuvalladım mı desem:) neyse.Ben zaten tek tek byte tanımlamayı biliyordumda benım derdım dizi olarak başarmaktı bu işi oda senin yardımlarınla oldu çok şükür.
Alıntı Yap
Clk palsi ben göndersem datayı SHITFIN komutuyla alıcam, klavye gönderdiği için datayla birlikte clk yi de takip etmek gerekiyor. Çünkü Clk palsin düşen kenarında bit ler gönderiliyor. Başka bir problemde gelen data yı start,stop ve parity bitlerinden ayıklamak.
Sanırım pbp kullanıyorsun.pbp konusunda pek bır bılgım yok.O yuzden sana işin mantığını kısaca anlatıcam.Seninde dediğin gibi clk palsin düsen kenarında bitler göderilir.Yukarıda söylediğim gibi ilk start biti gönderilir.
Normalde klavyenin data ve clock uçları lojik 1 konumundadır.Herhangi bir tuşa bastığınızda clock lojik 0 olur ve datanın ilk biti olan start biti(lojık 0) gonderılır benım ccs c de yazdıgım programımı incelersen teorik olarak işi cok kolay cozebılırsın ama benıım pbp yı bılmedıgım gıbı sende ccs c yı bılmıyorsan tabı yapacak bırsey yok:) Anlatmaya devam edeyım o halde,
yapacagın ilk sey eger interrupt kullanmıyorsan kı ılk basta kullanmadan dene ana programda devam lı clock pınını sorucan ılk denemenı boyle yapmanı tavsıye ederım ondan sonrakı denemelerınde shıftın comutunu yada ınterrupt ı kullanırsın.bu arada program ılk basladıgında gırıs cıkısları ayarladıktan sonra yaklasık olarak 1,5 sanıye kadar beklemelısın ondan sonra gırıslerı sormaya baslamalısın.yanı ılk enerjıyı verdıkten 1,5 sanıye sonra clock gırısını sormaya basla sıfıra dustu mu dıye.
sıfıra dustu ıse start bıtı data pınınde bulunmaktadır benım yaptıgım gıbı bı bıtı almak ıstemıyorsan data pınını hıc sorgulamadan clock pını 1 oldumu dıye sor olmadıysa devamlı bekle yanı sımdıye kadar demek ıstedıgımı asmdekı gbı yazarsak,
CLRF     VERIREG
BTFSC   KLV_CLK
GOTO    $-1
;Data biti su anda gonderıldı fakat yorumlamadan gectık
BTFSS   KLV_CLK
GOTO    $-1
BTFSC   KLV_CLK 
GOTO    $-1     ;0.DATA BİTİNİN GONDERILMESINI BEKLE
;0.DATA BİTİ GONDERILDI YORUMLA
BTFSC   KLV_DATA
BSF       VERIREG,0
BTFSS   KLV_CLK    ;DATA 0 GONDERILDI
GOTO    $-1
BTFSC   KLC_CLK    ;DATA 1 İ BEKLE
GOTO     $-1
     .         .
     .         .
     .         .
     .         .
BTFSS   KLV_CLK    ;DATA 7 GONDERILDI
GOTO    $-1
BTFSC   KLC_CLK    ;PARITY BITINİ BEKLE
GOTO     $-1
;PARITY GONDERILIYOR AMA YORUMLAMA
BTFSS   KLV_CLK    ;PARITY GONDERILDI
GOTO    $-1
BTFSC   KLC_CLK    ;STOP BITINİ BEKLE
GOTO     $-1
;STOP GONDERILIYOR
BTFSS   KLV_CLK    ;STOP GONDERILDI
GOTO    $-1

Evet verıreg de klavyeye bastıgımıda gonderılen data var.Umarım asm biliyorsundur:)
Yani anlatmak istediğim şey hep aynı yontemle klavye datasını alıyorsun pespese 11 biti tamamlıyana kadar devam lı clock bıtını sorguluyorsun sıfıra dustu ise data bitini sorguluyorsun ve kaydedıyorsun ondan sonra clockun tekrar 1 e cıkmasını beklıyorsun sonra tekrar sıfıra dusmesını beklıyorsun.Bu klavye datalarını alabılecegın en basıt yontem tabı farklı yontemlerde var ama sımdı onlardan bahsetmesem daha iyi olur sanıırım
Kolay gelsin
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Lütfi AYYILDIZ

İlgine teşekkürler bu kodları PBP ile denemeye çalışıcam. Pbp içinde asm kullanılabiliyor zaten

vatandas30

shiftin komutunda bildiğim kadarı ile clock palsini bizim göndermemiz gerekmiyor. zaten bunu klavye üretiyor. clock palsi ile birlikte datayı almamız lazım.

OG

FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

Lütfi AYYILDIZ

Yukarıdaki adreste programın klavye okumak için olan bölümünü uyarlamaya çalıştım  fakat data alırken yine problem çıkartrıyor
Sanırım pic çok hızlı komutları geçtiği için clk palsin düşen kenarını bir çok defa görüyor.  
reg var byte
veri var byte
clk var portb.4
kdata var portb.5
pause 1000
lcdout $fe,1,"PS/2 KLAVYE TEST"
PAUSE 1000
rx: 
gosub clock:
if reg=1 then goto rx
if reg<10 then  
veri=veri>>1
veri.7=kdata
endif
if reg=11 then
pause 200
lcdout $fe,$C0,#veri
PAUSE 200
reg=0
endif
goto rx
clock:
if clk=1 then goto clock
reg=reg+1
return
end