AC LED Sürücüsü çalışmıyor.

TPIC6B595 yüksk çıkışlı shift register larda var.
150mA sürekli yükü kaldırabiliyormuş.
40 nano saniye boyunca da 1A yükü kaldırabilirmiş.
hoşuma gitti ama benim dijital elektronik bakış açımda güç ve dijital devre aynı paket içinde olmamalı.

ben bu devreyi yapacak olsam 595+pc817+bd139 ile yaparım.
 
9 LED varsa, 1 ATTiny, 2 tane de 595 gerekli. Bu yapi 16 taneye kadar LED sürer. 1 W LED leri sürmek için darlington transistör veya MOSFET kullanmak daha uygun olur. Ucuz darlington bulmak zor olabilir ama aşağıdaki MOSFET iş görür

22201 eklentisine bak
1 tane 595 ile 8 led sürüyoruz 595 çalışmak için attinynin 3 tane pinini esir alıyor 1 tane daha IO daha kullanacağız o IO'da sonda kalan 1 ledi sürecek böylece kalabalık yapmadan 9 ledi sürebiliyor olacağız.
 
Kod:
bitSet(leds,0);//ILK 2 LED YANDI
bitSet(leds,1);//ILK 2 LED YANDI
updateShiftRegister();

delay(215);

Bir array yapıp bu animasyonu 0b00000 kullanarak oluşturacaktım o array basamaklarını bir for döngüsü ile yürütecektim ama çok kafa karıştırıcı olur müdahale etmek zor olur diye tek tek yazdım böyle çok rahat anlaşılır ve müdahale edilebilir oldu.
Bu programdan yola çıkarak audi kayar far, kara şimşek, ortada birleşip dışa doğru kayan far yapılabilir kafa karıştıran bir yer varsa anlatırım 595 entegresinnide çok severim.

eğer ledler algılama yönünüzün tersine doğru kayıyorsa shiftOut satırındaki MSB'i LSB yapın tam tersi yöne kayacaktır.

Bu yapı çalışır ama olabilecek en basit yapı değil. Biraz kafa karıştırıcı. bitSet kullanacağına doğrudan değişkeni güncellemek daha faydalı olur. Hatta bir array yaparsan tam olarak neyin çıkacağını da görmüş olursun. Mesela tek bit kaydıran kara şimşek aşağıda. Daha fazla bit kayacaksa bunu tabloya yansıtmak yeterli.

C++:
//-*- mode: c++; c-basic-offset: 2; -*-

const int clockPin = 2;
const int latchPin = 3;
const int dataPin = 4;

static unsigned char led[] =
{
  0b00000001,
  0b00000010,
  0b00000100,
  0b00001000,
  0b00010000,
  0b00100000,
  0b01000000,
  0b10000000,
  0b01000000,
  0b00100000,
  0b00010000,
  0b00001000,
  0b00000100,
  0b00000010,
};

