اطلاعیه

Collapse
No announcement yet.

برنامه نویسی بوتلودر

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    برنامه نویسی بوتلودر

    سلام دوستان من میخوام یه برنامه واسه بوتلودر بنویسم صرفا جهت یادگیری اما دیگه مخم نمیکشه میشه لطفا شما هم به من کمک کنید برنامه زیر شده نتیجه نهایی برنامه من ; برنامه رو قراره از eeprom بخونه و تو حافظه فلش بنویسه اما چرا کار نمیده اونو دیگه نمیدونم چرا; بکوب یه ماهه دارم دربارش مطالعه میکنم ده ها بار برنامه رو برسی کردم مقدار از eeprom درست خونده میشه و تو رم ذخیره میشه به صورت عملی تست کردم مشکل تو قسمت نوشتن برنامه تو قسمت فلش میکرو که دقیقا نمیدونم مشکل از کجاشه همه چیزم تنظیم کردم برنامه برای قسمت بوتلودر تولید میشه و اجرا هم میشه اما بعد از پرش به ادرس 0x0000 فلش دوباره همین برنامه رو اجرا میکنه با تشکر از دوستان
    کد:
    #define F_CPU 8000000UL
    #define page_1 17
    
    #define D4 eS_PORTC3
    #define D5 eS_PORTC2
    #define D6 eS_PORTC1
    #define D7 eS_PORTC0
    #define EN eS_PORTD0
    #define RS eS_PORTD1
    
    #include <avr/io.h>
    #include <stdio.h>
    #include <inttypes.h>
    #include <util/delay.h>
    #include <avr/eeprom.h>
    #include <stdint.h>
    #include <avr/boot.h>
    #include <avr/pgmspace.h>
    #include <string.h>
    #include "lcd.h"
    
    uint8_t EEMEM flashodata[page_1][SPM_PAGESIZE];  
    
    
    void flashdata_00(uint8_t *pointer_ss,uint8_t ss_size);
    
    
    
    
    int main(void)
    { 
    uint8_t flashdata[SPM_PAGESIZE];
    uint8_t u=0;
    uint8_t n=page_1-1;
    uint8_t *buf=&flashdata[0];
    uint16_t w=0;
    uint32_t page=0;
        DDRD=0xff;
        DDRC=0xff;
        Lcd4_Init();
        Lcd4_Clear();
        Lcd4_Write_String("start");
        _delay_ms(5000);
    while (1)
      {
        flashdata_00(flashdata,SPM_PAGESIZE);
        eeprom_read_block((void *)flashdata,(const void *)flashodata[u],SPM_PAGESIZE);
        Lcd4_Clear();
        Lcd4_Write_String("read eeprom ok");
        _delay_ms(500);
        if(u!=n) u++;
        else {
            u=0;
            Lcd4_Clear();
            Lcd4_Write_String("end");
            _delay_ms(500);
            asm ( "ret" );
            };
        page=(u<<6);
            boot_page_erase(page);
            boot_spm_busy_wait();
        
        for(uint8_t a=0;a<SPM_PAGESIZE;a+=2){
            w=*buf++;
            w+=(*buf++)<<8;
            boot_page_fill(page+a,w);
           
        }
        boot_page_write(page);
        boot_spm_busy_wait();
        boot_rww_enable();
        Lcd4_Clear();
        Lcd4_Write_String("write page ok");
        _delay_ms(500);
        
        
       
      }
    
    }
    
    
    
    
    
    
    void flashdata_00(uint8_t *pointer_ss,uint8_t ss_size){
    for (;ss_size!=0;ss_size--,*pointer_ss=0x00,*pointer_ss++);
        }
    فایل eeprom:

    کد:
    :100000000C942A000C943F000C943F000C943F0089
    :100010000C943F000C943F000C943F000C943F0064
    :100020000C943F000C943F000C943F000C943F0054
    :100030000C943F000C943F000C943F000C943F0044
    :100040000C943F000C943F000C943F000C943F0034
    :100050000C943F0011241FBECFE5D4E0DEBFCDBF1E
    :1000600010E0A0E6B0E0E8E7F4E002C005900D92F1
    :10007000A636B107D9F70E9425020C943A020C94D7
    :100080000000672B09F078C08A30910511F4C09800
    :1000900008958B30910511F4C19808958C30910525
    :1000A00011F4C29808958D30910511F4C398089504
    :1000B0008E30910511F4C49808958F30910511F494
    :1000C000C59808958031910511F4C698089581313D
    :1000D000910511F4C79808958431910511F4A898F9
    :1000E00008958531910511F4A998089586319105F7
    :1000F00011F4AA9808958731910511F4AB980895E9
    :100100008831910511F4AC9808958931910511F465
    :10011000AD9808958A31910511F4AE9808958B3108
    :10012000910511F4AF9808958E31910511F49098CE
    :1001300008958F31910511F49198089580329105B9
    :1001400011F4929808958132910511F493980895CD
    :100150008232910511F4949808958332910511F437
    :10016000959808958432910511F49698089585978D
    :1001700009F078C0979808958A30910511F4C09AD3
    :1001800008958B30910511F4C19A08958C30910532
    :1001900011F4C29A08958D30910511F4C39A08950F
    :1001A0008E30910511F4C49A08958F30910511F4A1
    :1001B000C59A08958031910511F4C69A0895813148
    :1001C000910511F4C79A08958431910511F4A89A04
    :1001D00008958531910511F4A99A08958631910504
    :1001E00011F4AA9A08958731910511F4AB9A0895F4
    :1001F0008831910511F4AC9A08958931910511F473
    :10020000AD9A08958A31910511F4AE9A08958B3113
    :10021000910511F4AF9A08958E31910511F4909AD9
    :1002200008958F31910511F4919A089580329105C6
    :1002300011F4929A08958132910511F4939A0895D8
    :100240008232910511F4949A08958332910511F444
    :10025000959A08958432910511F4969A0895859798
    :1002600009F4979A0895CF93C82F80FF07C061E0E3
    :1002700070E087E190E00E94410006C060E070E01D
    :1002800087E190E00E944100C1FF07C061E070E09B
    :1002900086E190E00E94410006C060E070E086E1E7
    :1002A00090E00E944100C2FF07C061E070E085E17C
    :1002B00090E00E94410006C060E070E085E190E0BF
    :1002C0000E944100C3FF07C061E070E084E190E05C
    :1002D0000E94410006C060E070E084E190E00E946E
    :1002E0004100CF910895CF93C82F60E070E08FE177
    :1002F00090E00E9441008C2F0E94330161E070E089
    :100300008EE190E00E9441008FEC97E00197F1F7B9
    :1003100000C0000060E070E08EE190E00E944100CB
    :100320008FEC97E00197F1F700C00000CF9108959E
    :1003300080E00E94730181E00E947301089580E0D3
    :100340000E9433018FE39CE90197F1F700C00000A0
    :1003500083E00E9473018FE097E20197F1F700C0FC
    :10036000000083E00E9473018FEE95E50197F1F79D
    :1003700000C0000083E00E94730182E00E947301CC
    :1003800082E00E94730188E00E94730180E00E9475
    :1003900073018CE00E94730180E00E94730186E08B
    :1003A0000E9473010895CF93C82F61E070E08FE140
    :1003B00090E00E9441008C2F82958F700E94330143
    :1003C00061E070E08EE190E00E9441008FEC97E0E8
    :1003D0000197F1F700C0000060E070E08EE190E06E
    :1003E0000E9441008FEC97E00197F1F700C00000F8
    :1003F0008C2F8F700E94330161E070E08EE190E0FD
    :100400000E9441008FEC97E00197F1F700C00000D7
    :1004100060E070E08EE190E00E9441008FEC97E098
    :100420000197F1F700C00000CF910895CF93DF93BB
    :10043000EC018881882331F021960E94D3018991B3
    :100440008111FBCFDF91CF9108958FEF81BB84BBEA
    :100450000E949F010E94980180E690E00E9416028F
    :100460002FEF83ED90E3215080409040E1F700C0F2
    :100470000000F0CFF894FFCF73616A61640060
    :00000001FF
    توضیحات فایل boot.h:


    فایل پروژه:
    http://www.0up.ir/do.php?downf=New-folder_cdf69.rar
    جدیدترین ویرایش توسط سید سجاد احدزاده; ۱۳:۲۱ ۱۳۹۵/۰۸/۱۳.
    سقراط : دانش من بدانجایی رسید که فهمیدم هیچ نمیدانم.

    #2
    پاسخ : برنامه نویسی بوتلودر

    یه چیز متوجه شدم برنامه توسط میکرو نوشته میشه اما درست نوشته نمیشه حالا علتش نمیدنم چی میتونه باشه یا تو فایل eeprom مشکلی هست یا مقدار فایل از حافظه eeprom بیشتر هست
    سقراط : دانش من بدانجایی رسید که فهمیدم هیچ نمیدانم.

    دیدگاه


      #3
      پاسخ : برنامه نویسی بوتلودر

      در توضیح صورت مسئله خود جزییات بیشتری را بیان کنید زیرا این شکل از طرح مسئله مستلزم این است که یک نفر وقت زیادی را صرف کند و کد شما را تحلیل کند تا به اشکالات احتمالی پی ببرد که معمولا چنین فرصتی کمتر در اختیار افراد است. برای به نتیجه رسیدن کار هم پیشنهاد می شود در ابتدا بصورت گام به گام پیش بروید و سعی کنید برای نوشتن یک صفحه در flash برنامه ساده ای را بنویسید و از آن جواب بگیرید و سپس مراحل ترکیبی تر مثل کپی کردن اطلاعات از eeprom به flash را اضافه کنید.
      اوژن: به معنای افکننده و شکست دهنده است
      دانایی، توانایی است-Knowledge is POWER
      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

      دیدگاه


        #4
        پاسخ : برنامه نویسی بوتلودر

        با تشکر از جناب طراح من به پیشنهادشون به صورت مرحله به مرحله پیش رفتم و جواب گرفتم اول داده یک پیج را از فایل هگز جدا کردم که برای atmega8 چهار خط فایل فایل هگز بود که تو هر خط بایت های اضافه رو حذف کردم و بقیه رو داده که در هر خط 16 بایت بود رو تو ارایه قرار دادم و سپس توسط به همراه برنامه پروگرام کردم بعد از اجرا برنامه مقدار حافظه فلش توسط پروگرامر read کردم و داده داخل حافظه فلش رو با داده ارایه مقایسه کردم که کاملا درست بود ومشکلی نبود وبه همین ترتیب برنامه رو برای eeprom تغییردادم و جواب داد
        حالا یه مشکل دارم و اونم اینه که وقتی میکرو به(( اخرین بایت ها میریسه که یه پیج کامل نمیشه و بقیه داده اریه با صفر پر میشه )) همون پیج داده هاش به طور کامل تغییر میکنه و به یه صورت دیگه و با یه داده های دیگه تو حافظه فلش نوشته میشه
        این برنامه توسط پروگرامر رو حافظه فلش رایت شده:



        این هم همون برنامه هست اما توسط میکرو رایت شده:




        این قسمت تعداد پیج ها هست که اول محاسبه میکنم که ببینم یک پیج چند خط فایل هگز شامل میشه بعد تعداد خط های فایل هگز برنامم رو میشمرم و بر اون عدد تقسیم میکنم و تعداد پیج ها رو بدست میارم:
        کد:
        #define page_1 2
        با این دستور ادرس پیج داخل متغییر 32 بیتی page قرار میدم:
        کد:
        page=(u<<6);
        با این دستور پیج رو erase میکنم:
        کد:
        boot_page_erase(page);
                boot_spm_busy_wait();
        با این تابع داده رو از eeprom به صورت 64 بایت داده میخونم و flashdata هم اریه ای هست که مقدار پیج توش قرار میگیره u هم شماره پیج هست :
        کد:
        eeprom_read_block((void*)flashdata,(const void*)flashodata[u],SPM_PAGESIZE);
        با این برنامه هم مقدار ارایه رو تو بافر موقت مینویسم که دومین خط و سومین خط برنامه بایت ها رو به صورت littel indian داخل متغییر w قرار میدن که به صورت ورد تو بافر موقت نوشته میشه:
        کد:
        for(uint8_t a=0;a<SPM_PAGESIZE;a+=2){
                    w=*buf++;
                    w+=(*buf++)<<8;
                    boot_page_fill(page+a,w);
                    
                }
        با این قسمت هم عملیات نوشتن بعد از erase کردن هست:
        کد:
        boot_page_write(page);
                boot_spm_busy_wait();
                boot_rww_enable();
        این قسمت هم برای خروج از حلقه بعد از اتمام نوشتن تمام پیج هاست
        کد:
        if (u==k) break;
                else u++;
        با این تابع هم مقدار ارایه flashdata صفر میشه:
        کد:
        flashdata_00(flashdata,SS);
        کل برنامه:
        کد:
        #define F_CPU 8000000UL
        #define page_1 2
        
        #define D4 eS_PORTC3
        #define D5 eS_PORTC2
        #define D6 eS_PORTC1
        #define D7 eS_PORTC0
        #define EN eS_PORTD0
        #define RS eS_PORTD1
        
        #include <avr/io.h>
        #include <avr/eeprom.h>
        #include <stdio.h>
        #include <inttypes.h>
        #include <util/delay.h>
        #include <stdint.h>
        #include <avr/boot.h>
        #include <avr/pgmspace.h>
        #include <string.h>
        #include "lcd.h"
        
        uint8_t EEMEM flashodata[page_1][SPM_PAGESIZE];
        void flashdata_00(uint8_t *pointer_ss,uint8_t ss_size);
        
        
        int main(void)
        {
            uint8_t flashdata[SPM_PAGESIZE];
            uint8_t *buf=&flashdata[0];
            uint16_t w=0x0000;
            uint8_t u=0,k=page_1-1,SS=SPM_PAGESIZE-1;
            uint32_t page=0;;
            DDRD=0xff;
            DDRC=0xff;
            Lcd4_Init();
            Lcd4_Clear();
            Lcd4_Write_String("start");
            _delay_ms(5000);
            while(1){
                page=(u<<6);
                boot_page_erase(page);
                boot_spm_busy_wait();
                eeprom_read_block((void*)flashdata,(const void*)flashodata[u],SPM_PAGESIZE);
                _delay_ms(10);
                
                
                for(uint8_t a=0;a<SPM_PAGESIZE;a+=2){
                    w=*buf++;
                    w+=(*buf++)<<8;
                    boot_page_fill(page+a,w);
                    
                }
                boot_page_write(page);
                boot_spm_busy_wait();
                boot_rww_enable();
                Lcd4_Clear();
                _delay_ms(1000);
                Lcd4_Write_String("write page ok");
                _delay_ms(1000);
                if (u==k) break;
                else u++;
                flashdata_00(flashdata,SS);
            }
                
                
                
            }
        void flashdata_00(uint8_t *pointer_ss,uint8_t ss_size){
            for (;ss_size!=0;ss_size--,*pointer_ss=0x00,*pointer_ss++);
        }
        جدیدترین ویرایش توسط سید سجاد احدزاده; ۲۱:۰۴ ۱۳۹۵/۰۸/۱۳.
        سقراط : دانش من بدانجایی رسید که فهمیدم هیچ نمیدانم.

        دیدگاه


          #5
          پاسخ : برنامه نویسی بوتلودر

          سلام دوستان مشکل حل شد با تغییر قسمت تبدیل بایت به ورد و پیاده سازی روش littel indian و همچنین گذاشتن یک شرط به این صورت که اگر پیج اخر بود و دو ورد پشت سر هم دارای مقدار FFFF بود از حلقه خارج شه به شکل زیر :
          کد:
          for(uint8_t a=0;a<SPM_PAGESIZE;a+=2){
                      w=flashdata[i++];
                      w+=(flashdata[i++])<<8;
                      if(u==k && w==0xffff){
                      w1=flashdata[i++];
                      w1+=(flashdata[i++])<<8;
                      if(w1==0xffff) break;
                          
                          
                      }
              
                           else boot_page_fill(page+a,w);
                      
                      
                  }
          حالا موفق شدم یه برنامه رو از eeprom بخونم و رو حافظه فلش پروگرم کنم به زودی یک اموزش کامل قرار میدم درباره بوتلودر و اینکه چطور برنامه رو کد گذاری کنیم و سپس تو میکرو برنامه رو بخونیم و کدگشایی کنیم و رو حافظه فلش پروگرم کنیم با تشکر از همه
          جدیدترین ویرایش توسط سید سجاد احدزاده; ۰۱:۳۱ ۱۳۹۵/۰۸/۱۴.
          سقراط : دانش من بدانجایی رسید که فهمیدم هیچ نمیدانم.

          دیدگاه


            #6
            پاسخ : برنامه نویسی بوتلودر

            مشکل قسمت بالا به خاطر دوباره مقدار ندادن به پوینتر buf بود که دیگه نیازی به تغییر برنامه اصلی به شکل بالا نیست فقط اضافه کردن این دستور قبل از حلقه for کافیه
            کد:
            buf=&flashdata[0];
            من قبلا یه با از این دستور استفاده کرده بودم اما به صورت غلط بهش مقدار دادم
            کد:
            *buf=&flashdata[0];
            اتمل استدیو هم ارور زرد میگرفت اما متوجه دلیلش نمیشدم
            که با مطالعه درباره پوینتر ها دلیلش رو فهمیدم
            سقراط : دانش من بدانجایی رسید که فهمیدم هیچ نمیدانم.

            دیدگاه

            لطفا صبر کنید...
            X