Hazır BootLoader Denemesi.

Furkan KELEŞOĞLU

Aktif Üye
Katılım
12 Ekim 2019
Mesajlar
494
Evet geçenlerde .hex file dosyasının iceriğini öğrenmeye calışmıştık. Yakın zamanda ise 18F serisi için assembly dilinde yazılmış bir bootloader buldum. philpem abimiz yazmış. http://www.philpem.me.uk/elec/pic/

ve 18F452 de denemiş ve calıştığını söylemiş. bunu duyduktan sonra hemen bootloader'i ICSP programlayıcı ile 18F452 ye yükledim. daha sonra meşhur PL2303 USB to TTL ile uart hattını PC nin USB sine bağladım. ilk bir yürüyen led kodu yazıp B portundaki ledleri bir sağa bir sola yürüttüm baktım calışıyor. daha sonra assembly kodunu inceledim baya bir şey anladım. ama burda da olayı karıştıran arayüz yazılımı. çünkü ikisi birbiriyle haberleşiyor ve herif kendi algoritmasını kurmuş arayüzüde delphi 7 ile yazmış. onlar mevcut olduğu zaman ben ortalıkta yoktum daha.


Her neyse dün logic analyzer hakkında yazı yazıyordum. Ve bir örnek için UART hattından text gönderen bir program yazdım. ve logic analyzer ile bu texti yakalayacaktım. ama yazdığım programın .hex uzantısını bootloader üzerinden pice yükleldiğim zaman. uart hattından yazdırdığım text değil ardı ardına "H" karakteri gelmeye başladı.

Bu "H" karakteri bootloaderin komutu. arayüze boot modundayım demek için "H" karakteri gönderiyor daha sonra arayüz bunu alınca başlıyor programlamaya. fakat garip olan bir diğer şey ise boot loader "H" Karakterini gönderdikten sonra 100ms bekliyor eğer yanıt gelmesse ana programa dallanıyor. ama Benim yazdığım UART kodunu yükleyince ana progorama dallanmıyor habire boot moduna giriyor tekrar tekrar giriyor diyorum. çünkü assembly kodunda PC(HOST) dan bir veri almazsa ana program adresine dallan diye komut var. yani oraya dallanmıyor dallanıyorsada tekrardan boot moduna dönüp geliyor.


Şimdi kafamı karıştıran şey. LED leri yürttüğüm programda sıkıntısız calıştığı halde ( bir kaç kez denedimm ) bir şey yoktu. normaldi.
Ama UART üzerinden text göndereceğim bir program yazıp yüklediğim zaman boot modundan bir türlü cıkıp ana programma gitmiyor veya gidiyor ama ne oluyorsa reset vektörüne dönüp boot moduna tekrar giriyor galiba.


Sonra şöyle bir şey düşündüm. BootLoader'de UART donanımını kullanıyor benim yazdığım programda UART donanımını kullanıyor bu ikisi cakışıyormu acaba cakışıyor ise bile sadece SFR lerde cakışıyordur. yani UARTın registerlerinde benim UART kodum ile bootloader kodunun UARTI yapılandırmma ayarları farklı. demek benim kod bir şeyi değiştiriyor ki bootloaderi de etkiliyor.

Burada acaba Hexmate iş görür mü diye düşündüm ama hem anlamadım hemde kullanamadım.

Ayrıca benim yazdığım UART_Deneme kodunu ICSP denn yükleyip test ettim gayet güzel calışıyor . text basıyor UART hattına. Bunun sebebi nedir veya nasıl cözeriz bootloaderi yazan arkadaşa mail attım ama dönmedi.
 
Muhtemelen senin yazdığın ikinci program bir şekilde reset attırıyordur pic'e ve o da boot moduna giriyordur. Sonsuz döngüye giren bir programı yüklemeyi dene istersen. Hiçbir şeyi ellemesin dönüp dursun.
 
Evet şimdi programı sonsuz döngüye soktum.
Screenshot_1.png


Kodu bootloader ile pice yükledikten sonra donanımsal olarak reset atıyorum (MCLR Pini ile)

daha sonra logic analyzer i ayarlıyoruz. yükselen kenar tetiklemesi ile. ve gelen veri "H" karakteri daha sonra bir şey gelmiyor yani ana programa dallandı. boot modundan cıktı.

Screenshot_2.png


Şuan herşey doğru yanlış olan hiç bir şey yok. Ama UARTI kullanan bir program olunca böyle olmuyor devamlı "H" karakteri göndermeye devam edicek bunun sorunu ne onu anlamaya calışıyorum ama işte.
 
O boot loader kodu muhtemelen UART receive veya transmit olayları meydana geldiğinde bir interrupt ürettiriyor ve o interrupt rutinlerini de kendi dahili koduna yönlendiriyordur. Böylece sen UART ile birşey yazıyorsun veya okuyorsun, interrupt meydana geliyor ve sen boot loader koduna balıklama dalmış oluyorsun :D

