7 SEGMENT DISPLAY ILE KRONOMETRE

Benim kafam akşamları çalışıyor herhalde bir hava alıp geleyim ben.
 
kesme saniyede 100 defa çağrılıyor ve sen her seferinde 8 tane Serial.print yapıyorsun.Bu da büyük intimalle seri portun transmit buffer'ini taşırıyor ve neticede hiçbir şey yazılmıyor. Ayrıca şimdi seri porta basit bir "Hello!" yazırmanın süresini ölçtüm, 55 μs. Sen 8 tane koymuşsun, oradan 440 μs ilave gecikme yarattın kesmede.

Böyle yapacağına algoritmayı loop içinde, araya da bol bol delayler ve Serial.Print ler koyarak çalışır hale getir, sonra çalışan kodu, bütün delay ve printleri kaldırıp kesmeye aktar.
 
kesme saniyede 100 defa çağrılıyor ve sen her seferinde 8 tane Serial.print yapıyorsun.Bu da büyük intimalle seri portun transmit buffer'ini taşırıyor ve neticede hiçbir şey yazılmıyor. Ayrıca şimdi seri porta basit bir "Hello!" yazırmanın süresini ölçtüm, 55 μs. Sen 8 tane koymuşsun, oradan 440 μs ilave gecikme yarattın kesmede.

Böyle yapacağına algoritmayı loop içinde, araya da bol bol delayler ve Serial.Print ler koyarak çalışır hale getir, sonra çalışan kodu, bütün delay ve printleri kaldırıp kesmeye aktar.
deneyelim

Çıktım biraz hava aldım belediye otobüslerini izledim geldim.
 
C++:
/*
  byte _10ms = 0;
  byte sn = 0;
  byte dk = 0;
  byte sa = 0;
*/


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
};

unsigned char bcd[] = {
  bcd[0] = 0,
  bcd[1] = 0,
  bcd[2] = 0,
  bcd[3] = 0,
  bcd[4] = 0,
  bcd[5] = 0,
  bcd[6] = 0,
  bcd[7] = 0
};

void bcd_inc()
{
  bcd[0]++;//her timer kesmesinde +1
  //------------MILISANIYE----------
  if (bcd[0] == 9) {
    bcd[1]++;
    bcd[0] = 0;
  }

  if (bcd[1] == 9) {
    bcd[2]++;
    bcd[1] = 0;
  }
  //------------MILISANIYE----------

  //------------SANIYE--------------
  if (bcd[2] > 9) {
    bcd[3]++;
    bcd[2] = 0;
  }

  if (bcd[3] == 6) {
    bcd[4]++;
    bcd[3] = 0;
  }
  //------------SANIYE--------------
}

ISR(TIMER1_COMPA_vect) {
  bcd_inc();
}

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();

  //Serial.begin(115200);
}

void loop() {

  PORTB = 0B00001011;
  PORTD = _7seg[bcd[0]];
  delay(4);

  PORTB = 0B00000111;
  PORTD = _7seg[bcd[1]];
  delay(4);

  PORTB = 0B00001101;
  PORTD = _7seg[bcd[2]];
  delay(4);

  PORTB = 0B00001110;
  PORTD = _7seg[bcd[3]];
  delay(4);


}
Bu halde 5 saniye önden gidiyor.
Telefondan video çekiyorum sonra video kırpma programından tam başlama anına kadar olan zamanı kırpıyorum ekranda son gözüken süre ile video süresi arasında 5 saniye fark var atmega328 5 saniye önde gidiyor. Toplamda delay sürem 16ms.

Serial.print yapamıyorum display sürerken 0-1 pinlerini kullanıyoruz
 
Neyse burada takılıp kalma diğer problemlere odaklan. Şuradan devam et:

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

static void bcd_inc(unsigned char* bcd)
{
  ++bcd[0];
  if (bcd[0] == 10)
  {
    bcd[0] = 0;
    ++bcd[1];
    if (bcd[1] == 10)
    {
      bcd[1] = 0;
      ++bcd[2];
      if (bcd[2] == 10)
      {
        bcd[2] = 0;
        ++bcd[3];
        if (bcd[3] == 6)
        {
          bcd[3] = 0;
          ++bcd[4];
          if (bcd[4] == 10)
          {
            bcd[4] = 0;
            ++bcd[5];
            if (bcd[5] == 6)
            {
              bcd[5] = 0;
              ++bcd[6];
              if ((bcd[6] == 4) && (bcd[7] == 2))
              {
                bcd[6] = bcd[7] = 0;
              }
              else if (bcd[6] == 10)
              {
                bcd[6] = 0;
                ++bcd[7];
              }
            }
          }
        }
      }
    }
  }
}

void setup()
{
  Serial.begin(115200);
}

void loop()
{
  while (1)
  {
    bcd_inc(bcd);

    char buffer[10];
    sprintf(buffer, "%u%u:%u%u:%u%u:%u%u\n",
      bcd[7], bcd[6], bcd[5], bcd[4], bcd[3], bcd[2], bcd[1], bcd[0]);

    Serial.print(buffer);
  }
}
 
