Geliştirdiğimiz elektronik cihazları daha sonradan da yeni özellikler eklemek, var olan hata düzeltmeleri yapmak için uzaktan güncelleme yapmak istemezmisiniz. Kullanıcılar bilgisayar veya cep telefonu yardımıyla pic'e yüklü firmware güncelleme imkanı sunmak ürettiğiniz ürünün kalitesini bir çıta daha yükseğe taşır. Bu makalede sizlere MCC Bootloaderın PIC16f1827 mikrodenetleyiciye nasıl kurulacağını anlatacağım. Microchip bootloaderlar için %100 çalışma garantisi vermiyor. Gerektiğinde bizimde değişiklik yapmamız gerekiyor. Genel kullanımla ilgili kaynağa microchip in kendi dökümanlarından ulaşabilirsiniz.

PIC için bootloader yazılımı mcc tarafından oluşturuyor. Bilgisayar için yazılımda microchip tarafından yazılmış. Yeri geldikçe yorumlarımı yapacağım. Proje 3 temel bileşenden oluşuyor. Bunlardan ikisi microchip firması tarafından bize hazır olarak veriliyor. İhtiyaca göre sizde alternatiflerini geliştirebilirsiniz.

Bootloader Yazılımı: Bilgisayardan seriport üzerinden gelen yazılımı PIC'in hafızasına yazılmasını sağlayan ara yazılımdır. Şu an sadece UART desteği mevcuttur. PIC'le aranız iyiyse rahatlıkla diğer kaynaklardan veriyi alacak şekilde yapabilirsiniz. MCC tarafından otomatik üretilmektedir.

Uygulama Yazılımı: Asıl projemizdir. PIC içinde çalışan yazdığımız uygulamadır.

Host Yazılımı: Hex dosyasını bilgisayardan bootloader yazılımına gönderen programdır. Microchip'in geliştirdiği hazır bir yazılım olmasına rağmen hex dosyasını herkese vermek istemediğimden dolayı C# ile özel bir yazılım yapılsa tadından yenmez.

Editör olarak MPLABX IDE v6.05, derleyici olarak XC8 v2.41 kullanıyorum. Diğer kütüphane versiyonlarıda aşağıdaki gibidir.

Şimdi aşağıdaki adımları takip ederek sizde Bootloader yazılımı oluşturabilirsiniz.

1. File -> New Project seçiniz.

2. Standalone Project seçip İleri butonuna basınız.

3. Kullandığımız mikrodenetleyici olarak PIC16F1827 seçiniz.

4. İleri butonuna basınız.

5. Burada kullanmak istediğiniz derleyici versiyonunu seçiniz. Farklı versiyonlarda çalışıp çalışmama garantisi verilmemektedir. Deneyerek tecrübe edebilirsiniz.

6. Proje adını veriniz. Projenin kaydedileceği klasörü seçiniz. Proje adı ve klasöründe Türkçe karakter kullanmayınız. Klasör ve dosya isimleri çok fazla uzun olmasın. Bu dediklerim garip gelebilir fakat bazen derleyici bu kurallara uymadığımızdan anlamsız bir hata verir ve hatanın nedenini bir türlü bulamayabilirsiniz. Dosyaadını ve klasör ana dizine kaydettiğinizde tüm sorun çözülür.

Yazdığımız c ve h dosyası içinde türkçe karakter kullanabilmek için Encoding ISO-8859-9 seçiniz. İşlemler bitince Finish butonuna basınız.

7. Araç cubuğundaki MCC simgesine basıp Microchip Code Configuratorü (MCC) çalıştırınız.

8. MCC'nin açılması bilgisayarınızın işlemcisine bağlı olarak birkaç dakika sürebilir. Biraz sabretmek gerekiyor. MPLABX 5.xx versiyonunda sanki daha hızlı çalışıyordu.

9. Kullandığımız PIC sadece MCC Classic'i desteklemektedir.

10. Finish butonuna basarak kütüphanelerin yüklenmesini bekleyiniz.

11. Bootloader için MEMORY ve EUSART kütüphanesini ekleyiniz. Şu an sadece USART iletişimini desteklemektedir. Siz kendiniz farklı iletişim protokolleri için geliştirme yapabilirsiniz.

12. Son olarak Bootloader Generatorü ekleyiniz. Sarı simge ise Bootloader modülünün test edilmemiş olduğunu göstermek içindir.

13. Kullandığım kütüphane versiyonunu öğrenmek için Device Resourcesdaki Content Manager butonuna basıp kütüphane versiyonlarını öğrenebilirsiniz. İster en son kütüphaneyi kullanın isterseniz önceki versiyonlara geçiş yapabilirsiniz.

