Kayıtlar

gömülü sistemler etiketine sahip yayınlar gösteriliyor

Gömülü Sistemler Ölçme Teknikleri

Resim
    Mikrodenetleyiciler ile Ne Ölçülebilir?      Arduino ile ya da diğer gömülü sistemler ailesinden herhangi bir mikrodenetleyici ile herhangi bir şeyi ölçebilmek, ölçmek istediğimiz şeyin ancak elektriksel bir değere çevrilebilmesiyle mümkün olabilmektedir. Tam nokta atışı konuşmak gerekirse voltaja çevirebildiğimiz herşeyi ölçebiliyoruz. Mikrodenetleyiciler kendisine verilen referans sayesinde ölçülmek istenen potansiyel farkı karşılaştırarak bir değer üretebilirler. Malesef ölçme anlamında yetenekleri ancak bu kadardır. Bir de zamanı bilirler, onu da üzerlerinde bulunan clock kaynağı sayesinde yaparlar. Bu da beraberinde sayma yeteneği kazandırır mikrodenetleyiciye. Netice olarak bir mikrodenetleyici sadece voltaj ölçebilir.     Sensör Nedir, Ne İşe Yarar? Net olarak bir mikrodenetleyicinin algılayabildiği (sense) tek şey potansiyel farktır. Sense demişken sensör kavramının da çıkış noktası ortaya çıkmış oluyor. Ölçmek istediğimiz büyüklüğü, mikrodenetleyicinin ölçebildiğ

C++ Dersleri | Dinamik Diziler

Resim
 C++ dizileri anlatırken -> C++ Diziler konusunda, dizilerin boyutlarının önceden belirtilmesi gerektiğinden bahsetmiştik, bunun nedeni olarak da programın çalışmadan evvel o dizi için ne kadar yer ayırmalı bilmesi gerektiğini söylemiştik, hatta iki boyutlu dizileri yazdığım yazıda dizi boyutlarını sabitler içerisine atarak tanımlama yapmıştık. Hadi deneysel düz bir kafada ilerleyelim ve bunu değişkenlerle yapmayı deneyelim :  int   n   =   3 ; int   arr [ n ]; Bunu yaptığımız anda Visual Studio daha kodu bile derlemeden tanımlamayı yaptığımız ikinci satırda n 'in altını çizdi ve Error List 'e şu hatayı yazdırdı : Error (active) E0028 expression must have a constant value Şair burada; ifade sabit bir değer olmalı demek istiyor. Birisinin çıkıp sevgili şairimize her zaman bir dizinin eleman sayısının sabit olamayacağını bazen parametrik olarak kullanılabilmesi için bize imkan tanıması gerektiğini anlatması gerekecek. Ya da başka bir şekilde yapılmış bir hesaplama sonuc

C++ Dersleri | C++ 2 Boyutlu Diziler

       C++ ile iki boyutlu eleman sayısı önceden belirli 'sabit' diziler de oluşturmak mümkündür, yapı tek boyutlu dizi tanımlamasıyla mantıksal olarak benzer yapıda. Neyin ne olduğunu anlamak için dizi elaman sayılarını sabitlere atayarak şöyle tanımlamış olalım : int   const   n_satir   =   3 ; int   const   n_sutun   =   7 ; int   const   m [ n_satir ][ n_sutun ]   =   {      {   1 ,   2 ,   3 ,   4 ,   5 ,   6 ,   7   },      {   8 ,   9 ,   10 ,   11 ,   12 ,   13 ,   14   },      {   15 ,   16 ,   17 ,   18 ,   19 ,   20 ,   21   } };      Sabit kelimesine dikkat edelim, bu değer sabit olmak zorunda. Hazıfazada ne kadar yer ayıracağını bilmek istiyor sevgili derleyicimiz. 3 satırlı, 7 sütunlu ve 2 boyutlu dizi tanımlamış ve değerlerini yukarıdaki şekilde belirlemiş olduk, bu yapıyı matematikteki matriks yapısına benzetebiliriz. Yapı karmaşık görünse de aslında çok basit bit mantığa dayanır, int tipinde bir dizinin dizisidir demek tam anlamını karşılayabilir. Örnek o

