HI-TECH PICC de boot loader kullanımı

Başlatan picman, 01 Kasım 2010, 18:54:54

picman

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...
Bilgi paylaştıkça artar..

picman

arkadaşlar bu konuda bilgisi olan yok mu...
Bilgi paylaştıkça artar..

picman

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...
Bilgi paylaştıkça artar..

X-Fi

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.

http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

picman

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
Bilgi paylaştıkça artar..

X-Fi

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.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

justice_for_all

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...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

justice_for_all

#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...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

X-Fi

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 :) 
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

justice_for_all

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 ...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

picman

ş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..
Bilgi paylaştıkça artar..

serdararikan

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.

picman

ö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  :)
Bilgi paylaştıkça artar..

serdararikan

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.

picman

ş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
Bilgi paylaştıkça artar..