14. Eklene modüllerin ayarlarını yapmaya başlayalım. MEMORY modülünde herhangi bir ayar yok.

15. EUSART ayarlarını aşağıdaki gibi yapınız.

16. Asıl önemli ayarların olduğu kısım Bootloader Generator kısmındaki ayarlardır. Burada

Application Reset Vector: Yazdığımız uygulamanın hangi adresten başlayacağının belirtildiği adrestir. Bu adresten önce bootloader yer alır. Eğer bootloader kodu çok büyükse bu adresi değiştirmeliyiz, biraz daha ileriye almalıyız.

IO Pin Indicator: Bootloader moduna girildiğinde bu pine bağlı led ışık verir.

IO Pin Entry: Normal ticari uygulamalarda bootloader moduna girmek için bir buton bulunması pek pratik değildir. Fakat test amaclı kullanmak için buton kullanacağız. Aktif low bir butona basıldığında bootloader moduna girecektir.

17. PIC'in çalışması için gerekli osilatör ve diğer ayarlarıda yapmalıyız. Buradaki ayarlar en son uygulamamızdaki ayarlar ile aynı olmalı. Çünkü projenin ilerlerisinde bootloader ve uygulamamızı birleştireceğiz. Konfigurasyon bitleri farklı olursa derleme işlemi sırasında hata alırız.

18. Power on Timer'ı aktif etmeyi tercih ediyorum.

19. Bootloader indicator ledi ve entery butonunu bağlayacağımız pinleri seçelim.

20. Uyarılara dikkate almayınız. Bootloader test edilmediğinden uyarı vermesi normal.

21. Generate butonuna basarak MCC nin kodları üretmesini bekleyiniz.


22. Bazı uyarıların olduğu kodların doğru olmama ihtimali olduğunu söylüyor. Evet butonuna basınız.

23. Birgisayarınızın hızına bağlı olarak birkaç saniyede kodlar üretilecektir.

24. Araç çubuğundaki MCC simgesine tekrar tıklayıp MCC'yi kapatınız.

25. Araç çubuğundan Clean and Build Main butonuna basıp derleyiniz. Buradaki amacımız üretilen bootloader kodunun sorunsuz derlenebildiğini test etmektir. Ayrıca bootloader kodunun derleme sonrası boyutunada bakmalıyız. İlk başta bootloader için 0 ile 0x2FF adresini belirlemiştik. Eğer bootloader bu boyuttan daha büyükse bu adres aralığını arttırmamız gerekir. Veya optimizasyon yaparak boyutu küçültmeyi deneyebiliriz.

26. Aşağıdaki çıktıdan görebileceğiniz gibi bootloader hafızanın %19.8 ni kapladı. Adres oalrak 32A ya kadar ulaştır. Bu istediğimiz boyuttan fazlaydı.

27. Bootloaderın hafızada nereleri kullandığını görmek için Program Memory i inceleyebiliriz.

28. Bootloader tahminimizden büyük olduğu için ilk olarak optimizasyon yapmayı deneyelim.

29. İngiliz anahtarı simgesine tıklayıp Project Properties i açın.

30. Aşağıdaki adımları takip edip Optimizations leveli s olarak seçip tekrar derleyiniz.

31. Derleme butonuna basın.

32. Boyutuna baktığımızda bootloader kodu istediğimiz aralığa sığacak kadar küçülmüştür. Bootloader kodu normalden büyük olmasını istemeyiz. Bootloader ne kadar küçük olursa yazacağımız program için o kadar fazla yere sahip oluruz.

33. Bootloader programını hafızanın ilk başına sınırlamak için gerekli ayarları yapalım.

34. Bootloader kodumuzu başarılı bir şekilde derledik.


Sırada uygulama yazılımını nasıl yazacağımızı göstereceğiz. Uygulama yazılımını yazarken yapmamız gereken 2 temel durum var. Birincisi bootloader ile aynı yerde olmaması için başlangıç adresini hafızasının ilerisinden başlatacağız. Buurada biz 0x300 den başlatacağız. İkinci olarak konfigurasyon bitlerini bootloader ile aynı yapacağız. Bu projeyi her detayı ile anlatmayacağım. Yoksa bu yazı bitmez.

1.Yeni projemizde yine PIC16F1827 seçiyoruz. Proje adını yazıp kaydettikten sonra Microchip Code Configurator (MCC) açıp gerekli ayarları yapınız.

2. Project Propertiese gidiniz.

3. Manage Configurations'a tıklayın.

4. Duplucate tıklayarak toplamda 3 adet kopya oluşturunuz.