C++ Dersleri | Diziler - Dizilerin Başlatılması ( Array Initialization )

    C++ 'da bir dizi, yalnızca belirli bir değişken türü için sıralı şekilde bellekte yer almasını sağlayan veri bloğudur. C++ 'da bir değişkeni tanımlarken geçerli olan tüm kurallar geçerlidir. Ek olarak bir diziden bahsettiğimiz için, bu veri tipinden bellekte kaç adet saklayacağımızı belirtmemiz gerekir. Bunun için değişken ismine köşeli parantez [] içerisine adedi yazarız.     Aşağıda int değişken tipi için adı arrInts olan ve 3 elemana sahip olduğu söylenen bir tanımlama görüyoruz : int   arrInts [ 3 ];     Bir dizi tanımlanırken eleman değerleri de verilebilir, buna literatürde initialization deniyor, başlatma olarak çevrilmiş, bunun sebebi bir değişkeni sadece tanımlarsanız sadece tanımlamış olursunuz, değerini vermezseniz başlatmış olmazsınız :) ya compiler kafasına göre bir değer verir ya da vermez sadece adresi ve sığasını biliyor olur ve o anda bellekte o adreste ne veri varsa onun veri tipindeki karşılığını görüyor olursunuz, kararsız bir yapıdan bahsediyoruz yani.

C++ Dersleri | C++ Diziler [ Array ]

    C++ 'da d iziler, aynı veri tipine sahip adetli verilerin tek bir değişken ismiyle erişilebilir hale gelmesine olanak tanır. Ne diyebiliriz; ADC 'den veri okuyoruz, saniyede 100 örnek alacağız, her biri için adcVal1, adcVal2 .. adcVal100 diye yüz adet değişken tanımlayıp her birine verimizi kaydedebiliriz, çok pratik olmayacak gibi geldi bana ve de örnekleme sayımız parametrik ise bu yolu kullanmak zaten imkansız oluyor. Bu noktada dizilerden faydalanıyoruz. AdcVals diye bir dizi oluşturup, boyutunu belirtip hafızada bizim için o veri tipinin yüz adedinin sığabileceği bir bellek alanı ayırmasını söylüyoruz, verilerimizi onun içinde saklayıp yine oradan erişebiliyoruz.     C++ da bir diziyi her değişkende olduğu gibi önce tanımlamak "declare" sonrasında da dilersek başlatmak "initialize" gerekiyor. Sabit değerli diziler için dizi boyutunu da belirtmek gerekiyor ki hafıza organizasyonu işlevi düzgün görevini yerine getirebilsin. Sabit değerli diye ba

C++ Dersleri | Bit Alanları - Gömülü Sistemler Bellek Organizasyonu

Resim
     Gömülü sistemlerde hepimizin bildiği ya da şuanda öğreneceği üzere hafıza alanlarımız (flash - eprom - ram) oldukça kısıtlıdır. Atmega 328p için 2kb ram alanı var desek ve bunun da ancak 2048 tane harfi ram de barındırabileceği anlamına geldiğini söylesek, belki de şu okumakta olduğunuz metini bile ram de saklayamıyor olacağımızı kolayca tahmin edebiliriz. Bazı durumlarda herhangi bir parametrenin sadece açık ya da kapalı olduğunu tutmak istediğimiz bir değişkene ihtiyacımız olur. Ancak en küçük hafıza birimimiz 8 bit (1byte) olduğundan, 1 byte harcamadan 1 bitlik veriyi bir değişken içerisinde saklayabilmek mümkün değildir. Ancak bu bir byte 'ın geri kalan 7 bitini farklı değişkenler için kullanmamıza olanak tanıyan bit fields dediğimiz bir yapı vardır. Tanımlarken hangi değişken için kaç bitlik alan ayırmak istediğimizi belirtmemiz yeterli, bit ayırma işlemini compiler halleder.           Bir projede parametreleri kaydetmek isteyelim, hatta daha net olarak örneklendirelim,

