реклама на сайте
подробности

 
 
> EEPROM, Оптимальная запись/чтение EEPROM
Дим
сообщение Mar 2 2006, 18:07
Сообщение #1





Группа: Новичок
Сообщений: 12
Регистрация: 20-10-05
Пользователь №: 9 894



Товарищи, help.gif! Такая проблемка: при записи в EEPROM на ATMEGE 8515 записывается только первый байт, остальные остаются прежними. Код функции...
.....
void RTEEPROMwrite(int location, unsigned char databyte)
{
unsigned char savedSREG;
EEAR = location; // set address
EEDR = databyte; // set data
savedSREG = SREG; // keep setting so it can be restored
while(EECR & (1<<EEWE));
CLI(); // disable interrupts
EECR |= BIT(EEMWE);// set "write enable" bit
EECR |= BIT(EEWE); // set "write" bit
SREG = savedSREG; // restore SREG
}
В чем может быть проблема?
И еще вопросик...
Bit EERIE: EEPROM Ready Interrupt Enable - бит отвечающий за прерывание, как им пользоваться и как сделать чтение/запись EEPROM по прерыванию? А то эти пустые циклы как-то не хорошо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
defunct
сообщение Mar 3 2006, 01:23
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Вот что у меня получилось с прерываниями.. Выигрыш по скорости в сравнении с тупым ожиданием примерно в два раза. Стоит ли оно того? проверил на IAR'е и gcc, вроде работает, только кода много получается - без оптимизации около 500 байт для чипов с EEPROM > 256 байт, и около 400 для чипов с EEPROM <= 256 байт.
Код
/* файл ee_mgr.c  */
// Использование динамической памяти отбросил (не актуально для мелкоконтроллеров с менее 8k RAM)

#include <avr\io.h>
#include "ee_mgr.h"

#ifndef _ee_mgr_header_present
// объявление возможных ошибок
#define ERROR_MSG_TOO_LONG            0
#define ERROR_BUSY                   -1
#define ERROR_NOT_ENOUGH_FREE_SPACE  -2
// объявление констант
#define EE_BUFFER_LENGTH 16
#endif

#define FALSE 0
#define TRUE 1
#define CARDINAL unsigned char
#define cli asm("cli")
#define EE_ReadyForAction (EECR & (1 << EEWE))


// реализована пока только функции записи в EEPROM,
// чтение по прерыванию сделать нельзя да и было бы медленнее!
char EE_Buf[EE_BUFFER_LENGTH];  // общий буфер для чтения и запис
CARDINAL  EE_CurrentPos = 0;
CARDINAL  EE_Count = 0;
WORD  EE_StartAddress;
char EE_Busy = FALSE;


int EEPROMWriteMsg(WORD address, void *msg, int count)
{
    char *amsg;
    CARDINAL i;
    if (count > EE_BUFFER_LENGTH)
       return ERROR_MSG_TOO_LONG;
    if (EE_Busy)
       return ERROR_BUSY;
    if ((address + count) > E2END)
       return ERROR_NOT_ENOUGH_FREE_SPACE;

    amsg = msg;
    EE_CurrentPos = 0;
    for(i=0; i < count; i++)
       EE_Buf[i] = amsg[i];

    EE_Busy = TRUE;
    EE_Count = count;
    EE_StartAddress = address;
    return count;
}


// апаратно зависимая функция инициализации записи EEPROM
void InitializeEEPROMWriteByte(WORD address, char data)
{
   char sreg_mirror;
   sreg_mirror = SREG;
   cli;
   EEAR = address;
   EEDR = data;
   EECR |= (1 << EEMWE);
   EECR |= (1 << EEWE)|(1 << EERIE);
   SREG = sreg_mirror;
}


// функция для вызова в основном цикле программы
void EEPROMDispatch(void)
{
   char data_byte;
   WORD address;
   if ((!EE_Busy)|(!EE_ReadyForAction))
      return;
   // Запись очередного байта
   if (EE_Count == EE_CurrentPos) // сообщение полностью записано
      {
        EE_Busy = FALSE;
        return;
      }

   data_byte = EE_Buf[EE_CurrentPos];
   address = EE_StartAddress + EE_CurrentPos;
   InitializeEEPROMWriteByte(address, data_byte);
   EE_CurrentPos++;
}



