Arduino programını debugger ile çalıştırmak

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
24,568
Arduino için program geliştirirken en yaygın kullanılan IDE, Arduino IDE. Ama bu IDE de yazılan bir programı satır satır, adım adım çalıştırma olanağı yok. Bunu yapmak için debugger özelliği olan bir IDE kullanmak lazım. Bu konuda, kısıtlı kullanım için bedava olan MPLAB IDE kullanacağız. Bunun dışında, bir de debug adaptörüne ihtiyacımız olacak. Bu konu içerisinde bunun için PicKit4 kullanacağız.
 
Öncelikle MPLAB IDE yi indirip kurulumunu yapıyoruz. Ben Linux kullandığım için Linux sürümünü indirdim.

 
Abi konuyu bölüyor gibi oluyorum ama.
Yeni arduino ide yani 2.0 olarak dağıtmı yapılan program içinde Sol taraftaki menüde alttan 2. bölümde DEBUG diye bir bölüm var fakat nası kullanılıyor bilmiyorum.

1.8.19'un biraz altına inince 2.0 sürümünü görüyoruz
debug.png
 
Sonra PicKit'deki 8 pinlik debug arabirimi, Arduino'daki Atmega328P de kullanılan 6 pinlik debug arabirimine dönüştüren bir kablo kullanmamız lazım. Ben bu iş için 8'li şerit kablo kullandım. Şerit kablonun bir tarafı erkek diğer tarafı dişi. Aslında 7 li kablo da yeterli ama artık 8 li şerit ayırmış oldum, kablonun bir tanesini boş bırakacağız.

IMG_20220418_213622.jpg
 
Arduino'da kullanmamız gereken debug header aşağıda. Ok ile işaretli olan pin de 1 numaralı pin.

IMG_20220418_213918.jpg
 
Sonra arduino UNO devre şemasında bu ISCP header'i buluyoruz. Buradan hangi pinin ne olduğu belli oluyor.

1650309806965.png
 
PicKit4 kullanım kılavuzuna bakınca, PicKit4 arabirimini değişik arabirimlere nasıl bağlayacağımızı gösteren bir tablo var: Burada ilk sütun PicKit4 ün kendisi. Bizim dönüştüreceğimiz arabirim, AVR ISP.

1650309408481.png
 
Bu tabloya göre bağlantıları yapıyoruz. Bu arada ben 8'li şerit kablonun sağ ve sol dıştaki kablolarını söktüm, bu bağlantı şekline göre gerekli olmadıkları ortaya çıktı.

IMG_20220418_222931.jpg


IMG_20220418_222947.jpg


IMG_20220418_223003.jpg
 
Öncelikle IDE den denemeden önce IPE denen ve sadece çipi programlamaya yarayan uygulamayı çalıştırıyoruz. Uygulamadan ATmega328P yi seçiyoruz. PicKit4 debug adaptörünü de IPE nin otomatik olarak algılamış olması lazım. Sonrasında önce 328'i siliyoruz. Sildikten sonra da geri okuyoruz. Her iki adım da sorunsuz çalışıyor. Burada dikkat edilmesi gereken husus, Arduino'ya USB portu üzerinden voltaj verilmesi gerektiğidir. PicKit4, ATmega328P ye voltaj veremiyor. Yani Arduino UNO, bilgisayara USB portundan bağlı olmalı.

1650310524383.png
 
Şimdi burada ben IPE kullanarak ATmega328P yi sildim. Artık içinde boot kodu falan kalmadı. Yani bu Arduino'yu ben şu anda Arduino IDE ile kullanmaya kalksam, kullanamayacağım. Yazdığım programı Arduino'ya aktaramayacağım. Artık MPLAB IDE ile yazdığım program neyse, çalışan tek program o olacak.
 
MPLAB IDE yi çalıştırdım ve Arduino programının ELF dosyasını yükledim. Ama IDE bir türlü programlayamadı 328P yi. Sonra IDE den çıktım ve tekrar IPE yi çalıştırdım. IPE de artık programlayamıyor! Bendeki MPLAB biraz eskide kaldı, son versiyonu yükleyim tekrar denedim, sorun aynı. Artık ne programlama, ne silme, nede okuma çalışıyor. İnternette biraz araştırınca birisi 328P nin RESET bağlantısının ayrılması gerektiğini söylemiş. Normalde 328P nin reset hattının USB kontrol işlemcisi tarafından kontrol edildiğini, ama PicKit4 ün programlama yapabilmesi için RESET'in boşta olması gerektiğini söylemiş.

