OCR1A değerini 1562 yaparsam saniyenin 10'da 1ini almış olurum değil mi?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
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ı önlerOCR1A değerini 1562 yaparsam saniyenin 10'da 1ini almış olurum değil mi?
#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:
}
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
Ne alaka, aklıma perde inmiş.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
#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(){}
CS11 presacaler-8 yapıyormuş CS11 olarak set ettim 20102 ayrladığımda bence kabul edilebilir bir sonuç alıyoruz.Madem osiloskop var prescale 8 ile daha hassas ve yakın ayarlayabilirsin .
(1/16.000.000)*8*20.000= 0,01sn OCR1A 20.000 için. 1/20.000'lik adımlarla referans frekansa yaklaşır.
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ı?Ş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.
deniyorum abi şuanreferansı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ı?
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.deniyorum abi şuan
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.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 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.
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.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
#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 ~]$