Arduino AVR C

watch_later 1/21/2016
Atmel AVR ATMega328P Mikrodenetleyicisi
8-bit AVR RISC temelli mikrodenetleyici
32 KB flash bellek (okunabilir-yazılabilir)
2 KB SRAM
1 KB EEPROM
23 genel amaçlı I/O pin
32 genel amaçlı register
3 esnek timers/counters(karşılaştırma modları ile)
dahili ve harici kesmeler(interrupts)
seri programlanabilir USART
SPI seri port,
6-kanal 10-bit A/D çevirici
programlanabilir watchdog timer (dahili osilatör ile)





Mikrodenetleyici Blok Diyagramı

Atmel AVR ATMega328P Bellekleri
Flash Bellek (32 KB)
Flash bellek depolama için kullanılan silinebilir, kalıcı depolama alanıdır. Programların derlenip ve cihazınıza yüklediğinizde depolandığı yerdir.
SRAM Bellek (2 KB)
Statik RAM (SRAM) geçici (örneğin değişkenler için) yığını ve program tarafından yapılan herhangi değişken için yer ayırma işlemi için kullanılır. Program çalışmaya başladığında, tüm global değişkenler derleyici tarafından otomatik olarak SRAM’de oluşturulur.
EEPROM bellek (1 KB)
EEPROM (elektriksel silinebilir, programlanabilir, salt okunur bellek) kalıcı depolama için kullanılır. Statik veri tutmak için (baud değerleri gibi) uygun bellektir.

Atmel AVR ATMega328P Zamanlayıcıları/Sayıcıları (Timers/Counters)
8 Bit T / C 0
Timer0 maksimum sayaç değeri 255 (işaretsiz 8-bit)’tir. Timer0 Arduino delay() ve millis() tarafından kullanılır.
16 Bit T / C 1
Timer1 65535 maksimum sayaç değeri (işaretsiz bir 16-bit)’tir. Arduino Servo kütüphanesi bu zamanlayıcıyı kullanır.
8 Bit T / C 2
Timer2 TIMER0 çok benzer bir 8-bit sayacıdır. Arduino tone() fonksiyonu tarafından kullanılır.

Atmel AVR ATMega328P Bekçi Köpeği(Watchdog Timer)
Bu cihaz işlemci aktivitesini izler ve periyodik olarak reset sinyalleri gönderir. Mikrodenetleyici gömülü sistemlerde kullanıldığında bu özellik yararlı olur. Bazı beklenmedik durumlarda Watchdog bir reset sinyali verecek kısa bir süre sonra sonsuz döngü içinde sıkışmış olan CPU’yu bulunduğu durumdan kurtarıp ve normal çalışmasına devam edebilir.

Atmel AVR ATMega328P I/O Portları
Atmel AVR ATMega328P 3 port bulunur:
PORT B (Dijital pin 8-13)
PORT C (Analog pinler + Reset)
PORT D (Dijital pinleri 0-7)

DDR (Data Direction Register) pinin INPUT(0) ya da OUTPUT(1) olduğunu belirler.
PORT HIGH veya LOW kontrolünü yapar.
PIN pinMode(pin,INPUT) pinlerinin durumunu okur.

PORT D ARDUINO DİJİTAL PİNS 0-7
DDRD - The PORT D Data Direction Register - read/write
PORTD - The PORT D Data Register - read/write
PIND - The PORT D Input Pins Register - read only

PORT B ARDUINO DİJİTAL PİNS 8-13
DDRB - The PORT B Data Direction Register - read/write
PORTB - The PORT B Data Register - read/write
PINB - The PORT B Input Pins Register - read only

PORT C ARDUINO ANALOG PİNS 0-5
DDRC - The PORT C Data Direction Register - read/write
PORTC - The PORT C Data Register - read/write
PINC - The PORT C Input Pins Register - read only 


Bitsel OR(|)
0 | 0 == 0
0 | 1 == 1
1 | 0 == 1
1 | 1 == 1
    
    int a =  92;     // a binary karşılığı: 0000000001011100
    int b = 101;    // b binary karşılığı: 0000000001100101
    int c = a | b;  // c binary karşılığı: 0000000001111101(125 decimal)
Bitsel AND(&)
0& 0 == 0
0 & 1 == 0
1 & 0 == 0
1 & 1 == 1
   
int a =  92;     // a binary karşılığı: 0000000001011100
int b = 101;    // b binary karşılığı: 0000000001100101
int c = a & b; // c binary karşılığı: 0000000001000100(68 decimal)
Bitsel XOR(^)
0 ^ 0 == 0
0 ^ 1 == 1
1 ^ 0 == 1
1 ^ 1 == 0
    
int a = 12;      // a binary karşılığı: 1100
int b = 10;      // b binary karşılığı: 1010
int c = a ^ b; // c binary karşılığı: 0110(6 decimal)
Bitsel NOT(~)
~0 == 1
~1 == 0
    
int a = 103;    // a binary karşılığı: 0000000001100111
int b = ~a;     // b binary karşılığı: 1111111110011000 = (-104 decimal)
Bitsel Operatörler Özellikleri
Bitsel işlemlerde bir sayıyı x kadar sola kaydırmak o sayıyı 2x ile çarpmaktır. Aynı şekilde bir sayıyı x kadar sağa kaydırmak o sayıyı 2x‘e bölmektir.
    
int a = 5;            // a binary karşılığı: 0000000000000101
int b = a << 3;   // b binary karşılığı: 0000000000101000 (40 decimal)
int c = b >> 3;   // c binary karşılığı: 0000000000000101(5 decimal)
Bitsel işlemlerde bir sayı değerini içeren bitlerini fazla kaydırmak o sayıdaki bitlerin kaybına yol açabilir.  
    
int a = 5;              // a binary karşılığı: 0000000000000101
int b = a << 14;  // b binary karşılığı: 0100000000000000(101 ikili sayısının başındaki ‘1’ değerini kaybettik.)
Bitsel işlemlerde negatif bir sayıyı sağa doğru kaydırdığımızda negative sayının işaretiyle yani ‘1’ ile ikili sayıyı devam ettirir. Bu da genelikle işlem sonuçlarının yanlış olmasına sebep olur.
    int a = -16;       // a binary karşılığı: 1111111111110000
    int b = a >> 3; // b binary karşılığı: 1111111111111110
Böyle bi sonuç üretmemesini istiyorsak aşağıdaki gibi unsigned() içerisinde kaydırma işlemleri yapmamız gerekir.
   
 int a = -16;  // a binary karşılığı: 1111111111110000
 int b = unsigned(a) >> 3; // b binary karşılığı: 0001111111111110
    
int a = 1;   // a binary karşılığı: 0000000000000001
a <<= 3;   // a binary karşılığı: 0000000000001000
a |= 3;     // a binary karşılığı: 0000000000001011 
a &= 1;     // a binary karşılığı: 0000000000000001
a ^= 4;     // a binary karşılığı: 0000000000000101 
16 bitlik bir ABCD sayısının  LSB(Least Significant Bit) ve MSB(Most Significant Bit) yer değiştiren DBCA yapan cpp kodu:
/*Bir ABCD sayısının LSB ile MSB yer değiştirir.*/
void swapLsbMsb(int ABCD)
{
   unsigned int D = ABCD << 12; 
   unsigned int A= ABCD >> 12;
   ABCD&=0b0000111111110000;
   ABCD|=(D|A);
   std::cout << ABCD; 
}






Bir sonraki yazımda görüşmek üzere...



sentiment_satisfied Emoticon