7 SEGMENT DISPLAY ILE KRONOMETRE

SRC.png

Bu basamak seçici devrem.
Acaba tarama frekansıma yetişemiyor mu diye beyzin'deki frekans ile collectordekini karşılaştırdım 328'den çıkan tarama frekansım 100herz collectörüne baktığımda'da 100herz görüyorum uyguladığım tarama frekansında açılıp kapanıyor.

Az kontrol edilen basamaklarda sönük yanma yok şuan en büyük basamağım saniye onlar basamağı direkt elektrik verdiğimdeki parlaklık ile aynı seviyede ışık veriyor.

Ama sık değer değiştirenler'de neredeyse %50(göz kararı) parlaklık düşüşü var.
IMG_20220626_101828.jpg
 
18017 eklentisine bak
Bu basamak seçici devrem.
Acaba tarama frekansıma yetişemiyor mu diye beyzin'deki frekans ile collectordekini karşılaştırdım 328'den çıkan tarama frekansım 100herz collectörüne baktığımda'da 100herz görüyorum uyguladığım tarama frekansında açılıp kapanıyor.

Az kontrol edilen basamaklarda sönük yanma yok şuan en büyük basamağım saniye onlar basamağı direkt elektrik verdiğimdeki parlaklık ile aynı seviyede ışık veriyor.

Ama sık değer değiştirenler'de neredeyse %50(göz kararı) parlaklık düşüşü var.
18018 eklentisine bak
Sabit bir sayı gösterirken de sönük görünüyor mu, yoksa sayaç çalışırken mi salise basamakları sönük görünüyor.
 
E ve F segmentleri daha sönük görünüyor, çünkü 0'dan 9'a tararken sayı sürekli değiştiğinden farklı segmentler farklı duty cycle ile gösterilmiş oluyor, B, C ve G segmentleri hemen hemen bütün rakamlarda yandığından sürekli yanıyorlar, F segmenti sadece 0, 8 ve 6 gösterirken yandığından daha sönük görünüyor insan gözüne. Sabit bir sayı gösterirken bütün segmentler aynı duty cycle ile yanmış oluyor ve parlaklığı farklı görmüyoruz.
 
C++:
unsigned char _7seg[] =
{ //nGFEDCBA
  0b11000000,//sıfır/0
  0b11111001,//bir/1
  0b10100100,//iki/2
  0b10110000,//üç/3
  0b10011001,//dört/4
  //nGFEDCBA
  0b10010010,//beş/5
  0b10000010,//altı/6
  0b11111000,//yedi7
  0b10000000,//sekiz8
  0b10010000,//dokuz9
  0b00000000,//lamba TEST10
  0b11111111,//lamba OF11
};


int a = 0;
void setup() {
  DDRD = B11111111; //büTÜN D PORTI ÇIKIŞ
  DDRB = DDRB | B00001111;

  a = 76;
}

void loop() {

  int onlar = a / 10;
  int birler = a % 10;

  PORTB = 0B00000111;
  PORTD = _7seg[onlar];
  delay(4);//tarama ayar


  PORTB = 0B00001011;
  PORTD = _7seg[birler];
  delay(4);//tarama ayar
 
  PORTB = 0B00001101;
  PORTD = _7seg[onlar];
  delay(4);//tarama ayar


  PORTB = 0B00001110;
  PORTD = _7seg[birler];
  delay(4);//tarama ayar


}


C++:
static unsigned char bcd[] =
{
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0
};

