7 SEGMENT DISPLAY ILE KRONOMETRE

süre:
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() {
Serial.begin(115200);
  DDRD = B11111111; //büTÜN D PORTI ÇIKIŞ
  DDRB = DDRB | B00001100;
  a = 25;
  pinMode(12,OUTPUT);
    TCCR1A=0;
    TCCR1B=0;
    TCCR1B|=0b1;//prescaler1 ile 16 bit timer mcu cycle sayacı için
}

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

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


  PORTB = 0B00001000;
  PORTD = _7seg[birler];
  t0=TCNT1;
    Serial.println(t0); // seriala  timer1'i yazdır. mcunun tik sayısını verir bazen araya interruptlar karışıp değişken sonuç çıkabilir
    delay(4);//tarama ayar
  //digitalWrite(12,LOW);//süre test
}
Timer 1 ile arduinoya ölçtürülebilir işlem süresi.

edit: setupa "Serial.begin(115200);" eklendi
 
süre:
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);
    TCCR1A=0;
    TCCR1B=0;
    TCCR1B|=0b1;//prescaler1 ile 16 bit timer mcu cycle sayacı için
}

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

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


  PORTB = 0B00001000;
  PORTD = _7seg[birler];
  t0=TCNT1;
    Serial.println(t0); // seriala  timer1'i yazdır. mcunun tik sayısını verir bazen araya interruptlar karışıp değişken sonuç çıkabilir
    delay(4);//tarama ayar
  //digitalWrite(12,LOW);//süre test
}
Timer 1 ile arduinoya ölçtürülebilir işlem süresi.
deneyeyim abi

edit:238 döndürüyor 4 kere resetledim hep 238 döndü
 
Şuan tek sorunum sızdırma.
Tek 7 segmanı sürerken hiç sızdırma olmuyordu çünkü tarama yapmıyorduk.
Kafamdan 4 milisaniye salladım süreyyi uzattıkça artık göz kırpmaya başlıyor kısalttıkça bu az yanan segmanlar sönmüyor seçici transistörlerim 2n3906 1k seri direnç 10k pullup şekilde kullanıyorum segmentler collectore bağlı emiterden 330R direnç ile geliyor +
 

Ekler

  • WhatsApp Image 2022-06-24 at 21.20.47.jpeg
    WhatsApp Image 2022-06-24 at 21.20.47.jpeg
    183.8 KB · Görüntüleme: 74
Daha başka sorunlar da çıkacak. Kesmenin içine almadın daha kodu.
 
Daha başka sorunlar da çıkacak. Kesmenin içine almadın daha kodu.
Sorunları çöze çöze gideyim diyorum abi birden hepsi gelince kafam karışıyor.

Şuan istediğim herşeyi yaptım.

Doğru bir kesme oluşturdum.
Doğru zaman hesabı yaptım.
2 Basamak display'e int tipinde değişken yazdırdım.

Şimdi mikrosaniye seviyesinde bekleme ile bu sızdırmayı çözmeyi deneyeceğim.
 
Bu sorunu'da kabataslak çözdük süreyle aşşağı yukarı oynadım 8mS ayalrayınca kaçırma gözü rahatsız etmeyecek kadar az şimdi birleştirme zamanı.
 
Mod işlemi var ölçüm aralığının içinde


Bir de sinyal pini "digitalWrite" ile değiştiriliyor. sürenini uzun çıkması bundan olsa gerek.

Hakkaten modülüs işlemi uzun sürüyor bu işlemcide. Neden bu kadar uzun sürer anlamadım.

Ama ölçümü yaparken de çok dikkat etmek gerekiyor. Arduino IDE de optimizasyonlar normalde açık olduğu için doğru bir şekilde yapmazsan testi, modülüs işlemini hiç yapmıyor ve sanki çok hızlı çalışıyormuş gibi oluyor. Derleyicide optimizasyonları kapatmanın bir yolu vardır bu Arduino IDE'de ama ben ona bakmadım. Kodu öyle bir düzenledim ki derleyicinin optimizasyon yapma imkanı kalmadı.