5. Bu konfigurasyonlar şu şekilde olacaktır.

Stand Alone: Herhangi bir offset ayarı yok. Tek başına bootloader olmadan çalışan program için gerekli ayardır.

Offset: Offset ayarı yapılmış sadece uygulamanın yazılımının olduğu ayardır. Firmware update yapılacağı zaman bu hex dosyası kullanılacaktır.

Combined: Uygulama yazılımı ve bootloader yazılımının beraber olduğu yazılımdır. Ürün üretildiğinde bootloader ve uygulamayı tek seferde PIC e yüklemek için bu hex dosyası kullanılacaktır.

6. Aşağıda gördüğünüz gibi uygulama yazılımının başlangıç adresini yazınız.

7. Combinedda bootloader ve uygulama tek bir hex içerisine gömülecektir. Yine offset ayarı yapılır.

8. Bootloader yazılımı uygulama yazılımı içine gömülür.

9. Bootloaderı seçin.

10. Set Configuration ile bu üç konfigurasyon arasında geçiş yapabilirsiniz.

 

Standalone PIC'e yüklersek bootloader özelliği olmadan cihazımızı kullanırız.

Combined ticari uygulamalarda mantıklı olandır. Tek seferde bootloader ve uygulama yazılımı beraber yüklenmektedir. Yalnız eğer bootloader moduna girmek için buton yoksa sizin özel bir kod yazarak 0x300 adresini sildirip PIC resetletmeniz lazım. Yoksa bootloader moduna girmez.

PIC'e sadece bootloader yüklediyseniz, offset modunda derlediğiniz HEX dosyasını seriporttan PIC'e gönderebilirsiniz.

Örnek uygulama yazılımı olarak blink uygulaması yaptım. Ayrıca seriporttan gelen veriyi aynen geri gönderir.

#include "mcc_generated_files/mcc.h"

/*
                         Main application
 */


volatile uint8_t rxData;

void main(void)
{
    // initialize the device
    SYSTEM_Initialize();

    // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
    // Use the following macros to:

    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();

    // Enable the Peripheral Interrupts
    INTERRUPT_PeripheralInterruptEnable();

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();

    
    printf("Selam V0.1\r\n");
    __delay_ms(100);
    
    while (1)
    {
        // Add your application code
        pinLed_Toggle();
        __delay_ms(500);
        
        while (EUSART_is_rx_ready())
        {
            rxData = EUSART_Read();
            EUSART_Write(rxData);
        }
    }
}
/**
 End of File
*/

Bilgisayarda kullanmak için Microchip firmasının yazdığı bir bootloader host uygulaması var. Açıkcası ben beğenmedim. Java Runtime tüm sürümlerinde çalışmıyor. Bilgisayara Java Runtime v1.8.0_251 dan daha sonraki bir versiyon kurarsanız port seçimi esnasında uygulama aniden kapanıyor. O yüzden bu versiyonu bulup kurmanız gerekmektedir.

Unified Bootloader Host Application uygulamasını aşağıdaki linkten indiriniz.

https://www.microchip.com/en-us/tools-resources/develop/libraries/microchip-bootloaders/8-bit

1. İlk olarak PIC' sadece bootloader veya combined olarak derlediğimiz yazılımı yükleyelim. Boot butonuna basılı tutup PIC'i resetlediğinizde bootloader moduna girdiğini belirtenl led sürekli yanacaktır. Unified Bootloader Host programını çalıştırıp PIC'i seçiniz. Bootloader işleminin başarılı olması için Offset ve Program Memory adresleri doğru girilmeli yoksa bootloader işlemi gerçekleşmiyor. Aşağıda PIC16F1827 için kullandığım değerler var. EEPROM ve diğer adresler doğru olmayabilir test etmedim.

2. Tools->Console açınız

3. Sonrada Settings->Serial den seriport ayarlarını yapınız.

4. Program Device bastığınızda eğer başarılı olursanız aşağıdak gibi çıktı alırsınız.

Yazdığım örnek dosyaları aşağıdaki linkten indirebilirsiniz.

https://github.com/gencmucitler/bootloader

 

Kaynaklar:

https://www.microchip.com/en-us/tools-resources/develop/libraries/microchip-bootloaders/8-bit

https://ww1.microchip.com/downloads/en/DeviceDoc/40001779B.pdf

https://onlinedocs.microchip.com/oxy/GUID-C6916C91-B44E-4984-8A69-9C06B0E156FD-en-US-1/GUID-41C493BE-EE53-476B-B0B0-D106F168BCAD.html

http://www.picprojects.net/serialbootloader/

https://github.com/spanceac/PIC18-bootloader