7 SEGMENT DISPLAY ILE KRONOMETRE

Şimdi ihtiyacım olan başka bir array'de oluşturduğum sayıları yani(0 için 1-0 düzeni 1 için 1-0 düzeni) bunları pinout'a atamak.
Bunu'da yaparsam daha sade bir ilerleme kaydetmiş olurum
 
17985 eklentisine bak
Hızlı seçim yaparak paralel segmanlarw farklı sayılar çıkarttım.

C++:
digitalWrite(seg0, HIGH);
  digitalWrite(seg1, LOW);

  segs(3);
  clear();
 
  digitalWrite(seg0, LOW);
  digitalWrite(seg1, HIGH);

  segs(5);
  clear();

Şimdi bu kodun en başında bir GPIO set et, sonunda da clear et. Sonra da osiloskop ile bak, bakalım ne kadar zaman alıyor. Bu şekilde bir sürü digitalWrite ile yapınca çok ciddi süre tutacaktır.
 
Hmm gene fazla tutmamış. 8 digit için toplam süre 550 μs gibi olacak. Doğrudan 8 bit PORT kullansaydın bunun 100 de biri kadar bir sürede hallolabilirdi bu iş. Şu anda işlemci gücünün %5 kadarı ekran tazelemeye gidecek.
 
Bir de şu var: Diyelim kesmede diğer yapılan işlemlerle beraber toplam 700 μs süre harcanıyor. Bunun anlamı, kesme dışındaki ana programda bütün zamanlamalı işlemlerde 700 μs lik belirsizlik olacak demektir. Mesela delay(3) dedin, ama gerçekte oluşan delay 3 ms ile 3.7 ms arasında olacaktır. Bir kesmenin olabildiğince kısa sürmesi istenir ki ana programa etkisi minimal olsun.
 
Bir de şu var: Diyelim kesmede diğer yapılan işlemlerle beraber toplam 700 μs süre harcanıyor. Bunun anlamı, kesme dışındaki ana programda bütün zamanlamalı işlemlerde 700 μs lik belirsizlik olacak demektir. Mesela delay(3) dedin, ama gerçekte oluşan delay 3 ms ile 3.7 ms arasında olacaktır. Bir kesmenin olabildiğince kısa sürmesi istenir ki ana programa etkisi minimal olsun.
Onu'da araştırayım nasıl yapıyoruz.
porta yazmayı yani
 
Şöyle tarif edeyim. 8 tane segment var, her bir segmenti mesela PORTD nin pinlerine bağlıyorsun. Böylece PORTD ye veri yazınca bütün segmentlere atama yapmış oluyorsun. Benim daha önce yaptığım karedalga üretme denemesinde her bir digitalwrite 4 μs sürüyordu. 8 tane digitalwrite 32 μs yapar. Ama PORTD ye yazma 6.25 ns sürüyor! Yani aynı işlemi 5000 kat daha hızlı yapıyorsun :)
 
Şöyle tarif edeyim. 8 tane segment var, her bir segmenti mesela PORTD nin pinlerine bağlıyorsun. Böylece PORTD ye veri yazınca bütün segmentlere atama yapmış oluyorsun. Benim daha önce yaptığım karedalga üretme denemesinde her bir digitalwrite 4 μs sürüyordu. 8 tane digitalwrite 32 μs yapar. Ama PORTD ye yazma 6.25 ns sürüyor! Yani aynı işlemi 5000 kat daha hızlı yapıyorsun :)
Bakalım nasıl yapıyoruz.
0-7 arası pinler PORTD
8-13 arası pinler PORTB
Diğer analog pinler'de PORTC

bize en uygun olanı PORTD
8 adet I/O barındırıyor tam ihtiyacımız olan.

Array olması veya tek yazılması bir fark yaratır mı program çalışmasında?
Yoksa sadece bize görsel sadelik mi sağlıyor.
 
Yapı basitçe şöyle. Bir array var ve her sayı için port verilerinin ne olması gerektiğini tutuyor. En alt bit (LSB) de noktayı temsil ediyor. Bir de array sonunda iki tane özel veri var. Birisi "blank" yani tüm segmentler sönük, diğeri "test" yani tüm segmentler yanık.

