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

Gönderdiğin değerler itibarı ile çıkışlar mantıklı, ama tek LED yakacak değer göndermen lazım. Şunları gönder:

0
1
2
4
8
16
32
64
128
 
Gönderdiğin değerler itibarı ile çıkışlar mantıklı, ama tek LED yakacak değer göndermen lazım. Şunları gönder:

0
1
2
4
8
16
32
64
128
tamam yav şimdi oldu.
O zaman bizim karaşimşek kodundaki hatayı bulmak lazım şimdi.
 
Şöyle kendi düz mantığımın yettiğince bir void loop oluşturdum. Sonuca çok yaklaştım gibi.

C++:
int clockPin = 2;
int latchPin = 3;
int dataPin = 4;
int i = 0;
int flag = 0;


uint8_t _a[] = {
  0b10000000,
  0b11000000,
  0b11100000,
  0b01110000,
  0b00111000,
  0b00011100,
  0b00001110,
  0b00000111,
  0b00000011,
  0b00000001,  //9. led pini burada high
  0b00000011,
  0b00000111,
  0b00001110,
  0b00011100,
  0b00111000,
  0b01110000,
  0b11100000,
  0b11000000,
  0b10000000
};

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
}
void loop() {
  if (flag == 0) {
    for (i = 0; i <= 19; i++) {
      updateShiftRegister();
      delay(150);
    }
    flag = 1;
  } else if (flag == 1) {
    for (i = 19; i >= 0; i--) {
      updateShiftRegister();
      delay(150);
    }
    flag = 0;
  }
}

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

 
Kartı hazırlarsan, ben programı yapar gönderirim.
Öyle direk hazıra konunca Timur abi kızıyor. İlla "kendin yapıp öğreneceksin" diyor. Yoksa ben Ahmete çoktan yaptırmıştım kodundan baskısına kadar :katil2:
 
Hatırladığım kadarıyla Attiny lerin küçükleri for döngüsünü pek sevmiyordu. Çok yer kapladığı için kod sığmıyordu.
Onun için for döngüsünden kurtulup void loop içinde yazabildiğim en minimal kodu yazdım.
Bu şekilde çalışmasında bir sorun yok.

C++:
void loop() {
    if (i <= 18) {
      updateShiftRegister();
      i++;
      delay(150);
    }
    if(i == 18)i = 0;
}

