İstanbul Teknik Üniversitesi Kontrol Mühendisliği Uçak Uzay Fakültesi Kontrol ve Aviyonik laboratuarında ATMEL ismi ile anılan mikro denetleyiciler üzerine çalışma yapıldı. Söz konusu stajda adı geçen laboratuarda sürdürülen bir projenin alt parçası olan yukarıda ismi anılan mikro denetleyici için düşünülen çeşitli algoritmalar koda döküldü ve her koda ilişkin uygulamalar yapıldı.
Staj ATMEL ailesine ait ATmega16 mikro denetleyicinsin genel özellikleri öğrenilerek başladı. 8 bitlik bir mikro denetleyici olan ATMEL ailesinin bu üyesi ile ATMEL hakkında genel bilgi sahibi olundu. Basit giriş/çıkış işlemlerinden, kesmeler, sayıcılardan zamanlayıcılara, pwm üretilmesinden seri haberleşmeye kadar bir çok modül kullanıldı ve uygulama yapıldı. Bu üyede öğrenilen bir çok özellik parça parça koda dökülüp Proteus Isis devre modelleme programı ile uygulamalar yapıldıktan sonra ATMEL ailesine mensup bir başka mikro denetleyici olan ATmega128 ile çalışmalara devam edildi.
ATmega 128 ile daha önce yazılan kodlar ve uygulamalar daha bütünlüklü olarak ele alındı. Kullanılan programlar süre ilerledikçe birleştirilip geliştirildi. Staj sonunda proje amacına uygun kod yazılarak, proje üzerinde denendi ve başarı ile çalıştığı görüldü. Staj boyunca parça parça ilerleyen çalışmalar staj sonunda olumlu sonuçlar verdi.
Projede amaç şu idi: Robota USART ile gelen konum bilgisine uygun olarak hareket etmek. Ancak robot bilgiyi aldıktan sonra bilgiye göre hareket edip etmediğini belirli aralıklar ile motorlarına bağlı enkoderlar aracılığı ile kontrol etmelidir. Projede bizden istenilen robotun harekete başlaması için USART’tan veri alabilmesi bu bilgiye uygun olarak PI kontrolcüsü kullanarak motorları ile uygun hızda uygun konuma gidebilmek için hareket etmesi ve her 16 milisaniyede bir doğru konuma gidip gitmediğini enkoderları vasıtası ile kontrol ederek meydana gelen hatayı yine PI kontrolcüsü aracılığı ile gidermesi.
Bu belgede staj boyunca ATmega16 ile başlayan süreç anlatılacak, ATmega 16 ve ATmega128 mikro denetleyicileri ile ele alınan konular anlatıldıktan sonra konuya uygun kod yazılacak ve ardından Proteus Isis programının ekran çıktıları ile koşturulan programın sonuçları verilecektir.
Belgenin sonunca ise projenin stajyerlerden istediği programın tamamı verilecektir. Belgenin genel dökümü aşağıdaki gibidir:
ATmega16
ATmega128
Temel İşlemler
Kesmeler
Harici Kesmeler
Zamanlayıcı, Sayıcı ve PWM Üreticiler
USART
ATmega16 Genel Özellikler ve Bacak (Pin) Diyagramı
Aşağıda ATmega16’ya ait bir kısım özellikler görülmektedir.
Yüksek performanslı düşük güçlü AVR® 8-bit Mikro denetleyici
Gelişmiş RISC mimarisi
32 x 8 Genel Amaçlı Çalışan Yazmaçlar (Kütükler-Registers)
Tamamıyla Statik (sabit) İşleyiş
16 MHz de 16 MIPS’e Kadar Çıkabilme
Çip üzerinde 2 çevrimli çarpım
Yüksek Dayanıklı Geçici Olmayan (Non-volatile) Bellek Bölümleri
16K Byte Flash Program Belleği
512 Byte EEPROM
1K Byte Dahili SRAM
Yaz/Sil Sayısı: 10,000 Flash/100,000 EEPROM
Veri (Data) Saklama: 20 yıl 85°C’de/100 yıl 25°C’ de(ilgili koşullar üretici bilgi sayfasında)
JTAG (IEEE std. 1149.1 Compliant) Arayüzü
Programlanabilir Flash, EEPROM, Sigortalar ve JTAG arayüzünde Kilit Bitleri
Arayüz Özellikleri
2 Adet 8-bit Zamanlayıcı/Sayıcı (Timer/Counters) ile Ayrık ‘Prescalers’ ve Karşılaştırma Modları
Bir adet 16-bit Zamanlayıcı/Sayıcı (Timer/Counter with Ayrık ‘Prescaler’ ve Karşılaştırma Modu ve ‘Capture’ Modu
Ayrık osilatör ile gerçek zamanlı sayaç
4 PWM Kanalı
8 Kanallı, 10-bit ADC 8 ‘Single-ended’ Kanal
Byte-yönelimli 2 kablolu seri arayüz
Programlanabilir Seri USART
Master/Slave SPI Seri Arayüz
Programlanabilir ‘Watchdog Timer’ ile Ayrık On-chip Osilatörü
On-chip Analog Karşılaştırıcı
Özel Mikro denetleyici Özellikleri
‘Power-on Reset’ ve Programlanabilir ‘Brown-out Detection’
Dahili Ayarlı RC Osilatör
Harici ve Dahili Kesme Kaynakları
6 Çeşit Uyku Modu : ‘Idle’, ‘ADC Gürültü Azaltma (Noise Reduction)’, ‘Power-save’, ‘Power-down’, ‘Standby’ ve ‘Extended Standby’
I/O ve Paketler(modüller)
32 Programlanabilir Giriş/Çıkış (I/O) Dizisi
40-pin PDIP, 44-lead TQFP, and 44-pad QFN/MLF
Çalışma Voltajı
2.7 – 5.5V ATmega16L için
4.5 – 5.5V ATmega16 için
Hız Seviyeleri
0 – 8 MHz ATmega16L için
0 – 16 MHz ATmega16 için
Güç Tüketimi @ 1 MHz, 3V, ve 25°C ATmega16L için
Aktif: 1.1 mA
Çalışmazken(Idle Mode): 0.35 mA
Kapatıldığında (Power-down Mode): < 1 µA
ATmega16 Pin Diyagramı
Aşağıda staj süresince üzerinde uygulamalar yapılan ATmega16’ya ait pin diyagramı görülmektedir.
ATmega16 Pin Tanımları
VCC: Dijital Besleme Gerilimi
GND: Toprak
Port A (PA7..PA0): Port A Analog Dijital Çevirici için analog giriş görevini yapar. Port A ayrıca A/D Çevirici kullanılmadığında 8-bitlik iki taraflı Giriş/Çıkış portu olarak görev yapar.Port A pinleri seçili tüm bitler için dahili pull-up direncine sahiptir. Port A çıkış kanalları simetrik sürüş karakteri ile ‘high sink ve source capability’e sahiptir. PA0 ve PA7 pinleri giriş olarak ayarlanıp, harici olarak pulled-low yapıldığında, eğer dahili pull-up dirençleri aktif ise bu pinler akımı beslerler. Port A pinleri, saat darbeleri olmasa da bir ‘reset’ durumu meydana geldiğinde ‘tri-stated’ olurlar.
Port B (PB7..PB0): Port B seçilen her biti için dahili pull-up direnci olan 8-bitlik iki yönlü Giriş/ ÇIKIŞ portu olarak görev yapar. bit). Port B çıkış kanalları simetrik sürüş karakteri ile ‘high sink ve source capability’e sahiptir.Port B giriş olarak ayarlandığında eğer pull-up dirençleri aktif hale getirilmişler ise harici olarak pull low yapılmış pinler akımı beslerler. Port B pinleri, saat darbeleri olmasa da bir ‘reset’ durumu meydana geldiğinde ‘tri- stated’ olurlar.
Port B ayrıca ATmega16 için üreticinin bilgi sayfasında yazılı olan çeşitli özelliklere sahiptir.
Port C (PC7..PC0): Port C seçilen her bit için dahili pull-up direnci olan 8-bitlik iki yönlü Giriş/Çıkış portudur. Port C çıkış kanalları simetrik sürüş karakteri ile ‘high sink ve source capability’e sahiptir.Giriş olarak ayarlandıklarında, harici pulled-low yapılmış Port C pinleri eğer pull-up dirençleri aktif hale getirilmiş ise akımı beslerler. Port C pinleri, saat darbeleri olmasa da bir ‘reset’ durumu meydana geldiğinde ‘tri-stated’ olurlar.
Eğer JTAG arayüzü açık ise, PC5(TDI), PC3(TMS) ve PC2(TCK) pinlerinde bulunan pull-up dirençleri bir reset meydana gelse de aktif olurlar
Port D (PD7..PD0): Port D seçilen her bit için dahili pull-up direnci olan 8-bitlik iki yönlü Giriş/Çıkış portudur.Port D çıkış kanalları simetrik sürüş karakteri ile ‘high sink ve source capability’e sahiptir. The Port D pinleri, saat darbeleri olmasa da bir ‘reset’ durumu meydana geldiğinde ‘tri-stated’ olurlar.
Port D ayrıca ATmgea16 ya ait üretici bilgi, sayfasında yer alan başka özelliklere de sahiptir.
RESET: Reset Girişi. Saat darbesi olmasa da genliği minimum darbe genliğinden (bu genlikle ilgili ayrıntı üretici bilgi sayfasında yer almaktadır) uzun olan bir düşük seviye (mantıksal sıfır-logic sıfır-low level) darbesi geldiğinde reset durumu meydana gelir.
XTAL1: Osilatör Bacağı
XTAL2: Osilatör Bacağı
AVCC: AVCC Port A ve A/D Çevirici için besleme gerilimi pinidir. ADC kullanılmasa da harici olarak VCC bacağına bağlanmalıdır. ADC kullanılır ise alçak geçiren (low-pass) filtre ile VCC bacağına bağlanmalıdır.
AREF: AREF A/D Çeivirci için analog referans pinidir.
ATmega128
Staj süresince kullanılan bir diğer mikro denetleyici 8 bitlik ATmega128’dir. ATmega128’in sahip olduğu özellikler ATmega16’dan daha fazla olmak üzere yukarıdakilere benzer olduğu için tekrar ele alınmayacak belgede yeri geldikçe ATmega128’in ATmega16’dan farklı olan tarafları anlatılacaktır. Şekil 2’de ATmega128’in bacak dizilimi görülmektedir.
Temel Çalışmalar
Stajda ilk çalışma temel giriş/çıkış işlemleri ile başlamıştır. Bu sayede Atmel ailesine mensup mikro denetleyicilere ait yazmaçlar (kütükler-registers) öğrenilmeye başlanmıştır.
İlk olarak ATmega16’nın bir devrede hangi bağlantılara sahip olacağı öğrenilmiştir. Şekil 3’te Atmega16’nın bağlanış şekli gösterilmiştir. Proteus Isis besleme bacaklarını otomatik olarak bağladığından şekilde VCC ve ‘Ground’ bacakları görülmemektedir. Şekilde görüleceği üzere şayet dahili osilatör kullanılmadığında harici osilatörün nasıl bağlanacağı, reset işlemi için nasıl bir bağlama şekli gerektiği gösterilmiştir. Bundan sonraki çalışmalarda Proteus dahili kristali istenilen biçimde değiştirmeye izin verdiğinden ve besleme bacakları otomatik olarak yapıldığından devre bu şekilde bağlanmadan uygulamalar yapılacaktır. .
Şekil 3
Uygulama 1:Temel Giriş/Çıkış İşlemleri
Şekil 4’te ilk uygulamaya dair AVR Studio’nun genel görünümü ile yazılan ilk program görülmektedir. AVR Sudio’nun sol tarafında programla ilgili ‘header files’, ’source files’ gibi programın derlenmesini ve çalışmasını sağlayan dosyalar bulunmaktadır. Ortadaki ekranda C kodu görülmektedir. Sağ yanda ise AVR’ye ait simülasyon ekranı bulunmaktadır. Bu ekranda programcıya ATmel16’ya dair tüm modüller (kesmeler,spi,usart gibi modüller yazmaçlar bayraklar…) sunulmaktadır.
Şekil 4
Şekil 5
Şekil 5’te yazılan ilk program görülmektedir. Programda öncelikle ATmega16’ya it giriş/çıkış kütüphanesi (i/o.h) eklenmiştir. Ardından geleneksel C dili yazımında olduğu üzere bir main() (ana fonksiyon) açılmıştır. DDRB = 0b11111111 yapılarak B portuna ait tüm pinler çıkış yapılmıştır. DDR ‘data direction register’in kısaltılmışı olup veri alış verişinin hangi yönde olacağına karar verir. Mantıksal (logic)‘0’ değeri giriş(input) anlamına gelirken, mantıksal ‘1’ çıkış(output) anlamına gelmektedir. Bunun ardından PORTB=0b01010101 yapılarak PORTB’den sırasıyla 0.,2.,4.,6. pinler mantıksal ‘1’ değeri verirken diğer pinler mantıksal ‘0’değeri verirler.
Şekil 6’da uygulamaya ilişkin devre çıktısı yer almaktadır:
Şekil 6
Uygulama 2:Bekleme Fonksiyonu İle LED Yakıp Söndürme
Şekil 7’de Uygulama 2 ile ilgili program görülmektedir. Bu programda önce iki adet kütüphane eklenmiştir. Birinci kütüphane giriş çıkış işlemleri ile ilgili olan, ikinci kütüphane ise bekleme işlemleri ile ilgili olan kütüphanedir. Ardından sayaç için tamsayı tipinde bir değişken tanımlanmıştır. Ana fonksiyonda D protu çıkış olarak ayarlanmış, PORTD binary cinsinden bir değere(0b01010101) eşitlenerek, hangi pinin 5V, hangi pinin 0V vereceği yazılmıştır. Ardından program bir döngüye sokulmuş(while(1)) ve içinde PORTD, “0b11111111” ile ‘ve’ lenmiştir. Bu işlemin ardından her bitin tersi alınmıştır. Sırasıyla gösterilecek olursa;
PORTD(‘ve’lendikten sonra)=0b01010101 olmuş, PORTD(‘ters’lendikten sonra)=0b10101010 olmuştur.
Bundan sonra 350 ms beklenmiş sonra bu yeni değer yeniden ‘ve’lenerek ve ‘ters’lenerek eski haline gelmiştir.
Şekil 7
Şekil 8
Şekil 9
Şekil 8 ve 9’da bu programa uygun çıktı görülmektedir.
Staj süresince bu ve bunun gibi bir çok uygulama kesmelerde,seri haberleşmede,pwm üretiminde… uygulandı. Bu gibi temel işlemler öğrenildikten sonra stajın ikinci safhasında kesmelere başlandı. İlk olarak harici kesmeler ele alındı.
Kesmeler
Kesme, gömülü sistemler için önemli bir kavramdır. Bir mikro denetleyicide bir program koşarken, kesmeye sebep olacak bir durum meydana geldiğinde (kesme bayrağını aktif hale getirecek-set edecek-bir durum) program nerede olursa olsun, hemen kesme ile ilgili olan alt programa dallanır. Kesme içindeki işlemler bitinceye veyahut kesme koşulu bir şekildi sonlandırılıncaya kadar bu dalın içinde kalır. Kesme koşulları sona erdiğinde program ana fonksiyona geri döner ve kaldığı yerden çalışmaya devam eder.
Atmega ailesine mensup olan mikro denetleyicilerde bir çok yazmaçta(register-kütük) kesmeye dair bayraklar ve yazmaçlar(kütük-register) bulunabilir.
Stajda ileriki uygulamalarda ele alınan projelerden fark edileceği üzere kesmeler bir çok yerde kullanılmaktadır. Bu sebepten daha stajın ilk günlerinden içlerinde kesmelere dair bit bulunduran, kesmeleri başlatan, bitiren… bir çok yazmaç ele alınmış ve bu yazmaçlara bağlı olarak uygulamalar yapılmıştır.
Bundan önce üreticinin bilgi sayfasında(datasheet) sayfa 45’ten alınan ATmega16’da bulunan kesme çeşitlerine bakılacak olursa:
Tablo 1
Tablo 1’de görüldüğü üzere ATmega16’da bir çok kesme çeşidi vardır. Şimdi bu kesmeleri kullanmayı öğrenmek için bakılan yazmaçlara ve onların görevlerine bakalım.
Staj süresince ilk ele alınan yazmaç Status Register ve onun içinde yer alan SREG’in
7. biri Global Interrupt Enable’dır.
Status register çalıştırılmış aritmetik işlermlerin sonuçları hakkındaki veriyi içerir. Bu bilgi programın akışını değiştirmek için kullanılabilir. SREG, Aritemek mantıksal ünitenin (Arithmetic Logic Unit-ALU) işlemlerinden sonra güncellenir. Bu sayede programın daha hızlı koşturulması sağlanır. AVR Status Register-SREG- şöyle gösterilir:
Tablo 2
SREG’in 7. biti Staj süresince yapılacak uygulamalar için oldukça büyük önem taşımaktadır:
Bit 7 – I: Global Interrupt Enable : Kesmelerin aktif hale getirilmesi için Global Interrupt Enable ayarlanmalıdır(‘1’ yapılmalıdır-set edilmelidir-aktif hale getirilmelidir). Bu aşamadan sonra ayrı ayrı her interrupt kendi bayrakları sayesinde aktif hale getirilebilir. Ancak Global Interrupt Enable Register temizlendiğinde(‘aktif halden çıkarıldığında’) hiçbir kesme çalışmaz.
Bu yazmacın kesmeler için başlama noktası anlamına gelen 7. bitine bakıldıktan sonra genelden özele ilerleyerek, bir başka yazmaç ele alındı. General Interrupt Control Register ismini taşıyan bu yazmacın bit yapısı şu şekilde idi:
Tablo 3
Tablo 3’ten anlaşıldığı üzere GICR, harici kesmeleri temsil eden INT0-1-2 bitleri ile IInterrupt vector select ile Interrupt Vector change Enable bitlerini taşımaktadır.
IVSEL ve IVCE, C kodu üzerinden işaretlenebildiğinden(Atmel’de vektör isimlerinin ayrı olup çağırıldıklarında bu bitler derleyici tarafından otomatik olarak ayarlanmaktadır) kod yazılırken dikkate alınmadı. Ancak harici kesmelerin aktif hale gelmesini sağlayan son 3 bit önemlidir. Bu nokta ileride anlatılacaktır.
Sonuç olarak stajın bu safhasında Atmel ailesine mensup bir mikro denetleyicide Kesme çeşitleri, haritası ve de kesme işlemleri için önce hangi adımın atılması gerektiği görüldüğü,bunun ardından ilk kesme çeşidi olan harici kesmeler ile ilgilenildi.
5. Harici Kesmeler
Harici kesmeler INT0,INT1,INT2 pinlerinin tetiklenmesi ile meydana gelir. INT0-1-2 pinleri çıkış olarak ayarlansalar da eğer aktif hale getirildilerse kesme meydana gelir. Harici kesmeler kendisine gelen elektriksel sinyalde düşen kenar, yükselen kenar veya herhangi bir mantıksal değişim sonucunda tetiklenebilir. MCU Control Register (MCUCR) isimli yazmaçta yapılan ayarlamalarla kesmenin ne zaman meydana geleceği ayarlanabilir. Kesme durumu meydana gelince program, harici kesme fonksiyonuna dallanır ve orada yazan kodu işlemeye başlar.
Tablo 4
Tablo 4’te harici kesme ile ilgili olan MCUCR(MCU Control Register) görülmektedir. Aşağıda ise bu bölümde işe kullanılacak olan bitler ele alınmıştır.
Bit 3, 2 – ISC11, ISC10: Interrupt Sense Control 1 Bit 1 and Bit 0
Harici kesme 1 (The External Interrupt 1 ) SREG ayarlanıp, GICR’de INT1 ile ilgili
bit ayarlandığında aktif hale gelir. ISC11 ve ISC10 ise INT1 pinine gelen elektriksel sinyalle ilgilidirler. Bu bitler hangi elektriksel sinyalde harici kesmenin aktif olacağını belirlerler. Tablo 4.1’de bu durum anlatılmaktadır.
Tablo 4.1 Interrupt 1 Sense Control ISC11 ISC10 Açıklama
0 0 INT1 ‘0’ (low level) iken kesme üretir.
0 1 Herhangi bir mantıksal değişim (Any logical change) kesme üretir.
1 0 INT1 düşen kenarda kesme üretir.
1 1 INT1 yükselen kenarda kesme üretir.
Bit 1, 0 – ISC01, ISC00: Interrupt Sense Control 0 Bit 1 and Bit 0
SREG ve ona ilişkin kesme maskesi aktif hale getirildiğinde INT 0 aktif hale gelir. Bu
bitler de yukarıdaki bitlerle aynı görevi yaparlar. INT0 harici kesmesinin hangi elektriksel değişim sonucunda medya geleceğini anlatan bu bitlerin hangi durumda ne yapacakları Tablo 4.2’da anlatılmaktadır.
Table 4.2 Interrupt 0 Sense Control ISC01 ISC00 Açıklama
0 | 0 | INT0 ‘0’(low level) iken kesme üretir. |
0 | 1 | Herhangi bir mantıksal değişimde INT0 kesme üretir. |
1 | 0 | INT0 düşen kenarda kesme üretir. |
1 | 1 | INT0 yükselen kenarda kesme üretir. |
INT2 ile ilgili kesme aşağıdaki yazmacın sorumluluğundadır.
MCU Control and Status Register – MCUCSR isimli bu yazmacın bit haritası aşağıdaki gibidir.
Tablo 5
Bu bitlerden INT2 ile ilgili olan bit ISC2’dir.
Bit 6 – ISC2: Interrupt Sense Control 2
Asenkron Harici Kesme 2, SREG’e ait I-bitinin(Interrupt) ve de GICR de INT2’ye ait
bitin aktif edilmesi ile çalışabilir. ISC2 ‘0 yapıldığında’, INT2 harici kesmesi düşen kenarda aktif hale gelir. ISC2 ‘1’ yapıldığında ise yükselen kenarda aktif hale gelir.
INT0-1-2 harici kesmlerini aktif hale getiren yazmaç Tablo 6’da bit haritası görülen GICR’dir.
Tablo 6
Her 3 kesmeyi de aktif hale getirmek için, SREG biti ayarlanıp, ilgili ISCxx bitleri de istenilen kesmeye girme biçimine getirilip GICR’de ilgili kesme biti ‘1’ yapıldığında harici kesme kullanıma hazır hale getirilmiş olur.
Uygulama 3:INT0 ve INT1 Harici Kesme Kullanımı
Şekil 7’de Uygulama 3’ e ait kod görülmektedir.
Kodda öncelikle kesme(interrupt.h) ve bekleme(delay.h) işlemlerine dair kütüphaneler eklenmiştir. ‘io.h’ isimli ‘header file’, ‘interrupt.h’ dosyasının içinde olduğundan yeniden eklenmemiştir. Ardından INT0 ve INT1 kesmelerinin vektörlerini ayarlayan ISR(INT0_vect) ve ISR(INT1_vect) fonksiyonları yazılmıştır. Bir harici kesme durumu oluştuğunda program bu iki fonksiyondan birine dallanmaktadır. Kesme fonksiyonlarının içinde ise PORTB’yi artırılıp azaltılarak görsel çıktı sağlanmak istenmiştir. Ana fonksiyonun içinde B portı çıkış D portu giriş olarak ayarlanmıştır. SREG’de I-biti diğer bir ifade ile kesmeleri aktif etmek için gerekli olan bit ‘1’ yapılmıştır. GICR’nin son 3 biti ‘1’ yapılarak INT 0-1-2 kesmeleri hazır hale getirilmiştir. Ardından ISCxx bitleri programda gibi INT1 için düşen kenarda INT0 için yükselen kenarda kesmeye girmek üzere ayarlanmıştır.
Şekil 10
Şekil 11’de devrenin başlangıç durumu görülmektedir. Şekil 12’de ise INT0’ın bağlı olduğu butona basılınca meydana gelen değişim gözlenmektedir. INT0 butonuna basıldığında INT0 toprakla kısa devre halindedir. Diğer bir deyişle düşen kenardadır. Çekildikten sonra ise 5V’a kısa devredir. İlk yükselen kenar. Böylece ilk basıp-çekme sonucunda bir kesme meydana gelir. Burada 21*1+22*1=2+4=6 dan butona toplam 6 kere basılıp çekildiği anlaşılmaktadır.
Şekil 13’te ise INT1 butonuna basılmış ve PORTB’nin değeri 1 azalmış şekilde görülmektedir. 6-1=5 ya da 20*1+22*1=1+4=5 eşitliklerinden bu durum anlaşılabilir. INT1’ butonuna basıldığı anda 5V’tan 0V’ta geçiş olduğundan basıldığı an düşen kenarla karşılaşılır ve PORTB bir azalır. Çekildiğinde ise bir şey olmaz.
Şekil 11
Şekil 12
Şekil 13
Bu çalışma ile ilk defa bir kesme kullanılmış oldu. Genel olarak yazmaçların nasıl işlediği anlaşıldıktan sonra zamanlayıcı/sayıcı/pwm üretici modüller ve onlara ait yazmaçlar öğrenilmeye başlandı.
6.Zamanlayıcı, Sayıcı ve Pwm Üreticiler
Tablo 7
Atmega16’da 8 bitlik 2, 16 bitlik 1 adet zamanlayıcı vardır.
Tablo 7’de timer0’a ait yazmaç haritası görülmektedir.
Bu haritada görülen bitlerden WGMxx ile başlayan bitler ‘wave generation mode’ (dalga üretim modu) anlamına gelmektedir. Tablo 8’de bir bakıma bu bitlerin ne iş yaptığı özetlenmiştir. ATmega16 ve 128’de zamanlayıcıların bir çok fonksiyonu vardır. bir bitin değeri ile oynanılarak pwm üretimin frekansı değiştirilebilir, genliği değiştirilebilir ve bütün bunların hemen hepsi birkaç bitte ufak oynalarla gerçekleşir. Uygulamalar yapıldıkça tüm bu bitler daha rahat anlaşılacaktır.
COMxx ile başlayan bitler compare match output mode ifadesinin kısaltılmış halidir. WGMxx’lerin durumlarına göre OC0 pinin davranışını belirlerler.
Tablo 8
Tablo 9
Tablo 10
Tablo 11
Üreticinin bilgi sayfasından alınmış olan yukarıdaki tablolardan şunlar anlaşılmaktadır. Zamanlayıcının nasıl bir dalga üreteceği seçilir. Ardından seçilen dalgaya uygun OC0 pinin davranışı COMxx isimli bitler aracılığı ile belirlenir. Son olarak da bütün bu dalga üretiminin hangi saat darbesi ile ne kadar sıklıkla yapılacağı CSxx (clock select) bitleri ile aşağıdaki tablodaki gibi belirlenir.
Tablo 12
Yine zamanlayıcı modülüne ait Tablo 13’te bit haritası görülen timer counter register isimli TCNT0 sayıcı uygulamalarında kullanılır.
Tablo 13
Tablo 14
Tablo 14’te ise output compare register isimli OCR0’a ilişkin bit haritası gösterilmiştir. OCR0 kendine atanan değeri sürekli olarak TCNT0 ile karşılaştırır. Bu karşılaştırmalar sonucunda bu ikisinin birbirlerini yakaladıkları nokta ya kesmeye girmenin tetikleyicisi olan ya da dalga üretimini başlatan noktadır. Ve bu noktada olan olaya göre OC0 pinin davranışı belirlenir.
Tablo 15
Tablo 15’te zamanlayıcı modülüne ait kesmelerden sorumlu timer interrupt mask register isimli yazmaç görülmektedir.
Bit 1 – OCIE0: Timer/Counter0 Output Compare Match Interrupt Enable OCIE0 ‘1’ yapıldığında(SREG’de kesmeler açılmış iken ) Timer/Counter0 Compare Match interrupt kesmesi aktif olur. Timer/Counter0’da bir karşılaşma meydana geldiğinde Timer/Counter0 Output Compare Match Interrupt Enable kesmesi meydana gelir.
Bit 0 – TOIE0: Timer/Counter0 Overflow Interrupt Enable
TOIE0 ‘1’ yapıldığında(SREG’de I-biti açılmış iken) Timer/Counter0 Overflow interrupt
kesmesi aktif olur. Timer/Counter0 ‘da taşma meydana geldiğinde Timer/Counter0 Overflow Interrupt Enable kesmesi meydana gelir.
Uygulama 4:Zamanlayıcı Modülü ile Sayaç Kullanımı
Şekil 14
Kodda her zamanki gibi gerekli kütüphane yazıldı. Ardından giriş çıkış portları ayarlandı. Sonra üreticinin bilgi sayfasından elde edilen değerler timer counter control register 0 (TCCR0) yazmacına atandı. Burada CSxx bitleri yükselen kenarları say şeklinde ayarlandı. COM00 seçilerek toggle modu ayarlandı. Böylece yükselen kenar sayısı TCNT0’a (timer counter 0) aktarıldı.Ardından ana fonksiyonda bu değer PORTD’ye yazdırıldı.
Şekil 15’te uygulamaya ilişkin kod çıktısı görülmektedir.
Şekil 15
Uygulama 5:PWM Üretimi
Şekil 16
Şekil 17
Şekil 18
Şekil 16’da bulunan kodda OC1A ve OC1B ye ilişkin port çıkış yapıldıktran sonra, üreticinin bilgi sayfasına bakılarak faz doğrultmalı, evirilmemiş -OCRxx yazmacındaki değere ulaşıncaya kadar ‘1’, o değerden sonra ise 0 veren- 8 bitlik PWM üretilmiş ve çıktısı Şekil 17 ve 18’de gösterilmiştir.
Atmega16’da veya 128’de bu ve bunun gibi bir çok pwm üretim şekli vardır. bunlardan bir diğer önemli olanı fast pwm olarak anılan normal pwm in 2 katı frekansı sahip olan pwm’dir. Bu ve bunun gibi konular ileri ki meselelerde görülecektir.
Uygulama 6:PWM Üretimi 2
Uygulama 16’da hem fast pwm hem de faz doğrultmalı pwm’ e ilişkin kod ile devre çıktısı ele alınmıştır.
Tablo 16
Tablo 16’da Atmega128 ile ilgili üreticinin bilgi sayfasında yer alan TCCR0 yazmacına ilişkin bitlerden WGMxx bitlerinin hangi yapıda hangi sonucu verceği görülmektedir.
Aşağıdaki kod ATmega128’de yazılmıştır. Kütüphane eklendikten sonra protatipler yazılmıştır. Program öncelikle portları hazırlar, ardından dış kesme hazırlanır. Dış kesmeye girdiğinde PORTE değeri 1 artırılır. Dış kesme hazırlandıktan sonra pwm hazırlanmış ve pwm_ver fonksiyonu ile üretilen pwm’in genliği ayarlanmıştır.genlik değeri ise PORTE ye atandığından, int0 bacağına yükselen kenar geldikçe kesmeye girip değerini bir artıracak bu da pwm’in genliğini 1 arıracaktır. Şekil 19 ve 20’de bu durum görülmektedir. Eğer fast pwm olmasaydı üretilen pwm bu takdirde aşağıda görüldüğü üzere osiloskop çıkışında aynı zaman diliminde olmasına karşılık 4 darbe görülecekti. Buradan da anlaşılacağı üzere fast pwm frekansı, faz doğrultmalı pwm’in frekansının iki katıdır.
Şekil 19
Şekil 20
Uygulama 7: Zamanlayıcı Taşma Kesmesi
Zamanlayıcı modülünün önemli uygulamalarından biri de taşma kesmesidir. Normal moda çalışan bir zamanlayıcı ileri doğru saymaktadır. Örneğin 0’dan 255Ee. ATmega 16’da böyle bir zamanlayıcı aksi belirtilmediği sürece 0’dan en büyük değer olan 255’e kadar sayar. Ardından yeniden sıfırlanır ve bu şekilde saymaya devam eder. Ancak eğer zamanlayıcı taşma kesmesi kullanılacaksa 255’ten sonra 256 demek artık değerin 8 bitin dışına taştığını bu değere ulaşmak için bir 9. bitin gerektiği an olarak düşünülebilir. Bu fazladan bit TOVx –x zamanlayıcısına ait timer overflow bayrağı- isimli bayrağı işaretler bu durumda zamanlayıcı taşma kesmesine girer. Kesme meydana geldiğinde bu bayrak sıfırlanır.
Şekil 21
7. USART
Evrensel Senksorn ve Asenkron Seri Alıcı ve Verici (The Universal Synchronous and Asynchronous serial Receiver and Transmitter) oldukça esnek bir seri iletişim aygıtıdır.
Stajda kullanılan ATmega128’e ait USART modülü çeşitli özelliklere sahiptir. Birbirinden bağımsız alıcı verici yazmaçları ile iki kat hızlı işlem yapabilme, asenkron ve senkron işlem yapabilme, Master veya Slave zamanlı senkron işlem yapabilme gibi.
ATmega128’de iki USART modülü bulunur. USART0 ve USART1.
ATmega128’de USART kullanılırken birden çok yazmaç kullanılmaktadır. Öncelikle birim saniyede gönderilecek bit sayısını ifade eden baud rate olarak adlandırılan değerim belirlenmesidir. Bilginin hangi hızda taşınacağı beirlendikten sonra USART başlatma işlemi ile ilgili kütükler hazır hale getirilir. Bunun ardından usart ile hangi işlem yapılacak ise (USART ile bilgi alma veya verme) buna uygun yazmaçların değerleri değiştirilerek mikro denetleyici ile haberleşme işlemi tamamlanabilir.
Uygulama 8: USART Modülünden Veri Yollama
Yukarıda görülen programa ait Proteus ekran çıktısı aşağıdaki gibidir:
Şekil 22
Yukarıdaki programdan da anlaşılacağı üzere bundan sonraki uygulamalarda da görülecek ortak özellik USART’a ait Baud Rate’i ayarlamak -bu ise üreticinin bilgi sayfasında verdiği formüllerde görüleceği üzere UBRR’yi ve Mikro denetleyicinin harici kristalini ayarlamakla olur- ardından alma işlemi veya verme işlemini etkin kılmaktır.
Uygulama 8: USART Modülünden Veri Alma
Bu uygulamada ise USART modülü ile veri alma işlemi gerçekleştirilmiştir. Ancak gönderilen verinin ATmgea128 tarafından gerçekten alınıp alınmadığını kontrol edebilmek amacı ile gelen veri tx bacağı ile Proteus’a ait Virtual Terminale gönderilmiştir.
Şekil 23
Şekil 23’te görüleceği üzere klavyeden “İSTANBUL TEKNİK ÜNİVERSİTESİ” yazılarak Virtual Terminal ile ATmega128’in rx bacağına gönderilen bilgi yine aynı mikrodenetleyici ile tx bacağı aracılığı ile Virtual Terminale gönderilmiştir. Diğer bir deyişle klavyeden girilen her harf önce mikro denetleyiciye gönderilmiş ardından bu bilgi mikro denetleyici tarafından Virtual Terminale yollanmıştr. Böylece ATmega128 ile hem veri alınmış ardından gönderilebilmiştir.
Uygulama 9: USART Modülünde RX Kesmesi
Şekil 24
Şekil 25
Şekil 26
Şekil 27
Bu uygulamada Usart’a ait rx kesmesi araştırıldı. Haberleşme hızı yani baud rate belirlendikten sonra alıcı verici kanallarını aktif hale getiren fonksiyonlar yazıldı. Bunun yanı sıra USART RX kesmesini hazırlayan kesme hazırla fonksiyonu ve kesmeye girildiği anda ne yapılacağını içinde barındıran USART0_RX_vect fonksiyonu yazıldı. Şekil 24’te ilk olarak ana fonksiyona uygun olarak A harfi çıktısı görülmektedir. Ana fonksiyon çalışmış ve A harfini yollamıştır. Şekil 25’te ise RX kanalına Virtual Terminal aracılığı ile bir bilgi (‘U’ harfi) yollanmıştır. Bunun üzerine RX kanalına bilgi gelir gelmez zaten koşulları hazırlanmış olan kesme devreye girmiş ve t değişkeni 1000 olduğu anda PORTB’yi şekil 26’da görüleceği üzere 1 artırmış ve t harfi 1000’in katı olduğu için ayrıca ‘B’ bilgisini yollamıştır. Şekil 20’de t, 3000 olduğundan PORTB.0 ve PORTB.1 yanmış (20+21=3) ve mikro denetleyici 3 defa ‘B’ yazmıştır.
Uygulama 9: USART Ve Diğer Modüllerin Kullanımı
Stajda yukarıda olan ve onlar gibi daha bir çok uygulama yapıldıktan sonra artık bir çok modülün bir arada kullanıldığı programlar yazıldı. Tüm bu karışık uygulamalarda amaç staj süresince üzerinde çalışılan robot için istenilen programı elde etmekti.
Bu uygulamada öncelikle bir adet mikro denetleyici sürekli aynı veriyi basmaktadır. Bu veri diğer mikro işlemciye iletilmekte, bunun üzerine veri alan mikro denetleyici RX kesmesine girerek PortB’yi artırmakta, aynı zamanda zamanlayıcı taşma kesmesine girerek PortF’yi artırmakta ve Timer2 ile de bir sayaç tutmakta ve bu sayacı her taşmada Virtual Terminale TX bacağı ile aktarmaktadır.
Öncelikle sürekli veri basan program:
Yukarıda görüleceği üzere program sürekli ‘e’ harfini veri olarak göndermektedir.
Bu veriyi alarak kullanan program ise:
bu iki programın çıktıları ise aşağıdadır:
Şekil 28
Şekil 29
Şekil 27’de görüleceği üzere programın yapısı itibari ile PORTF sürekli zamanlayıcı taşması kesmesine girilmesinden ve PORTB sürekli bilgi gelerek RX kesmesine girilmesinden dolayı artmaktadır. Şekil 28’de ise R1 Direncine bağlı butona basılarak sayacın bilgisi Virtual Terminale aktarılmaktadır. Bu çıktıya göre “butona” o ana kadar 5 defa basılmıştır.
Stajın bu safhasından sonra artık üzerinde çeşitli uygulamalar yapılan robota yönelik programlar yazılmaya başlandı. İlk programlar robotta etkin çalışmadı. Bunun sebeplerinden en önemlisi PID kontrolcüsünün katsayılarının tam olarak bilenememesidir. İlk yazılan programlarda uygun USART verilerine göre hareket eden robot tam verim sağlayamamaktaydı. Ayrıca kendini sürekli kontrol eden doğru mu gidiyorum sorusunu soran mekanizma 50 milisaniyede bir devreye girmekteydi. Halbuki bizden istenen “dt” örnek zaman aralığı 16 milisaniye idi. Bir kısım etkin çalışmayan programdan sonra PID katsayıları sorununa geri dönüldü. Ve robotun üzerine bir program gömülüp hareketine bakıldı. MATLAB aracılığı ile enkoderlardan gelen veri incelendi. Sonunda uygun katsayılar elde edildi. Aşağıda bu katsayıları elde etmek amacı ile robota gömülen yazılım görülmektedir:
Bu kod ile böylece robot için uygun PID katsayıları bulunmuştur. Katsayıların bulunmasının ardından artık robota en uygun yukarıdaki kod ufak birkaç değişiklikle robota uygulanmış ve başarı ile çalıştığı görülmüştür.
Bu projede çok kısaca sistemin çalışma şekli şöyledir:
Bir ortamın içerisinden çeşitli engeller ve staj boyunca üzerinde çalışılan robot vardır. Kamera aracılığı ile ortamın üstten görüntüsü alınmakta ve bu görüntü bilgisayar üzerinde işlenmektedir. Üzerinde Linux işletim sistemi koşan GUMSTİX isimli bir modül bu bilgiyi bilgisayardan almakta ve ROBOSTİX isimli bir başka modüle aktarmaktadır. ROBOSTİX içinde ATmega128 mikro denetleyicisi bulunan bir modüldür. Gelen bilgi –bilgisyarda çeşitli biçimlerde işlenmiş bilgi- USART aracılığı ile ATmega128 tarafından alınmakta ve ona uygun bir biçimde bir yerden başka bir yere gitmek üzere hareketlenmektedir. Her 16 milisaniyede bir hareketinin doğru olup olmadığını enkoderlarından aldığı bilgi sayesinde ölçmekte, PID kontrolcüsünü (çalışmada KD ‘0’ çıktığından PI kontrolcüsü de denebilir ) kullanarak motor hızını artırıp azaltarak robotun varılması istenen konum ile kendisinin gerçekte gittiği konumun aynı olmasına çalışmaktadır. Bu staj boyunca stajyerlerden istenen bu ATmega128’in USART’dan bilgiyi alması, enkoder bilgisini 16 milisaniyede bir kontrol etmesi PID kontrolcüsünü kullanarak, motorlara uygun PWM verilmesi şeklinde özetlenebilir.
Aşağıda yukarıda sayılan işlemlerin hepsini istenilen biçimde yerine getirebilen ATmega128’e gömülmüş olan program bulunmaktadır:
BİROL ÇAPA
KONTROL MÜHENDİSLİĞİ
2. SINIF ÖĞRENCİSİ
Yayım tarihi: 2014/09/20 Etiketler: ATmega128, Atmega16 Projeleri, atmel avr projeleri, atmel örnekleri, atmel programlama, atmel türkçe, pid kontrol