void setup()
{
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop()
{
  for (unsigned int i = 0; i < sizeof(led); ++i)
  {
    shiftOut(dataPin, clockPin, LSBFIRST, led[i]);
    digitalWrite(latchPin, HIGH);
    digitalWrite(latchPin, LOW);
    delay(1000);
  }
}
 
Bu yapı çalışır ama olabilecek en basit yapı değil. Biraz kafa karıştırıcı. bitSet kullanacağına doğrudan değişkeni güncellemek daha faydalı olur. Hatta bir array yaparsan tam olarak neyin çıkacağını da görmüş olursun. Mesela tek bit kaydıran kara şimşek aşağıda. Daha fazla bit kayacaksa bunu tabloya yansıtmak yeterli.

C++:
//-*- mode: c++; c-basic-offset: 2; -*-

const int clockPin = 2;
const int latchPin = 3;
const int dataPin = 4;

static unsigned char led[] =
{
  0b00000001,
  0b00000010,
  0b00000100,
  0b00001000,
  0b00010000,
  0b00100000,
  0b01000000,
  0b10000000,
  0b01000000,
  0b00100000,
  0b00010000,
  0b00001000,
  0b00000100,
  0b00000010,
};

void setup()
{
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop()
{
  for (unsigned int i = 0; i < sizeof(led); ++i)
  {
    shiftOut(dataPin, clockPin, LSBFIRST, led[i]);
    digitalWrite(latchPin, HIGH);
    digitalWrite(latchPin, LOW);
    delay(1000);
  }
}
öyle yapacaktım yazdım hatta öyle yapacağımı ama vazgeçtim böyle yapınca digitalWrite gibi oluyor herkes rahatlıkla yapabilir.
 
Ben bu shiftOut komutunu beğenmedim bakalım shiftOut nasıl çalışıyor.


C++:
void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{
    uint8_t i;

    for (i = 0; i < 8; i++)  {
        if (bitOrder == LSBFIRST) {
            digitalWrite(dataPin, val & 1);
            val >>= 1;
        } else {  
            digitalWrite(dataPin, (val & 128) != 0);
            val <<= 1;
        }
           
        digitalWrite(clockPin, HIGH);
        digitalWrite(clockPin, LOW);      
    }
}

Shift out komutunun temeline bakınca böyle bir yapı görüyorum.

kaynak kodu:
 
Son düzenleme:
Bir de osiloskobun var Gökhan, böyle programları yazınca daha hiç devreyi kurmadan MCU seviyesinde doğru çalıştığını doğrulayabilirsin.

 
Bir de osiloskobun var Gökhan, böyle programları yazınca daha hiç devreyi kurmadan MCU seviyesinde doğru çalıştığını doğrulayabilirsin.

22206 eklentisine bak
Ahh ahh. O eski boş günler geride kaldı abi. Boş vaktim hiç yok değil var ama benim yaptığım işe odaklanmam uzun sürdüğü için neyin ne olduğunu anlayana kadar çok vakit geçiyor. Aktif olarak çalıştığım için de vücut yorgun düştüğünden uykuya daha çok vakit ayırmak zorunda kalıyorum.
 
videoda QH' olarak anlatıyor @Gokrtl .

Bir de sorum olacak. Konu uzun olmuş okuyamadım hepsini.
3lü şışğın sona varınca geriye doğru da kaymasını istiyor musun?
Evet istiyorum. Sürekli sağa sola gidip gelmesi lazım. Videoya da bakayım bu gün.
 
C++:
int clockPin = 2;
int latchPin = 3;
int dataPin = 4;
int i = 0;


unsigned int _a [] = {
  0b00000000,//0
  0b11000000,//1
  0b00110000,//2
  0b00001100,//3
  0b00000011,//4
  0b00001100,//5
  0b00110000,//6
  0b11000000 //7
};
void setup()
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
}
void loop()
{
  i++;
  delay(250);
  updateShiftRegister();
  if(i == 8){
    i = 0;
  }

}

void updateShiftRegister()
{
  digitalWrite(latchPin, LOW);
  delayMicroseconds(2);
  shiftOut(dataPin, clockPin, MSBFIRST, _a [i]);
  digitalWrite(latchPin, HIGH);
}
Zamanında kronometre yaparken bu arrayi iyiki öğrenmişim, öğrendiğimden beri kullanmadığım programım neredeyse yok.
arrayli versiyonu ileri geri yapıyor.

ledlerin bir anlık sönük kalması gözü rahatsız ediyorsa 0 konumu silinebilir if şartı 7 yapılıp sönük konum kaybedilebilir.
 
C++:
int clockPin = 2;
int latchPin = 3;
int dataPin = 4;
int i = 0;

/*
unsigned int _a [] = {
  0b00000000,//0  0x00
  0b11000000,//1  0xC0
  0b00110000,//2  0x30
  0b00001100,//3  0xC
  0b00000011,//4  0x3
  0b00001100,//5  0xC
  0b00110000,//6  0x30
  0b11000000 //7  0xC0
};
*/
unsigned int _a [] = {
   0x00,
   0xC0,
   0x30,
   0xC,
   0x3,
   0xC,
   0x30,
   0xC0
};

void setup()
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
}
void loop()
{
  i++;
  delay(250);
  updateShiftRegister();
  if(i == 7){
    i = 0;
  }

}

