Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Помощ при писане във флаша на пик18 к22 серията
http://mcu-bg.com/mcu_site/viewtopic.php?f=14&t=12956
Страница 1 от 1

Автор:  Н'бабане Гт'муан'га [ Вто Май 27, 2014 12:40 pm ]
Заглавие:  Помощ при писане във флаша на пик18 к22 серията

Опитвам се безуспешно вече трети ден и не ще пущината. Явно нещо не правя като хората и се чудя ако някой го е правил на С ако може да удари едно рамо?
Мерси!

Автор:  [ Вто Май 27, 2014 7:27 pm ]
Заглавие:  Re: Помощ при писане във флаша на пик18 к22 серията

Покажи кода, кой компилатор използваш ?
За PIC18F25K80/26K80 използвам нещо такова:
Код:
#include <p18cxxx.h>      
#include "Integers.h"      

//
// PIC18F25K80_26K80
//

uint8 ReadEEData(uint8 Addr) {
      EEADR = Addr;           
   EECON1bits.EEPGD = 0;     // Data Memory Address to read
   EECON1bits.CFGS = 0;   // Access EEPROM
   EECON1bits.RD = 1;      // EEPROM read
   return EEDATA;   
}

void ReadEEBuffer(uint8* dst,uint8 src,uint8 bytes) {
   do {
      *dst++ = ReadEEData(src++);
   } while( --bytes );
}

void WriteEEData(uint8 Addr,uint8 Data)   {
   EEADR = Addr;             
   EEDATA = Data;       
   EECON1bits.EEPGD = 0;        // Point to DATA memory
   EECON1bits.CFGS = 0;       // Access EEPROM
     EECON1bits.WREN = 1;         // Enable writes
   // Save interrupt flag
#if defined(__18F4680) || defined(__18F4585) || defined(__18F2680) || defined(__18F2585) || \
   defined(__18F2480) || defined(__18F2580) || defined(__18F4480) || defined(__18F4580)
   STATUSbits.C = INTCONbits.GIE;
#elif defined(__18F25K80) || defined(__18F26K80)
   STATUSbits.C = INTCON1bits.GIE;
#endif
   // Requered sequence
     EECON2 = 0x55;   EECON2 = 0xaa;         
   EECON1bits.WR = 1;           // Set WR bit to begin write
   // Restore interrupt flag
#if defined(__18F4680) || defined(__18F4585) || defined(__18F2680) || defined(__18F2585) || \
   defined(__18F2480) || defined(__18F2580) || defined(__18F4480) || defined(__18F4580)
   if( STATUSbits.C )
      INTCONbits.GIE = 1;
#elif defined(__18F25K80) || defined(__18F26K80)
   if( STATUSbits.C )
      INTCON1bits.GIE = 1;
#endif
   EECON1bits.WREN = 0;      // Disable writes on write complete (EEIF set)
   // Wait to complete write operation
#if defined(__18F4680) || defined(__18F4585) || defined(__18F2680) || defined(__18F2585) || \
   defined(__18F2480) || defined(__18F2580) || defined(__18F4480) || defined(__18F4580)
     while( ! PIR2bits.EEIF );
   PIR2bits.EEIF = 0;     
#elif defined(__18F25K80) || defined(__18F26K80)
   while( ! PIR4bits.EEIF );
   PIR4bits.EEIF = 0;     
#endif
   
}

void WriteEEBuffer(uint8 dst,uint8* src,uint8 bytes) {
   do {
      WriteEEData( dst++, *src++ );
   } while( --bytes );
}


Автор:  sparkybg [ Вто Май 27, 2014 11:35 pm ]
Заглавие:  Re: Помощ при писане във флаша на пик18 к22 серията

Това е за писане в EEPROM-а. (сега дали хардуерно е флаш лили еепром - друга тема). Такова примерче мога и аз да дам, точно за тоя чип (24к22, ако трябва да съм точен) - общо взето не съм имал никакви грижи.

Да пиша вътрешно в програмния флаш обаче не съм си играл.

Автор:  speedblue [ Сря Май 28, 2014 1:38 am ]
Заглавие:  Re: Помощ при писане във флаша на пик18 к22 серията

Това е по Microchip образец. Работи с техния C18 компилатор.
Ако ползваш друг поне ще видиш идеята и някак ще го докараш.
Остава ти да разбереш коя версия е твоя FLASH в процесора и си почти готов.

Код:

#if defined (FLASH_V1_1)

#define FLASH_WRITE_BLOCK    8
#define FLASH_ERASE_BLOCK    64

#elif defined (FLASH_V1_2)

#define FLASH_WRITE_BLOCK    32
#define FLASH_ERASE_BLOCK    64

#elif defined (FLASH_V1_3)

#define FLASH_WRITE_BLOCK    16
#define FLASH_ERASE_BLOCK    64

#elif defined (FLASH_V1_4)

#define FLASH_WRITE_BLOCK    64
#define FLASH_ERASE_BLOCK    64

#elif defined (FLASH_V1_5) || defined (FLASH_V2_1)

