MicroChipC Bootloader Kullanımı [16f877-76]

Başlatan erdinch, 29 Mayıs 2007, 04:37:31

erdinch

Kendi deneyimim olan microchipc adlı sitenin bootloader kullanımını dilim döndüğü kadar anlatmaya çalışacağım.sanırım bootloader nedir, ne işe yarar sorularının cevaplarını burada tekrar yazmaya gerek yok.Forumda daha önce çok tartışılmış..


Öncelikle devremiz şu şekilde oluyor

http://img157.imageshack.us/img157/9130/gg1gps9.jpg



Not:Bootloder için gerekli seri port bağlantılarını temsil eden devre çizimidir.

devremizi kurduktan sonra
http://www.microchipc.com/PIC16bootload/
linkini ziyaret edip bootloader için gerekli dosyaları bilgisarımıza indiriyoruz.Burada bizim için önemli olan dosya linki şudur:

http://www.microchipc.com/PIC16bootload/PIC16F87xA_bootloader_v9-50.zip

Bu dosyayı bilgisayarımıza açtıktan sonra dosya içinden uygun işlemci, seri port hızı ve uygun osilatör için kendi hex dosyamızı buluyoruz.Örneğin ben 877, 9600 bps ve 4Mhz için "60419 - bootldr-v26-16F876-77-04Mhz-9600bps.hex" dosyasını kullandım.

Hex dosyasını bir kereye mahsus olmak üzere pic programlayıcımızdan mikrodenetleyicimize yüklüyoruz.


Ardından kendi programımızı yazıyoruz.Örneğin;


#include<16f877.h>
      #use delay(clock=4000000)
      #fuses   xt, NOWDT, PUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
      #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
      #org 0x1F00, 0x1FFF void loader16F876(void) {}
      #use fast_io(c)
      #byte portb = 6


void main(){
set_tris_b(0x00);
set_tris_c(0b10000000);
while(true){


output_b(0b00000001);
sol:
   if (bit_test(PORTB,7)) goto sag;
   delay_ms(200);
   PORTB<<=1;
   goto sol;
sag:
   if (bit_test(PORTB,0)) goto sol;
   delay_ms(200);
   PORTB>>=1;
   goto sag;
}
}


Burada dikkat edilecek satır #org 0x1F00, 0x1FFF void loader16F876(void) {} satırıdır.Bu bootloaderımızı kullanabilmemiz için gerekli satırdır.


Seri port bağlantımız, devremiz ve hex dosyamız hazır ise indirdiğimiz dosyalar içerisinden "PICbootPlus.exe" programını açıyoruz.Bilgisayarınız com1 portunu kullandığınızı sayarak ayarları com1 ve 9600 bps olarak yapıyoruz.
"Search" butonuna basarak yukarıda yazdığımız programın hex dosyasını seçiyoruz ve ardından "Write" butonuna basıyoruz.Eğer herşey yolunda ise programın info satırında "Searcing for bootloader" yazısı belirecektir.Bu yazı çıktıktan sonra kurduğunuz devredeki reset butonuna basınız.Reset butonuna bastıktan sonra info satırında "Writing" yazısı belirecek ve birkaç saniye içinde programınız seri port üzerinden mikrodenetleyecinize yüklenecektir.

Umarım herkese faydalı olur.
İyi çalışmalar dilerim..

zafzaf82

@erdinch bu bootloader bölgesini istediğimiz gibi seçebiliyormuyuz. Yoksa bootloader hex dosyasına özgü ayrılmış bir bölgemi 0x1F00, 0x1FFF aralığı
#org 0x1F00, 0x1FFF void loader16F876(void) {}


Birde 18f452 için hangi hex dosyasını yüklemeliyiz. Ben bulamadımda.
Mikroişlemci bi araçtır, amaç değil.....

erdinch

Alıntı yapılan: "zafzaf82"@erdinch bu bootloader bölgesini istediğimiz gibi seçebiliyormuyuz. Yoksa bootloader hex dosyasına özgü ayrılmış bir bölgemi 0x1F00, 0x1FFF aralığı
#org 0x1F00, 0x1FFF void loader16F876(void) {}


Birde 18f452 için hangi hex dosyasını yüklemeliyiz. Ben bulamadımda.


Aralık bootloaderın kendisine özgü ayrılmış bir alan.Kendisini belleğin o aralığına yüklüyor.Yani biz kendimiz aralığı seçemiyoruz.


Verdiğim linkler sadece 16f877, 16f876 ve 16f877A için.

18f452 için ise  sitede ayrı bir bootloader mevcut.Şu an  3.96mhz ve 20 mhz hızları için hex dosyaları yayınlanmış durumda.
Kendim şahsen henüz deneyemedim.Uygun bir zamanda deneyip tecrübelerimi paylaşmaya çalışacağım.

arslan74

Merhaba,

Seri haberleşme sisteminden haberleşen bir PIC devreinde Bootloader kullanabilinir mi? Yani PIC içindeki program normalde bir başka birimle RS232 üzerinden haberleşiyor. Bu çalışan sistemin içindeki programı yenilemek istiyorum. O zaman da Bootloader ile Çalışan sistemi programlayabilirmiyim.

Sistem kapalı kutunun içinde ve dışarıya bağlantı olarak sadece rs232 cıkışı var, bu bağlantı şekliyle kullanabilirmiyim.


Selamlar.

erdinch

Alıntı yapılan: "arslan74"Merhaba,