Bir diğer sorun da, boş bir program bile olsa Arduino'nun kendi kesmesi var arada bir devreye giren. O yüzden testi yaparken kesmeleri de kapattım.

Bu şekilde ölçüm yapınca modülüs fonksiyonunun 15.75 μs sürdüğünü görüyorum.

C++:
#define THEPIN 6

static int a = *(int*)0x1200;
static volatile int b = 0;

void setup()
{
  pinMode(THEPIN, OUTPUT);
}

void loop()
{
  noInterrupts();

  while (1)
  {
    PORTD = 0x40;

    b = a % 10;

    PORTD = 0x00;
  }
 
Hakkaten modülüs işlemi uzun sürüyor bu işlemcide. Neden bu kadar uzun sürer anlamadım.

Ama ölçümü yaparken de çok dikkat etmek gerekiyor. Arduino IDE de optimizasyonlar normalde açık olduğu için doğru bir şekilde yapmazsan testi, modülüs işlemini hiç yapmıyor ve sanki çok hızlı çalışıyormuş gibi oluyor. Derleyicide optimizasyonları kapatmanın bir yolu vardır bu Arduino IDE'de ama ben ona bakmadım. Kodu öyle bir düzenledim ki derleyicinin optimizasyon yapma imkanı kalmadı.

Bir diğer sorun da, boş bir program bile olsa Arduino'nun kendi kesmesi var arada bir devreye giren. O yüzden testi yaparken kesmeleri de kapattım.

Bu şekilde ölçüm yapınca modülüs fonksiyonunun 15.75 μs sürdüğünü görüyorum.

C++:
#define THEPIN 6

static int a = *(int*)0x1200;
static volatile int b = 0;

void setup()
{
  pinMode(THEPIN, OUTPUT);
}

void loop()
{
  noInterrupts();

  while (1)
  {
    PORTD = 0x40;

    b = a % 10;

    PORTD = 0x00;
  }
Ben nası 560nS gördüm abi.
Kalbirasyon sonrası kendi referansına ayarlıyor benim skop.
Ben kendşm ayar yaptım becerememişim herlade.
 
C++:
byte _10ms = 0;
byte sn = 0;
byte dk = 0;
byte sa = 0;


ISR(TIMER1_COMPA_vect) {

  _10ms++;

  if (_10ms == 100) {
    sn++;
    _10ms = 0;
  }

  if (sn == 60) {
    dk++;
    sn = 0;
  }

  if (dk == 60) {
    sa++;
    dk = 0;
  }

  if(sa == 99){
    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
};


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


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

  a = 76;
}

void loop() {

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

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


  PORTB = 0B00001000;
  PORTD = _7seg[birler];
  delay(8);//tarama ayar


}

Tam istediğim gibi çalıştı bu.
Doğru zaman çıktığını display'deki son gözüken değer ile video uzunluğuna bakarak anlayabiliriz.
Buraya kadar başarılı geldim.
Biraz dikkatli bakınca sızdırmalar net şekilde gözüküyor

Ruh hastası telefonum 18 saniye videoyu 100mb boyutunda çıkardığı için 480 pixel'e render almak zorunda kaldım kalite düştü o yüzden
 

Ekler

  • 7seggg.mp4
    6.3 MB
Sorun aslında modülüs de değil. Bölme. Şimdi 10'a bölerek denedim tam olarak aynı süre tuttu. Toplama, çıkarma ve çarpma için assembly komutları var Atmega328 in, ama bölme için yok, o yüzden bunu bir alt rutinde hallediyor. Ama toplama çıkarma birkaç saat döngüsünde tamamlanırken bölmenin en az bin kat daha uzun sürmesi gerçekten çok tuhaf ...
 
Sorunları çöze çöze gideyim diyorum abi birden hepsi gelince kafam karışıyor.

Şuan istediğim herşeyi yaptım.

Doğru bir kesme oluşturdum.
Doğru zaman hesabı yaptım.
2 Basamak display'e int tipinde değişken yazdırdım.

Şimdi mikrosaniye seviyesinde bekleme ile bu sızdırmayı çözmeyi deneyeceğim.

Hakkaten modülüs işlemi uzun sürüyor bu işlemcide. Neden bu kadar uzun sürer anlamadım.

Ama ölçümü yaparken de çok dikkat etmek gerekiyor. Arduino IDE de optimizasyonlar normalde açık olduğu için doğru bir şekilde yapmazsan testi, modülüs işlemini hiç yapmıyor ve sanki çok hızlı çalışıyormuş gibi oluyor. Derleyicide optimizasyonları kapatmanın bir yolu vardır bu Arduino IDE'de ama ben ona bakmadım. Kodu öyle bir düzenledim ki derleyicinin optimizasyon yapma imkanı kalmadı.

Bir diğer sorun da, boş bir program bile olsa Arduino'nun kendi kesmesi var arada bir devreye giren. O yüzden testi yaparken kesmeleri de kapattım.

Bu şekilde ölçüm yapınca modülüs fonksiyonunun 15.75 μs sürdüğünü görüyorum.

C++:
#define THEPIN 6

static int a = *(int*)0x1200;
static volatile int b = 0;

void setup()
{
  pinMode(THEPIN, OUTPUT);
}

void loop()
{
  noInterrupts();

  while (1)
  {
    PORTD = 0x40;

    b = a % 10;

    PORTD = 0x00;
  }
238 tik çıkan sonuç 14,875 microsaniye, bunun içinde başka işlemler de var, mod işlemi kodda kullanılan bir değişkeni etkilediğinden bu durumda optimizasyon en azından "modu" bypass geçmiyordur.. Demek optimizasyonlar sadece flash ve ram bellek kullanımında değil işlem süresinde de etkili oluyor.
 
Bunu çözemeyeceğim sanırım bilgisayardan açtığım sayıcı'da mS'nin 1'ler basamağını anlaşılmayacak kadar hızlı çeviriyor
 

Ekler

  • 7SEGMSSS.mp4
    1.9 MB
238 tik çıkan sonuç 14,875 microsaniye, bunun içinde başka işlemler de var, mod işlemi kodda kullanılan bir değişkeni etkilediğinden bu durumda optimizasyon en azından "modu" bypass geçmiyordur.. Demek optimizasyonlar sadece flash ve ram bellek kullanımında değil işlem süresinde de etkili oluyor.

Eğer değişkene sadece atama yapılıyor ve sonrasında değişken kullanılmıyorsa optimizasyon ile işlem komple atılıyor. Hatta değişkeni kullanan gereksiz bir if koysan bile gene optimize edip atıyor. Ben iki şey yaptım optimizasyonu engellemek için:

1) Rastgele bir hafıza bölgesinden okuma yaptım a değişkenine. Bunu yapmayıp sabit sayı atarsan, o zaman derleyici o sabit sayının modülüsünü hesaplayıp sonucu doğrudan yazıyor. Mod fonksiyonuna girmiyor hiç

2) b değişkenini volatile olarak işaretledim. Böylece derleyici mecbur atama yapmak zorunda kaldı ve bunun için de modülüs fonksiyonunu çağırması gerekti.
 
Bunu çözemeyeceğim sanırım bilgisayardan açtığım sayıcı'da mS'nin 1'ler basamağını anlaşılmayacak kadar hızlı çeviriyor

1 saliseyi net olarak görmeyi bekleyemezsin zaten. Bir sorun yok ortada.
 
1 saliseyi net olarak görmeyi bekleyemezsin zaten. Bir sorun yok ortada.
Bu gün yeterince ilerleme kaydettim.
Yarın 2 dijit daha ekleyip salise ve saniye görüntüleyeceğim ama devamını deney bordunda kuramam.
Delikli plakete geçiririm 8 dijiti.

Birde hiç yapmadım bütün dijitler taramasız ON konumdayken ampermetre bağlayayım besleme seçerken işime yarar.
 
Data yazdırmada bir sorunum kalmadı.
toplam 4 dijit sürdüğümde ciddi tarama sorunlarım ortaya çıktı fazlasıyla göz kırpma var.
 

Forum istatistikleri

Konular
6,985
Mesajlar
119,313
Ü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