static void bcd_inc(unsigned char* bcd)
{
  ++bcd[0];//her zaman kesmesinde 1 arttır
  if (bcd[0] == 10)//10 kere zaman kesmesinde(100ms) olunca BİRLER BASAMAĞI
  {
    bcd[0] = 0;//1 LER BASAMAĞINI SIFIRLA
    ++bcd[1];//ONLAR BASAMAĞI 1 ARTTIR

    if (bcd[1] == 10)//ONLAR BASAMAĞI 10 OLDUYSA 100x10 = 1000mS= 1 SANIYE
    {
      bcd[1] = 0; //10LAR BASAMAĞI SIFIRLAMA
      ++bcd[2]; // SANIYE BIRLER BASAMAĞI
      if (bcd[2] == 10)//SANIYE BIRLER BASAMAĞI 10 OLDUYSA
      {
        bcd[2] = 0;
        ++bcd[3];//SANİYE ONLAR BASAMAĞINI 1 ARTTIR
        if (bcd[3] == 6)//SANIYE 10LAR BASAMAĞI 6 OLDUYSA YANI 1 DAKIKA
        {
          bcd[3] = 0;
          ++bcd[4];//DAKIKA BİRLER BASAMAĞI 1 ARTTIR
          if (bcd[4] == 10)//DAKIKA BIRLER BASAMAĞI 10 OLDUYSA
          {
            bcd[4] = 0;
            ++bcd[5];//DAKIKA ONLAR BASAMAĞI 1 ARTTIR
            if (bcd[5] == 6)//DAKIKA ONLAR BASAMAĞI 6 OLDUYSA YANİ 1 SAAT
            {
              bcd[5] = 0;
              ++bcd[6];//SAAT BIRLER BASAMAĞI 1 ARTTIR
              if ((bcd[6] == 4) && (bcd[7] == 2)) // EĞER SAAT 24 OLDUYSA
              {
                bcd[6] = bcd[7] = 0;//SAATI SIFIRLA
              }
              else if (bcd[6] == 10)
              {
                bcd[6] = 0;
                ++bcd[7];
              }
            }
          }
        }
      }
    }
  }
}



unsigned char _7seg[] =
{ //nGFEDCBA

  0b11000000,//sıfır/0
  0b11111001,//bir/1
  0b10100100,//iki/2
  0b10110000,//üç/3
  0b10011001,//dört/4
  //nGFEDCBA
  0b10010010,//beş/5
  0b10000010,//altı/6
  0b11111000,//yedi7
  0b10000000,//sekiz8
  0b10010000,//dokuz9
  0b00000000,//lamba TEST10
  0b11111111,//lamba OF11
};

ISR(TIMER1_COMPA_vect) {
  bcd_inc(bcd);
  PORTB = 0B00001011;//10
  PORTD = _7seg[bcd[0] ];
  delay(4);//tarama ayar

  PORTB = 0B00000111;//11
  PORTD = _7seg[bcd[1] ];
  delay(4);//tarama ayar

  PORTB = 0B00001101;//9
  PORTD = _7seg[bcd[2] ];
  delay(4);//tarama ayar


  PORTB = 0B00001110;//8
  PORTD = _7seg[bcd[03] ];
  delay(4);//tarama ayar
}

void setup()
{
  DDRD = B11111111; //büTÜN D PORTI ÇIKIŞ
  DDRB = DDRB | B00001111;//8-9-10-11 çıkış

  noInterrupts();
  TCCR1A = 0;
  TCNT1 = 0;
  OCR1A = 16000000 / (100 * 64) - 1;
  TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10);
  TIMSK1 |= (1 << OCIE1A);
  interrupts();
}

void loop()
{
}
 

Ekler

  • 7SEGGGG.mp4
    2.6 MB
E ve F segmentleri daha sönük görünüyor, çünkü 0'dan 9'a tararken sayı sürekli değiştiğinden farklı segmentler farklı duty cycle ile gösterilmiş oluyor, B, C ve G segmentleri hemen hemen bütün rakamlarda yandığından sürekli yanıyorlar, F segmenti sadece 0, 8 ve 6 gösterirken yandığından daha sönük görünüyor insan gözüne. Sabit bir sayı gösterirken bütün segmentler aynı duty cycle ile yanmış oluyor ve parlaklığı farklı görmüyoruz.
Dediğin gibi hepsi aynı parlaklıkta yanıyor sabit değer gösterirken.
Çünkü hiç konum değiştirmiyor.

Şöyle birşey düşündüm bütün dijitler daima yanar halde olsa ben lazım olanları söndürsem bu parlaklık sorununun önüne geçmiş olur muyum
 
Dediğin gibi hepsi aynı parlaklıkta yanıyor sabit değer gösterirken.
Çünkü hiç konum değiştirmiyor.