Seri haberleşme sisteminden haberleşen bir PIC devreinde Bootloader kullanabilinir mi? Yani PIC içindeki program normalde bir başka birimle RS232 üzerinden haberleşiyor. Bu çalışan sistemin içindeki programı yenilemek istiyorum. O zaman da Bootloader ile Çalışan sistemi programlayabilirmiyim.

Sistem kapalı kutunun içinde ve dışarıya bağlantı olarak sadece rs232 cıkışı var, bu bağlantı şekliyle kullanabilirmiyim.


Selamlar.

elbette arslan74.Sistemin en güzel yani da bu.Programinizda yapacginiz degisiklikerde progralama kartina ihtiyac duymuyorsunuz.Tasarladiginiz sistemde kullandiginiz seri iletisim hattini mikrodenetleyicinizi programlamak icin de kullanabiliyorsunuz.

Kapali kutu içinde demissiniz.Birkereye mahsus denetleyiciyi kutudan cikarip bootloader'in hex dosyasini Pic programlayici ile yuklemelisiniz.Bu islemi yaptiktan sonra programinizdaki tum degisiklikleri seri iletisim hatti uzerinden gercekleyebilirsiniz.

not:ingilizce klavyeden yazdim.yazinin kusuruna bakmayin.

Iyi calismalar.

erdinch

ayrica su linkte deneme amacli kucuk bir uygulama yapmistim.Sistem hem bootloader kullaniyor hem de seri haberlesme ile haberlesiyor.

http://picproje.org/index.php/topic,15811


Eger sistemde bootloader kullanmiyor olsaydim sadece su satiri silecektim

#org 0x1F00, 0x1FFF void loader16F876(void) {}


tabi bir de pic icerisindeki bootloader hex dosyasini silip kendi proramimimn hex dosyasini yukleyecektim.

zafzaf82

Bootloader.exe programı sürekli Time of Comminication hatası verip duruyor. Sebebi ne olabilir. Senin dediğin herşeyi yaptım bi türlü çalışmıyor.
Mikroişlemci bi araçtır, amaç değil.....

erdinch

ben Downloader Windows in BC++ plus terminal dizinin içindeki PicBootPlus.exe dosyasini kullandim.Hicbir sorunla karsilasmadim.

Sorununu hangi asamada yasadigini biraz daha aciklarsan daha net cevaplar bulabiliriz sanirim.

iyi calismalar.

zafzaf82

bootloader in hex dosyasını normal programlayıcıyla attım, orda herhagi bir sorun yok ( 60419 - bootldr-v26-16F876-77-04Mhz-9600bps.hex). Sorun şu CCS de yazdıgım programı atarken oluşuyor. Yukarıda vermiş oldugun devreyide kurdum. Program picle haberleşiyo ancak yazmaya başladıktan sonra Time of Comminication hatası veriyor. Sorunu bir türlü çözemedim hatta 4Mhz'lik kristali bile değiştirdim, ama sorun yine çözülmedi.
Mikroişlemci bi araçtır, amaç değil.....

erdinch

Alıntı yapılan: "zafzaf82"bootloader in hex dosyasını normal programlayıcıyla attım, orda herhagi bir sorun yok ( 60419 - bootldr-v26-16F876-77-04Mhz-9600bps.hex). Sorun şu CCS de yazdıgım programı atarken oluşuyor. Yukarıda vermiş oldugun devreyide kurdum. Program picle haberleşiyo ancak yazmaya başladıktan sonra Time of Comminication hatası veriyor. Sorunu bir türlü çözemedim hatta 4Mhz'lik kristali bile değiştirdim, ama sorun yine çözülmedi.

sorunun büyük ihtimalle iletişim hızının yanlış seçilmesinden dolayı.

CCS deki programın 9600 bps ye ve picbootplus programındaki aktarim hızın da 9600 bps ye ayarlı olmalı.

Ayrıca bilgisayarının com port ayar hızları da 9600 bps ye ayarlı olmalı.

erdinch

Bootloader'ı yayınlayan sitenin forumlarına da göz attım böyle bir hatayla karşılaşmadım.Dediğim nedenlere bir göz at.Sorunun büyük ihtimalle çözülecek.

zafzaf82

@erdinch yardımların için çok sağol
 sorunu çözdüm. Sorun yanlış hex dosyasını yüklememmiş.
Mikroişlemci bi araçtır, amaç değil.....

mavi

bootloader olayını pbp de nasıl tanıtırız
Telecommander Monster Of Network

erdinch

Alıntı yapılan: "mavi"bootloader olayını pbp de nasıl tanıtırız


yapmak gereken şu satırı
#org 0x1F00, 0x1FFF void loader16F876(void) {}


pbp de tanıtmak.pbp bilgim olmadığı için tam olarak yardımcı olamıyorum.

remzi

Bu bootloader in PORTB ile bir gıcıklığı anlaşmazlığı var galiba. Deneme amaçlı olarak porta , b,c,d yi yakabildim ama B yi bir türlü yakıp söndüremedim.

kod parçası aşağıda. Önerileriniz ne olabilir?

#include<16f877.h> 

#device ADC=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES LVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
       
 
      #use delay(clock=4000000)
      #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7) 
      
      #org 0x1F00, 0x1FFF void loader16F876(void) {} 
      
      #byte PORTA  =    GETENV("SFR:PORTA")
      #byte PORTB  =    GETENV("SFR:PORTB")


void main()
{
SET_TRIS_A(0x00); 

for(;;)
{

PORTA=0x00;
delay_ms(1000);
PORTA=0xFF;
delay_ms(1000);
 
} 
}