Yapman gereken, UART'i yapılandırdıktan sonra, bütün interrupt'ların SENİN koduna yönlenmesini sağlamak. Veya interrupt'sız çalışacaksın. En uygun metot ne o tabi uygulamaya bağlı.
 
Abi tüm İnterrupt ları disable ettiğim halde yine aynı calışıyor. anlamadım gitti.
Screenshot_1.png


Daha sonra dediğin gibi abi kesmme vektörlerini yönlendirdim. ama banamasın demiyor.
Screenshot_2.png


Adam bootloader yazılımında vektörleri taşıdığı adresi yazmış aslında bir kesme olduğunda bootloader zaten yönlendiriyor.

Screenshot_3.png


Donanım daki vektörleri yazılımsal olarak başka bir adrese taşımış. zaten donanımsal bir kesme olduğu anda yönleniyormuş. zaten hemen burada da adresleri yazıyor.
Screenshot_4.png


Baya bir uğraştım beceremedim. Başım ağırmaya başladı :D biraz dinlenicem.
 
İnterrupt'ları kapatınca nasıl interrupt oluyor yav? Birisi vahiyle interrupt'ları tekrar açıyor mu :D Sen herhalde bir şekilde kapatmamış oluyorsun.

İnterrupt vektörlerine veya oradaki hedef adreslere breakpoint koyabiliyorsan koy ve hangi interrupt'un oluştuğunu gör.
 
Eğer bir şekilde kütüphane falan kullanıyorsan UART'a erişmek için, belki kütüphane senden habersiz açıyordur interrupt'u (kütüphane kullanmanın zararları :) )
 
Screenshot_6.png


Adam yazılımsal reset vektörüne gönderdiği her yerde kesmeleri komple kapattım. yani ana programa gecirdiği her koşulda. ama yine olmadı o değilde baya sinirlendim şuan. bir şekilde çözmessem bu gece uyuyamam sinirden. :D
 
Bence bizlik bir şey yok diye düşünüyorum. bu herifin arayüz yazılımında da sıkıntı olabilir. çünkü arayüz kodu yüklerken biraz zaman alıyor normald diğer programlarda mesela ledleri kaydır programında. ama uart kodunu yüklerken şak diye yüklüyor ve bitti diyor hata da göstermiyor. yani var bir şey varda ne var :D
 
Bizlik bir sorun yok bunda başka bir şey var. logic analyzer'den baktım da yani hex dosyasını yazmıyor içine. Arayüz yazılımında bir şey var UART ile alakalıı bir şeyi görünce demek yazmıyor. BOOT LOADER den DEVICE ID istemiş major ID istemiş sonra bir bir peşi aynı şeyi gönderip durmuş. arayüz de response kısmı ise eror vermiyor. led kaydırma programında olduğu gibi yazıp bitirip finish diyor. bundada aynısını diyor. bu herif bir yerde mantık hatası yapmış arayüz de bence. başka bir izahını bulamadım ben. Baya uğraştım.

Belki Yapılandırma ayarlarındandır dedim. bootloadere nasıl yapılandırma yaptıysa aynısını benim programda da yaptım yok yok yok... Benim canıma tak etti python derslerine ilgi gösterip bir arayüz yazıp kendi bootloaderimi yazacağım.
 
Firmware durup dururken boot loader konumuna giriyorsa bunun sebebi PC'de çalışan uygulama olamaz Furkan. Dolaylı veya doğrudan iki sebep olabilir:

1) Senin kod bir şekilde boot loader kodunu çağırıyor veya o kodu çalıştırmaya başlıyor
2) PIC umulmadık bir şekilde reset yiyor ve resetlenince de haliyla boot kodu çalışıyor.

Senin pickit ile bunda breakpoint falan koyamıyor musun? Hardware breakpoint desteği gerekir çünkü boot kodu flash bellekte.

Ama sen gene de kendi boot kodunu yaz :) PC tarafında pythonu da yaz, bir zararı olmaz. Ben de python öğrenmek istiyorum aslında, öğrenilecekler listesinde duruyor :D
 
Benim başıma da seneler önce benzer bir durum geldi. By-pass kondansatörün işini düzgün yapıyor mı?
 
Firmware durup dururken boot loader konumuna giriyorsa bunun sebebi PC'de çalışan uygulama olamaz Furkan. Dolaylı veya doğrudan iki sebep olabilir:

1) Senin kod bir şekilde boot loader kodunu çağırıyor veya o kodu çalıştırmaya başlıyor
2) PIC umulmadık bir şekilde reset yiyor ve resetlenince de haliyla boot kodu çalışıyor.

Senin pickit ile bunda breakpoint falan koyamıyor musun? Hardware breakpoint desteği gerekir çünkü boot kodu flash bellekte.

