7 SEGMENT DISPLAY ILE KRONOMETRE

ISR'yi setuptan önce yazmalı, loop boş olsa da eklemeli, bir de ISR içinde arduino delay kodu çalışmıyor, bunun dışında bunları düzeltip deniyorum şimdi.
 
Ben de hemen hemen aynı kodu yazıp deniyorum olmuyordu, yarım saattir uğraşıyorum, kartta sıkıntı olduğunu düşündüm. Şimdi çalışıyor.

timer1 taşması 65535 tik 4,19424 saniye demiştik, 1 saniye için 65535/4,19424 =15625 OCR1A ile 1 saniyelik kesmeler denedim.
CTC 1 saniye:
#include <avr/io.h>
#include <avr/interrupt.h>

volatile byte ocr,ovf;

ISR(TIMER1_COMPA_vect)
{
  ocr++;
  Serial.println("kesme");
 
}

ISR(TIMER1_OVF_vect)
{
  ovf++;
  Serial.println("OVF");
}


void setup() {
 
  Serial.begin(115200);
  Serial.println("BASLA");

  TCCR1A=0;
  TCCR1B=0;
  TCCR1B|=1<<WGM12;
  TCCR1B|=  0b101;
  TIMSK1|= 1<< OCIE1A | 1<< TOIE1;
  OCR1A=15625;
  sei();
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
}

17921 eklentisine bak

edit: imla
OCR1A değerini 1562 yaparsam saniyenin 10'da 1ini almış olurum değil mi?
 
OCR1A değerini 1562 yaparsam saniyenin 10'da 1ini almış olurum değil mi?
Evet ama yarım tik sapma olur 3000'de 1 hata düşük ama gerek yok prescale 1 yapıp OCR1A yı 1600 yapmak bu yarım tik hatayı önler

(1/16.000.00)*1600= 0,0001
 
C++:
#include <avr/io.h>
#include <avr/interrupt.h>

volatile byte ocr,ovf;

ISR(TIMER1_COMPA_vect)
{
  ocr++;
  Serial.println("kesme");
 
}

ISR(TIMER1_OVF_vect)
{
  ovf++;
  Serial.println("OVF");
}


void setup() {
 
  Serial.begin(115200);
  Serial.println("BASLA");

  TCCR1A=0;
  TCCR1B=0;
  TCCR1B|=1<<WGM12;
  TCCR1B|=  0b101;
  TIMSK1|= 1<< OCIE1A | 1<< TOIE1;
 // OCR1A=15625;------------
    OCR1A=1562;
      
 
  sei();
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
}

Bu şekilde sabit 93ms alıyorum
 
C++:
#include <avr/io.h>
#include <avr/interrupt.h>

volatile byte ocr,ovf;

ISR(TIMER1_COMPA_vect)
{
  ocr++;
  Serial.println("kesme");
 
}

ISR(TIMER1_OVF_vect)
{
  ovf++;
  Serial.println("OVF");
}


void setup() {
 
  Serial.begin(115200);
  Serial.println("BASLA");

  TCCR1A=0;
  TCCR1B=0;
  TCCR1B|=1<<WGM12;
  TCCR1B|=  0b101;
  TIMSK1|= 1<< OCIE1A | 1<< TOIE1;
 // OCR1A=15625;------------
    OCR1A=1562;
     
 
  sei();
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
}

Bu şekilde sabit 93ms alıyorum

Osiloskopla mı ölçüyorsun, Öyleyse ince ayar yapabilirsin.

Evet ama yarım tik sapma olur 3000'de 1 hata düşük ama gerek yok prescale 1 yapıp OCR1A yı 1600 yapmak bu yarım tik hatayı önler

(1/16.000.00)*1600= 0,0001
Ne alaka, aklıma perde inmiş.

256 prescale ile (1/16.000.000)*256*625=0,01 yani OCR1A=625 ile 10 ms haliyle 6250 ile 100 ms olmalı. tabii kristal toleransı limitleyici faktör. Ölçme imkanı varsa deneyerek bulmalı.

Pin toggle ile "hesapta" 100ms ile led toggle

100ms led toggle:
#define led 13