Şimdi geriye iki adım kaldı.
1- 9.LED'i nasıl ekleyeceğim?
2- Bu ledlerin direk yanıp sönmesi yerine kısılarak sönmesi ve açılarak yanmasını istiyorum. Gerekli koordinasyonu ayarlayabilirsek gerçekten bir karaşimşek hareketi yaptırmış olacağız. (Bu şekilde de iş görür ama imkan varsa daha iyisini yapmak isterim.
 
Döngüyü daha minimal yapabilirsin:

C++:
void loop() {
      updateShiftRegister();
      i = (i + 1) % 18;
      delay(150);
}

Bir de array büyüklüğünü hardcode edeceğine sizeof(_a) diye kullanırsan daha iyi olur. Böylece array içindeki verileri istediğin gibi arttırıp azaltırsın, ama programın geri kalanı değişmesi gerekmez.

Parlaklık ayarı için PWM gerekli, onun için birden fazla PWM destekleyen entegreler vardı onlardan kullanmak lazım.
 
@Ahmet şu 9.ledi nasıl sıraya dahil ederiz azıcık kopya versene. Benim kafa basmıyor.
Birde 74HC595'i rastgele 3 digital pine bağlamak yetiyor mu yoksa mosi- miso filan gözeterek mi takmamız lazım?
 
@Ahmet şu 9.ledi nasıl sıraya dahil ederiz azıcık kopya versene. Benim kafa basmıyor.
Birde 74HC595'i rastgele 3 digital pine bağlamak yetiyor mu yoksa mosi- miso filan gözeterek mi takmamız lazım?
rastgele pin olur.

9. ledi devreye almak için oluşturduğun döngünün son adımını kullan abi son adıma geldiğinde 595 saydırmayı durdurmalı senin IO konuşup sırasını tekrar 595e bırakmalı.
 
rastgele pin olur.

9. ledi devreye almak için oluşturduğun döngünün son adımını kullan abi son adıma geldiğinde 595 saydırmayı durdurmalı senin IO konuşup sırasını tekrar 595e bırakmalı.
interrupt mu yapacağız, nasıl durduracağız?
Şöyle ikiye böldüm ama arada 9.ledi kontrol edemiyorum.

C++:
void loop() {
  updateShiftRegister(_a);
  i = (i + 1) % 11;
  delay(150);
  digitalWrite(led9, HIGH);
  delay(150);
  digitalWrite(led9, LOW);
  updateShiftRegister(_b);
  i = (i + 1) % 9;
  delay(150);
}

void updateShiftRegister(uint8_t _c[]) {
  digitalWrite(latchPin, LOW);
  delayMicroseconds(2);
  shiftOut(dataPin, clockPin, LSBFIRST, _c[i]);
  digitalWrite(latchPin, HIGH);
}
 
interrupt mu yapacağız, nasıl durduracağız?
Şöyle ikiye böldüm ama arada 9.ledi kontrol edemiyorum.

C++:
void loop() {
  updateShiftRegister(_a);
  i = (i + 1) % 11;
  delay(150);
  digitalWrite(led9, HIGH);
  delay(150);
  digitalWrite(led9, LOW);
  updateShiftRegister(_b);
  i = (i + 1) % 9;
  delay(150);
}

void updateShiftRegister(uint8_t _c[]) {
  digitalWrite(latchPin, LOW);
  delayMicroseconds(2);
  shiftOut(dataPin, clockPin, LSBFIRST, _c[i]);
  digitalWrite(latchPin, HIGH);
}
i değeri shift register port sayısını aşma durumunu başka bir if ile kontrol edeceksin abi 1 aştığında 9 numara işini yapıp sıfırlayacak
 
9 numarayı da tabloda tanımla.

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

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

static uint16_t led[] =
{
  0b1100000000000000,
  0b0110000000000000,
  0b0011000000000000,
  0b0001100000000000,
  0b0000110000000000,
  0b0000011000000000,
  0b0000001100000000,
  0b0000000110000000,
  0b0000001100000000,
  0b0000011000000000,
  0b0000110000000000,
  0b0001100000000000,
  0b0011000000000000,
};

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

void loop()
{
  for (unsigned int i = 0;
       i < (sizeof(led) / sizeof(led[0]));
       ++i)
  {
    // 595 verisini yaz
    shiftOut(dataPin, clockPin, LSBFIRST, led[i] >> 8);
    digitalWrite(latchPin, HIGH);
    digitalWrite(latchPin, LOW);

    // GPIO verisini yaz
    digitalWrite(led9Pin, !!(led[i] & 0xff));

    delay(250);
  }
}
 
i değeri shift register port sayısını aşma durumunu başka bir if ile kontrol edeceksin abi 1 aştığında 9 numara işini yapıp sıfırlayacak
Kolaymış ya. Benim aklım i'nin for döngüsündeki gibi sayıyı tamamlamadan aşağıya geçmiyor algısına takılmış.
@Ahmet 'i fikir hocam tayin ettim. Ser veriyor sır vermiyor. Timurun kalfası Ahmet, Ahmetin çırağı ben. :katil2:

Şu şekilde çözdüm olayı:

C++:
void loop() {
  updateShiftRegister();
  i = (i + 1) % 19;
  delay(150);
  if (i == 11){
  digitalWrite(led9, HIGH);
  delay(150);
  digitalWrite(led9, LOW);
  }
}

 
9 numarayı da tabloda tanımla.

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

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

static uint16_t led[] =
{
  0b1100000000000000,
  0b0110000000000000,
  0b0011000000000000,
  0b0001100000000000,
  0b0000110000000000,
  0b0000011000000000,
  0b0000001100000000,
  0b0000000110000000,
  0b0000001100000000,
  0b0000011000000000,
  0b0000110000000000,
  0b0001100000000000,
  0b0011000000000000,
};

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

void loop()
{
  for (unsigned int i = 0;
       i < (sizeof(led) / sizeof(led[0]));
       ++i)
  {
    // 595 verisini yaz
    shiftOut(dataPin, clockPin, LSBFIRST, led[i] >> 8);
    digitalWrite(latchPin, HIGH);
    digitalWrite(latchPin, LOW);

    // GPIO verisini yaz
    digitalWrite(led9Pin, !!(led[i] & 0xff));

    delay(250);
  }
}
Abi senin kodlar mükemmel ama Ahmetin kalemi hep. Benim için ileri düzey kalıyor :D
 
Yarım yamalak kendim diğer yarısını forumda çoğunlukla Timur abiden öğrendim.

Ben prensip gereği 10 yılım dolmadan çırak kabul etmiyorum.
 
Şema yapısını da şöyle kurdum. Daha tam bitmedi ama vaktim de kalmadı. Yavaştan yatmam lazım. Bu gün izin günümdü iyi iş gördüm :)

Burada iki 74HC595 arasındaki bağlantıyı doğru yapmış mıyım? PJC7404 mosfet KiCad de olmadığı için salladım.

karaşimşek şema.png
 
Şemay yapısını da şöyle kurdum. Daha tam bitmedi ama vaktim de kalmadı. Yavaştan yatmam lazım. Bu gün izin günümdü iyi iş gördüm :)

Burada iki 74HC595 arasındaki bağlantıyı doğru yapmış mıyım? PJC7404 mosfet KiCad de olmadığı için salladım.

22259 eklentisine bak
Tr lerin hepsine çekme direnci eklemelisin abi.

ULN2003 yakışır buraya
 

Ç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