Ynt: Keypad ve PullUp

Başlatan veliusta, 05 Şubat 2016, 18:51:39

veliusta

Arduino ile kütüphanesiz 4x4 keypad yapmaya çalıştım. Yapmayı başardım fakat aynı anda 4-5 tanesi basınca sapıtıyor ve ISIS'te simulasyonunu denerken sarı oluyor pinler
Hata MCU'nun PullUp undan mı kaynaklanıyor. Direnç ile mi pullup yapmalıyım?

Sorun nereden kaynaklanıyor olabilir?



void setup(){
  pinMode(6, INPUT_PULLUP);
  digitalWrite(5, LOW);
}


mesaj birleştirme:: 06 Şubat 2016, 09:52:18

Sorunu buldum.



R1'e enerji verdiğimde ve 1 butona bastığımda sorun yok. Fakat 1 ve 4 ye aynı anda bastığımda 1 ve 4 kısa devre oluyor.
Çünkü C1'e Hem 0 hem 1 gidiyor. Sorunu nasıl çözeceğim.

C1'i okurken R1'i çıkış diğerlerini giriş olarak mı ayarlıyacağım?

8051-ARM

Tarama yaptığın bacaklara diyot bırakırsan sorunun çözülür.

bc_esd

Keypad işlemlerini 74HC922 ile yapsanız daha iyi olur.

Kabil ATICI

tarama bacaklarına diyot ve pull-up direnci ile çözülebilir. (klayve devrelerini bir inceleyin.

74C922 veya 74C923 (HC değil) kullanılabilir, ama aynı anda basılan tuşlara cevap veremez. Basılan tuşlardan birine kilitlenir ve tuş bırakılana kadar taramayı askıya alır.
ambar7

veliusta

#4
Benim istediğim şey. Tüm tuşlara aynı anda basıldığında cevap verebilmesi. Yani 65536 tane olasılığıda istiyorum.

Diyot ekledim biraz düzeldi ama tam değil.



Serial Monitörde 31 olması gereken yerde 255 gönderiyor. Anlamadım.
Alt satırlardada durumlar aynı sadece Son buton değerini gönderiyor.




mesaj birleştirme:: 06 Şubat 2016, 12:10:16

Tek tek bastığımda sorun yok. Sadece Sütünları kullandığımda sorun yok. Ama bir sütün full basılı iken(resimdeki gibi) bir başka satırdan basma kalktığımda tüm satırdaki butonların toplam değerini ekliyor.

mesaj birleştirme:: 06 Şubat 2016, 12:41:08

49 yerine 51 gönderiyor; ]http://resmet.net/images/2016/02/05/Untitled.png]

8051-ARM

Donanımsal değil yazılımla ilgili sorun var kodu paylaşırsanız sorun daha iyi anlaşılır.

veliusta

unsigned long BIN_1, BIN_2, BIN_3, BIN_4, BIN_SON;

void setup(){
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  Serial.begin(9600);
}

void loop(){
  digitalWrite(2, LOW);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  BIN_1 = !(digitalRead(6))*1 + !(digitalRead(7))*2 + !(digitalRead(8))*4 + !(digitalRead(9))*8;
  
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  BIN_2 = !(digitalRead(6))*16 + !(digitalRead(7))*32 + !(digitalRead(8))*64 + !(digitalRead(9))*128;
  
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  BIN_3 = !(digitalRead(6))*256 + !(digitalRead(7))*512 + !(digitalRead(8))*1024 + !(digitalRead(9))*2048;
  
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, LOW);
  BIN_4 = !(digitalRead(6))*4096 + !(digitalRead(7))*8192 + !(digitalRead(8))*16384 + !(digitalRead(9))*32768;
  
  BIN_SON = BIN_1 + BIN_2 + BIN_3 + BIN_4;
  
  Serial.println(BIN_SON);
 }

veliusta


pwm.c

veliusta, şu bağlantıyı denermisin:


_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

veliusta

pwm.c oldu fakat Ben bu diyotları keypadın içine nasıl sokacam.


dursuncemal

Serial Monitörde 31 olması gereken yerde 255 gönderiyor. Anlamadım.

hocam seriale  BIN_SON  degiskenine tus okumadan el ile veri girip denedinizmi serial monitorden okudunuzmu ?zira burda sikinti yok gibi. olsa olsa tur donusumu olabilir birde buton degerlerini hesaplamadan once araya bir delay girseniz.
:=

veliusta


dursuncemal

hic diyotsuz  calismasi lazim

  digitalWrite(2, HIGH);//  buralari digital   hi yerinegiris yapin(input);
  digitalWrite(3, HIGH);//buralari digital   hi yerinegiris yapin(input);
  digitalWrite(4, HIGH);//buralari digital   hi yerinegiris yapin(input);
  digitalWrite(5, LOW);
burayada bir delay girerseniz
  BIN_4 = !(digitalRead(6))*4096 + !(digitalRead(7))*8192 + !(digitalRead(8))*16384 + !(digitalRead(9))*32768;
:=

veliusta

Çalışmıyor diyotsuz.

unsigned long BIN_1;
unsigned long BIN_2;
unsigned long BIN_3;
unsigned long BIN_4;
unsigned long BIN_SON;

void setup(){
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  pinMode(8, INPUT);
  pinMode(9, INPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);

  Serial.begin(9600);
}

void loop(){
delay(5);
  
  digitalWrite(2, LOW);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  delay(5);
  pinMode(3, OUTPUT);
  delay(5);
  BIN_1 = !(digitalRead(6))*1 + !(digitalRead(7))*2 + !(digitalRead(8))*4 + !(digitalRead(9))*8;
  delay(5);
  
  digitalWrite(3, LOW);
  pinMode(2, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  delay(5);
  pinMode(4, OUTPUT);
  delay(5);
  BIN_2 = !(digitalRead(6))*16 + !(digitalRead(7))*32 + !(digitalRead(8))*64 + !(digitalRead(9))*128;
  delay(5);
  
  digitalWrite(4, LOW);
  pinMode(3, INPUT);
  pinMode(2, INPUT);
  pinMode(5, INPUT);
  delay(5);
  pinMode(5, OUTPUT);
  delay(5);
  BIN_3 = !(digitalRead(6))*256 + !(digitalRead(7))*512 + !(digitalRead(8))*1024 + !(digitalRead(9))*2048;
  delay(5);
  
  digitalWrite(5, LOW);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(2, INPUT);
  delay(5);
  pinMode(2, OUTPUT);
  delay(5);
  BIN_4 = !(digitalRead(6))*4096 + !(digitalRead(7))*8192 + !(digitalRead(8))*16384 + !(digitalRead(9))*32768;
  delay(5);
    
  BIN_SON = BIN_1 + BIN_2 + BIN_3 + BIN_4;
  delay(5);
  Serial.println(BIN_SON);
 }


10K dirençte ekledim.

pwm.c

diyotsuz olmaz gibi ama hala emin değilim. imkansızı başarmakta mümkündür.
kullandığınız keypad yapıştırmalı ise yapacak bişey yok ama tuşlu olanlardansa pcb üzerine 805 kılıf diyotlar eklenebilir ancak ciddi bir cerrahi müdehale ister.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-