Serial.print
yapıyorsun.Bu da büyük intimalle seri portun transmit buffer'ini taşırıyor ve neticede hiçbir şey yazılmıyor. Ayrıca şimdi seri porta basit bir "Hello!" yazırmanın süresini ölçtüm, 55 μs. Sen 8 tane koymuşsun, oradan 440 μs ilave gecikme yarattın kesmede.deneyelimkesme saniyede 100 defa çağrılıyor ve sen her seferinde 8 taneSerial.print
yapıyorsun.Bu da büyük intimalle seri portun transmit buffer'ini taşırıyor ve neticede hiçbir şey yazılmıyor. Ayrıca şimdi seri porta basit bir "Hello!" yazırmanın süresini ölçtüm, 55 μs. Sen 8 tane koymuşsun, oradan 440 μs ilave gecikme yarattın kesmede.
Böyle yapacağına algoritmayı loop içinde, araya da bol bol delayler ve Serial.Print ler koyarak çalışır hale getir, sonra çalışan kodu, bütün delay ve printleri kaldırıp kesmeye aktar.
/*
byte _10ms = 0;
byte sn = 0;
byte dk = 0;
byte 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
};
unsigned char bcd[] = {
bcd[0] = 0,
bcd[1] = 0,
bcd[2] = 0,
bcd[3] = 0,
bcd[4] = 0,
bcd[5] = 0,
bcd[6] = 0,
bcd[7] = 0
};
void bcd_inc()
{
bcd[0]++;//her timer kesmesinde +1
//------------MILISANIYE----------
if (bcd[0] == 9) {
bcd[1]++;
bcd[0] = 0;
}
if (bcd[1] == 9) {
bcd[2]++;
bcd[1] = 0;
}
//------------MILISANIYE----------
//------------SANIYE--------------
if (bcd[2] > 9) {
bcd[3]++;
bcd[2] = 0;
}
if (bcd[3] == 6) {
bcd[4]++;
bcd[3] = 0;
}
//------------SANIYE--------------
}
ISR(TIMER1_COMPA_vect) {
bcd_inc();
}
void setup() {
DDRD = B11111111; //büTÜN D PORTI ÇIKIŞ
DDRB = DDRB | B00001111;//8-9-10-11 çıkış
noInterrupts();
TCCR1A = 0;
TCNT1 = 0;
OCR1A = 16000000 / (100 * 64) - 1;
TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10);
TIMSK1 |= (1 << OCIE1A);
interrupts();
//Serial.begin(115200);
}
void loop() {
PORTB = 0B00001011;
PORTD = _7seg[bcd[0]];
delay(4);
PORTB = 0B00000111;
PORTD = _7seg[bcd[1]];
delay(4);
PORTB = 0B00001101;
PORTD = _7seg[bcd[2]];
delay(4);
PORTB = 0B00001110;
PORTD = _7seg[bcd[3]];
delay(4);
}
static unsigned char bcd[] = {0, 0, 0, 0, 0, 0, 0, 0};
static void bcd_inc(unsigned char* bcd)
{
++bcd[0];
if (bcd[0] == 10)
{
bcd[0] = 0;
++bcd[1];
if (bcd[1] == 10)
{
bcd[1] = 0;
++bcd[2];
if (bcd[2] == 10)
{
bcd[2] = 0;
++bcd[3];
if (bcd[3] == 6)
{
bcd[3] = 0;
++bcd[4];
if (bcd[4] == 10)
{
bcd[4] = 0;
++bcd[5];
if (bcd[5] == 6)
{
bcd[5] = 0;
++bcd[6];
if ((bcd[6] == 4) && (bcd[7] == 2))
{
bcd[6] = bcd[7] = 0;
}
else if (bcd[6] == 10)
{
bcd[6] = 0;
++bcd[7];
}
}
}
}
}
}
}
}
void setup()
{
Serial.begin(115200);
}
void loop()
{
while (1)
{
bcd_inc(bcd);
char buffer[10];
sprintf(buffer, "%u%u:%u%u:%u%u:%u%u\n",
bcd[7], bcd[6], bcd[5], bcd[4], bcd[3], bcd[2], bcd[1], bcd[0]);
Serial.print(buffer);
}
}
Benim bunu yazamamamın sebebi tecrübesizlik mi yeterince kafamı çalıştıramamam mı?Neyse burada takılıp kalma diğer problemlere odaklan. Şuradan devam et:
C++:static unsigned char bcd[] = {0, 0, 0, 0, 0, 0, 0, 0}; static void bcd_inc(unsigned char* bcd) { ++bcd[0]; if (bcd[0] == 10) { bcd[0] = 0; ++bcd[1]; if (bcd[1] == 10) { bcd[1] = 0; ++bcd[2]; if (bcd[2] == 10) { bcd[2] = 0; ++bcd[3]; if (bcd[3] == 6) { bcd[3] = 0; ++bcd[4]; if (bcd[4] == 10) { bcd[4] = 0; ++bcd[5]; if (bcd[5] == 6) { bcd[5] = 0; ++bcd[6]; if ((bcd[6] == 4) && (bcd[7] == 2)) { bcd[6] = bcd[7] = 0; } else if (bcd[6] == 10) { bcd[6] = 0; ++bcd[7]; } } } } } } } } void setup() { Serial.begin(115200); } void loop() { while (1) { bcd_inc(bcd); char buffer[10]; sprintf(buffer, "%u%u:%u%u:%u%u:%u%u\n", bcd[7], bcd[6], bcd[5], bcd[4], bcd[3], bcd[2], bcd[1], bcd[0]); Serial.print(buffer); } }
Benim bunu yazamamamın sebebi tecrübesizlik mi yeterince kafamı çalıştıramamam mı?
En başta okulda birazcık yanlış temel aldık ondan toparlanana kadar bir kısım yamuk kaldı.Yeterince C/C++ ile saç baş yolmamandan kaynaklanıyor. Ben 25 yıldır uğraşıyorum bu dil ile hala zaman zaman saç baş sakal yoluyorum
Ben herhangi bir programlama dili öğrenirsem önüme gelen platfrom'da önüme geleni yazabileceiğimi sanardım.C/C++ en pis dillerden birisidir. Bundan daha pisi assembly ile program yazmak. 40 sene de uğraşırsan zaman zaman çok aptalca hatalar yaptığın oluyor. Önemli olan problem bulmak için belli bir sistematiği oturtmak, o da malesef zaman alıyor.
Buraya kadar tamamen anlayarak geldim.Bu program yüzeyden bakınca çok kolaymış gibi görünüyor. Ama hem bazı ileri seviye konseptleri öğreniyorsun (timer yapılandırıp kesme çağrılması, direkt port erişimi, 7 segmentlerin multipleks olarak sürülmesi) hem de her aşamada değişik tuzaklarla karşılaşıyorsun. Bir de işlemci kısıtlı ise, oradan da ilave zorluklar geliyor. Ama bu programı bir kere tam anlayıp bitirdikten sonra bir level atlamış olacaksın. Bundan sonraki proje için daha donanımlı olacaksın. O yüzden bu projeyi hakkıyla yapmaya çalış.
Bende kütüphane alerjisi var abi.Her dilin kendi güzelliği ve kendi ameleliği var. C# yada VB de veritabanı bağlamak işkence iken Python da 4 satır kod ile her işi yapmak kolay ama bu defa da Python da gui sıkıntı. Ama Python da zibikyon tane kütüphane var. Her işin kütüphanesi var. İki satır kodla tonla iş yapılıyor.
Micropython başka güzel bir olay. Aynı kod hem esp32, hem pi Pico, hem Sipeed Maix modüller gibi farklı modül yada çiplerde çalışıyor.
isim.print(değişken);
yazmış olacaktım ve birkaç transistör bağlantısı.++bcd[0];//her zaman kesmesinde 1 arttır
if (bcd[0] == 10)//10 kere zaman kesmesinde(100ms) olunca BİRLER BASAMAĞI
{
bcd[0] = 0;//1 LER BASAMAĞINI SIFIRLA
++bcd[1];//ONLAR BASAMAĞI 1 ARTTIR
if (bcd[1] == 10)//ONLAR BASAMAĞI 10 OLDUYSA 100x10 = 1000mS= 1 SANIYE
{
bcd[1] = 0; //10LAR BASAMAĞI SIFIRLAMA
++bcd[2]; // SANIYE BIRLER BASAMAĞI
if (bcd[2] == 10)//SANIYE BIRLER BASAMAĞI 10 OLDUYSA
{
bcd[2] = 0;
++bcd[3];//SANİYE ONLAR BASAMAĞINI 1 ARTTIR
if (bcd[3] == 6)//SANIYE 10LAR BASAMAĞI 6 OLDUYSA YANI 1 DAKIKA
{
bcd[3] = 0;
++bcd[4];//DAKIKA BİRLER BASAMAĞI 1 ARTTIR
if (bcd[4] == 10)//DAKIKA BIRLER BASAMAĞI 10 OLDUYSA
{
bcd[4] = 0;
++bcd[5];//DAKIKA ONLAR BASAMAĞI 1 ARTTIR
if (bcd[5] == 6)//DAKIKA ONLAR BASAMAĞI 6 OLDUYSA YANİ 1 SAAT
{
bcd[5] = 0;
++bcd[6];//SAAT BIRLER BASAMAĞI 1 ARTTIR
if ((bcd[6] == 4) && (bcd[7] == 2)) // EĞER SAAT 24 OLDUYSA
{
bcd[6] = bcd[7] = 0;//SAATI SIFIRLA
}
else if (bcd[6] == 10)
{
bcd[6] = 0;
++bcd[7];
Port erişim ve belli başlı işler için doğrudan kodlama yapmak en güzeli ama opencv gibi, matplotlib, pandas, numpy, urllib gibi girdisi çıktısı bol olan işler yapıyorsan paşa paşa öğrenmek gerekiyor. Excel dosyasını modifiye edip yüzlerce veriyi iki satırla yazmak güzel oluyor. Baştan yazmak ise imkansız. Bu yüzden işin durumuna göre kendi library i oluştur yada hazır kullan. Tercihi iyi yapmak lazım.Bende kütüphane alerjisi var abi.
Kütüphane kullanınca habire kütüphane dosylarına bakıyorum neler olmuş neler bitmiş diye.
Eğer kendim yazınca yüzlerce satır + karşamaşa oluşmayacaksa kendim yazarım.
Kütüphane devamlı 2. plandır benim için alışınca bağımlılık yapıyor bırakılmıyor.
Bu konuda yaptığımızın dahi kütüphanesi var SevSeg adında onu kullansaydım benim yazacaklarım 10'da 1 kısalacaktı ama sadeceisim.print(değişken);
yazmış olacaktım ve birkaç transistör bağlantısı.
@taydin abi seninkinde süre kaçırma yok 35 yazıyorsa gerçekten 35 saniye geçmiş oluyor.
C++:++bcd[0];//her zaman kesmesinde 1 arttır if (bcd[0] == 10)//10 kere zaman kesmesinde(100ms) olunca BİRLER BASAMAĞI { bcd[0] = 0;//1 LER BASAMAĞINI SIFIRLA ++bcd[1];//ONLAR BASAMAĞI 1 ARTTIR if (bcd[1] == 10)//ONLAR BASAMAĞI 10 OLDUYSA 100x10 = 1000mS= 1 SANIYE { bcd[1] = 0; //10LAR BASAMAĞI SIFIRLAMA ++bcd[2]; // SANIYE BIRLER BASAMAĞI if (bcd[2] == 10)//SANIYE BIRLER BASAMAĞI 10 OLDUYSA { bcd[2] = 0; ++bcd[3];//SANİYE ONLAR BASAMAĞINI 1 ARTTIR if (bcd[3] == 6)//SANIYE 10LAR BASAMAĞI 6 OLDUYSA YANI 1 DAKIKA { bcd[3] = 0; ++bcd[4];//DAKIKA BİRLER BASAMAĞI 1 ARTTIR if (bcd[4] == 10)//DAKIKA BIRLER BASAMAĞI 10 OLDUYSA { bcd[4] = 0; ++bcd[5];//DAKIKA ONLAR BASAMAĞI 1 ARTTIR if (bcd[5] == 6)//DAKIKA ONLAR BASAMAĞI 6 OLDUYSA YANİ 1 SAAT { bcd[5] = 0; ++bcd[6];//SAAT BIRLER BASAMAĞI 1 ARTTIR if ((bcd[6] == 4) && (bcd[7] == 2)) // EĞER SAAT 24 OLDUYSA { bcd[6] = bcd[7] = 0;//SAATI SIFIRLA } else if (bcd[6] == 10) { bcd[6] = 0; ++bcd[7];
Buda 50 kere baktıktan sonra çıkardığım yorumlar umarım artık anlamışımdır
4 dijit bağlı aktif çalışıyor az önce dijitlere yazdırıp loop içinde test'de yaptım.Daha önce de anlamıştın sen bunu ama karşılaştırmalarda hata yapmıştın o yüzden doğru çalışmadı ve zaman hatası oluştu.
void loop()
{
PORTB = 0B00001011;//10
PORTD = _7seg[bcd[0] ];
delay(4);//tarama ayar
PORTB = 0B00000111;//11
PORTD = _7seg[bcd[1] ];
delay(4);//tarama ayar
PORTB = 0B00001101;//9
PORTD = _7seg[bcd[2] ];
delay(4);//tarama ayar
PORTB = 0B00001110;//8
PORTD = _7seg[bcd[03] ];
delay(4);//tarama ayar
}
static unsigned char bcd[] =
{
0,
0,
0,
0,
0,
0,
0,
0
};
static void bcd_inc(unsigned char* bcd)
{
++bcd[0];//her zaman kesmesinde 1 arttır
if (bcd[0] == 10)//10 kere zaman kesmesinde(100ms) olunca BİRLER BASAMAĞI
{
bcd[0] = 0;//1 LER BASAMAĞINI SIFIRLA
++bcd[1];//ONLAR BASAMAĞI 1 ARTTIR
if (bcd[1] == 10)//ONLAR BASAMAĞI 10 OLDUYSA 100x10 = 1000mS= 1 SANIYE
{
bcd[1] = 0; //10LAR BASAMAĞI SIFIRLAMA
++bcd[2]; // SANIYE BIRLER BASAMAĞI
if (bcd[2] == 10)//SANIYE BIRLER BASAMAĞI 10 OLDUYSA
{
bcd[2] = 0;
++bcd[3];//SANİYE ONLAR BASAMAĞINI 1 ARTTIR
if (bcd[3] == 6)//SANIYE 10LAR BASAMAĞI 6 OLDUYSA YANI 1 DAKIKA
{
bcd[3] = 0;
++bcd[4];//DAKIKA BİRLER BASAMAĞI 1 ARTTIR
if (bcd[4] == 10)//DAKIKA BIRLER BASAMAĞI 10 OLDUYSA
{
bcd[4] = 0;
++bcd[5];//DAKIKA ONLAR BASAMAĞI 1 ARTTIR
if (bcd[5] == 6)//DAKIKA ONLAR BASAMAĞI 6 OLDUYSA YANİ 1 SAAT
{
bcd[5] = 0;
++bcd[6];//SAAT BIRLER BASAMAĞI 1 ARTTIR
if ((bcd[6] == 4) && (bcd[7] == 2)) // EĞER SAAT 24 OLDUYSA
{
bcd[6] = bcd[7] = 0;//SAATI SIFIRLA
}
else if (bcd[6] == 10)
{
bcd[6] = 0;
++bcd[7];
}
}
}
}
}
}
}
}
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
};
ISR(TIMER1_COMPA_vect) {
bcd_inc(bcd);
PORTB = 0B00001011;//10
PORTD = _7seg[bcd[0] ];
delay(4);//tarama ayar
PORTB = 0B00000111;//11
PORTD = _7seg[bcd[1] ];
delay(4);//tarama ayar
PORTB = 0B00001101;//9
PORTD = _7seg[bcd[2] ];
delay(4);//tarama ayar
PORTB = 0B00001110;//8
PORTD = _7seg[bcd[03] ];
delay(4);//tarama ayar
}
void setup()
{
DDRD = B11111111; //büTÜN D PORTI ÇIKIŞ
DDRB = DDRB | B00001111;//8-9-10-11 çıkış
noInterrupts();
TCCR1A = 0;
TCNT1 = 0;
OCR1A = 16000000 / (100 * 64) - 1;
TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10);
TIMSK1 |= (1 << OCIE1A);
interrupts();
}
void loop()
{}