1 stanbul Teknik Üniversitesi Kontrol Mühendisliği 20 ş Günü Süreli

Transkript

1 stanbul Teknik Üniversitesi Kontrol Mühendisliği 20 ş Günü Süreli
İstanbul Teknik Üniversitesi
Kontrol Mühendisliği
20 İş Günü Süreli İlk Staj Programı
İlk staj programı 9 Haziran 2008 Pazartesi günü başlamış olup 20 iş günü sürmüştür.
Bu süreç boyunca 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:
1. ATmega16
2. ATmega128
3. Temel İşlemler
4. Kesmeler
5. Harici Kesmeler
6. Zamanlayıcı, Sayıcı ve PWM Üreticiler
7. USART
1
1. 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
2
Pin Diyagramı
Aşağıda staj süresince üzerinde uygulamalar yapılan ATmega16’ya ait pin diyagramı
görülmektedir.
Şekil 1
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 ‘tristated’ olurlar.
Port B ayrıca ATmega16 için üreticinin bilgi sayfasında yazılı olan çeşitli özelliklere sahiptir.
3
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.
2. 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.
Şekil 2
4
3.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.
5
Şekil 4
Şekil 5
6
Ş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.
7
Şekil 7
Şekil 8
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ı.
4. 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:
9
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:
10
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.
11
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
12
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.
13
Ş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
14
Şekil 12
Şekil 13
15
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
Atmega16’da 8 bitlik 2, 16 bitlik 1 adet zamanlayıcı vardır.
Tablo 7
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
16
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
17
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.
18
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
19
Uygulama 5:PWM Üretimi
Şekil 16
Şekil 17
Şekil 18
20
Ş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.
21
22
Şekil 19
Şekil 20
23
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
24
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
25
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.
26
Ş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.
27
Uygulama 9: USART Modülünde RX Kesmesi
28
Şekil 24
29
Şekil 25
Şekil 26
30
Ş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:
31
Yukarıda görüleceği üzere program sürekli ‘e’ harfini veri olarak göndermektedir.
Bu veriyi alarak kullanan program ise:
32
bu iki programın çıktıları ise aşağıdadır:
33
Şekil 28
Şekil 29
34
Ş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:
35
36
37
38
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:
39
40
41
42
BİROL ÇAPA
KONTROL MÜHENDİSLİĞİ
2. SINIF ÖĞRENCİSİ
43

Benzer belgeler