arkadaşlar pic 18f452 mikro denetleyiciye bootloader i yükledikten sonra kendi yazılımımızı pic e yüklemek için hi-tech derleyicisinde ne gibi bir ayar yapmamaız gerekiyor. ben bu sitede şöyle birşey buldum
__CONFIG(5, 0XFFFF);
__CONFIG(6,WPB & WP3);
yukarıdaki gibi bir ayar mı yapılması gerekiyor. aslında bunun ne olduğunu tam anlamadım . :-[ benim kullandığım bootloader microchipc in kendi sitesindeki bootloader 18f452 için. bunu pic e yüklediğim bootloader çalışıyor yaptığım programın hex dosyasıda seri porttan alınıyor ama derleyicide gerekli ayarlamaları yapmadığım için program çalışmıyor. bu konuda bilgisi olan arkadaşlardan yardım bekliyorum . ;D herkese kolay gelsin...
arkadaşlar bu konuda bilgisi olan yok mu...
beyler neden kimse ilgilenmiyor. bu sitede bu konuda br çalışma yapmış biri vardır eminim rica ediyorum Hi-tech te 18f452 için bootloader ayarlamaları ile ilgili bilgi verin . tekrar herkese iyi çalışmalar...
hi-tech ile bootloader demek saçları dökmek demek ben 18F46j11 için bootloader çalışıyorum veriyi gprs den alıp yazılım içinde kendi programını güncelleyeceğim ama ne kadar uğraştırdı anlatması zor butür işlerde psect komutları kullanılıyor iş tamamen asm ye kalıyor.
mesela 16F için
const unsigned char dizi[8]= @ 1FFF {"merhaba"};
veya
void boot () @ 1FFF
{
}
gibi kodlar rom adresinde yerleştirilebiliyorken 18F de
bootloader programını linker üzerinden -L-Pboot=FE06h şeklinde bildiriyorsunuz daha sonra #pragma psect string=boot gibi ifadeler var kodlarını programdan saklamak için --rom=default,-FE06-FFF8 gibi romu bölüyorsunuz. hi-tech bootloader için yeterli kaynak yok versiyonların eski ve çok sayıda hepsinin birbirinden farklılık göstermeside ayrı bir dert bu iş için C18 veya asm yoluyla çözmenizi tavsiye edebilirim ben bootloader kısmını asm de yazdım opcodeları psect komutlarıyla rom hafızasına string olrak yerleştirdim. örnek:
#asm
psect boot,global,reloc=2,class=MEDIUMCONST,delta=1
global _temp
_temp:
dw 0x000C ;FE06
dw 0x0E3F ;FE08
dw 0x1616 ;FE0A
.
.
.
@endasm
kolay gelsin.
arkadaşım sen benim bütün hayallerimi suya düşürdün ya :-\ . hal buki diğer derleyicilerde bu iş nekadar kolay hallediliyor. asm ile boot loader i rom hafızasına teker teker yazmak çoook büyük bir zahmet değil mi nasıl uğraştınız onunla. ben microchipc.com dan 18f452 için bootloader indirdim şimdi yazdığım kodları bir direktif ile belli bir adresten başlayıp devam etmesini sağlayamıyor muyum hi-tech te bu durum neden bu kadar karmaşık yapılmış. C18 den bahsetmişsiniz C18 microchip in c derleyicisi mi acaba hi-tech te yazdığım kodları direk bu derleyicide derleye bilirmiyim bu işi en kolay nasıl halledebilirim sizce . halbu ki ben hi-tech derleyicisini çok sevmiştim zor ama güzel bir derleyici bir çok şeyi bana bırakıyor uğraştırıyor insanı ama çok ta şey öğretiyor insana :) ama bu durumu çözmem gerek hi-tech in pdf dosyasında yükarıda yazdığınız direktifler felan var sanırım ama pek birşey anlayamadım çok deneme yapıp işi çözmem gerek . siz c18 hakkında bilgi verirmisiniz
Açıkcası bende ilk başladığımda tek satırlık kodlarla halledilebilecektir diye bekliyordum ama iş okadar kolay değilmiş c18 de #pragma fonksiyonu çok daha gelişmiş tek satırda istenilen rom adresine atlanabiliyor ama hi-tech bambaşka neredeyse rom üzerine hiç çalışılmamış .as dosyasındaki asm komutlarına baktığınızda yapmanız gereken işi anlayabiliyorsunuz bazı durumlarda ordanda değişiklik yapmak gerekiyor benim seçtiğim yöntem çok uzun bir yol ama işe yaradı rom hafızayı 3'e böldüm ana program, flashbuffer ve bootloader olarak main çalışırken flash bufferı dolduruyor bootloader kısmı sadece buffer ile ana programı yerdeğiştiriyor usart gibi dışardan alıyor olsaydım verileri belki daha kolay olacaktı belkide bu yüzden zorlandım hi-tech hızlı ama eksik bir dil manual pdf i yetersiz asm kısmıyla nasıl birleşeceğini anlatmıyor buraları karıştırmayın demek gibi bişey olmuş sadece örneklerden yola çıkarak çalıştırdım 1k lık program güncellemesini yapabildim üzerine çıkamadım banklar sorun çıkarttı yani allah sabır verdikçe devam ediyorum kütüpanelerim hatrına. C18 hakkında çok kapsamlı bilgim yok ama araştırırken öğrendiğim kadarıyla benim hi-techde aradığım yöntemler komutlar c18de var. daha önceki tft ekranlarda aynı kodu C18 ve hitechde derlediğimde hi tech 3/2 hızlı çalışmıştı ondan sonra c18 üzerine gitmedim aktarabileceklerim bukadar.
kolay gelsin.
arkadasim bence sen hi-tech diilde c18 ile yap bootloader i hem denetleyicin 18 f serisi oyuzden problem olmaz hemde microchipin sitesinde bol bol c18 ornegi var ben derimki bukadar ugrasma ve c18 ile yap kodlari birbirine yakin zaten...
#include <htc.h>
#include <stdio.h>
// BAUDRG is calculated as = Fosc / (4 * Desired Baudrate) - 1
// So, 4MHz / (4 * 19200) - 1 = 52 (approx.)
//#define BAUDRG 51 // 19.2Kbps from 4MHz INTOSC
//#define BAUDRG 103 // 115.2Kbps from 48MHz
//#define BAUDRG 89 // 115.2Kbps from 41.66MHz
#define BAUDRG 85 // 115.2Kbps from 40MHz
//#define BAUDRG 68 // 115.2Kbps from 32MHz
//#define BAUDRG 16 // 115.2Kbps from 8MHz
//#define BAUDRG 11 // 1Mbps from 48MHz
//#define BAUDRG 9 // 1Mbps from 40MHz
//#define BAUDRG 4 // 2Mbps from 40MHz
//#define BAUDRG 3 // 3Mbps from 48MHz
//#define BAUDRG 1 // 6Mbps from 48MHz
#ifndef BAUDRG
#define BAUDRG brg // use bootloader autobaud BRG if constant not provided
#endif
#define INVERT_UART // If you don't have an RS232 transceiver, you might want this option
void putch(unsigned char byte);
//__EEPROM_DATA(0, 1, 2, 3, 4, 5, 6, 7, 0x80, 0x7F);
void interrupt isr(void)
{
LATD1 ^= 1; // blink LED
TMR1IF = 0; // clear Timer 1 interrupt flag
}
void interrupt low_priority low_isr(void)
{
if(RCIF)
{
#ifdef INVERT_UART
if(FERR && RC7)
#else
if(FERR && RC7 == 0)
#endif
{
// receiving BREAK state, soft reboot back into Bootloader mode.
RESET();
}
TXREG = RCREG; // echo received serial data back
LATD ^= 0xF0; // blink LEDs
}
if(TMR0IF)
{
LATD0 ^= 1; // blink an LED
TMR0IF = 0; // clear Timer 0 interrupt flag
}
}
#ifndef SPBRGH
#define SPBRGH SPBRGH1 // PIC18F8722
#define BRG16 BRG161
#define TXIF TX1IF
#endif
persistent unsigned int brg;
void main(void)
{
PLLEN = 1; // enable PLL for higher speed execution
#ifdef INVERT_UART
LATC6 = 0; // drive TXD pin low for RS-232 IDLE state
#else
LATC6 = 1; // drive TXD pin high for RS-232 IDLE state
#endif
TRISC6 = 0;
if(POR == 0)
{
// Power On Reset occurred, bootloader did not capture an autobaud BRG value.
brg = 0;
POR = 1; // flag that future MCLR/soft resets are not POR resets
}
else
{
if(SPBRGH || SPBRG)
{
// save bootloader autobaud BRG value for display later.
brg = SPBRGH;
brg <<= 8;
brg |= SPBRG;
}
}
TMR0H = 0;
TMR0L = 0;
T0CON = 0b00010110;
TMR0IF = 0;
TMR0IE = 1;
TMR0IP = 0;
TMR1H = 0;
TMR1L = 0;
T1CON = 0b00110111;
TMR1CS = 0; // internal clock (Fosc/4)
TMR1IF = 0;
TMR1IE = 1;
TMR1IP = 1; // Timer 1 as High Priority interrupt
RCONbits.IPEN = 1; // enable interrupt priority
INTCONbits.GIEH = 1;
INTCONbits.GIEL = 1;
TXSTA = 0b00100100; // Async, 8 bit, BRGH
BRG16 = 1;
#ifdef INVERT_UART
BAUDCON1 |= 0b00110000; // invert UART signals
#endif
SPBRG = (BAUDRG & 0xFF);
SPBRGH = (BAUDRG >> 8);
RCSTA = 0b10010000;
RC1IP = 0; // USART RX interrupt as low priority interrupt
RC1IE = 1; // enable USART RX interrupt
LATD = 0; // turn off LEDs
TRISD = 0; // enable PORTD LED outputs
// wait for stable clock and host connection by waiting for first Timer 0 interrupt
TMR0ON = 1;
while(LATD0 == 0);
if(brg != 0)
{
printf("Bootloader BRG: %d\r\n", brg);
}
printf("\r\nHello world from PIC microcontroller!\r\n");
// infinite loop, interrupts will blink PORTD pins and handle UART communications.
while(1)
{
}
}
void putch(unsigned char byte)
{
while(TXIF == 0)
{
// spin until done transmitting
}
TXREG = byte;
}
usta buyur sana 18f serisi hi-tech kodu istersen c18 kodu da var ama yinede sen bilirsin...
hocam kodlarda flash yazım kısmı yok sanırım bu haliyle bootloaderın sadece usart alım kısmı yazım kısmıda eklendikten sonra --rom=default, direktifiyle hafıza bölümlenerek çok rahat çalıştırılabilir. benim bahsettiğim daha temeli spesific bir iş çıkartmaya çalışınca hitech picc18 in sınırlarını zorlama şansım oldu :)
valla hocam bu ornegi microchipin sitesinden aldim hi-tech de directive ler yok ama c18 ornegine baktigimda rom hafizasi belirtilmis ben hi-tech kullanmadigim icin bilmiyorum acikcasi..ben ccs c den direkt olarak microchip c18 derleyicisine gectim ve ondan cok da memnunum ...
şimdi arkadaşlar öncelikle hepinize ilginiz için teşekürler. benim anlayamadığım bir nokta var ben bootloader denen yazılımı kendim mi derlemem gerekiyor. derlenmiş hex dosyasını pic e yükledikten sonra derleyicide yazdığımız programın pic in rom unun hangi adresinden itibaren yükleneceğine dair bir direktif yazıp işi halledemiyor muyuz. besic dillerinde ve ccs de millet bir hamlede bu işi yapıyor ne güzel . şunu sorayım kendi yazdığım programın hangi adrese yükleneceğini ben bootloader yazılımının açık kaynak kodunda değişiklikler yaparak ve onu kendim derleyerek mi ayarlıyorum. yoksa bootloader in hex dosyasını yükledikten sonra kendi programımda bir takım direktifler kullanarak mı adresi belirliyorum . kafam karıştı yaa. :-[ mesela şöle birşey rica etsem pic 18f452 için çok basit bir program yapalım mesela yanıp sönen bir lamba programı bunu boot loader ile pic e yükleyelim bunu yapıp kodlarını forma koyabilirseniz çok sevinirim arkadaşlar. birde sanırım microchip in c18 derleyicisine geçmem gerekiyor eğer onunla bu işi yapmak daha basit ise örneği onun ile yapabilirseniz çok sevinirim. biraz fazla şey istedim sanırım. ilgilenen bir arladaş olursa şimdiden teşekkür ediyorum kendisine ... iyi çalışmalar..
dostum eğer bootloader kullanmak istiyorsan microcode studio nun içinde mcloader klasörünün içinde bootloader yazılımları var onları kullanabilirsin.oto baudrate,resette yükleme,microcode stucio ile tek tuşla picbasic programlarını derleyip pic'e yükleme gibi özellikleri var.Hitech kullanıyorsan bu bootloaderi de kullanacaksan programının içinde mutlaka interrupt fonksiyonun olması lazım.Ne demek bu?
interrupt kullanmıyorsan bile boş bir interrupt fonksiyonunu programında bulunduracaksın.kullan çok memnun kalacaksın.başka bootloader aramana gerek yok.
öncelikle teşekkür ederim . microcode studio daki bootloader i pic e yükledikten sonra hi-tech ile yaptığım programın hex dosyasını bir değişiklik yapmadan sadece boş bir int fonksiyonu kullanarak pic e bootloader ile yükleye bilirmiyim. onu anladım ben şimdi yanlış anladıysam düzeltin tütfen. sizin söylediğiniz bootloader programı benim hex kodlarımı alıp kendisi uygun bir adrese mi yerleştiriyor. eğer böyle oluyorsa bu çok güzel olur benim için doğru anlamışmıyım :)
bootloader programı programını alıp boş yerlere yerleştirmiyor.şimdi hitech interrupt programı kullanılmıyorsa;programı ilk adresten itibaren adreslere sırayla yerleştirir.Eğer interrupt kullanırsanız hitech ana programın başlangıç adresini 0x0000 ve 0x0001 adresine yazar,0x0003 ü boş bırakır,0x0004'den itibaren interrupt programını yazar.kesme programından hemen sonra da ana program başlar.sen kesmeyi hiteche bildirmezsen bootloader ana programın başlangıç adresini asla bulamaz hatalı yükleme yapar.
şimdi birşeyler anlamaya başladım interrupt adresi zaten belli oxo4, ana programda interrupt alt programından hemen sonra başlayacağından ana programında başlangıç adresi belli oluyor böylelikle. peki bu microcode studio nun 18f452 bootloader i pic in rom hafızasının ilk başında değilde sonunda olması gerek öyle değil mi. :D eğer hafızanın sonunda ise pic e ilk enerji verildiğinde bu program çalışması gerek ilk başta bu nasıl çalışıyor. yoksa ben programı yazarken ana programın içinde programı ilk önce bottloader başlangıç adresine mi yönlendiriyorum. yani anlatmaya çalıştığım şu bu bootloader pic in hafızasının neresinde ki benim hex dosyam alındığında kendisi bozulmuyor ve pic resetlendiğinde ilk önce bootloader çalışıyor.. :-\ size zahmet veriyom hocam kusura bakmayın :-[ ilginiz için çok teşekkür ederim ayrıca
aynen anladığın gibi.pic resetlenince 0x0000 adresine gidiyor.bu adreste ne var?? hitech bu adrese programın interruptan sonraki adresini yani ana programın adresini yerleştiriyor.Peki nasıl oluyorda bootloader resetlenince boot programını buluyor???
Çünkü boot programı yüklerken ana programın başlangıç adresini 0x0003 ve 0x0004 adreslerine taşıyor yerine yani 0x0000 ve 0x0001 adreslerine kendi programının(boot programının) başlangıç adresini atıyor.böylece reset durumunda önce boot programı çalıştırılıyor.
Donanımı incelerseniz seri portun RTS ucunun MCLR ucuna bağlandığını görürsünüz.Siz noot programı ile hex atmak istediğinizde önce pic RTS ucu tarafından resetleniyor ve boot programının çalıştırılması sağlanıyor.
s.a. bu problem çözüldümü. aynı sorunu 18f4550 hitech ile ben yaşıyorum. yardım...