PIC ile Klavye Yapmak....

Başlatan XErTuX, 03 Kasım 2008, 02:18:33

muhittin_kaplan

877 ile seri iletişim ile ps/2 yapılır(ki daha önceden anlatılmış).Hatta ben 84 ile yapmıştım. 2550 ile swordfish de usb yapıyorum.

timtim

Valla hangi pic olduğu önemli değil aslında. Şu işi şöyle temeliyle başından bi anlasam iyi olacak, ben de imkanlar doğrultusunda bişeyler yapacam inşallah. Bu başlık altında bi arkadaşımız az ordan az burdan bişeyler yapmış ama, şöyle başından sonuna nasıl yapılacağını anlayamadım. Bir çok kaynak siteye başvurdum. Genel prensiplerini az da olsa anladım. Ancak anlamadığım bazı yerler var. Örneğin Pic Basic Proda clock sinyalini bir komutla mı göndereceğiz, yoksa sinyal göndereceğimiz bacağı belirli zaman aralıklarıyla 1-0 yaparak clock sinyali mi oluşturacağız. Bu arada datanın iletilmesi nasıl sağlanacak acaba? Bir döngü oluşturup hem clock sinyalini hem de datayı mı ayarlayacağız acaba?

Yapmaya çalıştığım şey tam da başlık altında ifade edildiği gibi. Picden PC ye bazı karekterleri göndermek. Bu karekterlerin gönderilme hızını da kontrol etmek istiyom aslında. İşte öle bi şey :)

electronblue


timtim

Site gayet güzel ancak bendeki inilizce ingilazca olduğu için anlamakda zorlandığım yerler var. :)  Örneğin odd parity veya parity number ne demek değer olarak ne olması gerekiyor anlayamadım.  ???

electronblue

#34
Parity Number = Teknik olarak eşlik numarası, biti olarak geçer.

Parity number, herhangi bir verinin seri ya da paralel iletimi sonrası sağlık durumunu kontrol etmemize yarayan bitin ismidir.

Öncelikle ODD ve EVEN ı tanımlayalım.

ODD    = Tek
EVEN  = Çift anlamına gelir.

Elimizdeki datayı 7 bitlik varsayıyorum.
Data= 0100111 toplamda 4 tane 1 var değil mi. 4= Çift yani EVEN'dır.

Data=0111000 toplamda 3 tane 1 var değil mi. 3= Tek yani ODD'dir.

Bu datanın EVEN ya da ODD olduğunu belirtmek datanın gönderiliş şekline göre  7.bitinden sonra ya da 0.bitinden önce 1 bitlik 1 ya da 0 yollarız. Bu 1 veya 0 a göre alıcı bakar heh der bana gelen data tam gönderildiği gibiymiş.Peki bu anlama işini nasıl yapar ?

Buraya kadar tamam ise kontrol işlemi ve EVEN Parity - ODD Parity konusuna geçiyorum.

ODD Parity mantığı kullanılarak hazırlanmış bir data pakedinde  data+parity biti toplamı = tek olmak zorundadır ve dataya ekleyeceğimiz parity bitini buna göre belirleriz. Data=tek ise parity bit=0 , data=çift ise parity bit=1 olmalıdır.

EVEN Parity mantığı kullanılarak hazırlanmış bir data pakedinde data+parity biti toplamı= çift olmak zorundadır ve dataya  ekleyeceğimiz parity bitini buna göre belirleriz. Data=çift ise parity bit=0 , data=tek ise parity bit=1 olmalıdır.

Örneklendireyim:

ODD Parity:

Data= 0110011    1 + 1 + 1 +  1 + parity bit = tek olmalı.  Data bitleri toplamı = 4 ve bu sayı çift olduğundan ekleyeceğimiz  Parity Bit = 1 olur. Rakam tek olsaydı Parity Bit= 0 olacaktı.
Bu durumda DATA = 10110011 ya da 01100111 olur ve karşı tarafa yollarız.