#define FLASH_WRITE_BLOCK    64
#define FLASH_ERASE_BLOCK    1024

#elif defined (FLASH_V1_6)

#define FLASH_WRITE_BLOCK    128
#define FLASH_ERASE_BLOCK    128

#endif


#if defined (FLASH_V1_1) || defined (FLASH_V1_2) || defined (FLASH_V1_4) || defined (FLASH_V1_6)
void WriteBytesFlash(unsigned long startaddr, unsigned int num_bytes, unsigned char *flash_array) {
    unsigned char write_byte=0,flag=0;
    DWORD_VAL flash_addr;


    flash_addr.Val = startaddr;

    startaddr /= FLASH_WRITE_BLOCK ;    //Allign the starting address block
    startaddr *= FLASH_WRITE_BLOCK ;
    startaddr += FLASH_WRITE_BLOCK ;

    write_byte = startaddr - flash_addr.Val;

    while(num_bytes) {
        TBLPTRU = flash_addr.byte.UB;   //Load the address to Address pointer registers
        TBLPTRH = flash_addr.byte.HB;
        TBLPTRL = flash_addr.byte.LB;

        while(write_byte--) {
            TABLAT = *flash_array++;
            _asm
                TBLWTPOSTINC
            _endasm

            if (--num_bytes==0)
                break;
        }

        TBLPTRU = flash_addr.byte.UB;   //Load the address to Address pointer registers
        TBLPTRH = flash_addr.byte.HB;
        TBLPTRL = flash_addr.byte.LB;
        //*********** Flash write sequence ***********************************
        EECON1bits.EEPGD = 1;  // point to Flash program memory
        EECON1bits.CFGS = 0;  // access Flash program memory
        EECON1bits.WREN = 1;

        if(INTCONbits.GIE) {
            INTCONbits.GIE = 0;
            flag=1;
        }

        EECON2 = 0x55;
        EECON2 = 0xAA;
        EECON1bits.WR = 1;
        EECON1bits.WREN = 0 ;

        if(flag) {
            INTCONbits.GIE = 1;
            flag=0;
        }

        write_byte = FLASH_WRITE_BLOCK;
        flash_addr.Val = flash_addr.Val + FLASH_WRITE_BLOCK;   //increment to one block of 64 bytes
    }
}


#elif defined (FLASH_V1_3) || defined (FLASH_V1_5) || defined (FLASH_V2_1)
void WriteBytesFlash(unsigned long startaddr, unsigned int num_bytes, unsigned char *flash_array) {
    unsigned char write_byte=0,flag=0;
    DWORD_VAL flash_addr;

    flash_addr.Val = startaddr;

    startaddr /= FLASH_WRITE_BLOCK ;    //Allign the starting address block
    startaddr *= FLASH_WRITE_BLOCK ;
    startaddr += FLASH_WRITE_BLOCK ;

    write_byte = startaddr - flash_addr.Val;

    while(num_bytes) {
        TBLPTRU = flash_addr.byte.UB;   //Load the address to Address pointer registers
        TBLPTRH = flash_addr.byte.HB;
        TBLPTRL = flash_addr.byte.LB;

        while(write_byte--) {
            TABLAT = *flash_array++;
            _asm 
                TBLWTPOSTINC    
            _endasm

            if(--num_bytes==0)   
                break;
        }

        TBLPTRU = flash_addr.byte.UB;   //Load the address to Address pointer registers
        TBLPTRH = flash_addr.byte.HB;
        TBLPTRL = flash_addr.byte.LB;
        //*********** Flash write sequence ***********************************
        EECON1bits.WREN = 1;

        if(INTCONbits.GIE) {
            INTCONbits.GIE = 0;
            flag=1;
        }

        EECON2 = 0x55;
        EECON2 = 0xAA;
        EECON1bits.WR = 1;
        EECON1bits.WREN = 0 ;

        if(flag) {
            INTCONbits.GIE = 1;
            flag=0;
        }

        write_byte = FLASH_WRITE_BLOCK;
        flash_addr.Val = flash_addr.Val + FLASH_WRITE_BLOCK;    //increment to one block of 64 bytes
    }
}


void ReadFlash(unsigned long startaddr, unsigned int num_bytes, unsigned char *flash_array) {
    DWORD_VAL flash_addr;

    flash_addr.Val = startaddr;

    TBLPTRU = flash_addr.byte.UB;   //Load the address to Address pointer registers
    TBLPTRH = flash_addr.byte.HB;   
    TBLPTRL = flash_addr.byte.LB;

    while(num_bytes--) {
    //*********** Table read sequence ******************************
        _asm
            TBLRDPOSTINC
        _endasm

        *flash_array++ = TABLAT;
    }
}


Автор:  Н'бабане Гт'муан'га [ Сря Май 28, 2014 3:15 am ]
Заглавие:  Re: Помощ при писане във флаша на пик18 к22 серията

Чудна работа... тоя код е почти 1:1 с моя. Ще го мъча пак.
Мерси

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/