Geçen yazdığım .hex formatlarını araştırıyordum ve bir kaç format bulmuştum. şimdi bunların ne olduklarını yazacağım. ve hangisi bizim işimizi görüyor ona karar vereceğiz bulduğumuz formatlar şöyle idi.
1-INHX8M ( INTEL HEX FORMAT )
2-INHX8S ( INTEL SPLIT HEX FORMAT )
3-INHX32 ( INTEL HEX 32 FORMAT )
Diğer Formatlar var fakat bizim onlar ile bir işimiz yok. bizim hex uzantıları ile işimiz var.
INHX8M ( INTEL HEX FORMAT ) bu format. yazdığımız programın makina diline cevrilmesi için kullanılır. yani yazdığımız programı işlemci için anlaşılır hale getirir. (.HEX) Bunun formatı filan var bunlardan birazdan bahsedicem. ama ilk şunu diyeyim. INHX8M INTEL HEX FORMATI olmasına rağmen bunu michrochip biraz uyarlamış. Bu uyarlama tamamen değiştirmek değil. de formatın bazı özelliklerini kullanmak.
Peki INHX8S nedir ozaman ? buda yine 8 bitlik bir pic'e program yazdığımız zaman makina dilini icerir fakat INHX8M den farkı şudur. INHX8M tüm programı bir dosyada tutar iken. ( .HEX ) INHX8S ise bunları düşük ve yüksek olarak ( .HXL ve .HXH ) Diye iki adet makina dili oluşacaktır. Niye böyle bir şey yaptığı ve nerede kullanıldığı hakkında bir fikrim yok fakat bugüne kadar böyle bir uzantıyıda hiç görmedim bunun bizimle bir işi olmadığı kesin. zaten bununla ilgili pek bir bilgi de yok ortalıkta.
INHX32 ise INHX8M ile yapı olarak aynıdır tek farkı kayıt tipi ve adreslemeleridir. dosyada ( .hex ) uzantılıdır.
INHX32 ile INHX8M arasında sadece kayıt tiplerinde farklılık var.
İnternette cok fazla değişik bilgiler bulacaksınız. ve anlamanız zorlaşacak bunun için araştırmaların hepsini calışacağınız mikrodenetleyici üreticisinin adı ile araştırın. application notları cıkacaktır. oradan ne olduğu anlatılır.
Bizim Microchipin huyunu hiç sevmiyorum. çok sacma sapan bir sistemi var. Nerde ne var belli değil. bir developer destek kısmı var orası da yarım yamalak kalmış. her neyse.
Formatı Açıklamaya başlıyayım.
Görüldüğü üzere formatın kullandığı 4 adet kayıt tipi var şimdi bizim en çok karşılacağımıza bakalım.
00 -
bu kayıt formu. verilen adresten itibaren BB değerinin boyutu kadar data bytesini yazmaya başlar.
01 -
bu kayıt formu. hex dosyasının son satırındaki colonda geçer programın bittiğini yani dosyanın sonunu ifade eder.
ben 02 ve 04 modunu acıklamayacağım çünkü bende anlamadım. sadece 04 ün görevi şu. bizim adresleme kapasitemiz 00 kayıt modunda 16 bit
eğer 04 kayıt moduna geçersek 32 bit adresleme yapabilirz. yani hafızası 16 bit ile adreslenmeyecek kadar büyük hafızaya sahip bir mikro denetleyici ise. 04 kayıt modu geçilir.
ama bunun adreslerini 2 ye filan bölünüyor sonuc adrese data yazılıyor falan filan pek anlamadım orasını. her neyse.
Şimdi şu 00 kayıt modu ve 01 kayıt modlarını örnekleyerek bakalım.
00 kayıt moduna bakalım.
Şimdi ilk start karakteri verilmiş kolona. hemen devamında kac byte data uzunluğuna sahip bir kayıt olacağı belirtiliyor. hemen devamında kaydın başlanacağı adress gösteriliyor. daha sonrasında kayıt tipi 00 olarak berlirtiliyor yani gösterilen adresten itibaren dataları yaz diyor.
Ve 16 byte data yazılmaya başlanıyor. dataların devamına en son checksum değeri var. bu cheksum değeri yazıldığı kolunun cheksumu için geçerli bir değerdir.
Şimdi 7 numaralı işaretli yere baktığımız zaman EF80 görüyoruz. ama .hex dosyasının içinde ise tam tersi. işte buna " Little Endian (Küçük sonlu) " Deniyor. Bunu araştırabilirsiniz işlemciden işlemciye değişiyor. eğer iki işlemci aynı
endianness sahip değilse bunlar birbirlerinden anlamaz. haberleşemezler. googlede kaynak var. ben pek üstünde durmadım. konumuzdan da uzaklaşmayalım.
Şimdi de 8 numaralı işaretli yere baktığımız zaman GOTO 0x006300 komutunu görüyoruz. yani 0x006300 adresine git deniliyor. şimdi bu makina dilide nasıl üretiliyor. random sallanmıyor tabi onu görelim. bunlara OPCODE yani ( OPERATION CODE ) deniliyor. bunlar işlemcinin komut setinde var. yani bunlar sabit , asm olarak program yazıyorsanız. hangi mikrodenetleyiciyi veya mikro işlemciyi kullanıyorsanız. datasheetinden komut setine bakıp öğrenmeniz lazım.
Şimdi GOTO komutunun acıklamasına bakalım :
Komutumuz 2 adet 16 bitlik kelimeden oluşuyor. normalde 18F serisinde 16 bitlik komut seti vardır. ama GOTO , CALL gibi komutlar 2 kelime ye ihtiyac duyar. şimdi GOTO nun yaptığı operasyona bakalım. k değerini alıyormuş ( k değeri bizim programı göndermek istediğimiz adres) , PC (program counter ) ' ye yüklüyormuş fakat yüklerken 20. bit ile 1. bit arasına yüklüyor değeri 0.bite bir şey yüklenmiyor 0.bit clear olarak kalıyor.
şimdi 2 adet 16 bitlik kelimeden oluşuyor komut demiştik. şimdi ilk kelimeye bakalım. ilk kelimede sabit olan bir değer var " EF " Değeri bu değer bizim GOTO komutunun opcode değeri daha sonrasında. gelen k lar ise programı göndereceğimiz adresin değeri yazılacak. şimdi adresin ilk 8 bitini buraya yazıyormuşuz.
gecelim 2.kelimeye burada yine sabit olan bir değerimiz var onunda değeri " F " bundan sonra gelen değerler ise programı göndereceğimiz adresin 8. biti ile 19.bit arasındaki değerini barındırıyor. şimdi buna göre program memory baktığımızda ve bu açıklamaya göre dizince değerleri sacma bir şey cıkıyor ortaya yani " 03180h " diye bir değer cıkıyor ortaya. bu burda böyle şimdi bunu PC countere yükleyince bakalım hangi adrese gidecek program.
Şimdi acıklamadaki gibi 19 bite düzdük değeri. daha sonra ise solda ok ile belirttim. bu değer program countere taşındıktan sonraki oluşan değer.
006300 PC( program counter ) 0x006300 adresini gösteriyor artık.
Kısacası .Hex formatından girdik. bir komut setinden komut seçtik. bu .hex uzantılı dosyada nasıl anlamlı hale geliyor işlemci tarafından bunu acıkladık. aslında bootloaderin mantığına girdik. neyin nereye nasıl koyulduğuna arayüzün artık .hex dosyasını nasıl parcalayıp mikro denetleyiciye göndereceğini öğrendik. bundan sonrası ise mikro denetleyici bu bilgileri aldıktan sonra kendi kendinin program memorysini nasıl yazacak ona geleceğiz.
01 Kayıt modu bildiğimiz END OF FİLE onuda göstereyim.
Bunun bir OPCODE si yok. (zaten kayıt edilecek data değeride 0 yani opcodesi olmasına imkan yok ) bu tamamen programın bittiğinin dosyanın sonuna gelindiğinin bir göstergesi. C ile dosya okuma işlemi yaptıysanız ordada mesela EOF (END OF FİLE ) biti vardır. dosya sonuna gelindiğini belirtir buda öyle bir şey...
Bir sürü gerek video gerek pdf inceleyerek bunları cıkardım. bir yanlış anlatımım veya eksik bir şey varsa Lütfen bilgilendirin. Eğer konu hakkında daha çok şey biliyorsanız. lütfen tecrübelerinizi aktarmayıda eksik etmeyin.
Örnek hex dosyasını Mikro Elektronikanın MikroC ile 18F4550 için yazdığı USB_HID bootloader yazılımından yola cıkarak anlattım.