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();
131.886uSŞ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.
Onu'da araştırayım nasıl yapıyoruz.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.
Bakalım nasıl yapıyoruz.Şö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
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];
}
Doğru olsada invert etmem gerekirdi abi deney yaptığım displaylerim ortak anot.Yalnız benim kullandığım bütün segment dataları atmasyon, haylazlık yapıp aynen kullanma, olması gereken değerleri yaz
Ben kopya çekmem gözüm kayar arada o kadar öğrenmek amacıyla yapıyorum bu projeyi
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;
}
}
18.520uSSüre olarak da ölç farkı görelim
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
}
Birdaha bakayım abiÖlçüm doğru değil gibime geliyor. Çok daha kısa sürüyor olması lazım. 1 mikrosaniyenin altında olmalı.
Mod işlemi var ölçüm aralığının içindeÖlçüm doğru değil gibime geliyor. Çok daha kısa sürüyor olması lazım. 1 mikrosaniyenin altında olmalı.
int birler = a % 10;
560nS ölçüyorum ben az önce kalibrasyonda bıraktığım için ayar yapmadan bakmıştım ondan öyle çıktı.Neyse boşvar artık kesmenin içine alıp o şekilde deneyebilirsin.