Test amaçlı 23:57:00 den başlatmıştım. Şimdi sıfırdan başlattım.
 
Neyse burada takılıp kalma diğer problemlere odaklan. Şuradan devam et:

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

static void bcd_inc(unsigned char* bcd)
{
  ++bcd[0];
  if (bcd[0] == 10)
  {
    bcd[0] = 0;
    ++bcd[1];
    if (bcd[1] == 10)
    {
      bcd[1] = 0;
      ++bcd[2];
      if (bcd[2] == 10)
      {
        bcd[2] = 0;
        ++bcd[3];
        if (bcd[3] == 6)
        {
          bcd[3] = 0;
          ++bcd[4];
          if (bcd[4] == 10)
          {
            bcd[4] = 0;
            ++bcd[5];
            if (bcd[5] == 6)
            {
              bcd[5] = 0;
              ++bcd[6];
              if ((bcd[6] == 4) && (bcd[7] == 2))
              {
                bcd[6] = bcd[7] = 0;
              }
              else if (bcd[6] == 10)
              {
                bcd[6] = 0;
                ++bcd[7];
              }
            }
          }
        }
      }
    }
  }
}

void setup()
{
  Serial.begin(115200);
}

void loop()
{
  while (1)
  {
    bcd_inc(bcd);

    char buffer[10];
    sprintf(buffer, "%u%u:%u%u:%u%u:%u%u\n",
      bcd[7], bcd[6], bcd[5], bcd[4], bcd[3], bcd[2], bcd[1], bcd[0]);

    Serial.print(buffer);
  }
}
Benim bunu yazamamamın sebebi tecrübesizlik mi yeterince kafamı çalıştıramamam mı?
 
Benim bunu yazamamamın sebebi tecrübesizlik mi yeterince kafamı çalıştıramamam mı?

Yeterince C/C++ ile saç baş yolmamandan kaynaklanıyor. Ben 25 yıldır uğraşıyorum bu dil ile hala zaman zaman saç baş sakal yoluyorum :katil2:
 
Yeterince C/C++ ile saç baş yolmamandan kaynaklanıyor. Ben 25 yıldır uğraşıyorum bu dil ile hala zaman zaman saç baş sakal yoluyorum :katil2:
En başta okulda birazcık yanlış temel aldık ondan toparlanana kadar bir kısım yamuk kaldı.

Okulda haberleşmelerden başladık işlemci nedir bilmiyorken "ENDÜSTRİYEL ELEKTRONİKÇİ :katil2: " olduğumuz için hiç birşey bilmeden syntax bile bilmeden VFD'ye dur kalk komutu vermeye çalışıyorduk uart üstünden. 8-10 ders sonra blnik, buton okuma, karaşimşek falan yaptık doğru sırayla inşa edilmedi ben buna bağlıyorum çok kolay olanları yapamamamı.

23 yıl sonra senin seviyen'de olur muyum bilmiyorum:dusun1:
 
C/C++ en pis dillerden birisidir. Bundan daha pisi assembly ile program yazmak. 40 sene de uğraşırsan zaman zaman çok aptalca hatalar yaptığın oluyor. Önemli olan problem bulmak için belli bir sistematiği oturtmak, o da malesef zaman alıyor.
 
Bu program yüzeyden bakınca çok kolaymış gibi görünüyor. Ama hem bazı ileri seviye konseptleri öğreniyorsun (timer yapılandırıp kesme çağrılması, direkt port erişimi, 7 segmentlerin multipleks olarak sürülmesi) hem de her aşamada değişik tuzaklarla karşılaşıyorsun. Bir de işlemci kısıtlı ise, oradan da ilave zorluklar geliyor. Ama bu programı bir kere tam anlayıp bitirdikten sonra bir level atlamış olacaksın. Bundan sonraki proje için daha donanımlı olacaksın. O yüzden bu projeyi hakkıyla yapmaya çalış.
 
C/C++ en pis dillerden birisidir. Bundan daha pisi assembly ile program yazmak. 40 sene de uğraşırsan zaman zaman çok aptalca hatalar yaptığın oluyor. Önemli olan problem bulmak için belli bir sistematiği oturtmak, o da malesef zaman alıyor.
Ben herhangi bir programlama dili öğrenirsem önüme gelen platfrom'da önüme geleni yazabileceiğimi sanardım.

Her platfrom'da borusundan çıkan sesin kulağa hoş geldiği bir dil varmış.
Android'i ++'ile yazma denemesi yaptım ekrana gelecek yazıyı değiştirebildim sadece saatlerce uğraşmama rağmen yazının yerini yazının rengini değiştiremedim.

Sonra öğrendim ki mobil tarafta borusundan çıkan ses kulağa güzel gelen dil kotin'miş
 