ISR(TIMER1_COMPA_vect) {
 
 digitalWrite(led,!digitalRead(led));
 
 
}
void setup() {
  Serial.begin(115200);
  pinMode(led, OUTPUT);

  noInterrupts();

  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;
  OCR1A = 6250;

  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS12) ; // prscl 256
  TIMSK1 |= (1 << OCIE1A);
  interrupts();
}
void loop(){}
 
OCR1A'YI 630 yapınca.
asıjad.png

Alıyorum bu aralığı
 
Madem osiloskop var prescale 8 ile daha hassas ve yakın ayarlayabilirsin :) :cheeky1:.
(1/16.000.000)*8*20.000= 0,01sn OCR1A 20.000 için. 1/20.000'lik adımlarla referans frekansa yaklaşır.
 
Madem osiloskop var prescale 8 ile daha hassas ve yakın ayarlayabilirsin :) :cheeky1:.
(1/16.000.000)*8*20.000= 0,01sn OCR1A 20.000 için. 1/20.000'lik adımlarla referans frekansa yaklaşır.
CS11 presacaler-8 yapıyormuş CS11 olarak set ettim 20102 ayrladığımda bence kabul edilebilir bir sonuç alıyoruz.
OS.png
 
REF.png

Artık projeyi oluşturmaya başlayalım.
Bu mantıkta 8 basamağı oluşturacağım.
 
Ufak bir beyin durulmasından sonra çözdüm sanırım.

Şimdi benim ayarladığım timer kesme zamanı 10mS(9.998) ama ben bu kesmeye her girdiğimde değişkeni +1 yapıyorum.
Yani benim değişken 10 olduğuna 100mS zaman geçmiş oluyor.
Bunu nasıl çözerim diye yarım saat düşündükten sonra artışı 10a bölersem bu farkı kapatmış olurum diye düşündüm doğru düşünüyorum sanırım.
 
Şimdi oluşturduğumuz 10mS/10 referansımız ile diğer zamanları oluşturacağız asıl kafamı karıştıran kısım burası.

Biraz düşününce 1mS referansımı 100000(yüz bin)'e bölüp en küçük basamağı ortaya çıkarıp bu basamak 60 oldukça sıfırlayıp kaydırarak arttıracağım dakikaya kadar aklıma gelen en iyi yöntem bu oldu.
 
Şimdi oluşturduğumuz 10mS/10 referansımız ile diğer zamanları oluşturacağız asıl kafamı karıştıran kısım burası.

Biraz düşününce 1mS referansımı 100000(yüz bin)'e bölüp en küçük basamağı ortaya çıkarıp bu basamak 60 oldukça sıfırlayıp kaydırarak arttıracağım dakikaya kadar aklıma gelen en iyi yöntem bu oldu.
referansın 1 ms ise daha düşük zaman dilimlerini nasıl ölçeceksin, 1ms altında kalan basamaklar asla değişmeden göstergede 0 olarak kalmazlar mı?
 
deniyorum abi şuan
Yukarıda verdiğim tabloya göre bölüm yaptım ve en küçük basamağı çıkarmak için yüz bine böldüm çok fazla tekrarla aynı sayıyıyo basıyor ama 0da kalmıyor yürüyor çok hızlı şekilde seri portu açar açmaz neredeseyse aşşağı yukarı oynatan hareket çubuğu mouse ile tutulmayacak kadar küçülüyor.
 
oluşturduğum 1mS'lik referansı yüz bin'e böldüğümde her sayıyı 295 kez yazıyor seri porta.
 
Bunu @taydin abiye sorarım.
Abi ben galiba çok yanlış başladım projeye.

Ben her dijite neden 1 basamak verdiğimi bilmiyorum normalde 2 dijit 1 basamak olacak:kizgin3: değil mi?

fffofofof.png

Anlamlı olması için bu şekilde olması gerekiyor.
Her dijite 1 basamak verirsem o zaman o basamağın 9 değerinden yukarısını göremem.

Ben biraz gözü kapalı başladığım için böyle oldu.
 
Bunu @taydin abiye sorarım.
Abi ben galiba çok yanlış başladım projeye.

Ben her dijite neden 1 basamak verdiğimi bilmiyorum normalde 2 dijit 1 basamak olacak:kizgin3: değil mi?