C++ Dersleri | Bit işlemleri, Bit Clear ve Bit Set

 C++ dersleri bit işlemlerinde belki de en çok kullandığımız bit işlemlerinden biri bit set diğeri de bit clear dir desek yanılmış olayız herhalde, bitwise OR konusunda örneğini vermiştik burda da kullanalım: int indexOfBitToSet = 5 ; PORTB |= 1LL << indexOfBitToSet ; 5. indexteki bit 'i set eder. portB 'nin 5 numaralı pini Set edilmiş (HIGH) olur. Burada diğer pin konfigürasyonları bu durumdan etkilenmezler. PORTB 'nin 0000 0000b olduğunu düşünelim, 1 << 5 bize 0010 0000b değerini verir, bu değerle 0000 0000b değeri orlanırsa, gayet basitçe 5. indexin 1 olduğunu görebiliyoruz. Aynı şekilde bir bit dizesindeki belirli bir biti CLEAR (0) yapmak için bitwise and kullanıyoruz:   int indexOfBitToClear = 5 ;   PORTB &= ~( 1LL << indexOfBitToClear ); şimdide PORTB 'nin tümünün HIGH olduğunu varsayalım, 1111 1111b, 1 << 5 'den 0010 0000b değeri gelir, ifadenin başında yer alan ~ işaretiyle bit dizisindeki tüm değerler inverse oldu,

