Güvenilir Şekilde Port Çoğullamak

Başlatan burak54, 05 Şubat 2016, 01:11:37

burak54

Merhaba arkadaşlar,
74HC595 ile denemeler yapıyorum belki ben beceremiyorum ya da entegrenin yapısı geregi bazı eksikleri var. 16 Bitlik data yolladıgımda 2 tane seri sekilde deniyorum illa ki eş tarafta ki cıkısa denk gelen led te yanıyor .Yani 2. entegrenin 0. bitini 1 yapınca anlıkta olsa 1. entegrenin 0. biti de yanıyor gibi oluyor bana cok kararlı hata yapmayacak sekilde cıkış portunu cogullayacak bir yapı lazım. PCF8574P denemeyi düşünüyorum ne dersiniz ? Teşekkürler.

seyityildirim

devrenizin şemasını eklemenizin faydası olur

mehmet

Önce data yollayıp sonra lach yapılacak, her data
yollanırken latch yapılmaması gerekir.

16bit ihtiyacını; MCP23017, MCP23S17, Max7219,
PCF8574(iki adet kullanilacak) karşılayabilir.

Kod paylaşırsanız cevaplar daha verimli olacaktır...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

burak54



int latchPin = 5;

int clockPin = 4;

int dataPin = 3;

int buton1=8;
int buton2=9;
int enable=10;

byte dataRED;
byte dataGREEN;
byte dataArrayRED[10];
byte dataArrayGREEN[10];

void setup() {

  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(buton1,INPUT);
  pinMode(buton2,INPUT);
   pinMode(enable,OUTPUT);

  dataArrayRED[0] = 0xFF; //11111111
  dataArrayRED[1] = 0xFE; //11111110
  dataArrayRED[2] = 0xFC; //11111100
  dataArrayRED[3] = 0xF8; //11111000
  dataArrayRED[4] = 0xF0; //11110000
  dataArrayRED[5] = 0xE0; //11100000
  dataArrayRED[6] = 0xC0; //11000000
  dataArrayRED[7] = 0x80; //10000000
  dataArrayRED[8] = 0x00; //00000000
 // dataArrayRED[9] = 0xE0; //11100000

  dataArrayGREEN[0] = 0xFF; //11111111
  dataArrayGREEN[1] = 0x7F; //01111111
  dataArrayGREEN[2] = 0x3F; //00111111
  dataArrayGREEN[3] = 0x1F; //00011111
  dataArrayGREEN[4] = 0x0F; //00001111
  dataArrayGREEN[5] = 0x07; //00000111
  dataArrayGREEN[6] = 0x03; //00000011
  dataArrayGREEN[7] = 0x01; //00000001
  dataArrayGREEN[8] = 0x00; //00000000
 // dataArrayGREEN[9] = 0x07; //00000111


 digitalWrite(latchPin, HIGH);
  digitalWrite(latchPin, LOW);
   // delayMicroseconds(10); 
 shiftOut(dataPin, clockPin, MSBFIRST,dataArrayRED[8] );
    shiftOut(dataPin, clockPin, MSBFIRST,dataArrayGREEN[8] );
   // delayMicroseconds(10);   
   
    digitalWrite(latchPin, HIGH);
 digitalWrite(enable, LOW);
}


void loop() {

digitalWrite(enable, HIGH); 
if(digitalRead(buton1)){

 digitalWrite(enable, HIGH); 
 digitalWrite(latchPin, LOW);
 // delayMicroseconds(10); 
shiftOut(dataPin, clockPin, MSBFIRST,dataArrayRED[6] );
shiftOut(dataPin, clockPin, MSBFIRST,dataArrayGREEN[8] );
   // delayMicroseconds(10);   
digitalWrite(latchPin, HIGH);
    // delay(1000);
digitalWrite(enable, LOW);
     
delay(500); 
digitalWrite(enable, HIGH); 
digitalWrite(latchPin, LOW);
   // delayMicroseconds(10); 
shiftOut(dataPin, clockPin, MSBFIRST,dataArrayRED[8] );
shiftOut(dataPin, clockPin, MSBFIRST,dataArrayGREEN[8] );
   // delayMicroseconds(10);   
  digitalWrite(latchPin, HIGH);
    // delay(1000);
    digitalWrite(enable, LOW);
      




}

if(digitalRead(buton2)){
digitalWrite(enable, HIGH); 
delay(1500);
digitalWrite(latchPin, LOW);
delayMicroseconds(10); 
shiftOut(dataPin, clockPin, MSBFIRST,dataArrayRED[8] );
shiftOut(dataPin, clockPin, MSBFIRST,dataArrayGREEN[6] );
delayMicroseconds(10);   
digitalWrite(latchPin, HIGH);
digitalWrite(enable, LOW);
delay(500);


 
    
}


Kod Arduino IDE si içindir.

2 Adet input yaptım kod olarak tabi kararsız bir input alma şekli ama deneme amaclı bir kaç farklı yöntem denedim . Denemerim 16 Bit için ama 64 e kadar cıkabilir bu çıkış sayısı. Benim için önemli olan güvenli olması hatasız şekilde ne gönderirsem onun cıkışını almam gerek. farklı hiç birseyin kıpraşmaması gerek.

dursuncemal

#4
bu entegrenin birde giris cogulama icin olani var adini hatirlamiyorum ama;
cogu uygulamalarda kullanilan bir entegredir.epey bir zaman once kullanmistim herhangi bir sikinti yarammamisti.yanlis hatirlamiyor isem;seri yazmaya baslamadan once ; clock = 0; latch = 0; yazma bittikten hemen sonra  latch = 1; delay 1ms  latch = 0;     bu  seklinde sorun  olmamasi lazim. yanlis okumadiysam seri veriyi yazdiktan sonra  latch= 1; de kaliyor sende  latch pinini toogale yaparsan sıkıntın kalmayacaktir.

:=

mehmet

#5
Alıntı yapılan: dursuncemal - 05 Şubat 2016, 03:06:55
bu entegrenin birde giris cogulama icin olani var adini hatirlamiyorum ama;
74165

Veri yollamadan latch low yapılır.16bit verinin
tamamı yollanır. Daha sonra latch high
yapılır. Eğer daha fazla 595 kullanılacak ise
yine aynı, verinin tamamı bittikten sonra latch
high yapılır. Ayrıca Arduino kütüphanesi var
HC595 için.
http://playground.arduino.cc/Main/ShiftOutX

Buton için de debounce gecikmesi eklemeniz
gerekmekte. Aynı şekilde 74165 ile okuma
yaparsanız birden fazla okuma yaptığınız.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Murat Mert

mert07

dursuncemal

seri veri baslamadan latch = 0; veri bittikten sonra  latch = 1;  latch = 0; olmali tam bir pals gondermek lazim.
:=