Intel HEX Dosya Formatı Nedir? Mikrodenetleyici Programlama ve HEX Dosya Yapısı

guclusat

Tanınmış Üye
Süper Moderatör

Intel HEX Dosya Formatı Nedir? Kayıt Yapısı, Adresleme ve Örnekler​

Kısa açıklama: Intel HEX, mikrodenetleyici ve diğer programlanabilir elektronik cihazların belleğine yazılacak program kodlarını ve verileri metin tabanlı olarak saklayan bir dosya formatıdır. Bu makalede Intel HEX kayıt yapısı, adresleme yöntemleri, kayıt türleri ve checksum hesaplaması örneklerle açıklanmaktadır.

Etiketler: Intel HEX, HEX dosya formatı, Intel HEX kayıtları, mikrodenetleyici programlama, PIC programlama, firmware, HEX checksum, EEPROM programlama, flash bellek, programlayıcı


## 1. Intel HEX Dosya Formatı Nedir?

Intel HEX, ASCII karakterlerinden oluşan ve satır satır düzenlenmiş bir metin dosyası formatıdır. Her satır, Intel HEX formatına uygun bir kayıt (record) içerir.

Bu kayıtlarda yer alan onaltılık (hexadecimal) sayılar, makine kodlarını ve sabit verileri temsil eder. Intel HEX dosyaları, ROM, EPROM, EEPROM veya flash bellek gibi programlanabilir belleklerde saklanacak program ve verilerin aktarılması amacıyla kullanılır.

Birçok mikrodenetleyici programlayıcısı ve bellek programlama cihazı Intel HEX dosyalarını okuyabilir.

Intel HEX dosyaları; PIC, 8051, ARM ve benzeri mikrodenetleyici ailelerinde kullanılan yazılım geliştirme araçlarının ürettiği yaygın çıktı formatlarından biridir.

## 2. Intel HEX Kayıt Yapısı

Bir Intel HEX dosyası, bir veya daha fazla HEX kaydından oluşur. Her kayıt belirli alanlara ayrılmıştır.

Temel kayıt biçimi şöyledir:

Kod:
CC

Burada her alanın anlamı aşağıdaki gibidir:

AlanAçıklama
:Her HEX kaydının başlangıcında bulunan iki nokta işareti.
LLVeri uzunluğu. Kayıtta bulunan veri baytlarının sayısını belirtir.
AAAAAdres alanı. Veri baytlarının bellekte başlayacağı adresi belirtir.
TTKayıt türü. Kaydın veri, dosya sonu veya adres bilgisi içerdiğini belirtir.
DDVeri alanı. Bir veya daha fazla baytlık makine kodu veya veri içerir.
CCChecksum (kontrol toplamı). Kaydın doğruluğunu kontrol etmek için kullanılır.

Her iki hexadecimal karakter bir baytı temsil eder. Örneğin, 10 hexadecimal değeri 16 bayta karşılık gelir.

## 3. Intel HEX Kayıt Türleri

Intel HEX formatında kullanılan temel kayıt türleri şunlardır:

Kayıt türüAçıklama
00Veri kaydı (Data Record). Belleğe yazılacak verileri içerir.
01
02Genişletilmiş segment adres kaydı (Extended Segment Address). Bellek adresinin üst bölümünü belirtir.
04Genişletilmiş doğrusal adres kaydı (Extended Linear Address). 32 bit adreslemenin üst 16 bitini belirtir.
05Başlangıç doğrusal adres kaydı (Start Linear Address). Uygulamanın başlangıç adresini belirtir. Bazı araçlar tarafından kullanılır.