это header (учитывается размер EEPROM'а, для маленьких чипов)


Код
/*   файл ee_mgr.h   */
#define _ee_mgr_header_present
// объем буфера под EEPROM очередь
#define EE_BUFFER_LENGTH 32

#ifdef E2END
  #if (E2END < 0x100)
    #define WORD unsigned char
  #else
    #define WORD short
  #endif
#else
  #define WORD int
#endif

#ifndef EERIE
  #define EERIE 3
#endif

// коды возможных ошибок при обращении к функции записи
#define ERROR_BUSY -1
#define ERROR_NOT_ENOUGH_FREE_SPACE -2
#define ERROR_MSG_TOO_LONG 0


// Макрос, который необходимо вызывать в обработчике прерывания EEPROM_Ready
#define EEPROMReadyHandler     EECR &= ~(1 << EERIE)

void EEPROMDispatch(void);    // функция для вызова в основном цикле программы

int EEPROMWriteMsg(WORD address, void *msg, int count); // запись любых структур


Пример применения (gcc):

Код
SIGNAL (SIG_EE_READY)
{
   EEPROMReadyHandler;
}


int main( void )
{
  char str[] = "zzz";
  
  EEPROMWriteMsg(0x20, str, sizeof(str));
  
  asm("sei");
  for(;;)
  {
    EEPROMDispatch();
  }
}


Принимается любая критика!

Сообщение отредактировал defunct - Mar 3 2006, 02:18
Go to the top of the page
 
+Quote Post
vet
сообщение Mar 3 2006, 06:22
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(defunct @ Mar 3 2006, 04:23) *
Вот что у меня получилось с прерываниями.. Выигрыш по скорости в сравнении с тупым ожиданием примерно в два раза.

Цифра "в 2 раза" к чему относится? время записи в EEPROM, полагаю, не изменилось.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Дим   EEPROM   Mar 2 2006, 18:07
- - defunct   У вас ошибка в коде в части с CLI().. вот рабочий ...   Mar 2 2006, 18:17
- - Дим   Я правильно понял у вас сначала записываются адрес...   Mar 2 2006, 18:42
|- - defunct   Цитата(Дим @ Mar 2 2006, 20:42) Я правиль...   Mar 2 2006, 19:45
|- - prottoss   Цитата(defunct @ Mar 3 2006, 02:45) Похож...   Mar 2 2006, 20:01
|- - defunct   Цитата(prottoss @ Mar 2 2006, 22:01) ...   Mar 2 2006, 20:17
|- - prottoss   Цитата(defunct @ Mar 3 2006, 03:17) Цитат...   Mar 2 2006, 20:35
|- - defunct   Цитата(prottoss @ Mar 2 2006, 22:35) А Вы...   Mar 2 2006, 20:57
|- - prottoss   Цитата(defunct @ Mar 3 2006, 03:57) Цитат...   Mar 2 2006, 21:51
|- - defunct   Цитата(prottoss @ Mar 2 2006, 23:51) А не...   Mar 2 2006, 23:44
- - prottoss   Цитата(Дим @ Mar 3 2006, 01:07) Товарищи,...   Mar 2 2006, 18:49
- - beer_warrior   Господа, а никто не делал библиотечки EEPROM полно...   Mar 2 2006, 20:30
- - beer_warrior   Цитатаwill make the write cycle fail, since the EE...   Mar 2 2006, 21:02
|- - defunct   Цитата(vet @ Mar 3 2006, 08:22) Цифра ...   Mar 3 2006, 09:03
- - Георгий   А если не заморачиваться и положиться на компилято...   Mar 3 2006, 05:32
- - ArtemK   По поводу буферизированной записи в EEPROM по прер...   Mar 3 2006, 09:25
- - defunct   Цитата(ArtemK @ Mar 3 2006, 11:25) По пов...   Mar 3 2006, 09:38


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 00:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01411 секунд с 7
ELECTRONIX ©2004-2016