void updateShiftRegister()
{
  digitalWrite(latchPin, LOW);
  delayMicroseconds(2);
  shiftOut(dataPin, clockPin, MSBFIRST, _a [i]);
  digitalWrite(latchPin, HIGH);
}

HEX olarak yazılmış hali.
 
C++:
int clockPin = 2;
int latchPin = 3;
int dataPin = 4;
int i = 0;


 uint8_t _a [] = {
  0b00000000,//0  0x00
  0b11000000,//1  0xC0
  0b00110000,//2  0x30
  0b00001100,//3  0xC
  0b00000011,//4  0x3
  0b00001100,//5  0xC
  0b00110000,//6  0x30
  0b11000000 //7  0xC0
  };
 
void setup()
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
}
void loop()
{
  i++;
  delay(250);
  updateShiftRegister();
  if(i == 7){
    i = 0;
  }

}

void updateShiftRegister()
{
  digitalWrite(latchPin, LOW);
  delayMicroseconds(2);
  shiftOut(dataPin, clockPin, MSBFIRST, _a [i]);
  digitalWrite(latchPin, HIGH);
}

Bu haliyle 30 bayt daha az yer tutuyor çalışmasında bir farklılık yok.
 
9 tane LED sürmek için 20 pinli ucuz bir MCU ve 9 tane ucuz transistör yerine niye iş shift register kullanacak kadar karıştırıldı anlamadım. Bir şeyleri kaçırdım herhalde konuyu okurken.

Bir de, o boarddaki LEDlerin bazıları seri bağlı değil mi? Ayrı ayrı açıp kapayabilmek için aradaki yollar mı kesilecek?
 
9 tane LED sürmek için 20 pinli ucuz bir MCU ve 9 tane ucuz transistör yerine niye iş shift register kullanacak kadar karıştırıldı anlamadım. Bir şeyleri kaçırdım herhalde konuyu okurken.

Bir de, o boarddaki LEDlerin bazıları seri bağlı değil mi? Ayrı ayrı açıp kapayabilmek için aradaki yollar mı kesilecek?
arduino nano kartı şuan atmel temsilcimiz olarak çalışıyor.
proje nihai haline attiny13 ile geçecek diye düşünüyorum
 
Simply Put kanalının anlatım tarzını çok beğeniyorum. Aşağıdaki videoda SN74HC595N entegressinin çalışması çok güzel anlatılmış. İngilizce ama altyazıları açıp, Türkçe'ye çevirterek izleyebilirsiniz.

Maalesef Altyazılar da Türkçe seçeneği olmadığı için yarısına kadar izleyip fazla bir şey anlayamadım.
 
C++:
int clockPin = 2;
int latchPin = 3;
int dataPin = 4;
int i = 0;


 uint8_t _a [] = {
  0b00000000,//0  0x00
  0b11000000,//1  0xC0
  0b00110000,//2  0x30
  0b00001100,//3  0xC
  0b00000011,//4  0x3
  0b00001100,//5  0xC
  0b00110000,//6  0x30
  0b11000000 //7  0xC0
  };
 
void setup()
{
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
}
void loop()
{
  i++;
  delay(250);
  updateShiftRegister();
  if(i == 7){
    i = 0;
  }

}

void updateShiftRegister()
{
  digitalWrite(latchPin, LOW);
  delayMicroseconds(2);
  shiftOut(dataPin, clockPin, MSBFIRST, _a [i]);
  digitalWrite(latchPin, HIGH);
}

Bu haliyle 30 bayt daha az yer tutuyor çalışmasında bir farklılık yok.
Sen kodda ledler giderken sönmüyor, dönülte bir an sönüp geri yanıyor. Q7 hiç sönmüyor.

 

Çevrimiçi üyeler

Forum istatistikleri

Konular
6,584
Mesajlar
111,750
Üyeler
2,697
Son üye
emirhan123

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top