EVEN Parity

Data=0100001  1 + 1 + parity biti = çift olmalı.  Data bitleri toplamı = 2 ve bu sayı çift  olduğundan ekleyeceğimiz Parity Bit = 0 olur. Eğer rakam tek olsaydı Parity Bit = 1 olacaktı.
Bu durumda DATA = 00100001 ya da 01000010 olur ve karşı tarafa yollarız.

Karşı taraf datayı alır, parity bitine bakar bir de dataya bakar teklik çiftliği kontrol edip datanın sağlam ya da bozuk olduğuna karar verir ( tabi alıcının yapacağı iş alıcıda hazırlanan koda ya da sisteme göre değişir )

Ya da klavye örneğinde olduğu gibi  önce 8 bitlik data gelir ardından parity number gelir. Datanın kaç bit olduğu veya gönderiliş şekli yanıltmasın sizi  ;)

Düzeltme : Bazı kısımlar yalınlaştırıldı, örnekler eklendi.


timtim

#35
Üstad ilginiz ve yardımınız için teşekkürlerimi sunarım. Şu ana kadar yaptığım çalışmaları derleyip buradan bi görüşlerinize sunacağım. Yanlışlar doğrular ortaya çıksın bakalım  :D

electronblue

Hocam anlatımda bir hata yapmışım. Bugün çok yoğunum kusura bakmayın.
Düzeltiyorum:

data= 0111000
ODD Parity mantığı için: 1 + 1  + 1 + parity bit = Tek olmalıdır. 3 bir tek sayıdır ve bunu tek ( ODD ) yapmamız için herhangi bir şey eklememiz gerekmez, bu durumda parity bit =0  olacak.

EVEN Parity mantığı için 1 + 1 + 1 + parity bit =  Çift olmalıdır. 3 bir tek sayıdır , bu durumda parity bit=1 olur ve data bitleri toplam 4 yani çift ( EVEN ) olur.


eseneren

bileşik faiz gibi , sadece datadaki değil gönderilen bilgi butunlugunde tek mi çift mi diye bakılıyor.
Yani koyacağın parity ile beraber ne olacağını tahmin edip ona göre koyuyorsun, yada bunu hiç düşünmeden,
Aklında ODD'a çift EVEN'a tek dersin, yanlıs dediğinide bilirsin.Bu şekilde devam edersin.
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

timtim

Bu durumda
    * 1 start bit.  This is always 0.
    * 8 data bits, least significant bit first.
    * 1 parity bit (odd parity).
    * 1 stop bit.  This is always 1.

start bit ve diğerlerini de hesaba katacakmıyız acaba?

örneğin datamız 00111110 olsa
start bit + data + parity + stop bit = 00011111001
göndereceğimiz nihai bilgi böyle mi olacak?

timtim

#39
[IMG]http://img525.imageshack.us/img525/4645/shema1.jpg[/img]

Uploaded with ImageShack.us

[IMG]http://img843.imageshack.us/img843/1879/shema2.jpg[/img]

Uploaded with ImageShack.us

Bu da isis dosyası
http://turbobit.net/pii7ijpkmt7g/keyboard.DSN.html

PBP dosyası
http://turbobit.net/uqqe3ad7bxfn/KLAVYE2.ASM.html

Buraya da açık halini kopyalıyorum. İndirmek istemeyenler için.
Programı yazarken fonksiyoneliiğini düşünmeden yazdım. Amacım bir karekter göndermek için gerekli kodu yazmaktı. Burada 7 rakamını göndermek için yazılmış bir program parçası bulunuyor.

Baştan sona her türlü fikire, eleştiriye, öneriye ve öğretimlerinize açığım. Tüm ilgilenen arkadaşlara şimdiden Teşekkürlerimi yolluyorum.

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 01.02.2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F877A                      'işlemci 16F877A                               
@ DEVICE pic16F877A, WDT_ON              'Watch Dog Timer açık
@ DEVICE pic16F877A, PWRT_ON             'Power on Timer açık
@ DEVICE pic16F877A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE PIC16F877A, XT_OSC              'XT osilatör kullanılacak
OPTION_REG.7=1   'Pull up dirençleri İPTAL
ADCON1=%00000100 'PORTA.0 VE PORTA.1 ANALOG DİĞERLERİ DİGİTAL


