Hazırlayan: İbrahim KORANA – Atmel üretimi mikrodenetleyiciler hakkında Türkçe kaynak bulmak zor ATmega8 için çok detaylı bir yazı uygulamalar assembler komut bilgileri kullanım bilgileri tahminimce verilen bir çok bilgi diğer modeller içinde geçerlidir
Şekil 2.1.2 Atmega8 Microdenetleyici Blok Diyagramı
Şekil 2.1.3 Atmega8 Microdenetleyici Bacak Bağlantı Şeması (PDIP)
Şekil 2.1.4 Atmega8 Microdenetleyici Bacak Bağlantı Şeması (TQFP)
Pin Anlamları
VCC Sistem besleme voltajı. 4.5v-5.5v
GND Sistem GND
Port B (PB0..PB7)
• Port B, programlanabilir pull-up dirençleri bulunan, 8 bit genişliğinde bir giriş-çıkış portudur. Porta byte olarak erişim yapılabileceği gibi bit olarak da erişim yapılabilir.
• Portun 6 ve 7. bitleri, Oscillator’ün internal RC seçilmesi durumunda port bitleri, aksi durumda oscillator giriş uçları olarak kullanılır.
Xtal1/Xtal2/Tosc1/Tosc2
SPI
• Oscillator’un internal RC seçilmesi durumunda portun 6 ve 7. bitleri ASSR registerinin durumuna göre Timer/counter2’nin asenkron giriş uçları olarak kullanılabilir. Port ve portun fonksiyonlarının kullanımı ilerideki konularda detaylı olarak anlatılacaktır
Port C (PC0..PC6)
PC7/Reset
Adc, Seri giriş-çıkış
• Port C, programlanabilir pull-up dirençleri bulunan 7 bit genişliğinde bir giriş-çıkış portudur. Porta byte veya bit erişimleri yapılabilir.
• Portun 7. biti RESDISBL yönlendirme biti ile anlam değiştirebilir. RESDISBL biti programlanmış ise pin girişçıkış pini, programlanmamış Port ve portun fonksiyonlarının kullanımı ilerideki konularda detaylı olarak anlatılacaktır.
Port D (PD0..PD7)
Usart, int,
Timer/counter,
Analog comparator
• Port D, programlanabilir pull-up dirençleri bulunan 8 bit genişliğinde bir giriş-çıkış portudur. Port byte veya bit erimleri ile kullanılabilir. Port fonksiyonlarının kullanımı ilerideki konularda detaylı olarak anlatılacaktır.
AVCC
Avcc analog digital çevirici için besleme voltaj girişidir. Bu voltaj girişi saglanmadan ADC fonksiyonu kullanılamaz. ADC fonksiyonunun kullanımı için Avcc ucu alçak geçiren bir filtre ile besleme voltajına bağlanmalıdır.
AREF
Analog-Digital çevirici için referans voltaj girişidir.
MCS-51 Microdenetleyici Ailesinin RAM yapısı ve Register’leri
Genel Amaçlı Registerler ve Stack : MCS-51 sisteminde register kavramı, diğer microdenetleyici sistemlerindeki genel amaçlı register kavramı ile aynıdır. Söz konusu sistemin mimari özelliklerinden biri bu registerlerle ilgilidir. MCS–51 sisteminde fiziksel olarak hiç bir register bulunmaz. Fakat MCS-51’ in assembler dilini başka işlemcilerin alışılmış olan assembler diline yaklaştırmak amacıyla MCS-51’in assembler dilinde R0 – R31 gibi 32 adet register ismi kullanılmaktadır.
Görünür ile gerçeklik arasında uyum her bir register ismi altında belli bir iç RAM hücresinin
kullanılması sayesinde sağlanır. Bu uyumu sağlamak için gereken işlemler derleyici
tarafından ve kullanıcıya şeffaf olarak gerçekleştirilir. Registerler iç ram’ın 00h -1Fh adresleri de yerleşir.
Buna göre söz konusu registerlerin ismini veya adreslerini kullanmanın hiçbir farkı yoktur. Örneğin R5. registerinin içeriğinin akümülatöre gönderilmesi gerekiyorsa o zaman MOV A, R5 veya MOV A, $05 yazılması yeterlidir. Sonuç olarak sistemde 32 register vardır. Bu registerler iç ram’ın 00h – 1Fh adreslerine yerleşmektedir. Aslında registerler ram hücrelerin kendileridir. Bu hücreler komut görüntüsüne uygun olarak registerler diye adlandırılmaktadırlar. Böyle aldatmacalar bilgisayar tekniğinde çok yaygın olarak kullanılmaktadır ve amacı kullanıcı alışkanlığı ile donanım gerçekliği arasındaki açıklığı mümkün olduğu kadar kapatmaktır.
Şekil 2.3.1.1 Registerlerin iç ram üzerindeki yerleşimi
Microdenetleyiciler iç ram olarak 8 bit ile adreslenemeyecek kadar büyük iç ram veya
rom bulundurabilirler. Bu gibi durumlarda iç ram’a veya rom’a erişim için 16 bit registerler
gerekli olurlar. Bu ihtiyacı karşılayabilmek için X,Y,Z registerleri düzenlenmiştir. Bu
registerler R26 ile R31 registerleri üzerine yerleştirilmiş durumdadırlar ve genel olarak
Indirect adresleme için kullanılırlar.
Şekil 2.3.1.2 X,Y,Z registerlerinin ram üzerindeki yerleşimi
Stack, program içinde kullanılan geçici dataların saklanılması amacıyla kullanılan bir
alandır. Program içinde kullanılan local degişkenler, alt program çağırmalarında ve Interrupt
geçişlerinde geri dönüş adresleri ve parametreler stack alanı içinde tutulur. Stack LIFO (Last in First Out, Son giren ilk çıkar) metodu ile çalışır.
Registerler gibi stack’da ayrıca şema olarak mevcut değildir. Stack işlemleri SP (Stack
Pointer) registerin yardımı ile iç ram’ın belli bir alanında simule edilir.
MCS-51 core içerisinde gerçekleştirilmiş olan mantığa göre microdenetleyicinin her bir resetlemesinden sonra SP = 0h durumu oluşur. Bu durum stack alanı ile register alanlarının çakışmalarına neden olur. Herhangi bir karışıklığın önlenebilmesi için programların eğer stack kullanacaklarsa Stack Pointer’a stack olarak kullanacakları alanın başlangıç adresini yerleştirmeleri gereklidir. Stack teorik olarak 60h adresinden başlayarak FFh adresine kadar devam edebilir.
20h – 5Fh arasındaki iç ram alanı hayati önem taşımakta olan SFR (Special Functial
Register) için ayrılmıştır ve bu alanın başka amaçlar için kullanılması microdenetleyicinin
işinin bozulmasına sebep olabilir. Bu registerler sonraki bölümde açıklanacaktır.
Şekil 2.3.1.3 Genel iç ram yerleşimi
Özel Amaçlı Registerler
Bu registerler gurubunu sadece SFR’ ler (Spesial Function Registers) olarak adlandıracağız. Bu registerlerden her biri çok özel olan bir veya birkaç fonksiyonun gerçekleştirilmesine hizmet ederler. Her bir programda SFR’ lerin hepsinin kullanılması gerekmez. Yani herhangi bir programda yalnız o program için geçerli olan SFR alt gurubu kullanılır. Geride kalan SFR’ler hakkında düşünmeye gerek yoktur. Çünkü RESET sırasında bütün SFR’ ler etkisiz duruma getirilir. SFR’leri açıklarken onları hizmet amaçlarına göre aşağıdaki guruplara bölünmesi uygun olacaktır.
• Microdenetleyicinin mikroişlemci kısmının temel görevlerini sürdürebilmesi için gereken SFR’ler.
• Microdenetleyicinin içinde bulunan Timer/Counter’ları denetleyen SFR’ ler.
• Microdenetleyici içerisinde bulunan Usart’ı denetleyen SFR’ler,
• Microdenetleyici içerisinde bulunan interrupt devresi denetleyen SFR’ ler.
• Giriş / Çıkış portları olarak kullanılan SFR’ ler,
• Diğer SFR’ler
Özel Amaçlı Registerler başlığı altında sadece Microdenetleyicinin microişlemci kısmının temel görevlerini sürdürebilmesi için gereken SFR’lerden bahsedilecek, Timer/Counter, Usart, Interrupt ve diğer SFR’ler ayrı başlıklar halinde incelenecektir.
SREG (Status Register) : Bu register yapılan matematiksel işlemlerin ve microdenetleyicinin genel durumunu tutmak için kullanılır. Register bir bayt olarak veya 8 ayrı bit olarak adreslenebilir. Register iç ram’de 5Fh adresinde yer alır. SREG’in bit yapısı aşağıdaki gibidir.
I Global Interrupt Enable
T Bit Copy Storage
H Half Carry Flag
S Sign Bit
V Two’s complement overflow flag
N Negative Flag
Z Zero Flag
C Carry Flag
SREG Registerinin bit değerleri, yapılan işlemlere göre microdenetleyici tarafından oluşturulur. Fakat programlar tarafından istenildiği şekilde değiştirilebilir.
(I) Global Interrupt Enable : I biti, microdenetleyici içindeki iç ve dış interruptları genel olarak açmak ve kapatmak için kullanılır. Eğer bit set durumda ise microdenetleyici kurulmuş
interruptların çalışmasına imkan verecektir. Aksi durumda interruptlar kurulmuş olsa
bile interrupt aktif olmayacaktır. Eğer I biti set edilmişse interrupt oluştuğunda microdenetleyici bit değerini kendiliğinden resetler ve reti komutu ile tekrar set yapar. Bu yöntem ile microdenetleyicinin peşpeşe oluşan interruptlarla stack taşmasının önüne geçilmiş olur. I biti sei komutu ile set, cli komutu ile resetlenebilir.
(T) Bit Copy Storage : T biti, bit kopyalama işlemlerinde kaynak veya hedef olarak kullanılır. Bit BLD ve BST komutlarında geçici alan olarak kullanılır. BLD komutu T bitini
belirlenen registerin istenen bitine kopyalar.
Örnek : BLD r16,4 T bitinin değerini r16 registerinin 4. bitine kopyalar.
BST Komutu belirlenen registerin belirlenen bitini T registerine kopyalar.
Örnek : BST r16,2 R16 registerinin 2. bitini T bitine kopyalar.
(H) Half Carry Flag (Auxilary Carry) : Microdenetleyici matematiksel işlemlerin sonunda H flagını set veya reset yapar. Flag genel olarak matematiksel işlemlerde alıcı alanın alt nibble’ında bir taşma olursa set olur. Bu durum BCD matematiksel işlemlerin yapılabilmesini sağlar.
(S) Sign Bit : Microdenetleyicinin matematiksel işlemler sonunda etkilediği bir flagdır. Flag
daima N ve V flaglarının toplamını ifade eder.
(V) Two’s complement overflow flag : Flag iki tabanlı sayılarla yapılan matematiksel işlemlerde byte üzerindeki taşmayı kontrol etmek için kullanılır. Yapılan matematiksel işlemler sonunda microdenetleyici flagı set veya reset yapar.
(N) Negative Flag : İşaretli sayılarla işlem yaparken işlem sonucunun işareti hakkında bilgi verir. Flagın set olması işlem sonucunun negatif, aksi pozitif olduğunu belirtir.
(Z) Zero Flag : Bir matematiksel işlem sonunda sonuç 0 ise veya bir atama işleminde alıcı
alana aktarılan değer 0 ise flag set olur. Bu özellik karşılaştırma işlemlerinde oldukça
sık kullanılır.
(C) Carry Flag : Bu flag ALU vasıtası ile peşpeşe yapılan toplama ve çıkartma işlemlerinin
gerçekleştirilmesi ve başka amaçlar için kullanılabilen bir flagdır. Toplama işlemlerinde flag elde (carry), çıkartma işlemlerinde borç (barrow) flagı olarak kullanılır. Çıkartma işleminde barrow’un dikkat dışı bırakılması gerektiğinde işlemden önce C=0 yapılmalıdır. Toplama işlemleri için ise iki değişik komut; ADD ve ADDC komutları kullanıldığından söz konusu ön hazırlığa ihtiyaç yoktur.
SP Registeri (Stack Pointer) : Bu register stack göstergesi olarak kullanılır. 5Dh ve 5Eh adreslerine yerleştirilmiştir. Stack teorik olarak tüm ram üzerinde olabileceği için 16 bit’lik bir register olarak düzenlenmiştir. SP olarak 16 bit erişim sağlanabileceği gibi SPH (5Eh) ve SPL (5Dh) olarak 8 bitlik erişim de sağlanabilir.
MCUCR Registeri (MCU Control Register) MCUCR registeri genel olarak microdenetleyicinin güç kontrolü ve dış interruptların nasıl tetikleneceğini belirlemek için kullanılır. Registerin genel yapısı;
SE SM0..SM2 bitleri ile belirlenen microdenetleyici güç uyuma modunun aktif edilmesini sağlayan bittir. Bitin set edilmesi durumunda SM0..SM2 ile belirlenen güç uyuma modunu aktif hale getirir.
SM0..SM2 Microdenetleyici güç uyuma modlarının seçimini sağlayan bitlerdir.
Not 1 : Bu mod sadece external oscillator kullanıldığında geçerlidir.
Idle Sleep Mode : SM0, SM1 ve SM2 bitleri 0 yapıldığında microdenetleyici idle güç uyuma moduna geçer. Bu modda CPU ve flash dışındaki tüm birimler çalışır durumdadır. Mod aktif edildikten sonra herhangi bir dış interrup geldiğinde, herhangi bir iç timer owerflow olduğunda, USART’tan bir karakter alındığında microdenetleyici Idle moddan çıkar.
ADC Noise Reduction : SM0 1, SM1 ve SM2 bitleri 0 yapıldığında ADC gürültü bastırma moduna geçilir. Bu modda I/O, CPU ve flash kapatılır. Bu birimler dışındaki birimler çalışır durumdadır. ADC Noise Reduction güç uyuma modu yüksek çözünürlüklü ADC çevrimlerinde oluşabilecek parazitleri engellemek içindir. Bu nedenle mod adc okuma çevrimine girildiğinde kendiliğinden devreye girer.
Power-Down : MCUCR registeri içinde SM0,SM1,SM2 bitleri 010 yapılırsa microdenetleyici Power-Down güç uyuma moduna geçer. Bu modda externel interruptlar, Two wire serial Interface ve watchdog hariç her şey durdurulur. Power-Down modunda iken açık external interruptlardan birinin durum değiştirmesi moddan çıkmak için yeterlidir.
Power-Save : SM0, SM1 ve SM2 bitleri 011 yapıldığında microdenetleyici powersave
moduna girer. Power-save modu power down modu ile çok benzer şekilde çalışır. Modun Power-down modundan farkı, timer2 asenkron modda çalışıyorsa timer2’nin durdurulmamasıdır.
Standby : Bu mod, microdenetleyici external crystal/resonator ile çalışacak şekilde
düzenlenmişse geçerlidir. Standby, power-down modu ile aynı özelliklere sahiptir. Ancak
standby modundan çıkış için 6 clock gereklidir.
Microdenetleyiciye ait tüm güç uyuma modları özet olarak aşağıdaki gibi gösterilebilir.
Active Clock Domains : Aktif clocklar
Wake-up Sources : Uyandırma Kaynakları
(1) Clock kaynağı olarak external crystal/resonator seçilmişse
(2) ASSR registerinde ASR biti set edilmişse
(3) INT0 ve INT1 seviye tetiklemeli olarak seçilmişse
ISCxx ISCxx bitleri INT0 ve INT1 external interruptlarının nasıl tetikleneceğini gösteren bitlerdir. ISC00 ve ISC01 interrupt 0, ISC01 ve ISC11 interrupt 1 için tetikleme şekli belirler. Interrupt 0 için tetikleme tipleri aşağıdaki gibidir.
Interrupt 1 için tetikleme tipleri aşağıdaki gibidir.
MCUCSR Registeri (MCU Control and Status Register)
MCUCSR registeri microdenetleyicinin hangi kaynaktan resetlendiğini program içinde tesbit etmek için kullanılır. Registerin yapısı :
Bit 4..7 : Registerdeki 4-7 arasındaki bitler yedek bitlerdir ve değerleri daima 0’dır.
Bit 3 : WDRF Watchdog Reset Flag Microdenetleyici Watchdog tarafından resetlenmişse flag set olur.
Bit 2 : BORF Brown-out Reset Flag Microdenetleyici internal Brown-out devresi tarafından resetlenmişse flag set olur.
Bit 1 : EXTRF External Reset Flag Microdenetleyici reset ucu ile resetlenmişse flag set olur.
Bit 0 : PORF Power-on Reset Flagm Microdenetleyiciye ilk kez enerji verildiğinde flag set olur.
MCUCSR Registeri microdenetleyici resetlendikten sonra program yolu ile sıfırlanmalıdır.
OSCCAL Registeri (Oscillator Calibration)
Register, microdenetleyici internal RC oscillator ile çalıştırıldığında, oscillator’ü ayarlamak için kullanılır. Internal RC ilk kez çalıştırıldığında oscillator 1 Mhz, OSCCAL registeri 0 olarak ayarlanmıştır. Oscillator frekansı, OSCCAL registerinin değeri değiştirilerek % cinsinden ayarlanabilir. Registere yazılacak 0 dışındaki değerler oscillator frekansının artmasına neden olur. Bu yöntemle yapılan frekans değişimleri flash ve eeprom erişimlerini direkt etkiler. Bu nedenle flash ve eeprom erişimlerinde frekans %10 dan fazla artırılmamalıdır. OSCCAL frekans değişimleri aşağıdaki tabloda gösterilmiştir.
Farklı oscillator seçimlerinde OSCCAL register değerinin frekans üzerindeki etkisi :
SPMCR Registeri (Store Program Memory Control Register)
SPMCR registeri program hafızasının programlanması sırasında kullanılacak olan bitleri içerir. Microdenetleyici içinde çalışan bir program tarafından program hafızasının (Flash Rom) programlanması boot loader programlarının vazgeçilmez özelliğidir. Bu nedenle register içeriği boot loader başlığı altında detaylı olarak incelenecektir. Registerin genel yapısı
aşağıdaki gibidir.
SFIOR Registeri (Spesial Function In/Out Register)
PSR10 : Timer/Counter0 ve Timer/Counter1 tarafından kullanılan prescaller’ın (bölücü) resetlenmesini sağlar. Resetleme bit set yapıldığında ve timer/counter yeniden start edildiğinde gerçekleşir. Bit okunduğunda her zaman 0 değerini verecektir.
PSR2 : Timer/Counter2 tarafından kullanılan prescaller’ın (bölücü) resetlenmesini sağlar. Resetleme bit set yapıldığında ve timer/counter yeniden start edildiğinde gerçekleşir. Bit okunduğunda her zaman 0 değerini verecektir.
PUD : I/O portlara ait açılmış tüm pull-up dirençlerin kapatılmasını sağlar.
ACME : Microdenetleyici içindeki ADC kapalı ve ACME biti set ise Analog comparator’un negatif girişi ADC multiplexer tarafından seçilir. ACME biti logic 0 ise Analog conparator’un negatif girişi AIN1 ucundadır. Bitin detaylı açıklaması Analog Comparator bölümünde detaylı olarak anlatılacaktır.
Özel Amaçlı registerlerin microdenetleyici fonksiyonları açısından anlatımına başlamadan önce Atmel Mcs-51 komut setinin, program yazımı ve verilen örneklerin anlaşılabilmesi açısından kısaca anlatımında yarar bulunmaktadır.
Genel Assembler Bilgileri
Her bir assembler komutu bir, iki, üç veya dört kısımdan oluşabilir. Komut kısımları bir birinden virgül (,) vasıtasıyla ayrılır. Her bir komutun birinci kısmı komutun görevini ifade eder. Mesela MOV – gönder, ADD – topla, ANL – lojik çarp, JMP – atla, XCH – değiştir vs. Komutun geriye kalan kısımlarını onun operandları (üzerinde işlem yapılacak olan bilgiler) oluşturur. Bu anlamda sıfır, bir, iki ve üç operandlı komutlar söz konusu olacaklardır. Komutta her hangi bir operand olarak veri (data), adres ve register ismi kullanılabilir. Komularda sabit veri olarak 2’ li, 16’ lı ve 10’ lu sayı sisteminde ifade edilmiş sayılar kullanılabilir. Verilmiş olan sayını 2’ li sistemde ifade edilmiş olduğunu bildirmek için sayının başına 0b eklenir. Aynı amaçla 16’ lı sayının başına 0x eklenir. Eğer sayının sonuna veya başına hiç bir işaret eklenmemiş ise o zaman söz konusu sayının 10’ lu sistemde verilmiş olduğu varsayılır.
Örneğin : ldi r16, 0b10001001 ldi r15, 0x0F ldi r14, 112
Herhangi bir microdenetleyici komut seti ile programlama için kullanılan assembler derleyici arasında sıkı bir bağ bulunmaktadır. Assembler derleyiciler program yazımını kolaylaştırmak amacıyla komut setine ek olarak microdenetleyici komut setinden farklı komutlar sunabilmektedirler. Bu nedenle, bundan sonra anlatılacaklar Atmel firmasının AVR Studio 4 yazılımı esas alınarak anlatılacaktır. Yazılım bir assembler compiler’ın yanı sıra bir microdenetleyici simülatörü, bir flash programlayıcı ve debugger içermektedir. (Yazılım http://www.atmel.com/dyn/resources/prod_documents/aStudio4b460.exe linkinden ücretsiz olarak alınabilir.)
DEVICE : Komut, assembler derleyiciye hangi microdenetleyici için kod üreteceği konusunda bilgi üretir. Komut ile kullanılabilecek microdenetleyici isimleri aşağıdaki tabloda verilmiştir.
Assembler Operatörleri
Assembler komut operandları içinde, operandlar üzerinde direkt işlem yapmak için kullanılan işaretlerdir. Bu işaretler :
Logical Not
Sembol: !
Açıklama: Operatörde kullanılan değer 0 ise 1, sıfır olmayan bir değer ise 0 döndürür.
Örnek : ldi r16,!0xf0 ;r16 registerine 0 değerini atar.
Bitwise Not
Sembol : ~
Açıklama : Operatörde kullanılan değerin tüm bit değerlerini tersine çevirir.
Örnek : ldi r16,~0xf0 ; r16 registerine 0x0f değerini atar.
Minus
Sembol : –
Açıklama : Operatör kendisinden sonra kullanılan değeri negatif yapar.
Örnek : ldi r16,-2 ; r16 registerine -2 (0xfe) değerini yükler.
Multiplication
Sembol : *
Açıklama : Bu operatör iki değerin çarpımını döndürür.
Örnek : ldi r30,label*2 ;r30 registerine label*2 değerini atar.
Division
Sembol : /
Açıklama : Bu operatör soldaki değerin sağdaki değere bölümünün tamsayı cinsinden
sonucunu döndürür.
Örnek : ldi r30,label/2 ;r30 registerine label/2 sonucunu yükler
Modulo (AVRASM2)
Sembol : %
Açıklama : Operatör soldaki değerin sağdaki değere bölümünden kalanı tamsayı olarak
döndürür.
Örnek : ldi r30,label%2 ;r30 registerine label%2 sonucunu yükler
Addition
Sembol : +
Açıklama : Operatör iki değerin toplamını döndürür.
Örnek : ldi r30,c1+c2 ;r30 registerine c1+c2 sonucunu yükler.
Subtraction
Sembol : –
Açıklama : Operatör soldaki ifade ile sağdaki ifadenin farkını döndürür.
Örnek : ldi r17,c1-c2 ;r17 registerine c1-c2 sonucunu yükler.
Shift left
Sembol : <<
Açıklama : Operatör kendisinden önce kullanılan değerin bitlerini sağında kullanılan sayı
kadar sola kaydırarak sonucu döndürür.
Örnek : ldi r17,1<<4 ;r17 registerine 1 in 4 kez sola kaydırılmış halini yükler.
Shift right
Sembol : >>
Açıklama : Operatör kendisinden önce kullanılan değerin bitlerini sağında kullanılan sayı kadar sağa kaydırarak sonucu döndürür
Örnek: ldi r17,c1>>c2 ;r17 registerine c1 değerini c2 kez sağa kaydırarak yükler
Less than
Sembol : <
Açıklama : Operatörün solundaki değer sağındaki değerden küçükse 1, aksi durumda 0
döndürür.
Örnek : ldi r18,bitmask*(c1
Less or equal
Sembol : <=
Açıklama : Operatörün solundaki değer sağındaki değerden küçük veya eşitse 1, aksi
durumda 0 döndürür.
Örnek : ldi r18,bitmask*(c1<=c2)+1 ;r18 registerine işlem sonucunu aktarır.
Greater than
Sembol : >
Açıklama : Operatörün solundaki değer sağındaki değerden büyükse 1, aksi durumda 0
döndürür.
Örnek : ldi r18,bitmask*(c1>c2)+1 ;r18 registerine işlem sonucunu aktarır.
Greater or equal
Sembol : >=
Açıklama : Operatörün solundaki değer sağındaki değerden büyükse veya eşitse 1, aksi
durumda 0 döndürür.
Örnek : ldi r18,bitmask*(c1>=c2)+1 ; r18 registerine işlem sonucunu aktarır.
Equal
Sembol : ==
Açıklama : Operatörün sonundaki değer ile sağındaki değer eşitse 1, aksi durumda 0
döndürür.
Örnek : ldi r18,bitmask*(c1==c2)+1 ; r18 registerine işlem sonucunu aktarır.
Not equal
Sembol : !=
Açıklama : Operatörün solundaki değer ile sağındaki değer eşit değilse 1, aksi durumda
0 döndürür.
Örnek : .SET flag=(c1!=c2) ;flag değişkenine 1 veya 0 değerini aktarır
Bitwise And
Sembol : &
Açıklama : Operatörün solundaki ve sağındaki değerlerin bitlerini karşılıklı olarak and
logical işlemine tabi tutar.
Örnek : ldi r18,0x0A & 0x02 ;r18 registerine 2 değerini atar.
Not : And işleminde işleme tabi tutulan iki bit 1 ise sonuç 1 aksi halde sonuç 0 olur.
Bitwise Xor
Sembol : ^
Açıklama : Operatörün solundaki ve sağındaki değerlerin bitlerini karşılıklı olarak xor
logical işlemine tabi tutar.
Örnek : ldi r18,0x0A ^ 0x02 ;r18 registerine 0x48 değerini atar.
Not : Xor işleminde işleme tabi tutulan iki bit 1 ise veya 0 ise sonuç 0 aksi durumda sonuç 1 olur.
Bitwise Or
Sembol : |
Açıklama : Operatörün solundaki ve sağındaki değerlerin bitlerini karşılıklı olarak or logical işlemine tabi tutar.
Örnek : ldi r18,0x0A | 0x02 ;r18 registerine 0x4A değerini atar.
Not : Or işleminde işleme tabi tutulan iki bitten herhangi birisi 1 ise sonuç 1 aksi durumda sonuç 0 olur.
Logical And
Sembol : &&
Açıklama : Operatörün her iki tarafındaki değerlerden bir tanesinin 0 olması durumunda
0, aksi durumda 1 döndürür.
Örnek : ldi r18,0x0A && 0x02 ;r18 registerine 1 değerini atar.
Logical Or
Sembol : ||
Açıklama : Operatörün her iki tarafındaki değerlerden her ikisinin de 0 olması
durumunda 0, aksi durumda 1 döndürür.
Örnek : ldi r18,0x0A || 0x02 ;r18 registerine 1 değerini atar.
Conditional operator (AVRASM2)
Sembol : ? :
Düzen : Logic? exp1 : exp2
Açıklama : Logic olarak verilen ifade doğru ise exp1 değerini aksi halde exp2 değerini
döndürür.
Örnek : ldi r18, 1 > 2? 10 : 20 ; r18 registerine 20 değerini atar.
Hazır Fonksiyonlar
Hazır fonksiyonlar avr studio 4 assembler içinde bulunan hazır fonksiyonlardır. Bu fonksiyonlar :
• LOW(exp) 16 bitlik exp ifadesinin düşük byte değerini döndürür
• HIGH(exp) 16 bitlik exp ifadesinin yüksek byte değerini döndürür
• BYTE2(exp) exp ifadesinin 2. byte değerini döndürür
• BYTE3(exp) exp ifadesinin 3. byte değerini döndürür
• BYTE4(exp) exp ifadesinin 4. byte değerini döndürür
• LWRD(exp) exp ifadesinin 1. ve 2. byte değerlerini döndürür.
• HWRD(exp) exp ifadesinin 1. ve 2. byte değerlerini döndürür.
• PAGE(exp) exp ifadesinin 16-21. bit değerlerini döndürür.
• EXP2(exp) exp ifadesinin karesini döndürür.
• LOG2(exp) exp ifadesinin logaritmasını tamsayı olarak döndürür.
Data transfer komutları genel olarak, herhangi bir hafıza adresine değer atamak veya herhangi bir hafıza adresindeki bir değeri başka bir hafıza adresine aktarmak için kullanılan komutlardır.
Dallanma Komutları
Dallanma komutlarının özetlemesine geçmeden önce dallanma komutlarında sıklıkla kullanılan dört kavramın açıklanması gerekmektedir.
• Long address
• Absolute address
• Relative address
• Indirect address
Long Address : Bu tür adres yalnız atama ve çağırma komutlarında kullanılır. Eğer komutun adres operandı olarak 16 bitlik bir sayı kullanılırsa bu kod uzun adres olarak adlandırılır. Birçok microdenetleyici için adres hattı 16 bittir. Bu nedenler 16 bitlik bir adres long address olarak adlandırılır.
Absolute Address : Bu tür adres de yalnız atlama ve çağırma komutlarında kullanılır. Eğer absolute adres kullanan bir komutun adres operandı olarak 11 bitlik bir ikili kod veya büyük rakamı 7’ yi aşmayan 16’ lı kod kullanırsa bu kod absolute adres olarak adlandırılır. Görüldüğü gibi bu tür adreslemede adres hattının 5 büyük bitinin durumu hakkında somut bilgi verilmiştir. Absolute adreslemenin şartlarına göre söz konusu bitlerin bir önceki adresleme sırasında oluşmuş olan durumu değişmez kalmalıdır. Yani A15 – A11 bitlerinin eski durumu ile A10 – A0 bitlerinin yeni durumu birleşerek 16 bitlik tam bir adres oluşturur. Absolute adreslemede adresin 5 büyük bitinin kullanılması adreslemenin söz konusu bitlerin belli bir durumunda gerçekleştirilmesi demektir.
Relative Address : Relative adresleme şartlı veya şartsız kısa atlamalar için kullanılır. Bu tür adreslemede adres kodunun uzunluğu 8 bittir. Long ve absolute adreslerden farklı olarak bu kod varılacak olan bellek hücresinin adresini değil bu hücrenin program sayacının (Program Counter) göstermekte olduğu hücrelerden uzaklığı belirtir. Atlamalar ileriye ve geriye doğru olabildiğinden dolayı uzaklıkları da artı ve eksi işareti olabilirler. Başka bir deyimle relative adres işaretli bir sayı olmak zorundadır. Relative adresleme yöntemi ile 128 baytlık geriye 127 baytlık ileriye doğru atlama yapılabilir. Relative adreslemede atamaların doğru gerçekleştirilmesi için söz konusu adreslerin değerleri değil onlar arasındaki fark önemlidir. Yani programın bellek içerisinde herhangi bir şekilde kaydırılması relative adreslere göre kurulmuş olan atamaları etkilenmez. Atlama ilişkileri tamamen relative adreslere göre kurulmuş olan bir program ram yerleşim değişimlerinden etkilenmez.
Indirect Address : Indirect adresleme okuma ve yazma işlerinde kullanılır. Bu adreslemede komutun adres operand kısmında okunacak veya yazılacak hafıza hücrenin adresinin bulunduğu register gösterilir. Adreslemede kullanılan registerler olarak R0 veya R1 genel registerlerin biri veya pointer registerleri (X,Y,Z) kullanılır. R0 ve R1 registerleri 1 baytlık olduğu için belleğin yalnız ilk 256 baytını adresleyebilir ve bunlardan dolayı çok özel durumlarda faydalı olabilir. Ancak pointer registerleri 16 bitlik olduğu için mevcut adres uzayının başından sonuna kadar adresleyebilir.
Çıkış olarak belirlenen bir port pininden 20 mA (miliamper) akım çekilebilir. 20 mA’den daha fazla akım gerektiren uygulamalarda pin’in zarar görmemesi için yükün transistör ile sürülmesi gereklidir. Port pinleri üzerinden değişik yapılardaki yükleri sürerken dikkat edilmesi gereken diğer bir husus da sistem beslemesinden daha yüksek voltajlarda çalışan yüklerden gelebilecek voltaj sızıntılarının önlenmesidir. Bu tür voltaj sızıntılarının önlenmesi tıkama diyotu yolu ile gerçekleştirilir.
Digital Output Örnek :
#include "m8def.inc" .CSEG .ORG 0x000 ;Osilator ayarlanıyor ldi r16,0xFF out OSCCAL,r16 ;stack pointer ayarlanıyor ldi r16,high(RAMEND) out sph,r16 ldi r16,low(RAMEND) out spl,r16 ;port C çıkış için ayarlanıyor ldi r16,0xFF out DDRD,r16 ldi r16,0x01 out PORTD,r16 DNN: rol r16 out PORTD,r16 rjmp DNN
Digital Input-Output Örnek:
#include "m8def.inc" .CSEG .ORG 0x000 ;Osilator ayarlanıyor ldi r16,0xFF out OSCCAL,r16 ;stack pointer ayarlanıyor ldi r16,high(RAMEND) out sph,r16 ldi r16,low(RAMEND) out spl,r16 ;port C çıkış için ayarlanıyor ldi r16,0xFF out DDRC,r16 ldi r16,0x01 out PORTC,r16 ;port D giriş için ayarlanıyor ldi r16,0x00 out DDRD,r16 ldi r16,0xFF out PORTD,r16 clt ;T Flagı reset ldi r16,0x01 DNN: sbic PORTD,2 ;2. bit reset ise (Tuşa basıldı) rjmp PRG0 rcall TBIT PRG0: brts SAGA ;T flag set ise rjmp SOLA SOLA: rol r16 out PORTC,r16 rjmp DNN SAGA: ror r16 out PORTC,r16 rjmp DNN TBIT: brts RESETLE set ;T flagını set et rjmp CIKIS RESETLE: clt ;T flagını resetle CIKIS: sbis PORTD,2 ;2. bit set ise (Tuş Bırakıldı) rjmp CIKIS ret
Step Motor Sürme
#include "m8def.inc" .CSEG ;Osilator ayarlanıyor ldi r16,0xFF out OSCCAL,r16 ;stack pointer ayarlanıyor ldi r16,high(RAMEND) out sph,r16 ldi r16,low(RAMEND) out spl,r16 ;port C çıkış için ayarlanıyor ldi r16,0xFF out DDRC,r16 ;C portunun tüm bitleri set ediliyor ldi r16,0xFF out PORTC,r16 DNN: ;1. Adım ldi r16,0x01 out PORTC,r16 rcall BEKLE ;2. Adım rol r16 out PORTC,r16 rcall BEKLE ;3. Adım rol r16 out PORTC,r16 rcall BEKLE ;4. Adım rol r16 out PORTC,r16 rcall BEKLE rjmp DNN BEKLE: ldi r17,0xFF BEK0: ldi r18,0xFF BEK1: dec r18 cpi r18,0x00 brne BEK1 dec r17 cpi r17,0x00 brne BEK0 ret
7 Segment Display Sürme
#include "m8def.inc" .CSEG .ORG 0x000 ;Osilator ayarlanıyor ldi r16,0xFF out OSCCAL,r16 ;stack pointer ayarlanıyor ldi r16,high(RAMEND) out sph,r16 ldi r16,low(RAMEND) out spl,r16 ;port C çıkış için ayarlanıyor ldi r16,0xFF out DDRC,r16 ldi r16,0x00 out PORTC,r16 ;port D Çıkış için ayarlanıyor ldi r16,0xFF out DDRD,r16 ldi r16,0x00 out PORTD,r16 ; ; ; PRG: ;0 Yazdırılıyor ldi r16,0b00111111 out PORTC,r16 sbi PORTD,0 call BEKLE ;1 Yazdırılıyor ldi r16,0b00000110 out PORTC,r16 sbi PORTD,0 call BEKLE rjmp PRG BEKLE: ldi r17,0xFF BEK1: dec r17 cpi r17,0x00 breq CIK rjmp BEK1 CIK: ret
Microişlemci Nedir?
Microişlemci, program yolu ile aritmetiksel ve mantıksal işlemler yapabilme gücü olan, kendisine bağlı iç ve dış çevre birimleri yönetebilen ve bu birimler arasındaki ilişkileri düzenleyebilen bir entegredir. Bir microişlemci, yapabileceği matematiksel ve mantıksal işlemlerin, çevrebirim yönetim fonksiyonlarının dizayn sırasında belirlendiği bir entegredir. Bu nedenle her microişlemci bir diğerinden farklıdır. (8088, Pentium III, Pentium II, Sparc, Alpha vb.)
Microişlemciler genel amaçlar için dizayn edilmiş yapılardır. Bu nedenle temel işlevlerini yerine getirebilmek için dizayn edilen komut setleri oldukça fazladır. Örneğin intel microişlemci ailesinin ilk işlemcilerinden olan 8088’in 92 adet komutu bulunmaktadır. Microişlemcilerin komut setleri ve bu komut setlerinin nasıl işletildiği işlemcinin mimarisini belirler. Eğer komutların hafızada kapladığı alanlar farklı ise bu şekilde düzenlenmiş işlemciler CISC (Complex Instruction Set Computing) işlemciler adını alırlar. CISC mimari ile düzenlenmiş işlemcilerde, komutlar basitlik veya karmaşıklıklarına göre hafızada farklı uzunlukta yer kaplarlar.
Bu durum işlemcinin içinde komutların decode edilmesi ile ilgili oldukça karmaşık bir birimin varlığını zorunlu kılar. Ancak, complex komutlar programlarda kullanılması gereken komut sayısını azaltırlar. 1970 yılında ortaya çıkan CISC mimari ilerleyen yıllarda hafıza birimlerinin büyümesi ve ucuzlaması, kısıtları nedeniyle RISC mimarinin ortaya atılmasına öncülük etmiştir. 1974 yılında IBM, bir işlemcinin daha az komut sayısı ve basit komutlardan oluşan bir komut seti ile çalışabileceğini önererek RISC (Reduced Instruction Set Computing) mimariyi çıkarttı. Bu mimaride komut uzunlukları sabittir ve her komut basit bir işlemi yerine getirir. Bir risc cipi bu iki karakteristik özelliği sayesinde komutların yorumlamasını kolaylıkla ve hızla yapabilir. RISC mimarinin en önemli dezavantajı CISC programlara göre programlarının hafızada daha fazla yer kaplamasıdır.
Gerek RISC mimaride gerekse CISC mimaride dizayn edilmiş olsun bir microişlemci herhangi bir komutu işleyebilmek için bir komut döngüsünü yerine getirmek zorundadır. Komut döngüsünün nasıl düzenlendiği genel olarak işlemcinin performansını belirler. Birkomut döngüsü 3 ana başlıktan oluşur.
1. Fetch
2. Decode
3. Execute
1. Fetch : İşlenme sırası gelen komutun ram’den okunarak microişlemcinin içine alınması
2. Decode : Komutun nasıl işleneceğinin belirlenerek çözümlenmesi
3. Execute : Komutun çalıştırılması ve elde edilen sonuçların ilgili yerlere aktarılması
• Execution Unit (Core): Bu ünite komutları çalıştırır. Genel olarak matematiksel işlemlerin kontrolü ve mantıksal işlemleri gerçekleştirir. Execution Unit Artimetik hesaplamalar için ALU (Arithmetic and Logic Unit) denen aritmetik ve mantık ünitelerini kullanılır, ALU için işlemcilerin yapıtaşıdır denilebilir.
• Branch Predictor: Bu ünite, bir program çalışırken hangi komutun öncelikle çalışacağını belirleyerek Prefetch ve Decode ünitelerine hız kazandırır.
• Floating Point Unit: Bu ünite tamsayı olmayan floating point sayılarla yapılan matematiksel işlemlerin gerçekleştirilmesini sağlar.
• L1 Cache: Sistem belleğinden gelen veriler, bazı durumlarda CPU ‘nun hızına yetişmeyebilir. Bu problemi çözmek için CPU içinde, küçük bir miktar cache (tampon) bellek bulunur. Önemli kodlar ve veriler bellekten cache belleğe getirilir ve burada tutulur. İhtiyaç duyulduğunda işlemci bunlara dış bellekte bulunan verilerden çok daha hızlı ulaşabilir. İşlenecek makine kodlarının ve verilerin saklandığı cache bellekler ayrı düzenlenirler.
• BUS Interface: Çevrebirimlerden işlemciye veri – kod karışımını getirir, bunları ayırarak işlemcinin ilgili ünitelerine aktarılmasını ve işlem sonuçlarının dış ortama aktarılmasını sağlar. Bu arayüzün genişliği işlemcinin adresleyebileceği hafızayı belirler. Örneğin 32 bitlik hafıza genişliğine sahip bir işlemci 4 GB hafızayı adresleyebilir ve bu hafızadan aynı anda 32 bitlik veriyi transfer edebilir.
Microişlemcilerin genel amaçlı yapılar olmaları, komut setlerinin büyüklüğü, kullanıldığı sistemlerde ana eleman olmaları vb. nedenlerle çalışma hızları oldukça önemlidir. Bir işlemcideki bütün elemanlar saat vuruşlarıyla çalışır. Saat hızı bir işlemcinin saniyede ne kadar çevrim yapabileceğini belirler. 200 MHz saat hızı bir işlemci kendi içinde saniyede 200.000.000 çevrim yapabilir. Her çevrimde işlemcinin ne kadar işlem yapabileceği işlemcinin yapısına göre değişir. Genel olarak bir işlemcinin performansını;
İşlemcinin Mimarisi
Saat Hızı
L1/L2 Cache Miktarı
belirler. Ham işlemci performansını ifade etmek için MIPS (Million Instructions Per Second, saniyede işlenebilen komut sayısı) ve MFLOPS (Million Floating Point Operations Per Second, saniyede yapılabilen kayar nokta hesabı) birimleri kullanılır.
Microdenetleyici Nedir?
Bir mikroişlemcinin çevrebirimleri (ram, rom, bus controller vb.) olmaksızın genel amaçlı bir programı çalıştırarak bir problemi çözmesi beklenemez. Mikroişlemcilerin anlamlı bir şekilde çalışabilmesi için minimum input ve output ünitelerinin bulunduğu bir sistemin kurulması gereklidir. Bir mikroişlemci ve minimum input-output ünitelerinin tek bir entegre içinde toplandığı yapılara microdenetleyici adı verilir.
Microdenetleyicilerde, çoğunlukla risc mimariye sahip bir microişlemci, proğramların ve verilerin saklanabileceği 2K ile 512Kb arasında değişebilen flash rom, 64 byte ile 16Kb arasında değişebilen statik ram, 4 ile 64 arasında değişebilen I/O, kontrol edilebilen
timer/counter’lar, PWM, dışarıdan tetiklenebilen Interrupt kaynakları, Analog-digital çeviriciler, digital-analog çeviriciler bulunur. Bu özellikler microişlemci ile microdenetleyici
arasındaki en önemli farkı oluşturur.
Microdenetleyiciler genel amaçlı uygulamalardan çok özel amaçlı uygulamalar için düzenlenmiş yapılardır. Kullanabilecekleri iç kaynakları çeşitli olmasına rağmen bu kaynakların sınırlı olması nedeniyle daha çok özel amaçlı cihazların kontrolünde kullanılmaktadırlar. Günlük hayatta kullandığımız birçok cihazın kontrolü microdenetleyiciler tarafından gerçekleştirilmektedir. Cep telefonu, televizyon, radyo, alarm sistemleri, taşıtlar, hesap makineleri, giriş-çıkış kontrol sistemleri, kameralar, bilgisayar vb.
Kısıtlı miktarda olmakla birlikte yeterince hafıza birimlerine ve input – output uçlarına
sahip olmaları sayesinde tek başlarına (stand alone) çalışabildikleri gibi donanımı oluşturan
diğer elektronik devrelerle irtibat kurabilir, uygulamanın gerektirdiği fonksiyonları
gerçekleştirebilirler. Mikrodenetleyiciler çoğunlukla, yer aldıkları uygulama devresinin içine
gömülmüş, sadece oraya adanmış olarak kullanılırlar.
Bu özellikleri nedeniyle bilgisayarlardaki kullanıcı uygulama programlarını çalıştırma gibi esneklikleri olmamakla birlikte kontrol ağırlıklı uygulamalarda alternatifsiz seçenek olarak karşımıza çıkarlar. Onları böyle cazip kılan, çok düşük boyutlu olmaları (az yer kaplamaları), düşük güç tüketimleri, düşük maliyetlerine karşın yüksek performansa sahip olmaları gibi özellikleridir.
Microişlemci-Microdenetleyicinin Tarihsel Gelişimi
Microişlemcilerin gelişimi 1970 li yıllarda başlar. 1971 yılında İntel firması hesap makinelerinde kullanılmak üzere ilk microişlemcilerden sayılabilecek 4004 işlemcisini üretti. Bu işlemci 4 bit veri yoluna sahipti ve 640 byte adres uzayına sahipti. Bu işlemcinin rağbet görmesi üzerine daha genel amaçlı ve daha büyük hafıza birimlerini adresleyebilecek 8080 microişlemcisi üretildi. 1974 yılında üretilen bu işlemci 8 bit veri yoluna ve 64Kb adres uzayına sahipti. 8080 8 bit microişlemcilerde endüstri standardı olan bir entegredir. Intel 1976 yılında 8080 işlemcinin gelişmiş bir versiyonu olan 8085 işlemcisini piyasaya sürerek işlemci gelişimini sürdürdü.
Intel 8080 işlemcisini duyurduktan kısa bir süre sonra Motorola 6800 microişlemcisini üretti. Bu işlemci 8080 işlemci ile karşılaştırılabilir bir güce sahipti. Motorola 6800 işlemcisinin devamı olarak bu işlemci ile uyumlu 6809 işlemcisini üretti. Bu işlemci 16 bit veri yoluna sahipti.
6809 işlemcisinden sonra Motorola 68000 işlemci serisinin üretimine başladı. Bu işlemci iç yapısında 32 bit dış yapısında ise 16 bit veri yoluna sahip bir işlemcidir ve 6800 serisi işlemcileri desteklememektedir. 68000 serisi işlemciler 68008, 68010, 68012, 68020, 68030, 68040 ve Power PC ile günümüze kadar gelmiştir.
Intel firması 1978 yılında ilk 16 bit veri yoluna sahip microişlemcisi olan 8086’yı duyurdu. 8086 gerek iç veri yollarında gerekse dış veri yollarında 16 bit uzunluk kullanan bir
yapıya sahipti. Çevrebirimlerle uyum problemleri yaşanması üzerine intel 1979 yılında iç
yapısında 16 bit, dış veri yolunda 8 bit yapıya sahip 8088 işlemcisini duyurdu. Bu işlemciler
8080-8085 microişlemci serisi ile benzeşmesine rağmen bu seri ile tam uyumlu değildir.
8086 ve 8088 1981 yılında ilk üretilen IBM-PC lerin gelişiminin temelini oluşturmuştur. Bu
işlemciler geriye uyumluluk kaygıları ile gelişimini bugüne kadar sürdüren Intel x86 ailesinin
başlangıcı olmuştur.
Intel firması 1976 yılında 8080-8085 microişlemcilerinin devamı olarak bazı microişlemci çevre birimlerini içinde barındıran ve özel amaçlı uygulamalarda kullanılmak üzere 8048 ve 8051 microdenetleyicilerin üretimini gerçekleştirdi. Bu microdenetleyiciler üzerinde kullanılan yapı günümüzde de kullanılan birçok 8 bit microdenetleyicinin temelini oluşturan standardı sağlamıştır. 8048 ve 8051 ile başlayan microdenetleyici serisi farklı özelliklerle günümüze kadar gelmiştir. Intel firmasının PC lerin gelişimine temel oluşturan 8086-8088 serisinin 1Mb hafıza sınırlaması 80’li yıllarda birçok uygulama için ciddi problemler oluşturmaya başladı. Bu nedenle Intel 16Mb belleği adresleyebilen 80286 işlemcisini üretti. Bu işlemci 8088 işlemcisinin devamı olarak piyasaya sürüldü ve 8088 ile tam uyumlu olarak çalışabiliyordu. Intel firmasının bu işlemcisi IBM firmasının PC/AT makinelerinde kullanıldı.
1985 yılında Intel ilk 32 bit işlemcisi olan 80386 işlemcisini duyurdu. Bu işlemcinin 16 bit dış veri yoluna versiyonu 80386SX’in üretimini 1988 yılında gerçekleştirdi. 80386 işlemcinin devamı olarak piyasaya sürülen 80486, 80386 nın gelişmiş bir versiyonu görünümündedir.
80486 ile 80386 arasındaki en önemli fark 80486 içinde kayan noktalı sayılarla işlem yapabilecek bir FPU (Floatin-Point unit) bulunmasıdır. 80486 microişlemcinin ardından Intel, hızlarını, cache miktarlarını, işlem kapasitelerini artırarak x86 microişlemci serisini geliştirmeye devam etti. (Pentium I, Pentium pro, Pentium II, Pentium III, Pentium IV)
Neden Intel Tabanlı Microdenetleyici ?
Günümüzde microdenetleyicilerin birçok çeşidi bulunmaktadır. Intel, Microchip, Motorola, National, Atmel firmalarının ürettiği microdenetleyiciler bunlar arasında sayılabilir. Microdenetleyici gerektiren herhangi bir uygulama geliştirirken seçilecek microdenetleyicinin
uygulamanın gereklerini karşılayıp karşılamadığı önemlidir. Bunun yanı sıra kullanılacak olan
derleyici, programlayıcı, simülatör, elektriksel özellikler, kaynak temini, seçenek çeşitliliği,
kolay elde edilebilirlik, fiyat, Komut seti vb. özellikler de microdenetleyici seçiminde önemli
etmenlerdir.
Atmel firmasının ürettiği Atmega serisi microcontrollerların yukarıda sayılan birçok
özellikte öne çıktığı görülmektedir. Firma 8 bit Intel MCS-51 core’a sahip microdenetleyicilerin yanı sıra 16/32 bit veri yoluna sahip microdenetleyiciler, otomotiv
temelli microdenetleyicileri de Intel MCS-51 core ile kullanıma sunmaktadır.
Microdenetleyicilerin aynı core’u kullanıyor olmaları, komut setlerinin de birbirini
desteklemesi anlamına gelmektedir. Bu nedenle herhangi bir microdenetleyici için yazılan
program özelliklerin aynı olması durumunda hiçbir değişikliğe ihtiyaç duymadan farklı bir
microdenetleyicide çalışabilmektedir. Atmel microdenetleyiciler elektriksel bozukluklardan
etkilenmeyi minimize edebilmek için Wath dog timer, Brown-out dedektör vb. özellikler
içermesi nedeniyle sanayi uygulamalarında oldukça yoğun kullanılmaktadır.
MCS-51 Microdenetleyici Ailesinin Mimari Özellikleri
MCS-51 Microdenetleyici Ailesinin Genel Mimari Yapısı : Sanayi Otomasyonu için günümüzde mevcut olan mikroişlemciler ve microdenetleyiciler arasında en uygunlardan birisi MCS-51 ailesinden olan microdenetleyicilerdir. Bu microdenetleyicilerin çekici tarafı, bu aileden olan her bir microdenetleyicinin çok küçük boy bir bilgisayar olması ile birlikte içermekte olduğu girişçıkış potlarının her birinin ve diğer önemli fonksiyon registerlerin (Special Function Registers SFR) büyük çoğunluğunun üzerinde bayt ve bit maniplasyonu yapmaya direkt imkan sağlamasıdır.
MCS-51 ailesinden olan microdenetleyici tabanlı kontrol kartına sanayi otomasyonuna
yönelik küçük boy bilgisayar özelliği kazandırmaya imkan sağlayan özellikler sadece bir çip
içerisinde yer alan aşağıdaki mimari özelliklerdir.
• 8/16/32 bit RISC merkezi işlem birimi (CPU),
• Dahili EEprom
• Dahili Flash Rom
• Harici veya dahili olarak seçilebilen osilatör,
• Bayt veya bit olarak düzenlenebilen, pull-up dirençleri aktif veya pasif yapılabilen Giriş / Çıkış portları,
• Static RAM bellek (İç Ram),
• Dış program/veri belleği (Bazı microdenetleyicilerde),
• 8/16 bit Zamanlayıcı/Sayaç/Pwm,
• İç ve dış kaynaklara hizmet edebilen, farklı vektörlere sahip kesme (Interrupt) sistemi,
• Seri Port,
• ISP Port,
• JTag Port,
• Security bitler aracılığı ile program ve verinin korunabilmesi,
• Watch dog timer, Brown-out dedektör,
• Analog-Digital çevirici (Adc)
• 20 MHZ kadar çalışma frekansı,
• Çalışma frekansına bağımlı (MIPS) çalışma performansı
MCS-51 risc core’a sahip, Atmel firmasının atmega8 microdenetleyicisi yukarıda sözü
edilen mimari yapının tümüne sahiptirler. Atmega8 microdenetleyicisinin özellikleri aşağıdaki
şekilde özetlenebilir.
• Geliştirilmiş RISC mimari
– 130 adet komut
– 32 genel amaçlı register
– Her clock’ta 1 komut çalıştırma
• 8Kb program tarafından da yazılabilen program belleği
• 512 Byte EEprom
• 1 Kb statik ram
• 2 adet 8 bit timer/counter
• 1 adet 16 bit timer/counter
• 3 adet PWM kanalı
• 6 kanal 10 bit ADC
• Byte temelli çift yönlü seri kanal
• Programlanabilir seri USART
• Master/Slave SPI seri kanal
• Programlanabilir Watchdog timer
• Chip içinde analog comparador
• Power on reset ve programlanabilen Brown-out dedektör
• Internal düzenlenebilir RC oscillator
• İç/Dış kaynaklı Interrupt sistemi
• 5 değişik uyuma modu
• 23 programlanabilir giriş-çıkış ucu
• 0-16 Mhz çalışma frekansı
• 4.5 – 5.5v çalışma voltajı
Şekil 2.1.1’ de MCS-51 core mimarisinin blok diyagramını, şekil 2.1.2’de Atmega8
microdenetleyicinin blok diyagramı, şekil 2.1.3’ de ise bu microdenetleyicinin bacak bağlantı
şeması gösterilmiştir.
Şekil 2.1.1 MCS-51 core mimarisinin blok diyagramı
yukarıda özetler verilmiştir;
Şifre-Pass: 320volt.com
Yayım tarihi: 2009/03/18 Etiketler: asm, assembler, atmega mikrodenetleyici, atmega8 türkçe, atmel atmega8
Çok teşekkürler
Çok teşekkürler tam konusuna parmak başmışsın.
gerçekten net açıklamışsınız teşekkürler
Çok sağolun çok işime yaradı eline sağlık
Teşekkürler Hocam.
Ellerinize sağlık cok güzel bir kaynak olmuş
Yardımlarınıza teşekkür ederim.