Ama sen gene de kendi boot kodunu yaz :) PC tarafında pythonu da yaz, bir zararı olmaz. Ben de python öğrenmek istiyorum aslında, öğrenilecekler listesinde duruyor :D

Hayır abi yanlış anladın. şöyle bootloader , hex dosyasını pice yazmıyor. UART ile alaklı olan hex dosyayı yazmıyor. logic analyzer de gözüküyor yazmadığı . ama led yak söndür konudunun hex dosyasını yazıyor. bununla alakalı logic analyzer ile incelemeler yapıp burayada aktaracacağım.

Burda bir şey var ama anlayamadım logic analyzer yardımcı olacak gibi bana. Pickit2 tarihi eser 6 sene öncemi ne aldım bunla breakpoint falan yapamıyoruz abi :D zaten MPLAB IDE görmez bunu :D

Benim başıma da seneler önce benzer bir durum geldi. By-pass kondansatörün işini düzgün yapıyor mı?

Abi bende buralara baya takıldım reset pininden kristaline kadar tek tek test ettim. zaten ledleri istediğim gibi kaydıran bir programı sorunsuzca saatlerce calıştıran bir PIC. yani donanımsal bir sıkıntı olduğunu düşünmüyorum.



Bu Arada bootloader'i yazan adama mail atmıştım cevap vermiş şimdi bu sorunu ona söyliyeceğim :D
 
Firmware durup dururken boot loader konumuna giriyorsa bunun sebebi PC'de çalışan uygulama olamaz Furkan. Dolaylı veya doğrudan iki sebep olabilir:

1) Senin kod bir şekilde boot loader kodunu çağırıyor veya o kodu çalıştırmaya başlıyor
2) PIC umulmadık bir şekilde reset yiyor ve resetlenince de haliyla boot kodu çalışıyor.

Senin pickit ile bunda breakpoint falan koyamıyor musun? Hardware breakpoint desteği gerekir çünkü boot kodu flash bellekte.

Ama sen gene de kendi boot kodunu yaz :) PC tarafında pythonu da yaz, bir zararı olmaz. Ben de python öğrenmek istiyorum aslında, öğrenilecekler listesinde duruyor :D

Abi picproje sayfasında interaktif python calışma grubu kuruldu. her salı perşembe ve cumartesi saat 10 ile 11 arası canlı yayında python dersi işleniyor. bayada güzel gidiyor. bakmanı öneririm. whatsapp grubuda var direk soru sorabiliyoruz. güzel bir platform oluşturulmuş.
 
Logic analyzer ile test yaptım. herşey doğru gözüküyor gibi. doğru şekilde attığı kodu ve doğru şekilde atamadığı kodun verilerini karşılaştırdım. başarılı şekilde bilgisayar ile iletişim kurup PIC in ID lerini falan almış sonra yazmaya başlamış. Bir ara aklıma Baud Rateyi değiştirmek geldi bunuda denedim olmadı :D son kez biraz daha uğraşacağım sonra başka bir PIC de deneyeceğim onda bootloader hiç calışmayabilir eğer calışırsa UART ı deneyeceğim eğer yine calışmazsa kolları sıvayıp bootloader işine giricez hep birlikte. :D Varmısınız yokmusunuz'a hoş geldiniz :D
 
Herif maile cevap verdi sorunu dile getirdim. adam diyor ki 15 yıl önce yazdım bunun hakkında hiç bir şey hatırlamıyorum üzgünüm :D Bunun üzerine MPLAB IDE'den MCC eklentisinden bootloader üret dedim. gerekli ayarları yaptım. Kendi ürettiği MCC librarylerini derlerken kendi yaptığı bir hatayı eror diye gösteriyor , 2 tane değişken kurmuş bunlarıda 0. ve 1. adreslere atamak istemiş. oraya hata veriyor. :D bu michrochipin sonu Nokia gibi olucak en sonunda. okadar adam bir eklenti yazıcak onuda becerememiş. yok hayır bootloaderı bir şekilde yazacağım ama zamanımı alıcak ve şuan uğraşıcak hiç halim yok.

Görünen o ki cok sağlam bir araştırma yapacağım buda biraz zaman alacak gibi. daha sonra ilkten flash hafızayı yazma ve silme fonksiyonlarını kurup uart ile doğruladıktan sonra en son bootloader arayüzünü yapacağız. veyahut sağlam bir arayüz bulup onun protokolüne göre algoritmayı düzenleyeceğiz.
 
Belki de zamanında o eleman da çalıştıramadı, "benden bu kadar, alın ne yaparsanız yapın" anlamında koydu internete. Sen de hazır boot loader buldum diye ha babam çalıştırmak için paralıyorsun kendini :D

Boş ver artık onu, sıfırdan kendin yaz.
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
5,787
Mesajlar
98,997
Üyeler
2,464
Son üye
s4met

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top