trisa= 255
trisb= 255
trisc= %00010000
trisd= 255
portc.3=1
portc.5=1

'portc.3 clock sinyali için seçtiğim bacak
'portc.5 data gönderdiğim uç
'klavyeden 7 basıldı bilgisi için 
'HEX 3D = Bin 00111110 göndermek gerekiyor
' 5 tane 1 = 5 olduğuna göre parity biti = 0 olacak
'start bit(0)+00111110+parity bit(0)+stop bit(1)
'bu duruma göre gönderilecek bilgi şu şekilde oluyo
'00011111001
basla:

if portc.3 = 1 then
    portd.0=1
    portd.1=1
   
    pauseus 100
'1- start bit=0   
    portc.3=0
    portc.5=0
    pauseus 10
    portc.3=1
    pauseus 10

'2- data 1. bit=0
    portc.3=0
    portc.5=0
    pauseus 10
    portc.3=1
    pauseus 10
   
'3- data 2. bit=0
    portc.3=0
    portc.5=0
    pauseus 10
    portc.3=1
    pauseus 10
   
'4- data 3. bit=1
    portc.3=0
    portc.5=1
    pauseus 10
    portc.3=1
    pauseus 10
   
'5- data 4. bit=1
    portc.3=0
    portc.5=1
    pauseus 10
    portc.3=1
    pauseus 10
   
'6- data 5. bit=1
    portc.3=0
    portc.5=1
    pauseus 10
    portc.3=1
    pauseus 10
   
'7- data 6. bit=1
    portc.3=0
    portc.5=1
    pauseus 10
    portc.3=1
    pauseus 10
   
'8- data 7. bit=1
    portc.3=0
    portc.5=1
    pauseus 10
    portc.3=1
    pauseus 10
   
'9- data 8. bit=0
    portc.3=0
    portc.5=0
    pauseus 10
    portc.3=1
    pauseus 10
   
'10- parity biti =0
    portc.3=0
    portc.5=0
    pauseus 10
    portc.3=1
    pauseus 10
   
'11- stop biti = 1
    portc.3=0
    portc.5=1
    pauseus 10
    portc.3=1
    pauseus 10

    portd.0=0
    portd.1=0
    pauseus 100
   
    pause 100
endif
goto basla

electronblue

Daha önce hiç klavye uygulaması yapmadım, benim de iştahım kabardı şimdi ,bu hafta bir uygulama da ben yapayım.

"The parity bit is set if there is an even number of 1's in the data bits and reset (0) if there is an odd number of 1's in the data bits.  The number of 1's in the data bits plus the parity bit always add up to an odd number (odd parity.)  This is used for error detection.  The keyboard/mouse must check this bit and if incorrect it should respond as if it had received an invalid command"

demiş...
Bu durumda parity biti sadece 8 bitlik "data" yı kapsar, start ve stop bitlerini kapsamaz.

eseneren

7 bits of data

(number of 1s)   8 bits including parity
    Data          0.bit-even-7.bit       odd
0000000 (0)   00000000   10000000
1010001 (3)   11010001   01010001
1101001 (4)   01101001   11101001
1111111 (7)   11111111   01111111

Bende hevesle klavye soktum de konnektor yok afrika birsey yapayım dedim ama olmadı konnektor şart.
Even ve odd eklenmiş data da 0. bit parity
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

timtim

Program ve devre şemasında problem yok diyorsanız devreyi kurup denemeyi düşünüyorum. Ama bir yanlışlık varsa boşuna uğraşmıyayım. Önce düzeltiyim sonra yapıyım. Böylece bana zaman kazandırmış olur.