C++ Dersleri | Bit İşlemleri - Set Bitleri sayma

 C++ bit işlemlerinde bir bit dizesi içerisindeki SET (1) olmuş bitlerin sayısını elde etmek için bir kaç yol izleyebiliriz, basitçe programlama kafasıyla for kullanarak yapılabilir : int   main () { unsigned   int   a   =   1234 ;       // 0100 1101 0010 int   bitCount   =   0 ; for   ( bitCount   =   0 ;   a ;   a   >>=   1 ) bitCount   +=   a   &   1LL ; cout   <<   " result= "   <<   bitCount   <<   endl ; }  result=5  ne yapmış olduk açıklamaya çalışamadan önce for ne yapıyor onu anlatalım : for 'un ilk ifadesi bir kez çalıştırılır, ikinci ifadesi kontrol edilecek durumu belirler; burada yalnızca a var, bu ne anlama geliyor, bu ifade boolean bir ifade olmalıdır, 0 olmamışsa durumun sağlandığını kabul eder yani 3 5 7 vs diğer tüm sayılar true kabul edilir, yani for 'un bitme şartı a nın sıfır olması durumudur, en son ifadesi de her dönüşte yürütülecek kod ifadesidir, for'u yazmadan for'u da anlatmış olduk kıs

C++ Dersleri | Bit işlemleri - Bit Kontrol

 C++ bit işlemlerinde bir bit dizesindeki belirli bir bitin durumunu kontrol etmek için değeri elde etmek istediğimiz bitin indeks değeri kadar right shift yapıp üzerinde and işlemi uygulayarak yapılabilir. Cümle şeklinde ifade edince bana bile anlaşılabilir gelmedi :) kodla bakalım : int   main () { int   a   =   170 ;       // 10101010 int   result   =   ( a   >>   5 )   &   1LL ; cout   <<   " result= "   <<   result   <<   endl ;    }  result = 5  5. numaralı indexte yer alan bitin değerini sorguluyoruz, bu indexle kastettiğim sayma sayılarıyla değil, en sağdaki bit için 0 'dan başlayarak sayıyoruz anlamını ifade ediyor. Adım Adım şöyle gidiyor işlem : a = 10 1 01010 değerini   a >> 5 : 0000010 1 : yaptığımız zaman zaten istediğimiz bit en sağda yerini almış oluyor, bu değeri de 1 ile & işlemine tabi tutunca 1 ise 1, 0 ise döndürüyor result değişkenine. LL kullanmamızın sebebi Long Long deyip, değişkenin boyutundan bağı

C++ Dersleri | Bit İşlemleri - Bit Toggle

 C++ Dersleri | Bit İşlemleri - Bit Toggle; kısaca açıklamak gerekirse bir bit dizesinin istenen bitini toggle etmek, mevcut değerini ters çevirmek anlamına gelir, yani 0 ise 1, 1 ise 0 a çevirir. int   main () { int   a   =   255 ;       // 11111111 a   ^=   1LL   <<   7 ;    // 01111111 127 cout   <<   " a= "   <<   a   <<   endl ;    } a değişkeninin 7 bitini toggle yap demiş olduk, işlemi adım adım yazmamız gerekirse a 255 değerindeyken 8 bit, hepsi 1 şeklinde değer buluyor ikili sistemde -> 11111111 bu değeri (1 << 7) ile -> 10000000 xor işlemine tabii tutarsak 01111111 elde etmiş oluyoruz. Önceki konu :  Tüm Bitleri Set Etme Sonraki konu : Bit Kontrol

C++ Dersleri | Bit İşlemleri - Tüm Bitleri Set Etme

 C++ ve gömülü sistemlerde bir değişkene ya da yazmaca ait tüm bitlerin set edilmesi çokça kolay bir mantığa dayanır. Eğer değişkenin ya da yazmacın boyutunu biliyorsak o kadar bit sayısına eşit olan en büyük sayıya eşitleyerek işin içinden sıyrılabiliriz: 8 bitlik bir yazmaç için 0xFF 'e eşitlemek bir çözüm olmakla beraber eğer bilmiyorsak bir fonksiyon içerisine template ile geliyorsa mesela daha basit bir yolu da söz konusu: değeri -1 e eşitlemek.  uint8_t a = 0xFF ;      Yazının birinde bahsetmiştik, işaretli sayıların MSB biti (en solda) işaret biti olup 0 ise sayının pozitif 1 ise negatif olduğu anlamına geliyordu ve negatif tarafta anlamlı bitler 1 'ler değil 0'lardı. Ne demeye çalışıyorum ? 8 bit için konuşursak : -1 sayısı 2 lik sistemde 11111111b olarak ifade edilir, bence tüm bitleri set etmek için güzel yöntem :)   PORTB = - 1 ; Tüm bitleri resetlemek istersek? Bilmem söylemeye gerek var mı ama yazmış olalım : a=0; işinizi çözecektir. Herkese kolay gels

C++ Dersleri | Bitwise Operatörleri | Right Shift Operatör

Resim
 C++ bitwise operatörlerden right shift operatörünü konu alıyoruz >> . Right shift operatörü,   C++ Dersleri | Bitwise Operatörleri | Left Shift Operatör konusunda bahsettiğimiz tüm özellikleri taşıyor, tek farkla : bit dizisini sağa doğru kaydırıyor. Bir örnekle right shift operatörünün nasıl kullanıldığına bakalım: int   main () { int   a   =   2 ; // 0010b int   b   =   a   >>   1 ; // 0001b cout   <<   " a= "   <<   a   <<   " , b= "   <<   b ; } çıktımız şu şekilde :  a=2, b=1  Kolayca anlayabileceğimiz şekilde a değişkeni için oluşan binary sistem diziliminde indexlemeye göre 1. bit hanesinde yer alan operatöre gönderdiğimiz sayı :1 adedince sağ tarafa kaydırılmış. Left Shift operatörü için sayıyı 2 'nin kuvvetleriyle çarpmakla aynı şey demiştik, burada olan da sayıyı 2 'nin kuvvetleriyle bölmekle aynı şeydir. a değişkeninin değeri olan 2 'yi 2^1 'e (bu 1 operatöre gönderilen 1) bölerek 1 eld