[TD>Dosya sonu kaydı (End of File). HEX dosyasının tamamlandığını belirtir.[/TD]

## 4. Veri Kayıtları (Data Records)

Intel HEX dosyasında program kodları ve veriler genellikle 00 türündeki kayıtlarla aktarılır.

Örnek bir veri kaydı:

Kod:
:10246200464C5549442050524F46494C4500464C33

Bu kayıt aşağıdaki şekilde ayrıştırılır:

AlanDeğerAnlamı
LL1016 bayt veri bulunur.
AAAA2462Verinin başlangıç adresidir.
TT00Veri kaydıdır.
DD464C...464CBelleğe yazılacak veri baytlarıdır.
CC33Checksum değeridir.

Veri kayıtlarında adres alanı, kaydın ilk veri baytının adresini belirtir. Sonraki baytlar bellekte artan adreslere yerleştirilir.

Her kayıt bir satırda bulunur. Dosyada birden fazla veri kaydı varsa bunlar farklı adreslere karşılık gelebilir.

## 5. Checksum (Kontrol Toplamı) Nasıl Hesaplanır?

Checksum, Intel HEX kaydındaki verilerin aktarım sırasında bozulup bozulmadığını kontrol etmek için kullanılır.

Hesaplama yöntemi şöyledir:

  1. Kayıttaki LL, AAAA, TT ve DD alanlarının bütün baytları toplanır.
  2. Toplamın en düşük 8 biti alınır. Başka bir ifadeyle toplam 256'ya göre mod işlemi uygulanır.
  3. Elde edilen değerin ikiye tümleyeni alınır. Bu değer CC checksum alanıdır.
İki baytlık veya daha uzun alanlarda hexadecimal karakterler ikişerli gruplar hâlinde değerlendirilir.

Örneğin, aşağıdaki dosya sonu kaydında:

Kod:
:00000001FF

Baytların toplamı:

Kod:
00 + 00 + 00 + 01 = 01

01 değerinin ikiye tümleyeni FF olduğundan checksum FF olur.

Bir HEX kaydının geçerli olması için, checksum baytı da dâhil olmak üzere kayıttaki bütün baytların toplamının en düşük 8 biti sıfır olmalıdır.

## 6. Genişletilmiş Doğrusal Adres Kayıtları (Extended Linear Address – HEX386)

Genişletilmiş doğrusal adres kayıtları, 32 bit bellek adreslemesini desteklemek için kullanılır. Bu kayıtlar, veri adresinin üst 16 bitini içerir.

Kayıt türü 04 olarak belirtilir ve kayıt her zaman iki veri baytı içerir.

Örnek:

Kod:
:02000004FFFFFC

Kaydın alanları:

AlanDeğer
LL02
AAAA0000
TT04
DDFFFF
CCFC

Bu kayıttaki FFFF, sonraki veri kayıtlarının adresine eklenecek üst 16 bit değerini belirtir.

Genişletilmiş doğrusal adres bilgisi, yeni bir 04 kaydı okunana kadar sonraki veri kayıtları için geçerliliğini korur.

Bir veri kaydının gerçek adresi aşağıdaki şekilde hesaplanır:

Kod:
Gerçek adres = (Üst adres << 16) + Veri kaydının adresi

Örneğin, veri kaydının adresi 2462, genişletilmiş doğrusal adres değeri FFFF ise:

Kod:
Veri kaydı adresi                 2462
Üst adres                         FFFF
--------
Gerçek bellek adresi              FFFF2462

## 7. Genişletilmiş Segment Adres Kayıtları (Extended Segment Address – HEX86)

Genişletilmiş segment adres kayıtları, 20 bit adresleme yönteminde kullanılır. Bu kayıtlar, adresin 4 ile 19 arasındaki bitlerini temsil eden segment değerini içerir.

Kayıt türü 02'dir ve iki veri baytı içerir.

Örnek:

Kod:
:020000021200EA

Kayıttaki 1200 değeri segment adresidir. Gerçek bellek adresi, segment değerinin 4 bit sola kaydırılması ve veri kaydının adresinin eklenmesiyle elde edilir.

Kod:
Gerçek adres = (Segment adresi << 4) + Veri kaydının adresi

Örneğin, veri kaydının adresi 2462 ve segment değeri 1200 ise:

Kod:
Veri kaydı adresi                 2462
Segment adresi                    1200
--------
Gerçek bellek adresi              14462

Segment adresi de yeni bir 02 kaydı gelene kadar sonraki veri kayıtları için geçerli kalır.

## 8. Başlangıç Doğrusal Adres Kaydı (Start Linear Address)

Kayıt türü 05 olan başlangıç doğrusal adres kaydı, uygulamanın başlangıç adresini belirtir. Dört veri baytı içerir ve 32 bit başlangıç adresini tanımlar.

Örnek:

Kod:
:04000005000000CD2A

Bu kayıtta:

  • 04: Veri uzunluğu, 4 bayt.
  • 0000: Adres alanı.
  • 05: Kayıt türü.
  • 000000CD: Uygulamanın başlangıç adresi.
  • 2A: Checksum.
Bu kayıt, özellikle ARM tabanlı geliştirme araçlarında uygulamanın başlangıç noktası hakkında bilgi taşıyabilir. Birçok programlayıcı, flash belleğe yazma işlemi sırasında bu kaydı dikkate almayabilir.

## 9. Dosya Sonu Kaydı (End-of-File – EOF)

Intel HEX dosyasının sonunda mutlaka bir dosya sonu kaydı bulunmalıdır. Bu kayıt türü 01 olarak belirtilir.

Standart EOF kaydı şöyledir:

Kod:
:00000001FF

Bu kayıtta veri uzunluğu sıfırdır. Adres alanı kullanılmaz ve checksum değeri FF olur.

## 10. Örnek Intel HEX Dosyası

Aşağıda bir Intel HEX dosyasına ait örnek kayıtlar verilmiştir:

Kod:
:10001300AC12AD13AE10AF1112002F8E0E8F0F2244
:10000300E50B250DF509E50A350CF5081200132259
:03000000020023D8
:0C002300787FE4F6D8FD7581130200031D
:10002F00EFF88DF0A4FFEDC5F0CEA42EFEEC88F016
:04003F00A42EFE22CB
:00000001FF

Bu dosyada veri kayıtları, program kodlarını ve belleğe yazılacak değerleri içerir. Son satırdaki EOF kaydı dosyanın tamamlandığını bildirir.

Intel HEX dosyası, doğrudan okunabilir bir programlama dili değildir. İçindeki hexadecimal veriler, hedef mikrodenetleyicinin komutlarına veya belleğe yerleştirilecek verilere karşılık gelir.

## 11. Intel HEX Dosyaları ve Mikrodenetleyici Programlama

Mikrodenetleyici yazılımı derlendiğinde, derleyici veya geliştirme ortamı çoğunlukla HEX formatında bir çıktı oluşturabilir. Programlayıcı bu dosyayı okuyarak hedef cihazın program belleğine gerekli verileri aktarır.

Ancak her HEX dosyasının her mikrodenetleyiciye uygun olduğu düşünülmemelidir. Dosyanın doğru cihaza, doğru bellek adreslerine ve uygun yapılandırma ayarlarına sahip olması gerekir.

Özellikle PIC mikrodenetleyicilerinde HEX dosyasının program belleği, konfigürasyon bitleri ve hedef cihazla uyumluluğu kontrol edilmelidir.


## Konuya Sonradan Eklenecek Bilgiler

Bu konu ilerleyen mesajlarda aşağıdaki başlıklarla genişletilebilir:

  • HEX dosyasının içeriğini görüntüleme ve inceleme
  • HEX dosyasını BIN dosyasına dönüştürme
  • Checksum hesaplama ve HEX kayıtlarını doğrulama
  • PIC mikrodenetleyicilerinde HEX dosyası ve konfigürasyon bitleri
  • Programlayıcıda HEX dosyası yükleme ve doğrulama hataları
Yeni açıklamalar ve uygulamalı örnekler, konuya devam mesajları olarak eklenecektir.
 

Eklentiler

Son düzenleme:

Intel HEX Dosya Formatı – Devam: HEX Dosyasını İnceleme, Doğrulama ve BIN Dönüşümü​

Önceki mesajımızda Intel HEX dosyasının kayıt yapısını, adresleme yöntemlerini ve checksum hesaplamasını incelemiştik. Bu bölümde bir HEX dosyasının nasıl okunabileceğini, kayıtların nasıl doğrulanacağını ve HEX dosyasının ikili (BIN) formata nasıl dönüştürülebileceğini ele alacağız.

## 12. Intel HEX Dosyası Nasıl İncelenir?

Intel HEX dosyası ASCII tabanlı bir metin dosyasıdır. Bu nedenle bir metin düzenleyiciyle açılabilir. Windows üzerinde Not Defteri veya Notepad++ gibi programlar kullanılabilir.

Örnek HEX içeriği:

Kod:
:03000000020103F7
:00000001FF

İlk satır, adresi 0000 olan üç baytlık veri kaydıdır. İkinci satır ise dosyanın sona erdiğini belirtir.

İlk kayıt şu şekilde ayrıştırılır:

AlanDeğerAçıklama
LL033 bayt veri
AAAA0000Başlangıç adresi
TT00Veri kaydı
DD020103Veri baytları: 02, 01, 03
CCF7Checksum

Checksum kontrolü:

Kod:
03 + 00 + 00 + 00 + 02 + 01 + 03 = 09
İkiye tümleyen: F7

Toplamın en düşük 8 biti ile checksum birlikte toplandığında sonuç sıfır olur:

Kod:
09 + F7 = 100h

Bu örnek, HEX kayıtlarının nasıl çözümlenebileceğini gösterir. Gerçek bir mikrodenetleyiciye ait dosyada veri baytları hedef işlemcinin makine kodlarını içerir.

## 13. HEX Dosyasındaki Adresler Nasıl Yorumlanır?

Bir HEX dosyasındaki adres alanı, verinin hedef bellekte nereye yerleştirileceğini belirtir. Fakat adres alanı her zaman tek başına tam bellek adresini ifade etmez.

Kayıt türü 00 ise ve daha önce bir genişletilmiş adres kaydı okunmamışsa, veri kaydındaki adres doğrudan kullanılır.

Kayıt türü 04 kullanılmışsa:

Kod:
Gerçek adres = (Üst 16 bit << 16) + Kayıt adresi

Kayıt türü 02 kullanılmışsa:

Kod:
Gerçek adres = (Segment değeri << 4) + Kayıt adresi

Genişletilmiş adres kayıtları, kendilerinden sonra gelen veri kayıtlarına uygulanır. Yeni bir adres kaydı okunana kadar önceki genişletilmiş adres değeri geçerli kalır.

Önemli: HEX dosyasındaki adresleri yorumlarken hedef mikrodenetleyicinin bellek haritası da dikkate alınmalıdır. Bir HEX dosyasının adresleri, her işlemcide aynı fiziksel bellek alanını temsil etmez.

## 14. Intel HEX Dosyasını BIN Formatına Dönüştürme

Intel HEX dosyası, adres bilgileri ve veri baytları içeren metin tabanlı bir formattır. BIN dosyası ise verileri ham ikili baytlar olarak saklar; Intel HEX dosyasındaki kayıt başlıklarını, adres alanlarını ve checksum değerlerini içermez.

Dönüştürme sırasında:

  1. HEX kayıtları okunur.
  2. Veri kayıtlarının adresleri hesaplanır.
  3. Veri baytları ilgili bellek adreslerine yerleştirilir.
  4. Seçilen başlangıç adresinden itibaren ham veri dosyası oluşturulur.
HEX dosyasında adres boşlukları bulunuyorsa, BIN dosyasının nasıl oluşturulacağı kullanılan dönüştürme aracına bağlıdır. Bazı araçlar boşlukları belirli bir dolgu baytıyla doldurur; bazıları başlangıç adresi veya çıktı aralığı seçilmesine izin verir.

Bu nedenle HEX dosyasını BIN formatına dönüştürürken yalnızca dosya uzantısını değiştirmek yeterli değildir. Adreslerin doğru şekilde işlenmesi gerekir.

## 15. HEX Dosyasının Checksum Değerleri Nasıl Doğrulanır?

HEX dosyasındaki her kayıt kendi checksum değerine sahiptir. Bir kayıt doğrulanırken, checksum alanı da dâhil olmak üzere tüm baytların toplamının en düşük 8 biti sıfır olmalıdır.

Örnek:

Kod:
:03000000020103F7

Kayıttaki baytları toplayalım:

Kod:
03 + 00 + 00 + 00 + 02 + 01 + 03 + F7 = 100h

Toplamın en düşük 8 biti 00 olduğundan kayıt checksum açısından geçerlidir.

Checksum kontrolü, dosyanın aktarım sırasında bozulup bozulmadığını anlamaya yardımcı olur. Ancak checksum değerinin doğru olması, HEX dosyasının hedef mikrodenetleyici için doğru veya çalışır durumda olduğunu tek başına kanıtlamaz.

## 16. HEX Dosyası Programlayıcıda Neden Hata Verebilir?

HEX dosyasının programlayıcı tarafından kabul edilmemesi veya yazma işleminden sonra doğrulama (verify) hatası oluşması farklı nedenlerden kaynaklanabilir.

Olası nedenler:
  • HEX dosyasının hedef mikrodenetleyiciyle uyumlu olmaması
  • Programlayıcının cihazı veya dosya biçimini desteklememesi
  • HEX dosyasındaki adreslerin hedef belleğin dışında kalması
  • Konfigürasyon bitlerinin veya özel bellek alanlarının yanlış işlenmesi
  • Programlayıcı bağlantısı, besleme gerilimi veya cihaz temas sorunları
  • Programlama işlemi sırasında cihazın silinmemesi veya doğru programlama algoritmasının seçilmemesi
HEX dosyasındaki checksum kontrolünün başarılı olması, programlama işleminin de mutlaka başarılı olacağı anlamına gelmez. Programlayıcı ayrıca hedef cihazın belleğine yazılan verileri okuyarak doğrulama yapar.

Özellikle PIC mikrodenetleyicilerinde, kullanılan cihazın veri sayfasındaki program belleği ve konfigürasyon bitleri bölümleri kontrol edilmelidir.
 

Intel HEX Dosyası – Devam 2: PIC Mikrodenetleyicilerinde Program Belleği, Konfigürasyon Bitleri ve Programlama​

Önceki bölümlerde Intel HEX kayıt yapısını, adresleme yöntemlerini ve checksum kontrolünü inceledik. Şimdi bu bilgileri PIC mikrodenetleyicileri üzerinde uygulayalım.

PIC programlama sırasında HEX dosyasının doğru oluşturulması kadar, dosyanın hedef mikrodenetleyiciye uygun olması ve programlayıcının belleğe doğru veri yazması da önemlidir.

## 17. PIC Mikrodenetleyicilerinde HEX Dosyası Nasıl Oluşturulur?

PIC mikrodenetleyicilerinde yazılım geliştirme süreci genel olarak şu aşamalardan oluşur:

  1. Mikrodenetleyiciye uygun kaynak kod hazırlanır.
  2. Kaynak kod, derleyici aracılığıyla makine koduna dönüştürülür.
  3. Derleyici, program belleğine yazılacak verileri içeren HEX dosyasını oluşturur.
  4. HEX dosyası, uyumlu bir programlayıcı yazılımına yüklenir.
  5. Programlayıcı, HEX içeriğini hedef PIC mikrodenetleyicisinin belleğine yazar.
  6. Yazma işleminden sonra doğrulama (Verify) yapılır.
Örneğin, PIC16F628A için hazırlanmış bir proje derlendiğinde, derleyicinin ürettiği HEX dosyası program kodunu ve derleyici tarafından HEX çıktısına eklenen diğer gerekli bilgileri içerebilir.

Ancak HEX dosyasının yalnızca uzantısına bakarak hangi PIC modeline ait olduğu kesin olarak belirlenemez. Dosyanın hedef cihazla uyumluluğu; kullanılan işlemci, derleyici ayarları, bellek adresleri ve yapılandırma bilgileri üzerinden değerlendirilmelidir.

## 18. PIC Program Belleği ve HEX Adresleri

PIC mikrodenetleyicilerinde program belleği, işlemcinin çalıştıracağı komutların saklandığı alandır.

Derleyici, programın makine kodlarını hedef cihazın program belleğine yerleştirir. HEX dosyasında bu veriler adres alanlarıyla birlikte kaydedilir.

Burada önemli bir ayrıntı vardır: HEX dosyasındaki adres gösterimi ile PIC'in program belleğindeki komut adreslemesi her zaman doğrudan aynı biçimde değildir.

Bazı PIC ailelerinde program belleği komut sözcükleri hâlinde düzenlenir. Komut sözcüğünün genişliği ve HEX dosyasında temsil edilme biçimi kullanılan PIC ailesine bağlıdır.

Bu nedenle:

  • HEX dosyasındaki adresler, hedef işlemcinin bellek haritasına göre yorumlanmalıdır.
  • Bir PIC modeli için oluşturulan HEX dosyası başka bir PIC modeline doğrudan yüklenmemelidir.
  • Programlayıcı yazılımı, hedef cihazın bellek düzenini ve programlama algoritmasını desteklemelidir.
## 19. PIC Konfigürasyon Bitleri HEX Dosyasında Nasıl Yer Alır?

PIC mikrodenetleyicilerinde konfigürasyon bitleri (Configuration Bits), işlemcinin çalışma şeklini belirleyen özel ayarlardır.

Bu ayarlar kullanılan modele göre aşağıdaki özellikleri belirleyebilir:

KonfigürasyonGörevi
Osilatör seçimiDahili veya harici saat kaynağının seçilmesini sağlar.
Watchdog Timer (WDT)Watchdog zamanlayıcısının etkin veya devre dışı olmasını belirler.
Power-up TimerBesleme açılışında başlangıç gecikmesi uygulanmasını belirler.
Brown-out ResetBesleme gerilimi belirli bir seviyenin altına düştüğünde sıfırlama davranışını kontrol eder.
Low Voltage ProgrammingDestekleyen modellerde düşük gerilimle programlama özelliğini kontrol eder.
Code ProtectionProgram belleğinin okunmasına karşı koruma seçeneklerini belirler.

Konfigürasyon bitlerinin adları, konumları ve kullanılabilir seçenekleri PIC modeline göre değişir.

Derleyici, proje ayarlarında seçilen konfigürasyon değerlerini HEX çıktısına uygun biçimde ekleyebilir. Programlayıcı ise bu değerleri hedef cihazın ilgili konfigürasyon alanına yazmalıdır.

Önemli: Konfigürasyon bitleri her PIC modelinde aynı adreste bulunmaz ve aynı HEX gösterimini kullanmaz. Kesin adres ve değerler için ilgili PIC'in veri sayfası ile programlama spesifikasyonu kontrol edilmelidir.

## 20. Derleyici Ayarları ile HEX Dosyası Arasındaki İlişki

Bir PIC projesinde yalnızca kaynak kodun doğru olması yeterli değildir. Proje ayarları da hedef cihazın çalışma biçimine uygun olmalıdır.

Örneğin, dahili osilatör kullanılması planlanan bir projede osilatör yapılandırması yanlış seçilirse mikrodenetleyici beklenen şekilde çalışmayabilir.

Benzer şekilde, konfigürasyon bitleri proje içinde tanımlanmadığında veya derleyici tarafından HEX çıktısına eklenmediğinde, programlayıcı cihazda önceden bulunan konfigürasyon değerlerini koruyabilir ya da kendi varsayılan ayarlarını kullanabilir.

Bu durum, yazılımın belleğe başarıyla yazılmasına rağmen mikrodenetleyicinin çalışmamasına neden olabilir.

Bir projeyi derlerken şu noktalar kontrol edilmelidir:

  • Doğru PIC modeli seçilmiş mi?
  • Derleyici ve proje ayarları hedef cihazla uyumlu mu?
  • Osilatör seçimi devrenin donanımına uygun mu?
  • Konfigürasyon bitleri açıkça tanımlanmış mı?
  • Oluşturulan HEX dosyası güncel derlemeye mi ait?
## 21. Programlayıcıda Write ve Verify İşlemleri

PIC programlayıcılarında iki temel işlem bulunur:

Write (Yazma): HEX dosyasındaki verilerin hedef mikrodenetleyicinin ilgili bellek alanlarına programlanmasıdır.

Verify (Doğrulama): Programlama sonrasında cihaz belleğindeki verilerin beklenen verilerle karşılaştırılmasıdır.

Doğrulama sırasında hata oluşursa, programlayıcı belirli bir bellek adresinde beklenen veriyle okunan verinin uyuşmadığını bildirebilir.

Örneğin, programlayıcı aşağıdaki gibi bir hata gösterebilir:

Kod:
Verify Error
Address: 0x4200

Bu tür bir hata tek başına HEX dosyasının bozuk olduğunu kanıtlamaz. Hatanın hangi bellek alanında meydana geldiği, hedef PIC'in bellek haritası ve programlayıcının desteklediği cihaz algoritmasıyla birlikte değerlendirilmelidir.

Olası nedenler şunlardır:

  • Hedef cihazın yanlış seçilmesi
  • Programlayıcı ile mikrodenetleyici arasındaki bağlantı sorunu
  • Besleme geriliminin veya programlama geriliminin uygun olmaması
  • HEX dosyasındaki verilerin hedef cihazın desteklemediği bir alana yerleştirilmesi
  • Konfigürasyon veya özel bellek alanlarının yanlış işlenmesi
  • Programlama yazılımının ya da cihaz algoritmasının uyumsuzluğu
## 22. PIC Programlama Hatalarında İzlenecek Kontrol Sırası

HEX dosyasını programlarken hata oluştuğunda, sorunu rastgele ayar değiştirerek çözmeye çalışmak yerine aşağıdaki kontroller sırayla yapılabilir.

KontrolYapılacak işlem
1. Hedef cihazProgramlayıcıda seçilen PIC modelinin devredeki işlemciyle aynı olduğunu doğrulayın.
2. HEX dosyasıDosyanın doğru projeden ve son derlemeden oluşturulduğunu kontrol edin.
3. Dosya içeriğiHEX kayıtlarının biçimini, checksum değerlerini ve adreslerini inceleyin.
4. Konfigürasyon bitleriOsilatör ve diğer ayarların hedef PIC'e uygun olduğunu kontrol edin.
5. Programlayıcı bağlantısıVDD, VSS, MCLR/VPP, PGC ve PGD bağlantılarını cihazın programlama dokümanına göre kontrol edin. Pin adları ve programlama bağlantıları modele göre değişebilir.
6. Yazma ve doğrulamaProgramlama işlemini tamamlayıp Verify sonucunu inceleyin. Hata adresini ve programlayıcı mesajını kaydedin.

Bu kontroller, HEX dosyasıyla ilgili sorunları donanım ve programlayıcı kaynaklı sorunlardan ayırmaya yardımcı olur.

## 23. Sonuç

Intel HEX dosyası, mikrodenetleyici programlarının ve verilerinin adres bilgileriyle birlikte aktarılmasını sağlayan bir formattır. PIC programlamada doğru HEX dosyasının oluşturulması, konfigürasyon bitlerinin hedef cihaza uygun seçilmesi ve programlama işleminin doğrulanması birlikte değerlendirilmelidir.

Bir HEX dosyasının checksum açısından geçerli olması, onun her PIC modelinde çalışacağı anlamına gelmez. Hedef işlemci, bellek haritası, derleyici ayarları ve programlayıcı desteği de önemlidir.
 

Intel HEX Dosya Formatı – Devam 3: HEX Kayıtlarını Python ile Çözümleme​

Intel HEX dosyasının yapısını öğrendikten sonra, bu dosyaları bilgisayar üzerinde program aracılığıyla inceleyebiliriz. Bu bölümde önce bir HEX kaydını elle çözecek, ardından Python ile kayıtları okuyup checksum doğrulaması yapacağız.

## 24. Bir Intel HEX Kaydını Adım Adım Çözümleme

Örnek olarak aşağıdaki HEX kaydını kullanalım:

Kod:
:03000000020103F7

Kayıt alanlarını ayıralım:

Kod:
: 03 0000 00 02 01 03 F7
|  |    |  |        |
|  |    |  |        +-- Checksum
|  |    |  +----------- Veri baytları
|  |    +-------------- Kayıt türü
|  +------------------- Başlangıç adresi
+---------------------- Veri uzunluğu

Bu kayıtta:

  • 03: Üç veri baytı bulunduğunu belirtir.
  • 0000: Verinin başlangıç adresidir.
  • 00: Kayıt türü, yani normal veri kaydıdır.
  • 02 01 03: Belleğe yerleştirilecek üç veri baytıdır.
  • F7: Checksum değeridir.
Checksum kontrolü için kayıt içindeki bütün baytları toplarız:

Kod:
03 + 00 + 00 + 00 + 02 + 01 + 03 + F7 = 100h

Toplamın en düşük 8 biti sıfır olduğundan kayıt checksum açısından geçerlidir.

Dosyanın sonundaki kayıt ise şöyledir:

Kod:
:00000001FF

Bu kayıt, HEX dosyasının sona erdiğini belirtir.

## 25. Python ile Intel HEX Kaydını Okuma

Python kullanarak bir HEX satırını alanlarına ayırabilir ve checksum değerini kontrol edebiliriz.

Aşağıdaki örnek tek bir kaydı çözümler:

Python:
def parse_hex_record(line):
line = line.strip()

if not line.startswith(":"):
    raise ValueError("HEX kaydı ':' ile başlamalıdır.")

# ':' işaretinden sonraki hexadecimal karakterleri baytlara çevir
raw = bytes.fromhex(line[1:])

if len(raw) < 5:
    raise ValueError("Kayıt çok kısa.")

length = raw[0]
address = (raw[1] << 8) | raw[2]
record_type = raw[3]
data = raw[4:-1]
checksum = raw[-1]

# Veri uzunluğunu kontrol et
if len(data) != length:
    raise ValueError("Veri uzunluğu LL alanıyla uyuşmuyor.")

# Checksum kontrolü
if sum(raw) & 0xFF:
    raise ValueError("Checksum hatalı.")

return {
    "length": length,
    "address": address,
    "type": record_type,
    "data": data,
    "checksum": checksum
}
record = parse_hex_record(":03000000020103F7")

print("Uzunluk:", record["length"])
print("Adres:", hex(record["address"]))
print("Kayıt türü:", record["type"])
print("Veri:", record["data"].hex(" "))
print("Checksum:", hex(record["checksum"]))

Beklenen çıktı:

Kod:
Uzunluk: 3
Adres: 0x0
Kayıt türü: 0
Veri: 02 01 03
Checksum: 0xf7

Bu örnekte Python, HEX satırını bir metin olarak değil, hexadecimal baytlar dizisi olarak ele alır. Ardından kayıt alanlarını ayırır ve checksum kontrolünü gerçekleştirir.

## 26. HEX Dosyasındaki Bellek Adreslerini Hesaplama

Bir HEX dosyasında yalnızca normal veri kayıtları bulunmayabilir. Kayıt türü 02 veya 04 kullanıldığında, sonraki veri kayıtlarının adresi genişletilmiş adres bilgisiyle hesaplanır.

Örneğin:

Kod:
:020000040001F9
:03001000010203E7
:00000001FF

İlk kayıt, genişletilmiş doğrusal adres değerini 0001 olarak ayarlar.

İkinci kayıtta başlangıç adresi 0010 olduğundan gerçek adres:

Kod:
(0001h << 16) + 0010h = 10010h

Veri baytları 10010h, 10011h ve 10012h adreslerine yerleştirilir.

Aşağıdaki Python örneği kayıt türü 00, 01, 02 ve 04 kayıtlarını işleyerek adresleri hesaplar:

Python:
def load_intel_hex(lines):
memory = {}
upper_address = 0

for line in lines:
    rec = parse_hex_record(line)

    address = rec["address"]
    record_type = rec["type"]
    data = rec["data"]

    if record_type == 0x00:
        # Veri kaydı
        absolute_address = upper_address + address

        for offset, byte in enumerate(data):
            memory[absolute_address + offset] = byte

    elif record_type == 0x01:
        # EOF
        break

    elif record_type == 0x02:
        # Extended Segment Address
        if rec["length"] != 2 or address != 0:
            raise ValueError("Geçersiz tür 02 kaydı.")

        segment = (data[0] << 8) | data[1]
        upper_address = segment << 4

    elif record_type == 0x04:
        # Extended Linear Address
        if rec["length"] != 2 or address != 0:
            raise ValueError("Geçersiz tür 04 kaydı.")

        upper = (data[0] << 8) | data[1]
        upper_address = upper << 16

    elif record_type in (0x03, 0x05):
        # Başlangıç adresi kayıtları bu örnekte
        # belleğe veri yerleştirmek için kullanılmıyor.
        continue

    else:
        raise ValueError(
            f"Desteklenmeyen kayıt türü: {record_type:02X}"
        )

return memory
sample = [
":020000040001F9",
":03001000010203E7",
":00000001FF"
]

memory = load_intel_hex(sample)

for address in sorted(memory):
print(f"{address:08X}: {memory[address]:02X}")

Beklenen çıktı:

Kod:
00010010: 01
00010011: 02
00010012: 03

Bu kod, HEX dosyasındaki verilerin adreslerle ilişkisini anlamak için hazırlanmış basit bir örnektir. Üretim amaçlı bir HEX dönüştürücüsünde kayıt biçimi, dosya sonu, adres aralıkları, çakışan adresler ve desteklenen kayıt türleri için daha kapsamlı kontroller yapılmalıdır.

## 27. HEX Dosyasından BIN Dosyası Oluştururken Bellek Boşlukları

Intel HEX dosyasında veri kayıtları ardışık adreslerde bulunmak zorunda değildir.

Örneğin:

Kod:
:020000000102FB
:020010000304E7
:00000001FF

İlk kayıt 0000 adresine iki bayt, ikinci kayıt ise 0010 adresine iki bayt yerleştirir.

İki kayıt arasında kullanılmayan adresler bulunur. BIN dosyası oluşturulurken bu boşlukların nasıl temsil edileceği seçilmelidir.

Bir seçenek, başlangıç adresinden son veri adresine kadar boşlukları FF ile doldurmaktır. Ancak FF her cihaz veya kullanım için doğru dolgu değeri olmayabilir. Kullanılacak değer hedef belleğin özelliklerine ve dönüştürme amacına göre belirlenmelidir.

Ayrıca PIC gibi mikrodenetleyicilerde program belleğinin sözcük yapısı dikkate alınmalıdır. Intel HEX verisini ham BIN dosyasına dönüştürmek, işlemcinin komut sözcüklerini otomatik olarak doğru biçimde yorumlamak anlamına gelmez.

## 28. Bu Bölümün Özeti

Intel HEX dosyası Python ile incelendiğinde:

  • Her satırın kayıt uzunluğu, adresi, türü, veri alanı ve checksum değeri ayrıştırılabilir.
  • Checksum kontrolüyle kayıtların biçimsel doğruluğu denetlenebilir.
  • Genişletilmiş adres kayıtları kullanılarak gerçek veri adresleri hesaplanabilir.
  • Veri baytları bellekteki adresleriyle ilişkilendirilebilir.
  • BIN dönüşümünde adres boşlukları ve hedef belleğin yapısı ayrıca ele alınmalıdır.
Bu işlemler HEX dosyasının yapısını anlamayı kolaylaştırır. Ancak bir dosyanın doğru mikrodenetleyiciye ait olduğunu veya programın çalışacağını tek başına kanıtlamaz.
 

Intel HEX Dosya Formatı – Devam 4: HEX Dosyasını BIN Formatına Dönüştürme​

Intel HEX ve BIN dosyaları, mikrodenetleyici programlama işlemlerinde kullanılan iki farklı dosya formatıdır. Her ikisi de program kodlarını ve verileri taşıyabilir; ancak bilgileri saklama biçimleri birbirinden farklıdır.

## 29. Intel HEX ile BIN Dosyası Arasındaki Farklar

ÖzellikIntel HEXBIN
Dosya yapısıASCII karakterlerinden oluşan metin tabanlı formatHam ikili baytlar
Adres bilgisiKayıtların içinde bulunurGenellikle dosyanın içinde açık adres bilgisi bulunmaz
ChecksumHer kayıtta kontrol toplamı bulunurStandart ham BIN formatında HEX kayıt checksum alanları bulunmaz
Dosya boyutuMetin biçimi nedeniyle genellikle daha büyüktürVeriler ham baytlar hâlinde saklandığından genellikle daha küçüktür
Bellek boşluklarıAdres aralıkları kayıtlar arasında boş kalabilirBoşlukların nasıl temsil edileceği dönüştürme ayarlarına bağlıdır

Intel HEX dosyasında adres bilgileri açıkça bulunduğundan, programlayıcı verilerin hangi adreslere yazılacağını belirleyebilir. BIN dosyasında ise verilerin hedef bellekte hangi adrese yerleştirileceği çoğunlukla dosyanın kendisinden anlaşılamaz; başlangıç adresi veya bellek düzeni ayrıca bilinmelidir.

## 30. Basit Bir HEX Dosyasını BIN Verisine Dönüştürme

Örnek olarak aşağıdaki HEX dosyasını ele alalım:

Kod:
:03000000020103F7
:00000001FF

İlk kayıt, 0000 adresinden başlayan üç veri baytı içerir:

Kod:
Adres 0000: 02
Adres 0001: 01
Adres 0002: 03

Bu örnekte adresler ardışık olduğundan BIN dosyasının içeriği şu üç bayttan oluşur:

Kod:
02 01 03

Burada önemli nokta, BIN dosyasına HEX kaydının tamamının değil, yalnızca veri alanındaki baytların aktarılmasıdır. Başlangıçtaki :, adres alanı, kayıt türü ve checksum BIN verisinin parçası olmaz.

## 31. HEX Dosyasında Adres Boşlukları Varsa Ne Olur?

HEX dosyasındaki veri kayıtları farklı adreslerde bulunabilir. Bu durumda BIN dosyası oluşturulurken boş adres aralıklarının nasıl ele alınacağına karar verilmelidir.

Örnek:

Kod:
:020000000102FB
:020010000304E7
:00000001FF

Bu dosyada:

  • 0000 adresinde 01 02 baytları bulunur.
  • 0010 adresinde 03 04 baytları bulunur.
  • 0002 ile 000F arasındaki adreslerde bu örnek için veri kaydı yoktur.
Başlangıç adresi 0000 ve dolgu değeri FF seçilirse, ortaya çıkan BIN verisinin ilk bölümü şöyle olur:

Kod:
01 02 FF FF FF FF FF FF FF FF FF FF FF FF FF FF
03 04

Bu örnekte iki veri grubu arasındaki boşluklar FF ile doldurulmuştur.

Dikkat: HEX dosyasında bir adres için veri bulunmaması, o adrese mutlaka FF yazılması gerektiği anlamına gelmez. Dolgu değeri, hedef belleğin özelliklerine ve dosyanın kullanılacağı amaca göre belirlenmelidir.

## 32. Python ile HEX Dosyasından BIN Dosyası Oluşturma

Aşağıdaki örnek, önceki bölümde tanımlanan load_intel_hex() ve parse_hex_record() fonksiyonlarını kullanır. Bu fonksiyonları aynı Python dosyasında önce tanımlamış olmanız gerekir.

Kod, HEX dosyasındaki veri kayıtlarını okur, adresleri hesaplar ve seçilen başlangıç adresinden itibaren BIN dosyası oluşturur.

Python:
def write_bin(memory, output_file, fill=0xFF):
if not memory:
raise ValueError("HEX dosyasında veri bulunamadı.")

start_address = min(memory)
end_address = max(memory)

# Bellek adresleri arasındaki boşlukları dolgu
# değeriyle doldur.
image = bytearray(
    [fill] * (end_address - start_address + 1)
)

for address, value in memory.items():
    image[address - start_address] = value

with open(output_file, "wb") as f:
    f.write(image)

print("BIN dosyası oluşturuldu:", output_file)
print("Başlangıç adresi:", hex(start_address))
print("Bitiş adresi:", hex(end_address))
print("Dosya boyutu:", len(image), "bayt")
hex_lines = [
":020000000102FB",
":020010000304E7",
":00000001FF"
]

memory = load_intel_hex(hex_lines)

write_bin(
memory,
"cikti.bin",
fill=0xFF
)

Bu örnekte cikti.bin adlı dosya oluşturulur. Veriler arasındaki boş adresler FF ile doldurulur.

Kod, basit bir örneği açıklamak için hazırlanmıştır. Gerçek dosyalarda çok büyük adres aralıkları bulunabileceğinden, dosya boyutunu oluşturmadan önce kontrol etmek önemlidir. Ayrıca aynı adresin birden fazla kayıtta yer alması gibi durumlar için ek doğrulama yapılmalıdır.

## 33. Dönüştürme Sırasında Yapılabilecek Hatalar

HEX dosyasını BIN formatına dönüştürürken aşağıdaki hatalara dikkat edilmelidir:

  • Adreslerin göz ardı edilmesi: HEX kayıtları sırasıyla birleştirilirse bellek yerleşimi yanlış olabilir.
  • Dolgu değerinin yanlış seçilmesi: Boş adreslerin 00 veya FF ile doldurulması her uygulamada aynı sonucu vermez.
  • Genişletilmiş adres kayıtlarının atlanması: Tür 02 ve tür 04 kayıtları doğru işlenmezse veriler yanlış adreslere yerleştirilebilir.
  • Dosya boyutunun gereksiz büyümesi: Birbirinden çok uzak adresler, tek bir BIN dosyasında geniş boşluklar oluşmasına neden olabilir.
  • Hedef işlemciye özgü bellek yapısının dikkate alınmaması: Özellikle mikrodenetleyicilerde ham BIN dosyasının doğrudan programlanabilir olduğu varsayılmamalıdır.
## 34. PIC Mikrodenetleyicilerinde HEX ve BIN Dönüşümü

PIC mikrodenetleyicilerinde HEX dosyası, program belleğine yazılacak verileri ve uygun olduğunda konfigürasyon gibi özel alanlara ilişkin bilgileri içerebilir.

Bu dosyanın BIN formatına dönüştürülmesi, hedef PIC'in programlama gereksinimlerini otomatik olarak karşılamaz. PIC ailesine bağlı olarak program belleği sözcük genişliği, adresleme ve konfigürasyon alanları farklı olabilir.

Bu nedenle:
  • PIC için oluşturulan HEX dosyasını dönüştürmeden önce hedef cihazın bellek yapısı öğrenilmelidir.
  • Dönüştürme aracının özel bellek alanlarını nasıl ele aldığı kontrol edilmelidir.
  • BIN dosyasının hangi başlangıç adresine yazılacağı bilinmelidir.
  • Programlama işlemi, hedef cihazı destekleyen bir araçla gerçekleştirilmelidir.
## 35. Sonuç

Intel HEX dosyasından BIN dosyası oluşturmak, kayıtların veri alanlarını çıkarmaktan ibaret değildir. Adresler, genişletilmiş adres kayıtları, bellek boşlukları ve hedef cihazın bellek yapısı doğru değerlendirilmelidir.

HEX formatı adres ve kayıt kontrol bilgilerini açıkça taşırken, standart BIN dosyası yalnızca ham baytları içerir. Bu nedenle iki format arasında dönüşüm yapılırken adres bilgilerinin kaybolmamasına ve verilerin doğru sırayla yerleştirilmesine dikkat edilmelidir.
 
Geri
Yukarı