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
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
~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...