Şöyle birşey düşündüm bütün dijitler daima yanar halde olsa ben lazım olanları söndürsem bu parlaklık sorununun önüne geçmiş olur muyum
Sorun insan gözünde, salise basamaklarını anlık algılayan bir göz lazım. Ya da sayaç çalışırken salise basamağını hep 8 göster, titrek titrek yansın sanki sayılar değişiyor gibi. Kronometreyi durdurunca gerçekleşen değeri yazdırırsın. yüksek hızlı kameradan bakmayan kimse anlamaz, segmentlerin parlaklık farkı da çok düşük olur.
 
Sorun insan gözünde, salise basamaklarını anlık algılayan bir göz lazım. Ya da sayaç çalışırken salise basamağını hep 8 göster, titrek titrek yansın sanki sayılar değişiyor gibi. Kronometreyi durdurunca gerçekleşen değeri yazdırırsın. yüksek hızlı kameradan bakmayan kimse anlamaz, segmentlerin parlaklık farkı da çok düşük olur.
Ben gözlükle değişimleri hiç net olmasada sezebiliyorum diyeyim yada beynim beni kandırıyor.
Ama gözlüksüz titreyen 8.
 
Sorun insan gözünde, salise basamaklarını anlık algılayan bir göz lazım. Ya da sayaç çalışırken salise basamağını hep 8 göster, titrek titrek yansın sanki sayılar değişiyor gibi. Kronometreyi durdurunca gerçekleşen değeri yazdırırsın. yüksek hızlı kameradan bakmayan kimse anlamaz, segmentlerin parlaklık farkı da çok düşük olur.
Birde bu videoya bakar mısın abi bu cihazı yapanlar en minimal hesapla 77 tane çıkış kullanarak sürmemişlerdir herhalde.
Taramayı nasıl bu kadar başarılı yaptı bu herifler.
 
Birde bu videoya bakar mısın abi bu cihazı yapanlar en minimal hesapla 77 tane çıkış kullanarak sürmemişlerdir herhalde.
Taramayı nasıl bu kadar başarılı yaptı bu herifler.
Birkaç çözümü vardır. 11 basamağı teker teker değil ikişer ikişer gösterip titrek veya soluk görünmemesini sağlıyor olabilirler. Bir monitörün kaç piksel yönettiğini düşünürsek yeterli hızda ve çıkışta entegre bulunuyordur. Ben kendi projemde shift reg. kullanırdım, deneyip bildiğimden. Endüstride daha özelleşmiş kullanışlı sürücü entegreler vardır heralde.
 
Birkaç çözümü vardır. 11 basamağı teker teker değil ikişer ikişer gösterip titrek veya soluk görünmemesini sağlıyor olabilirler. Bir monitörün kaç piksel yönettiğini düşünürsek yeterli hızda ve çıkışta entegre bulunuyordur. Ben kendi projemde shift reg. kullanırdım, deneyip bildiğimden. Endüstride daha özelleşmiş kullanışlı sürücü entegreler vardır heralde.

TAR.png

Daha önce hiç böyle düşünmedim 4017'yi ama olur diye düşünüyorum.
Display tarama işini 4017'ye bıraksam hem tarama için 7 tane I/O'dan tasarruf ederim tek pin pulse verdirerek kaydırım yeterince hızlı kaydırabilirse 4017 hem tasarruf sağlarım hemde daha başarılı bir tarama yapmış olurum
 
Saliseler yanıp dönerken saatler yanıp sönmüyorsa tabii parlaklık farkı olacak. Olmaması için durumu eşitlemek lazım bu doğrultuda düşün.
 
Saliseler yanıp dönerken saatler yanıp sönmüyorsa tabii parlaklık farkı olacak. Olmaması için durumu eşitlemek lazım bu doğrultuda düşün.
IMG_20220626_114447.jpg


O zaman siz biraz daha kenarında durun ULN2803 ve 4017
Ben umarım birkaç if ile halledeceğim

İnterupt ataması yaparken kullandığımız CHANGE veya eeprom kullanırken kullandığım update işe yararsa

Değişim olduysa ekrana yazdır gibi birşey düşündüm
 
Tamam sen gene dene ama harici başka komponente gerek yok.
 
Tamam sen gene dene ama harici başka komponente gerek yok.
Biliyorum abi bu şekilde'de kullanılır sorun olmadan.
Ama I/O ihtiyacı hat safada olan bir proje'de tek entegre kullanarak yüzlerce display taraması yapılabilir 4017 taşmalarını kullanıp diğer 4017'lere atlayarak.