Bu program yüzeyden bakınca çok kolaymış gibi görünüyor. Ama hem bazı ileri seviye konseptleri öğreniyorsun (timer yapılandırıp kesme çağrılması, direkt port erişimi, 7 segmentlerin multipleks olarak sürülmesi) hem de her aşamada değişik tuzaklarla karşılaşıyorsun. Bir de işlemci kısıtlı ise, oradan da ilave zorluklar geliyor. Ama bu programı bir kere tam anlayıp bitirdikten sonra bir level atlamış olacaksın. Bundan sonraki proje için daha donanımlı olacaksın. O yüzden bu projeyi hakkıyla yapmaya çalış.
Buraya kadar tamamen anlayarak geldim.

BCD'de biraz tökezledim şimdi verdiğin programda neler varsa hepsiyle oynayıp haaa bu bunu yapıyor diye anlaya anlaya gideceğim. Aşırı ihtiyacım olan bir şey değil ortaya çıkacak, veya dünyada eşi benzeri olmayan bir şey'de değil öğrenmek amacıyla yapıyorum.
 
Her dilin kendi güzelliği ve kendi ameleliği var. C# yada VB de veritabanı bağlamak işkence iken Python da 4 satır kod ile her işi yapmak kolay ama bu defa da Python da gui sıkıntı. Ama Python da zibikyon tane kütüphane var. Her işin kütüphanesi var. İki satır kodla tonla iş yapılıyor.

Micropython başka güzel bir olay. Aynı kod hem esp32, hem pi Pico, hem Sipeed Maix modüller gibi farklı modül yada çiplerde çalışıyor.
 
Her dilin kendi güzelliği ve kendi ameleliği var. C# yada VB de veritabanı bağlamak işkence iken Python da 4 satır kod ile her işi yapmak kolay ama bu defa da Python da gui sıkıntı. Ama Python da zibikyon tane kütüphane var. Her işin kütüphanesi var. İki satır kodla tonla iş yapılıyor.

Micropython başka güzel bir olay. Aynı kod hem esp32, hem pi Pico, hem Sipeed Maix modüller gibi farklı modül yada çiplerde çalışıyor.
Bende kütüphane alerjisi var abi.

Kütüphane kullanınca habire kütüphane dosylarına bakıyorum neler olmuş neler bitmiş diye.

Eğer kendim yazınca yüzlerce satır + karşamaşa oluşmayacaksa kendim yazarım.
Kütüphane devamlı 2. plandır benim için alışınca bağımlılık yapıyor bırakılmıyor.

Bu konuda yaptığımızın dahi kütüphanesi var SevSeg adında onu kullansaydım benim yazacaklarım 10'da 1 kısalacaktı ama sadece isim.print(değişken); yazmış olacaktım ve birkaç transistör bağlantısı.
 
@taydin abi seninkinde süre kaçırma yok 35 yazıyorsa gerçekten 35 saniye geçmiş oluyor.

C++:
++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];

Buda 50 kere baktıktan sonra çıkardığım yorumlar umarım artık anlamışımdır:mad:
 
Bende kütüphane alerjisi var abi.

Kütüphane kullanınca habire kütüphane dosylarına bakıyorum neler olmuş neler bitmiş diye.

Eğer kendim yazınca yüzlerce satır + karşamaşa oluşmayacaksa kendim yazarım.
Kütüphane devamlı 2. plandır benim için alışınca bağımlılık yapıyor bırakılmıyor.

Bu konuda yaptığımızın dahi kütüphanesi var SevSeg adında onu kullansaydım benim yazacaklarım 10'da 1 kısalacaktı ama sadece isim.print(değişken); yazmış olacaktım ve birkaç transistör bağlantısı.
Port erişim ve belli başlı işler için doğrudan kodlama yapmak en güzeli ama opencv gibi, matplotlib, pandas, numpy, urllib gibi girdisi çıktısı bol olan işler yapıyorsan paşa paşa öğrenmek gerekiyor. Excel dosyasını modifiye edip yüzlerce veriyi iki satırla yazmak güzel oluyor. Baştan yazmak ise imkansız. Bu yüzden işin durumuna göre kendi library i oluştur yada hazır kullan. Tercihi iyi yapmak lazım.
 
@taydin abi seninkinde süre kaçırma yok 35 yazıyorsa gerçekten 35 saniye geçmiş oluyor.

C++:
++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];

Buda 50 kere baktıktan sonra çıkardığım yorumlar umarım artık anlamışımdır:mad:

Daha önce de anlamıştın sen bunu ama karşılaştırmalarda hata yapmıştın o yüzden doğru çalışmadı ve zaman hatası oluştu.
 
Daha önce de anlamıştın sen bunu ama karşılaştırmalarda hata yapmıştın o yüzden doğru çalışmadı ve zaman hatası oluştu.
4 dijit bağlı aktif çalışıyor az önce dijitlere yazdırıp loop içinde test'de yaptım.
Öncelikli amacım kesme içinde dijitleri aynı şekilde yazdırmak
C++:
void loop()
{
  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

}
 
Kesme içine aldım loop'daki gibi sorunsuz çalışıyor.
Şimdi sönük yanmalar ve taramadaki delaylardan kurtulacağım.
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()
{}
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,961
Mesajlar
118,864
Üyeler
2,826
Son üye
CortexPhoton

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