C++:
unsigned char _7seg[] =
{
    0b10000000, // 0
    0b01001000, // 1
    0b10101000, // 2
    0b00010010, // 3
    0b10000000, // 4
    0b01001000, // 5
    0b10101000, // 6
    0b00010010, // 7
    0b10000000, // 8
    0b01001000, // 9
    0b00000000, // ALL OFF
    0b11111111, // ALL ON
};

void loop()
{
    // 5 yazdir
    PORTD = _7seg[5];
  
    // 3 yazdir, nokta da olsun
    PORTD = _7seg[3] | 1;

    // tum segmentler OFF
    PORTD = _7seg[10];
}
 
Yalnız benim kullandığım bütün segment dataları atmasyon, haylazlık yapıp aynen kullanma, olması gereken değerleri yaz ;)
 
Yalnız benim kullandığım bütün segment dataları atmasyon, haylazlık yapıp aynen kullanma, olması gereken değerleri yaz ;)
Doğru olsada invert etmem gerekirdi abi deney yaptığım displaylerim ortak anot.

Ben kopya çekmem gözüm kayar arada o kadar öğrenmek amacıyla yapıyorum bu projeyi
 
C++:
unsigned char _7seg[] =
{   //nGFEDCBA
    0b11000000,//sıfır/
    0b11111001,//bir/
    0b10100100,//iki/
    0b10110000,//üç/
    0b10011001,//dört/
    //nGFEDCBA
    0b10010010,//beş/
    0b10000010,//altı/
    0b11111000,//yedi
    0b10000000,//sekiz
    0b10010000,//dokuz
    0b00000000,//lamba TEST
    0b11111111,//lamba OF
};

int a = 0;

void setup() {
 
  DDRB = B11111111; //BÜTÜN D PORTU ÇIKIŞ

  pinMode(11, INPUT_PULLUP);
  pinMode(11, OUTPUT);
  digitalWrite(11, HIGH);
}

void loop() {
  digitalWrite(11, LOW);
  PORTD = _7seg[a];
  delay(600);
  if(a < 10){
    a++;
  }
  if(a == 10){
    PORTD = _7seg[11];
    a = 0;
  }
}
216 satırdan 43 satıra düştü bu şekilde DDRB'yi biliyordum diye ekledim
 
Son düzenleme:
Süre olarak da ölç farkı görelim :)
 
Süre olarak da ölç farkı görelim :)
18.520uS
Ama program gelişti :cool:

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 | B00001100;
  a = 25;
  pinMode(12,OUTPUT);
}

void loop() {
  digitalWrite(12,HIGH);//süre test
  int onlar = a / 10;
  int birler = a % 10;

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


  PORTB = 0B00001000;
  PORTD = _7seg[birler];
  //delay(4);//tarama ayar
  digitalWrite(12,LOW);//süre test
}

Bu şekilde delaysız yapınca anlamsız soluk şekilde çıkıyorlar
4ms delay eklenmiş halini ekte veriyorum.
 

Ekler

  • WhatsApp Image 2022-06-24 at 20.44.16.jpeg
    WhatsApp Image 2022-06-24 at 20.44.16.jpeg
    202.1 KB · Görüntüleme: 75
Ölçüm doğru değil gibime geliyor. Çok daha kısa sürüyor olması lazım. 1 mikrosaniyenin altında olmalı.
 
Neyse boşvar artık kesmenin içine alıp o şekilde deneyebilirsin.
 
Neyse boşvar artık kesmenin içine alıp o şekilde deneyebilirsin.
560nS ölçüyorum ben az önce kalibrasyonda bıraktığım için ayar yapmadan bakmıştım ondan öyle çıktı.
 

Ekler

  • WhatsApp Image 2022-06-24 at 21.08.22.jpeg
    WhatsApp Image 2022-06-24 at 21.08.22.jpeg
    402.7 KB · Görüntüleme: 66

Çevrimiçi personel

Forum istatistikleri

Konular
6,986
Mesajlar
119,328
Üyeler
2,835
Son üye
alpermete

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