Tek çıkış ile seçebiliriz hepsini.
Bu projede kalıcı olmasada 4017'li versiyonunu yapmaya çalışacağım.

Hatta 595+4017 kullanarak sadece 4 çıkış ile yine istediğimiz kadar sürebiliriz tamponlar ve transistörler kullanmak şartıyla display sayısı istenildiği kadar arttırılabilir.
 
Display sayısı ile ilgili bir kısıtlama yok multiplex yaparken. 50 tane 7 segment de taratabilirsin, bunun için ilave bir komponente gerek yok.
 
Display sayısı ile ilgili bir kısıtlama yok multiplex yaparken. 50 tane 7 segment de taratabilirsin, bunun için ilave bir komponente gerek yok.
abi 7 tane görüntü oluşturmak için mecburen kullanacağız.

birde display seçmek çıkışlara ihtiyacımız var bunlar için ya direkt çıkış yapacağız yada ilave 595,4017 vs. kullanacağız başka nasıl olabilir ki?
 
8 tane 7 segmenti taramak için harici başka komponente gerek yok. Ama sen başka bir projeye girişiyorsan o ayrı tabi.
 
C++:
bool snb = 0;
bool sno = 0;

static void bcd_inc(unsigned char* bcd)
{
  ++bcd[0];//her zaman kesmesinde 1 arttır
 // msb == 1;

  if (bcd[0] == 10)//10 kere zaman kesmesinde(100ms) olunca BİRLER BASAMAĞI
  {
    bcd[0] = 0;//1 LER BASAMAĞINI SIFIRLA
    ++bcd[1];//ONLAR BASAMAĞI 1 ARTTIR
    //mso == 1;

    if (bcd[1] == 10)//ONLAR BASAMAĞI 10 OLDUYSA 100x10 = 1000mS= 1 SANIYE
    {
      bcd[1] = 0; //10LAR BASAMAĞI SIFIRLAMA
      ++bcd[2]; // SANIYE BIRLER BASAMAĞI
      snb = 1;

      if (bcd[2] == 10)//SANIYE BIRLER BASAMAĞI 10 OLDUYSA
      {
        bcd[2] = 0;
        ++bcd[3];//SANİYE ONLAR BASAMAĞINI 1 ARTTIR
        sno = 1;

        if (bcd[3] == 6)//SANIYE 10LAR BASAMAĞI 6 OLDUYSA YANI 1 DAKIKA
        {
          bcd[3] = 0;
          ++bcd[4];//DAKIKA BİRLER BASAMAĞI 1 ARTTIR
          if (bcd[4] == 10)//DAKIKA BIRLER BASAMAĞI 10 OLDUYSA
          {
            bcd[4] = 0;
            ++bcd[5];//DAKIKA ONLAR BASAMAĞI 1 ARTTIR
            if (bcd[5] == 6)//DAKIKA ONLAR BASAMAĞI 6 OLDUYSA YANİ 1 SAAT
            {
              bcd[5] = 0;
              ++bcd[6];//SAAT BIRLER BASAMAĞI 1 ARTTIR
              if ((bcd[6] == 4) && (bcd[7] == 2)) // EĞER SAAT 24 OLDUYSA
              {
                bcd[6] = bcd[7] = 0;//SAATI SIFIRLA
              }
              else if (bcd[6] == 10)
              {
                bcd[6] = 0;
                ++bcd[7];
              }
            }
          }
        }
      }
    }
  }
}





ISR(TIMER1_COMPA_vect) {


   bcd_inc(bcd);

    PORTB = 0B00001011;//10
    PORTD = _7seg[bcd[0]];
    delay(4);//tarama ayar;




    PORTB = 0B00000111;//11
    PORTD = _7seg[bcd[1]];
    delay(5);//tarama ayar


  if (snb == 1) {
    PORTB = 0B00001101;//9
    PORTD = _7seg[bcd[2]];
    delay(3);//tarama ayar
    snb == 0;
  }

  if (sno == 1) {
    PORTB = 0B00001110;//8
    PORTD = _7seg[bcd[3]];
    delay(4);//tarama ayar
    sno == 0;
  }

}