17926 eklentisine bak
Anlamlı olması için bu şekilde olması gerekiyor.
Her dijite 1 basamak verirsem o zaman o basamağın 9 değerinden yukarısını göremem.

Ben biraz gözü kapalı başladığım için böyle oldu.
Mola vermek lazım, 10 dakkada yapılacak işi 1 saatte yarım yamalak yapıyor insan beyni sulanınca. Bu arada 100.000'e bölümlerin 0'dan farklı olması precision problemi olabilir.

birkaç işlem yaptırdım, seri monitördeki sonuçlar.

Kod:
22:30:36.074 -> 124.00 / 100.000 = 0.0012300000
22:30:37.108 -> 125.00 / 100.000 = 0.0012400000
22:30:38.098 -> 126.00 / 100.000 = 0.0012499998
22:30:39.088 -> 127.00 / 100.000 = 0.0012600002
22:30:40.081 -> 128.00 / 100.000 = 0.0012699999
22:30:41.068 -> 129.00 / 100.000 = 0.0012799999
22:30:42.104 -> 130.00 / 100.000 = 0.0012900000
22:30:43.096 -> 131.00 / 100.000 = 0.0012999999
 
Mola vermek lazım, 10 dakkada yapılacak işi 1 saatte yarım yamalak yapıyor insan beyni sulanınca. Bu arada 100.000'e bölümlerin 0'dan farklı olması precision problemi olabilir.

birkaç işlem yaptırdım, seri monitördeki sonuçlar.

Kod:
22:30:36.074 -> 124.00 / 100.000 = 0.0012300000
22:30:37.108 -> 125.00 / 100.000 = 0.0012400000
22:30:38.098 -> 126.00 / 100.000 = 0.0012499998
22:30:39.088 -> 127.00 / 100.000 = 0.0012600002
22:30:40.081 -> 128.00 / 100.000 = 0.0012699999
22:30:41.068 -> 129.00 / 100.000 = 0.0012799999
22:30:42.104 -> 130.00 / 100.000 = 0.0012900000
22:30:43.096 -> 131.00 / 100.000 = 0.0012999999
Benim aklım bulandı hiçte gelmiyor aklıma nano saniye ve altını görüntülemek kronometreye bakan insan için hızla akıp giden sayılardan başka birşey ifade edemeyecek tutturmuşum dikine gidiyorum.

Birazcık FH5 oynadıktan sonra baştan sonra daha düzgün daha sakin düşünüp tekrar oluşturacağım projeyi.

Sana da çok teşekkür ederim abi benim durmuş kafama bile soktun timer kesmesini.
 
10 ms aralıklarla kesmeyi yapılandırdıysan, her kesme geldiğinde 32 bitlik bir değişkeni arttıracaksın, o kadar. Sonra da bu değişkeni 7 segmentlere yazdıracaksın.

Eğer sorun 32 bit değişkenin basamaklarını ayrıştırmak ise, o kolay. 10 ile bölümünde kalana bakacaksın. Linux'ta basit bir programla göstereyim:

C++:
#include <stdio.h>

unsigned int sayi = 273645837;

int main()
{
    unsigned int hane = 0;
    while (sayi != 0)
    {
        printf("hane %u = %u\n", hane, sayi % 10);
        sayi /= 10;
        ++hane;
    }
}

[ta@bonsai ~]$ g++ -Wall a.cpp
[ta@bonsai ~]$ ./a.out
hane 0= 7
hane 1= 3
hane 2= 8
hane 3= 5
hane 4= 4
hane 5= 6
hane 6= 3
hane 7= 7
hane 8= 2
[ta@bonsai ~]$
 
pr.png

Baştan bir düzen oluşturdum bunu daha sakin daha düşünerek yazdım.
Artık her 1 basamağı 2 segman yönetecek.

10mS'lik referans oluşturmayı başardım @semih_s abi çok yardımcı oldu :)
Bu referans'ı bölüp 1mS'de elde ediyorum.

Ben ilk okuduğumdan beri her dijiti 1 basamak olarak düşündüm niyeyse o yüzden biraz saçmaladım şimdiye kadar.
Şimdi kafam biraz yerine geldi.
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,986
Mesajlar
119,341
Ü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