Burada TINY Bootloader in kullanimi hakkinda fikir alis-verisinde bulunacagiz.
Bir cok bootloader ozellikleri itibabari ile birbirine benziyor.
TINY B.L. kend'ne ozgu ozellikleri ile bunlardan bir derece ayriliyor.
1. Otomatik Reset [Yukleme icin boot yuklu PIC e dokunmaniz gerekmiyor]
2. Yuksek Hiz [deneme kodlarini yaklasik 300 mS de yukledi]
3. Yaziliminin pratik olmasi
Bircogu bootloader da RS232 portundan RX ve TX bus i kullaniliyor.
TINY B.L. da Otomatik Reset icin ayrica RTS pini de kullanıldığından
pratikligi kesinlikle artiran bir ozellik.
TINY BOOTLOADER (http://www.etc.ugal.ro/cchiculita/software/picbootloader.htm) Sitenin adresinde bizim baktigimiz siralarda 1.91 versiyonu vardi.
Devre semasi digerlerinde oldugu gibi
(http://www.etc.ugal.ro/cchiculita/software/max232.png)
Ayrica otomatik reset icin su devrede eklenmelidir.
(http://www.etc.ugal.ro/cchiculita/software/resetpic.gif)
Devreyi yaptiniz ama calismiyor !!!
Incelersek MCLR pinine uygun gerilim gelmedigini farkediyoruz.
(http://www.etc.ugal.ro/cchiculita/software/tbld02.png)
Onun için buradaki Reset PIC Using RTS Line i seciyor ve kullanmaya başlıyoruz. Ben bunu 18F452 ile denedim.
CCS te reset adresi ile ilgili h.h. bir değişiklik yapmıyorsunuz sadece ve sadece bootloader için işlemcinin flash alanının son 100 word unu bootloader a ayırıyorsunuz o kadar.
Merhaba
Ben kullandım tiny bootloader'ı. Çok güzel bir program. Dediğiniz gibi çokda HIZLI ÇALIŞIYOR. Kullanımıda kolay. Ayrıca diğer bootloader lara göre picde daha az yer kaplıyor. Aslında pek tartışacak da bir yanı yok hani. İyi çalışmalar.
merak ettim en kısa zamanda yapacağım
hocam nedir bu biraz yardımcı olurmsunuz !
Merhaba
Pic'in program hafızasının ilk adreslerine küçük bir programcık normal bir pic programlayıcı ile yükleniyor. Hafızada birazcık yer kaplıyor. Bu nedenle duruma göre genellikle program hafızası yüksek olan işlemciler (8k ve üstü gibi ) için kullanımı düşünülmelidir. Daha sonra pc de çalışan bir program vasıtası ile pice 115200Bps gibi hızlarda rs232 arayüzlü bir devre ile ( yukarıda en başta arkadaşımız anlatmış linkleri vermiş.) çok hızlı bir şekilde yazılım yüklenebiliyor. Genellikle bootloaderlar ile yükleme yapılırken işlemcinin resetlenmesi gerekiyorki program hafızasındaki bootloader programı yeniden başlatılsın ve pc ile senkronize olan pice program yüklenebilsin. Tiny bootloader ile resetlemeyi pc rs232 arayüzündeki rts sinyalini kullanarak yapmışlar. İsteğe bağlı kullanabilirsiniz. Devre üzerinde programlama yapmak ve üretimide bootloaderın avantajlarını göz önüne alarak yapmakta fayda var derim. Saygılarımla ...
bilgi için sağolun
Alıntı yapılan: "Erol"
CCS te reset adresi ile ilgili h.h. bir değişiklik yapmıyorsunuz sadece ve sadece bootloader için işlemcinin flash alanının son 100 word unu bootloader a ayırıyorsunuz o kadar.
Erol, ben de uygulamalarımda bootloader kullanıyorum. Bootloader Flashın ilk veya son birkaç yüz byte ını kullandığı malum. Ancak son 100 byte nı kullansa bile pic resetlediğinde ilk birkaç byte da sıçrama komutu bulunması ve bunun kendi programımız tarafından silinmemesine dikkat etmemiz gerekmez mi?Yoksa bootloader bir daha çalışmaz.CCs kullanmadığım için bilmiyorum belki de CCs bunu kendi hallediyordur. Ancak o zaman bile derleyiciye bunu bildirmemiz gerekiyor gibi geliyor bana. Yoksa nasıl bootloader programına dallanacak? Ya da başka bir derleyici kullanıyorsak?
Iste TINY bu noktada birşeyler yapıyor.
TINY senin bu ilk baştaki GOTO ifadene bakıp programı yuklerken modifiyeli olarak yukluyor.
Niye Goto ?
Çünkü 4. word de kesme programı başlıyor. Ve buradan zıplayarak gecmek zorundasın.
Boot donusu de yine o adresten devam ediyor...
Tabi bu nokta biraz tahmini. Çok açık bir şekilde bir yerde yazdığını görmedim. Yorumlarım yanlış ta olabilir...
CCS de reset vektörünü değiştirdiğimizde TINY ilk 4 word te GOTO yok diye uyarı veriyor...
arkadaslar bu bootloaderlar nedir ne işe yarar.ilk bir kaçyüz baytı kaplıyormus,en başta normal bir programmer ile yukleniyormus falan.ama kimse tam olarak bootloderin ne oldugunu anlatmamıs.nedir bu bootloader.nerede neden kullanılır.intel 8088 de falan ilk baytlar kesme vektör aderslerini belirtmek için kullanılıyor.bu da böyle bir sey mi.anlatır yardımcı olursanız sevinirim.
mesela en basitinden uydu receiverlara yazılım atmak için sadece RS232 üzerinden pc ye bağlayıp programı atıveriyorsun değilmi? receiverı söküp mikroişlemciyi çıkarıp (yada flashı) programlamıyorsun
işte bootloader bu işi yapıyor programlayıcı cihaz olmadan mikroişlemciyi programlamaya yarıyor tabiiki sadece birkez bootloader programını mikroişlemciye yüklemek için programlayıcı (propic, epic, K128 vs.vs) kullanman gerekiyor
boot hexini normal bir pic programmer ile atmamız mümkün değilmi? illaki bir boot loadermi lazım arkadaşlar?
@mustafacan,
Tabii öncelikle boot hex'sini normal proglamlayıcı ile atman gerekir. Ondan sonra artık programlamayı çipi söküp takmadan devre üzerinde yapabilirsin.
Arkadaşlar, Tiny Boot loaderin pcb sini isteyen alabilir.
Ares 6.7 sp3 ile çizdim. Malzeme listeside ekindedir.
Tiny Boot Loader Pcb si (http://rapidshare.de/files/16707966/tiny_bootloader.rar.html)
PL2303 lu bu USB-RS232 cevirici TINY bootloader ile calisiyor, haberiniz olsun.
(http://img169.imageshack.us/img169/875/img12869rg.jpg)
Beyazimsi RS232 kablosu WIN 3.1 zamanindan kalma bir fare ye ait oldugundan idare edin, cok temiz değil... :D
@mustafacan, çizdiğin devreyi yeniden yükliyebilirmisin?
mümkünse buraya yükle
http://picproje.org/upload/
selamlar,
pic16f877a için 4mhz bootloader arıyorum ama bulamadım bir türlü. bu içinden çıkan kodu nasıl değiştirmeliyim de 4mhzde çalışır hale gelsin. ya da bunu yapmış olupta paylaşmak isteyen var mı?
MErhaba Arkadaşlar,
Ben dsPIC 30f4013 kullanıyorum. TINY 'nin sitesinde listeye baktım. orada 4013'ü göremedim. acaba desteklemiyor mu?
bir sorum daha olacak. Şimdi öncelikle dsPIC'e herhangi bir development board kullanarak bootloader'ı yüklüyoruz. daha sonra da TINY ile istediğimiz programı seçip seri porttan yolluyorum.
Peki Yaptığım programda bellek kıssımı için yer ayırması nasıl yapılmakta. özel bir komutu mu var?
saygılar..
Bellek ayırma işlemini bootloader kendisi yapıyor.
Soldaki şekil normal program işleyişi...
Sağdaki resim bootloader program işleyişi...
(http://www.etc.ugal.ro/cchiculita/software/bootloader.png)
ds30f4013 hex'i var içinde.
Tiny bootloader ile program yüklemeyi isis te simüle etmenin bir yolu varmı acaba. Ben denedim ama yapamadım. Program yükleniyor gibi oluyor ama sonunda ERROR yazıyor.
Bootloader hex dosyası nereden bulunabilir acaba?
bırcok ıslemcıde ıcsp ozellıgı var .bootloader kullanmak anladıgım kadarıyla uzerınde rs232 modulu bulunduran devrelerde pratık olur,bırde uzaktan yazılım guncellemede.bunların dısında avantajları var mıdır?
merhabalar,
pic18f458 için tiny bootloader üzerinde calişma yapıyorum .hex dosyasını buldum fakat tiny'in kendi interface'i ile pc den pice baglantı kuramıyorum acaba sorun nedir?? yardımcı olursanız memnun olurum .....
arkadaşlar 18f4620 de bootloader yüklemek istiyorum.
LIST P=18F4620 ; change also: Configure->SelectDevice from Mplab
xtal EQU 20000000
baud EQU 19200
buna göre configurasyon ayarları nasıl yaparım yardımcı olurmusunuz?
CCS ve Proteus ile denemeler yapıyorum, proteusta içinde bootloader olan pic'e sanal seri port vasıtasıyla kendi hex'imi atabiliyorum ama sorun şu ki bu işlemi otomatik reset devresini bağladığımda yapamıyorum çünkü RTS(sanal port olduğundan karşılığı CTS oluyor) pini pici sürekli resette tuttuğundan gelen komuta cevap veremiyor dolayısıyla pic bulunamıyor... reset devresini kaldırdığımda içinde bootloader olan devreye direkt bağlanıp hex atabiliyorum, reset devresi benim için pek de önemli değil(ki bu sorunun aslında sanal seri portla bir alakası var gibi), zira reset olayını yazılımla halletmem gerekiyor zaten, şimdi asıl soruna gelecek olursam bootloder'ın flash'a yazdığı hex dosyam bootloader'ın üzerine yazılıyor veya goto ifadesini v.s değiştiriyor olacak ki bir daha bootloader başlamıyor, ccs de fuse ifadelerinden sonra #define flash_max getenv("PROGRAM_MEMORY")
#org flash_max-200,flash_max-1
void bootloader()
{
}
şeklinde son 199luk flash kısmını bootloader'a ayırdım oysa. reset devresini kaldırdın, peki nasıl reset atıyorsun derseniz "Check PIC" sırasında 5-6 snlik süre içinde manuel reset atıyorum ama kendi programım yeniden başlıyor, bootloader devreye girmiyor... bootloader için PIC18F.asm dosyasından birkaç satırı değiştirip 18F452(p=) ve 19200(baud eq) baud olarak yeniden derledim. Şimdi sorun nerede kestiremedim, CCS de mi birşeyler atlıyorum, asm dosyasında değiştirmem gereken başka birşeyler de mi var yoksa sorun reset devresinin şart olması(?)yla mı alakalı...
Options sekmesinden Remote Reset signals kutucuğuna RTS high for 20ms yazınca sürekli reset sorununu düzelttim ve düşündüğüm gibi 2. kez yükleyememe sorunuyla alakası yokmuş reset olayının...
Bu konuda dün denemeler yaparken birşey keşfettim, windows tarafının 1.95 sürümü ile yükleme yapınca herşey olması gibi çalışıyor ta ki 1.97 ve sonraki sürümlerle yükleme yapıncaya kadar, bu sürümlerde ne gibi bir sorun oluyorsa "WARNING: GOTO not found in first 4 words" ifadesinden de anlaşılacağı gibi ilk 4 worddeki goto ifademiz kayboluyor, dolayısıyla program flashın başından başlayıp çalışınca da bizim flashın sonunda yer alan bootloaderımız yalan oluyor, şimdi neden 1.95 sürümünden sonra bu böyle, sorunu düzeltmek için ne yapmam gerekiyor anlayamadım ilk 4 wordü de mi #ORG ile ayırmamız gerekiyor diyeceğim 1.95 de sorun olmadığından öyle de değil gibi, ne yapmalı acaba...
Bende uzun zamandır güzel bir bootloader arıyordum. Microchip 'in AN851 ve Petr Kolomaznik arkadışın bootloader uygulamalarını denedim ancak bir çok sorun ile karşılaştım. Bunların başında benim programlarımı yazarken kullandığım yazılımın başlangıç adresleriydi.
Assembly 'den gelen bir alışkanlık olarak ben ;
org 0x00
goto init
org 0x04
goto $
gibi bir kod her program için kullanıyorum, kesme kullanmasam bile oraya yazıyorum.
Tiny bootloader ise bu yazımı uygun olarak çalıştı ve şu an bunu kullanıyorum. Anladığım kadarı ile ccs ile derlenen kodlarda #org ile ayırıp programınızın main bloğuna dallandırmak gerekiyor, sanırım.
18f4550 nin içine yüklememiz gerek hexi bulamadım acaba elinde olan atabilrmi?
18F4585 için hangi hexi atıcam bulamadım. Siteden dosyaları indirdim ama orada 18F4585 için hex bulamadım. Ne yapmam gerekiyor?
16F887 ile denediğimde PIC not found hatası alıyorum, nerde yanlış yapıyorum sizce?
Arkadaşlar kurduğum devre bu, 16F887 için "tinybld16F887.hex" dosyasını attım PICe öncelikle.
Devreyle seri port bağlantısını yapıyorum, programı açıp "CheckPIC"e tıklıyorum ama
Connected to \\.\COM1 at 115200
Searching for PIC ...Not found,
ERROR!
hatasını alıyorum. İletişim hızını değiştiripte denedim yine aynı şey oldu.
16F887 için diğer hex dosyalarını da attım ama yine aynı şey oldu. Sizce nerede yanlış yapıyorum?
[IMG]http://img385.yukle.tc/images/377rs232.png[/img] (http://www.yukle.tc)
Devrede biraz değişiklik yaptım.
İlk devre bu. Ama çalışmadı.
http://img849.imageshack.us/img849/5728/61171796.png
Daha sonra aşağıdaki gibi değiştirdim ama yine çalışmadı devre.
http://img43.imageshack.us/img43/7082/97677464.png
Aldığım hata şu: search PIC diyorum, PIC not found hatası alıyorum.
Devrede mi yanlışlık var yoksa bootloader hex'inde mi anlamadım.
Aklıma takılan soru var,
-8MHZ kristal kullanıyorum devrede, 8MHZ için 9600 baud rate destekliyor en son(datasheete göre),
acaba bootloader hex dosyası farklı baud rate hızı ve osilatör frekansı için de ondan mı olmuyor?
Alıntı yapılan: healme - 22 Haziran 2011, 21:19:12
Arkadaşlar kurduğum devre bu, 16F887 için "tinybld16F887.hex" dosyasını attım PICe öncelikle.
Devreyle seri port bağlantısını yapıyorum, programı açıp "CheckPIC"e tıklıyorum ama
Connected to \\.\COM1 at 115200
Searching for PIC ...Not found,
ERROR!
hatasını alıyorum. İletişim hızını değiştiripte denedim yine aynı şey oldu.
16F887 için diğer hex dosyalarını da attım ama yine aynı şey oldu. Sizce nerede yanlış yapıyorum?
[IMG]http://img385.yukle.tc/images/377rs232.png[/img] (http://www.yukle.tc)
daha önce attığım mesajlarda bu cümleye denk gelmiş olmalısınız
Alıntı yapılan: RcALTIN
Options sekmesinden Remote Reset signals kutucuğuna RTS high for 20ms yazınca sürekli reset sorununu düzelttim
kısaca pic sürekli reset atarsa(RTS pininin sürekli high kalmasından dolayı) bootloader hiç başlayamaz, RTS pininin sürekli high kalmamasına dikkat edin, sorun buysa çözümünü de yazmışım zaten.
Tamam hocam yarın sabah deneyip buraya sonucu yazarım, inşallah dediğiniz gibidir de kurtulurum artık şu sorunlardan :)
Sonunda çalıştırabildim devreyi, programı gönderdim başarıyla :)
Bir sorum daha olacak. Bu RTS ile resetleme işlemini donanımsal değil de yazılımsal yapabilir miyiz(sadece RX TX pinlerini kullanmak istiyorum)?
Bir de MAX232 entegresi 3.3V ile çalışır mı?
Alıntı yapılan: healme - 24 Haziran 2011, 10:05:37
Sonunda çalıştırabildim devreyi, programı gönderdim başarıyla :)
Bir sorum daha olacak. Bu RTS ile resetleme işlemini donanımsal değil de yazılımsal yapabilir miyiz(sadece RX TX pinlerini kullanmak istiyorum)?
Bir de MAX232 entegresi 3.3V ile çalışır mı?
Yazılımınızda USART kullanıp, RS232 hattından sürekli komut beklemesini sağlarsınız. Loader uyugulamasındaki terminal sekmesinden yararlanarak, önce yazılımın pic'e reset attırması için gereken komutları gönderip ardından yükleme yaptırırsınız. CCS için reset_cpu(); metodu pici resetlemek için yeterli, bootloader ı kaçırmamak için belki resetleme öncesi delay koymak gerekebilir.
16F887 için 9600baud ratelik bootloader hex dosyası lazım, 115200 ile programlama yapamıyorum :(
Ben assembly bilmiyorum değiştiremiyorum o yüzden bilen biri 9600 baud rate için kodu değiştirip ekleyebilir mi?
Az önce bir fransız sitesinden çok güzel bir kod buldum tinybootloaderın üstüne yazmış sanırım. Kod aşağıda, anlamadığım yer şu while'ın içine kodu biz mi yazıcaz yoksa bu halde hex'e çevirip PIC'e atsak çalışır mı?
While'in içine "// votre code ici" yazmış. Kodunuz buraya demek sanırım fransızcada.
// Programme de base pour utilisation avec TinyBootLoader
// Sélection du PIC
#include <18f2520.h>
//#include <16f876.h>
#device adc=8 *=16
#device ICD=TRUE
// Fusibles pour PIC18F
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT,CCP2C1,NOSTVREN,NODEBUG
// Fusibles pour PIC16F
//#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
// Fréquence d'horloge à ajuster
#use delay(clock=20000000)
// Vitesse de l'interface RS232 à ajuster
#use rs232(baud=115200, parity=N, xmit=PIN_C6, rcv=PIN_C7, STOP=1, BITS=8)
// Interruption réception d'un caractère dans le buffer voie série
#int_RDA // Reset avant reprogrammation par TinyBootLoader
void RDA_isr()
{
if (getchar() == 0xFF && getchar()==0xFA && getchar()==0xFA) reset_cpu();
}
void main()
{
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while (TRUE) {
// votre code ici
}
}
Alıntı yapılan: healme - 28 Haziran 2011, 15:07:42
Az önce bir fransız sitesinden çok güzel bir kod buldum tinybootloaderın üstüne yazmış sanırım. Kod aşağıda, anlamadığım yer şu while'ın içine kodu biz mi yazıcaz yoksa bu halde hex'e çevirip PIC'e atsak çalışır mı?
While'in içine "// votre code ici" yazmış. Kodunuz buraya demek sanırım fransızcada.
// Programme de base pour utilisation avec TinyBootLoader
// Sélection du PIC
#include <18f2520.h>
//#include <16f876.h>
#device adc=8 *=16
#device ICD=TRUE
// Fusibles pour PIC18F
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT,CCP2C1,NOSTVREN,NODEBUG
// Fusibles pour PIC16F
//#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
// Fréquence d'horloge à ajuster
#use delay(clock=20000000)
// Vitesse de l'interface RS232 à ajuster
#use rs232(baud=115200, parity=N, xmit=PIN_C6, rcv=PIN_C7, STOP=1, BITS=8)
// Interruption réception d'un caractère dans le buffer voie série
#int_RDA // Reset avant reprogrammation par TinyBootLoader
void RDA_isr()
{
if (getchar() == 0xFF && getchar()==0xFA && getchar()==0xFA) reset_cpu();
}
void main()
{
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while (TRUE) {
// votre code ici
}
}
bu kodda bootloader v.s içeren birşey yok, bootloaderdan bağımsız yazılmış, hatta sadece rs232 kesmesi eklenmiş boş bir program(üzerine yazılmıştan kastınız tinyle birlikte kullanmak için yazılmış ise o doğru). gördüğüm tek şey var, RS232den ard arda FF, FA, FA geldiğinde pic resetleniyor(açlış sırasında bootloader çalışacak tabi), başka da bir işlevi yok. bu da bir önceki mesajımda bahsettiğim resetlettirme olayının koda dökülmüş hali zaten. while kısmına kendi programınızı yazacaksınız, yukarıdaki header dosyalarını kullandığınız pic'e göre düzenleyeceksiniz.
Hocam ben bu tinybootloader'ı kablosuz olarak yapmak istiyorum.
Kendi hex'i 115200 baud rate için. Benim modüller o kadar desteklemiyor, 9600'a düşürmem lazım.
Ve reset olayını da yazılımla halletem lazım. Bootloader hex'inde bu programdaki gibi reset olması lazım.
Bu yüzden hep sorup duruyorum.
Reset olayını bu şekilde yapabiliriz tamam onu hallettik. Ama baud rate'i kendim değiştirip denemem lazım.
Assembly bilmediğim için tinybootloader'ın kendi programında oynama yapamıyorum. Sadece baud rate kısmını değiştirdim 9600 yaptım ama hala 115200'de çalışıyor.
CCS ile yazılmış bir kod bulabilirsem belki değiştirebilirim istediğim gibi.
tiny bootloader asm üzerinde değişiklik yapılmamışsa baudrate'i değiştirmek için en üst kısmında bulunan baud EQU değerini değiştirip derlemeniz yeterli.
benim önceden kullandığım versiyon bu, rs485(rs232nin endüstriyel versiyonu) ile uyumlu sürüm. derlemek için mplab veya mpasm kullanabilirsin. fakat rf modül işlerinden pek anlamam, sağlıklı çalışabileceğini sanmıyorum kablosuz şekilde, önce kablolu deneme yapın çalıştırdıktan sonra uğraşın rf ile...
radix DEC
LIST P=PIC18F452 ; change also: Configure->SelectDevice from Mplab
xtal EQU 20000000 ; you may want to change: _XT_OSC_1H _HS_OSC_1H _HSPLL_OSC_1H
baud EQU 9600 ; standard TinyBld baud rates: 115200 or 19200
; The above 3 lines can be changed and buid a bootloader for the desired frequency (and PIC type)
;********************************************************************
; Tiny Bootloader
;
; 18F series
;
; RS485 Compatible Version
;
; RE-DE Transmission = PIN RC5
;
; Size = 132words
;
; claudiu.chiculita@ugal.ro
; http://www.etc.ugal.ro/cchiculita/software/picbootloader.htm
;********************************************************************
#include "icdpictypes.inc" ;takes care of: #include "p18fxxx.inc", max_flash, IdTypePIC
#include "spbrgselect.inc" ; RoundResult and baud_rate
#define first_address max_flash-264 ;132 words
__CONFIG _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H
__CONFIG _CONFIG2L, _BOR_ON_2L & _BORV_20_2L & _PWRT_ON_2L
__CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_128_2H
__CONFIG _CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
;----------------------------- PROGRAM ---------------------------------
cblock 0
crc
i
cnt1
cnt2
cnt3
counter_hi
counter_lo
flag
endc
cblock 10
buffer:64
dummy4crc
sendb ;byte to send
d1 ;for delay routine
endc
;0000000000000000000000000 RESET 00000000000000000000000000
ORG 0x0000
GOTO IntrareBootloader
;view with TabSize=4
;&&&&&&&&&&&&&&&&&&&&&&& START &&&&&&&&&&&&&&&&&&&&&&
;---------------------- Bootloader ----------------------
;PC_flash: C1h U H L x ... <64> ... crc
;PC_eeprom: C1h 40h EEADR EEDATA 0 crc
;PC_cfg C1h U OR 80h H L 1 byte crc
;PIC_response: type `K`
ORG first_address ;space to deposit first 4 instr. of user prog.
nop
nop
nop
nop
org first_address+8
IntrareBootloader
movlw b'10011111'
movwf TRISC ;init serial port
bcf PORTC,5 ;RS485 receive
movlw b'00100100'
movwf TXSTA
movlw spbrg_value
movwf SPBRG
movlw b'10010000'
movwf RCSTA
;wait for computer
rcall Receive
sublw 0xC1 ;Expect C1h = 'K'
bnz way_to_exit
movlw IdTypePIC
rcall SendW ;send PIC type
MainLoop
movlw 'K'
rcall SendW ;"-Everything OK, ready and waiting."
mainl
clrf crc
rcall Receive ;Upper
movwf TBLPTRU
movwf flag ;(for EEPROM and CFG cases)
rcall Receive ;Hi
movwf TBLPTRH
movwf EEADR ;(for EEPROM case)
rcall Receive ;Lo
movwf TBLPTRL
movwf EEDATA ;(for EEPROM case)
rcall Receive ;count
movwf i
incf i
lfsr FSR0, (buffer-1)
rcvoct ;read 64+1 bytes
movwf TABLAT ;prepare for cfg; => store byte before crc
rcall Receive
movwf PREINC0
decfsz i
bra rcvoct
tstfsz crc ;check crc
bra ziieroare
btfss flag,6 ;is EEPROM data?
bra noeeprom
movlw b'00000100' ;Setup eeprom
rcall Write
bra waitwre
noeeprom
btfss flag,7 ;is CFG data?
bra noconfig
tblwt* ;write TABLAT(byte before crc) to TBLPTR***
movlw b'11000100' ;Setup cfg
rcall Write
bra waitwre
noconfig
;write
eraseloop
movlw b'10010100' ;Setup erase
rcall Write
TBLRD*- ;point to adr-1
writebigloop
movlw 8 ;8groups
movwf counter_hi
lfsr FSR0,buffer
writesloop
movlw 8 ;8bytes = 4instr
movwf counter_lo
writebyte
movf POSTINC0,w ;put 1 byte
movwf TABLAT
tblwt+*
decfsz counter_lo
bra writebyte
movlw b'10000100' ;Setup writes
rcall Write
decfsz counter_hi
bra writesloop
waitwre
;btfsc EECON1,WR ;for eeprom writes (wait to finish write)
;bra waitwre ;no need: round trip time with PC bigger than 4ms
bcf EECON1,WREN ;disable writes
bra MainLoop
ziieroare ;CRC failed
movlw 'N'
rcall SendW
bra mainl
;******** procedures ******************
SendW
movwf sendb
bsf PORTC,5 ;RS485 transmit
btfss PIR1,TXIF
goto $-2
movff sendb,TXREG
nop
btfss TXSTA,TRMT
goto $-2
bcf PORTC,5 ;RS485 receive
return
Write
clrwdt
movwf EECON1
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR ;WRITE
nop
;nop
return
Receive
clrwdt
movlw xtal/2000000+1 ;for 20MHz => 11 => 1second delay
movwf cnt1
rpt2
clrf cnt2
rpt3
clrf cnt3
rptc
btfss PIR1,RCIF ;test RX
bra notrcv
movf RCREG,w ;return read data in W
addwf crc,f ;compute crc
return
notrcv
decfsz cnt3
bra rptc
decfsz cnt2
bra rpt3
decfsz cnt1
bra rpt2
;timeout:
way_to_exit
bcf RCSTA, SPEN ;deactivate UART
movlw b'11111111'
movwf TRISC
bra first_address
;*************************************************************
; After reset
; Do not expect the memory to be zero,
; Do not expect registers to be initialised like in catalog.
END
Kablolu olarak denedim zaten çalıştırıyorum bu şekilde.
Sorunum modüllerin baud rate'inden kaynaklı o yüzden.
Asm dosyasında "baud EQU 9600" olarak değiştirip derledim, tinybootloader programında ve serip portta 9600 baud rate seçtim ama PIC'i görmedi, 115200 yaptım o zaman gördü. Değiştirmeme rağmen 115200'de çalışıyor hala. Acaba başka yerlerde de değişiklik yapmak mı gerekiyor?
Bir de osilatör frekansını değiştirmek için en üstteki "xtal EQU 8000000" satırını değiştirmek yeterli mi?
RcALTIN hocam, şimdi de şöyle bir sorun çıktı ortaya. Nasıl çözebilirim bunu? Bu sorunu da halletsem çalışacak ama takıldım kaldım burada.
Connected to \\.\COM12 at 115200
HEX: 22 hours old, INHX8M,16Fcode+cfg, total=148 bytes.
Searching for PIC ...
Wait 200 ms
Wait 200 ms
Rcv:type=36h=6
K found
Found:16F 886/887
Also found:
EEprom: __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __
Config: __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __
Prepare16FPre - check HEX and GOTO
Reallocate to [03F38h..03F3Fh] (byte addr)
Prepare16FAfter - 0>+Goto 1FA0
Addr(words)=000000h, 3+64+1 bytes:
00 00 40 1F 30 8A 00 A0 2F 00 00 22 30 84 00 83 13 00 08 03 19 17 28 02 30 F8 00 F7 01 F7 0B 0D 28 F8 0B 0C 28 97 30 F7 00 F7 0B 13 28 80 0B 0A 28 00 34 84 01 83 13 1F 30 83 05 83 16 03 17 09 08 C0 39 1E
Sent:68
wait for a byte max 350 ms
timeout
timeout 1, trying to catch up
Sent:68
wait for a byte max 350 ms
Received "N": crc fail
purge( hex): 4E 4E 4E
purge(ascii): NNN
Sent:68
wait for a byte max 350 ms
Received "N": crc fail
Could not write
ERROR!
Could not write
Microchip'in bootloaderından buna geçmeyi denedim.
16f877A kullanıyorum. Check PIC dediğimde buluyor. Hex dosyasınıda istediğim kadar başarılı şekilde yazıyor; ancak program execute edilmiyor. PIC hiçbir işlem yapmıyor! Programladığım dosyanın başına:
#define MAX_FLASH getenv("PROGRAM_MEMORY")
#define LOADER_SIZE 0xFF
#org MAX_FLASH-LOADER_SIZE , MAX_FLASH-1 void boot_loader(void) {}
ekliyorum.
Sorun nedir?
Teşekkürler
Alıntı yapılan: jozzef - 29 Eylül 2011, 23:31:39
Microchip'in bootloaderından buna geçmeyi denedim.
16f877A kullanıyorum. Check PIC dediğimde buluyor. Hex dosyasınıda istediğim kadar başarılı şekilde yazıyor; ancak program execute edilmiyor. PIC hiçbir işlem yapmıyor! Programladığım dosyanın başına:
#define MAX_FLASH getenv("PROGRAM_MEMORY")
#define LOADER_SIZE 0xFF
#org MAX_FLASH-LOADER_SIZE , MAX_FLASH-1 void boot_loader(void) {}
ekliyorum.
Sorun nedir?
Teşekkürler
loader_size için 0xFF değil 0xC8 atayın veya değişkeni komple silin #org satırını max_flash-200,max_flash-1 şeklinde düzenleyin. bir de böyle deneyin...
#define max_flash getenv("PROGRAM_MEMORY")
#org max_flash-200,max_flash-1 void boot_loader(void) {}
şeklinde denedim olmadı hocam. Diğer önerinizde de olumsuz sonuç aldım.
Connected to \\.\COM4 at 115200
HEX: 0 min old, INHX8M,16Fcode+cfg, total=278 bytes.
Searching for PIC ...
Found:16F 876A/877A
WRITE OK at 23:56, time:1.017 sec
Yukarıdaki gibi yüklüyor. WDT kapalı. Yalnız ilginç bir durum var ki ( aslında ilginç midir bilemiyorum) "write flash" dedikten sonra direk yazıyor. Reset atmama gerek kalmıyor ancak otomatik reset içinde bir devre kurmadım, sadece MEMCLR bacağı 10k ile +5V ye bağlı
Alıntı yapılan: jozzef - 30 Eylül 2011, 00:02:08
#define max_flash getenv("PROGRAM_MEMORY")
#org max_flash-200,max_flash-1 void boot_loader(void) {}
şeklinde denedim olmadı hocam. Diğer önerinizde de olumsuz sonuç aldım.
Connected to \\.\COM4 at 115200
HEX: 0 min old, INHX8M,16Fcode+cfg, total=278 bytes.
Searching for PIC ...
Found:16F 876A/877A
WRITE OK at 23:56, time:1.017 sec
Yukarıdaki gibi yüklüyor. WDT kapalı. Yalnız ilginç bir durum var ki ( aslında ilginç midir bilemiyorum) "write flash" dedikten sonra direk yazıyor. Reset atmama gerek kalmıyor ancak otomatik reset içinde bir devre kurmadım, sadece MEMCLR bacağı 10k ile +5V ye bağlı
mcu içinde sadece bootloader varken reset atmaya gerek yok, user programdan çıkıp bootloader'ın başlamasını sağlamak için gerekiyor o devre; normal o yani. sorun kullandığınız loader yazılımıyla alakalı olabilir, forumda bir başka konuda belirttiğimi hatırlıyorum yeni sürüm loader ile bende başarılı olamamıştım(hatta aynı sıkıntı vardı yanlış hatırlamıyorsam, sorun mcu tarafındaki sürümün eski olması olabilir). kendim de eski sürümlerden birini kullanıyordum, onda sorun çıkmıyordu, o konuyu bulup okumanızı tavsiye ederim...
Daha eski sürümlerden birini denedim de, sonuç değişmedi. Tiny Bootloader'ın sayfasında şöyle bir bilgi var:
If you write your software in assembler the program must have in the first 4 words of memory a GOTO to the start of the main program. This is how most of the ASM programs look anyway. So in assembler it should look something like this:
org 0
;clrf STATUS
clrf PCLATH
goto Main
Assemblerda yazmıyorum; yine de main'e gidemiyor. Durumum bununla alakalı olabilir mi?
(http://a1111.hizliresim.com/r/4/b8yh.jpg)
16f887 4mhz için yu7kardaki reset devresi ile denem yaptım.
"Connected to \\.\COM4 at 19200
Searching for PIC ...
pic sending unknown data: "K" <> 0h=
Check baudrate & Start Write while PIC is not sending serial data (e.g. in reset)
ERROR!"
hatası alıyorum. böyle bir hata neden olabilir.
Alıntı yapılan: fryrmnd - 04 Kasım 2011, 11:34:40
(http://a1111.hizliresim.com/r/4/b8yh.jpg)
16f887 4mhz için yu7kardaki reset devresi ile denem yaptım.
"Connected to \\.\COM4 at 19200
Searching for PIC ...
pic sending unknown data: "K" <> 0h=
Check baudrate & Start Write while PIC is not sending serial data (e.g. in reset)
ERROR!"
hatası alıyorum. böyle bir hata neden olabilir.
pic ve loaderiniz farklı baudrate değerine sahip olabilir mi? picden yanlış hello char geliyormuş(K veya 0h değilmiş gelen) sanırsam...
versiyon 198 deki 887.asm dosyası
radix DEC
LIST P=16F887, F=INHX8M ; change also: Configure->SelectDevice from Mplab
; [u]auto-start at 4MHz internal osc [/u]
xtal EQU 4000000 ; you may also want to change: _HS_OSC _XT_OSC
baud EQU 19200 ; standard TinyBld baud rates: 115200 or 19200
;xtal EQU 4000000 ; you may also want to change: _HS_OSC _XT_OSC
;baud EQU 19200 ; standard TinyBld baud rates: 115200 or 19200
anladığım baud 19200 ve kristal de 4MHz. Yanlış yapmıyorum değil mi.
IG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & [u]_INTRC_OSC_NOCLKOUT[/u]
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
; auto-start at 4MHz internal osc , _INTRC_OSC_NOCLKOUT
altı çizili açıklama ve sigorta ayarlarındaki altı çizili ifade... dahili osc mi kullanılıyor acaba. biliyormusunuz. eğer öyle ise kristal bağlamam bu hataya sebep olabilir mi.
Üzerinde baya bir zaman geçmiş. bu işte ustalaşmış forum üyelerimiz olmuştur muhakak.. ben bir kaç soru sormak istiyorum..
1.usb bağlantısıyla yapılabilir mi??
2.rs232 to usb kabloları performans açısından iyimidir ? dezavantaj yaratırmı ? bu uygulamada veya başka uygulamalarda??
Alıntı yapılan: Extreme - 19 Şubat 2013, 12:52:50
Üzerinde baya bir zaman geçmiş. bu işte ustalaşmış forum üyelerimiz olmuştur muhakak.. ben bir kaç soru sormak istiyorum..
1.usb bağlantısıyla yapılabilir mi??
2.rs232 to usb kabloları performans açısından iyimidir ? dezavantaj yaratırmı ? bu uygulamada veya başka uygulamalarda??
TinyBootloader'ı usb/rs232 çevirici ile kullanabilirsiniz.
Kaliteli ve bilinen bir marka konvertör kullanmanızı tavsiye ederim. rts/cts uçları çalışmayan konvertörler de mevcut piyasada...
yapacağım çalışma için rs232 to usb kablo hoş olmaz diye düşündüm
tiny bootloader sitesini inceliyorumda sanırım tiny bootloaderda usb bağlantılı bir şema anlatılmamış.
usb ile tiny bootloader programı kullanılabilir mi ?
Alıntı yapılan: Extreme - 23 Şubat 2013, 18:20:32
yapacağım çalışma için rs232 to usb kablo hoş olmaz diye düşündüm
tiny bootloader sitesini inceliyorumda sanırım tiny bootloaderda usb bağlantılı bir şema anlatılmamış.
usb ile tiny bootloader programı kullanılabilir mi ?
Bilgisayarınızda seri port yoksa, usb kullanacaksınız. tinybld yazılımı seri port üzerinden çalışıyor. Yani konvertör kullanmak zorundasınız.
arada çevirici görünmesin istiyorsanız, usb-ttl çeviriciler var, biraz değişiklik yaparak kullanabilirsiniz.
http://dx.com/p/cp2102-usb-to-ttl-converter-module-red-146141 (http://dx.com/p/cp2102-usb-to-ttl-converter-module-red-146141)
hocam bu iş eski teknoloji olur gibi geliyor .. tiny bootloaderı askıya alıyorum.
şu an iki tane bootloader yapabiliyorum basit bir devre üzerinde
ikisinden biri umarım bitirme projemde çalışır.