Böyle birşey yaptım ama hala sönük yanma devam ediyor
 
C++:
bool snb = 0;
bool sno = 0;

static void bcd_inc(unsigned char* bcd)
{
  ++bcd[0];//her zaman kesmesinde 1 arttır
 // msb == 1;

  if (bcd[0] == 10)//10 kere zaman kesmesinde(100ms) olunca BİRLER BASAMAĞI
  {
    bcd[0] = 0;//1 LER BASAMAĞINI SIFIRLA
    ++bcd[1];//ONLAR BASAMAĞI 1 ARTTIR
    //mso == 1;

    if (bcd[1] == 10)//ONLAR BASAMAĞI 10 OLDUYSA 100x10 = 1000mS= 1 SANIYE
    {
      bcd[1] = 0; //10LAR BASAMAĞI SIFIRLAMA
      ++bcd[2]; // SANIYE BIRLER BASAMAĞI
      snb = 1;

      if (bcd[2] == 10)//SANIYE BIRLER BASAMAĞI 10 OLDUYSA
      {
        bcd[2] = 0;
        ++bcd[3];//SANİYE ONLAR BASAMAĞINI 1 ARTTIR
        sno = 1;

        if (bcd[3] == 6)//SANIYE 10LAR BASAMAĞI 6 OLDUYSA YANI 1 DAKIKA
        {
          bcd[3] = 0;
          ++bcd[4];//DAKIKA BİRLER BASAMAĞI 1 ARTTIR
          if (bcd[4] == 10)//DAKIKA BIRLER BASAMAĞI 10 OLDUYSA
          {
            bcd[4] = 0;
            ++bcd[5];//DAKIKA ONLAR BASAMAĞI 1 ARTTIR
            if (bcd[5] == 6)//DAKIKA ONLAR BASAMAĞI 6 OLDUYSA YANİ 1 SAAT
            {
              bcd[5] = 0;
              ++bcd[6];//SAAT BIRLER BASAMAĞI 1 ARTTIR
              if ((bcd[6] == 4) && (bcd[7] == 2)) // EĞER SAAT 24 OLDUYSA
              {
                bcd[6] = bcd[7] = 0;//SAATI SIFIRLA
              }
              else if (bcd[6] == 10)
              {
                bcd[6] = 0;
                ++bcd[7];
              }
            }
          }
        }
      }
    }
  }
}





ISR(TIMER1_COMPA_vect) {


   bcd_inc(bcd);

    PORTB = 0B00001011;//10
    PORTD = _7seg[bcd[0]];
    delay(4);//tarama ayar;




    PORTB = 0B00000111;//11
    PORTD = _7seg[bcd[1]];
    delay(5);//tarama ayar


  if (snb == 1) {
    PORTB = 0B00001101;//9
    PORTD = _7seg[bcd[2]];
    delay(3);//tarama ayar
    snb == 0;
  }

  if (sno == 1) {
    PORTB = 0B00001110;//8
    PORTD = _7seg[bcd[3]];
    delay(4);//tarama ayar
    sno == 0;
  }

}

Böyle birşey yaptım ama hala sönük yanma devam ediyor
sönük yanma tahmin ettiğim gibi segment bazında değil mi? yani 1 salise basamağında E ve F segmentlerinin sönük yanması şeklinde değil miydi? Videoda kamera etkilerinden olsa gerek pek anlaşılmıyordu.
 
sönük yanma tahmin ettiğim gibi segment bazında değil mi? yani 1 salise basamağında E ve F segmentlerinin sönük yanması şeklinde değil miydi? Videoda kamera etkilerinden olsa gerek pek anlaşılmıyordu.
Aynen dediğin gibi abi.
Saniye onlar basamağı olması gerektiği gibi yanıyor tam parlaklıkta.
Saniye birler basamağı nispeten daha iyi ama sönük olduğu anlaşılıyor.

Salise kısmı net şekilde anlaşılıyor parlaklık yarı yarıya az.

Sürekli yanan dijitlerde sönük ama geçiş yaptığında değişenb dijitlerde daha bariz
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,959
Mesajlar
118,814
Üyeler
2,825
Son üye
bekinci

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