Отговори на тема  [ 5 мнения ] 
Помощ при писане във флаша на пик18 к22 серията 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Помощ при писане във флаша на пик18 к22 серията
Опитвам се безуспешно вече трети ден и не ще пущината. Явно нещо не правя като хората и се чудя ако някой го е правил на С ако може да удари едно рамо?
Мерси!

_________________
'просто' е технически синоним на 'красиво'


Вто Май 27, 2014 12:40 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 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 );
}


_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Вто Май 27, 2014 7:27 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: Помощ при писане във флаша на пик18 к22 серията
Това е за писане в EEPROM-а. (сега дали хардуерно е флаш лили еепром - друга тема). Такова примерче мога и аз да дам, точно за тоя чип (24к22, ако трябва да съм точен) - общо взето не съм имал никакви грижи.

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


Вто Май 27, 2014 11:35 pm
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Нед Фев 25, 2007 1:41 am
Мнения: 276
Местоположение: София
Мнение 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 1:38 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Re: Помощ при писане във флаша на пик18 к22 серията
Чудна работа... тоя код е почти 1:1 с моя. Ще го мъча пак.
Мерси

_________________
'просто' е технически синоним на 'красиво'


Сря Май 28, 2014 3:15 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 5 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: Google [Bot] и 9 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни