7 SEGMENT DISPLAY ILE KRONOMETRE

Kod:
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
 
Kod:
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: 83
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.

Kod:
#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.

Kod:
#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.
 
Kod:
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.

Kod:
#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
7,293
Mesajlar
123,329
Üyeler
2,946
Son üye
yigitmcr01

Son kaynaklar

Son profil mesajları

Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
Freemont2.0 posta Freemont2.0 wrote on posta's profile.
Merhabalar :)
az bilgili çok meraklı
Prooffy semih_s Prooffy wrote on semih_s's profile.
Merhaba, sizden DSO2C10 hakkında bilgi rica ettim. Yanıtlarsanız sevinirim...
Unal taydin Unal wrote on taydin's profile.
Timur Bey, Arduino kontrollü bir akü şarj cihazı yapmaya çalışıyorum. Aklımdaki fikri basit bir çizim olarak konu açmıştım. Özellikle sizin fikirlerinizi çok önemsiyorum.
Back
Top