Neyse, Arduino PCB üzerinde zaten özel kesilebilen bir yer yapılmış RESET hattını ayırmak için. Ayırdım ve sorun gitti. Ulan daha önce programlanabiliyordu bu, ne oldu yani? Neyse, demekki MPLAP IDE/IPE kullanabilmek için Arduino UNO kartının ameliyat edilmesi gerekiyor :mad: Ama PCB'de kesilen yerin tekrar birleştirilmesi sorun değil, o yüzden rahatlıkla yapılabilecek bir değişiklik.

IMG_20220419_002911.jpg
 
Evet şimdi basit bir blink programı yazalım ve çalıştıralım. Önce yeni proje oluşturuyoruz:

1650368872504.png
 
Sonra kullandığımız işlemciyi ve debug adaptörünü seçiyoruz

1650368998422.png
 
Sonra kullanacağımız derleyiciyi seçiyoruz. Ben daha önceden microchip sitesinden 8 bit AVR işlemciler için olan derleyiciyi indirip makinaya kurmuştum.

1650369094057.png
 
Sonra projenin dizinini seçiyoruz ve işlemi tamamlıyoruz.

1650369173095.png
 
MPLAB IDE projeyi oluşturuyor. Halihazırda hiçbir kaynak kodu yok, programın main fonksiyonunun bulunacağı bir C kaynak kodu ekliyoruz

1650369307713.png
 
Önce hiçbir şey yapmayan bir program yazıyoruz ve derlediğini teyit ediyoruz

1650369636944.png
 
Sonra debug etmeye kalkınca sorunla karşılaşıyoruz. Debug adaptörünün mevcut modu debugWire, ama IDE kodu işlemciye programlamak için ISP modunu istiyor. ISP moduna geçsek, sonra debug etmek için tekrar debugWire moduna dönmek isteyecek. Çok gıcık bir durum.

1650369804461.png
 
Neyse, ISP moduna geç dedim ve programladı. Sonra debug et dediğim zaman bu sefer de debugWire modunu istedi. Bir sürü ıvır zıvır ritüel'den sonra tekrar debugWire moduna geçti ve şu anda debug edebiliyorum.

1650370108808.png
 
Şimdi asıl yazacağımız blink programını yazalım. Bunun için öncelikle kullandığımız işlemcinin registerlerinin adres tanımlarının gelmesi için xc.h isimli header'i program dahil etmemiz lazım. Sonra da blink zamanlamasını tutabilmek için, _delay_ms fonksiyonunun tanımlandığı <util/delay.h> header'i programa dahil etmemiz lazım. Ayrıca _delay_ms fonksiyonunun doğru çalışması için, işlemcinin saat hızını da tanımlamamız lazım.

C:
#include <xc.h>

/* Arduino varsayilan saat hizi 16 MHz */
#define F_CPU 16000000L
#include <util/delay.h>

int main()
{
    /* PB5 pinini OUTPUT yap */
    DDRB = 0x20;

    while (1)
    {
        PORTB = 0x20;
        _delay_ms(500);
        PORTB = 0x00;
        _delay_ms(500);
    }

    return 0;
}

Şimdi bu programda ne yaptık? Öncelikle Arduino 16 MHz de çalıştığı için F_CPU yu 16 milyon olarak tanımladık. Böylece _delay_ms fonksiyonu milisaniye olarak doğru gecikmeyi üretir oldu.

Sonra Arduino devre şemasına bakarak üzerindeki LED'nin hangi pine bağlı olduğunu tespit ettik. LED, U5B bufferi üzerinden atmega328P nin PB5 portuna bağlı, yani PORT B ye bağlı.

1650374449540.png


Sonrasında PORTB nin 5 numaralı pinini output yaptık. Ondan sonra da sonsuz döngü içinde PORTB nin 5 numaralı pinini 1 ve 0 yapıyoruz.
 

Forum istatistikleri

Konular
7,175
Mesajlar
121,831
Üyeler
2,902
Son üye
ssefeate

Son kaynaklar

Son profil mesajları

Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
Freemont2.0 wrote on posta's profile.
Merhabalar :)
az bilgili çok meraklı
Prooffy wrote on semih_s's profile.
Merhaba, sizden DSO2C10 hakkında bilgi rica ettim. Yanıtlarsanız sevinirim...
Unal wrote on taydin's profile.
Timur Bey, Arduino kontrollü bir akü şarj cihazı yapmaya çalışıyorum. Aklımdaki fikri basit bir çizim olarak konu açmıştım. Özellikle sizin fikirlerinizi çok önemsiyorum.
Back
Top