Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> AVR EEPORM 
:(
    Опции темы
=Женек=
Дата 19.3.2006, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: нет
Всего: 1



Господа!

Вот из Codevision Example по EEPROM:

Код

// EEPROM access example

// CodeVisionAVR C Compiler
// (C) 2000-2002 HP InfoTech S.R.L.
// www.hpinfotech.ro

// Chip: AT90S2313
// Memory Model: TINY
// Data Stack Size: 64 bytes

flash char f[]="This is a test";
#pragma warn-
eeprom char e[16];
#pragma warn+
char r[16];

void main (void)
{
char flash *ptr_to_flash;
char eeprom *ptr_to_eeprom;
char *ptr_to_ram;

// copy the string f from FLASH to
// the string e in EEPROM
ptr_to_flash=f;
ptr_to_eeprom=e;
while (*ptr_to_flash)
      *ptr_to_eeprom++=*ptr_to_flash++;

// copy the string e from EEPROM to
// the string r in RAM
ptr_to_eeprom=e;
ptr_to_ram=r;
while (*ptr_to_eeprom)
      *ptr_to_ram++=*ptr_to_eeprom++;

// stop here
while (1);
}




В общем не выводит ничего... В моей программе часть кода
Код

while (*ptr_to_flash)
      *ptr_to_eeprom++=*ptr_to_flash++;


была заменена на

Код

i=0;
while (*ptr_to_flash)
{
      *ptr_to_eeprom++=*ptr_to_flash++;
      LcdLine(0,i*5,80,i*5);
      i++;
      
}


Ну и чтение из EEPROM соответственно модифицировано. Линии там - типа таблицы, оказались очень полезны для отладки. При записи в EEPROM их было столько, сколько символов в записываемой строке.

При чтении - рисование таблицы длилось долго-долго, после чего то ли у Меги, то ли у индикатора съезжала крыша...

Найдите ошибку... ПОчему ptrt_to_eeprom указывает на что-то очень длинное..

P.S. Пишу для ATMega8 в Codevision. Данные выводятся на индикатор от NOKIA 3310
PM MAIL   Вверх
=Женек=
Дата 21.3.2006, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: нет
Всего: 1



Ну неужели никто не знает?
PM MAIL   Вверх
Ivan.
Дата 6.4.2006, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



не знаю, что у тебя там происходит, вот у меня 2 функции для работы с EEPROM работают безотказно уже много лет:
Код

void WriteEEPROM(void *Data, int Address, int Size){
    int i;
    for (i = 0; i < Size; i++){
        while (EECR & 0x02);
        EEAR = Address++;
        EEDR = *((uchar *)Data);
        Data = (char *)Data + 1;
        EECR |= 0x04;
        EECR |= 0x02;
    }
}
//---------------------------------------------------------------------------
void ReadEEPROM(void *Data, int Address, int Size){
    int i;
    for (i = 0; i < Size; i++){
        while (EECR & 0x02);
        EEAR = Address++;
        EECR |= 0x01;
        *((unsigned char *)Data) = EEDR;
        Data = (char *)Data + 1;
    }
}
//---------------------------------------------------------------------------

Есть еще компанента:
Код

class TROM {
public:
    char (*Save)(TROM *Sender, void *Data, ushort Addr, ushort Size);
    char (*Load)(TROM *Sender, void *Data, ushort Addr, ushort Size);
};
//---------------------------------------------------------------------------
class TEEPROM : public TROM {
public:
    char Save(void *Data, ushort Addr, ushort Size);
    char Load(void *Data, ushort Addr, ushort Size);
    TEEPROM() { SetEvent(TROM::Save, &TEEPROM::Save); SetEvent(TROM::Load, &TEEPROM::Load); }
};
//---------------------------------------------------------------------------
char TEEPROM::Save(void *Data, ushort Addr, ushort Size){
    for (ushort i = 0; i < Size; i++){
        while (EECR & 0x02);
        EEAR = Addr++;
        EEDR = *((uchar *)Data);
        Data = (char *)Data + 1;
        EECR |= 0x04;
        EECR |= 0x02;
    }
    return 0;
}
//---------------------------------------------------------------------------
char TEEPROM::Load(void *Data, ushort Addr, ushort Size){
    for (ushort i = 0; i < Size; i++){
        while (EECR & 0x02);
        EEAR = Addr++;
        EECR |= 0x01;
        *((unsigned char *)Data) = EEDR;
        Data = (char *)Data + 1;
    }
    return 0;
}
//---------------------------------------------------------------------------

мне не нравятся виртуальные функции. я использую указатель методов:
Код

#define SetEvent(Event, Func)    asm ("MOVW %[E], %[F]\r\n":[E]"=r"(Event):[F]"r"(Func):"memory");
//---------------------------------------------------------------------------

с коротким именами думаю разберешся.


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
FPMOleg
Дата 14.6.2006, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 15.5.2006

Репутация: нет
Всего: нет



CodeVision штука загадочная. В общем там при генерации кода есть баги!!! Запись байта в EEPROM надо брать из документаци, в ней приводиться пример, алгоритм записи и чтения байта из EEPROM. 
PM MAIL   Вверх
PILOT
Дата 15.6.2006, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: 20
Всего: 54



Цитата(FPMOleg @ 14.6.2006,  11:55)
CodeVision штука загадочная. В общем там при генерации кода есть баги!!! Запись байта в EEPROM надо брать из документаци, в ней приводиться пример, алгоритм записи и чтения байта из EEPROM.

Вывод - писать на асме, гарантированно все куда нужно ложится... и работает...

СУВ. 


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
ManiaK
Дата 16.6.2006, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 2
Всего: 29



Цитата(PILOT @  15.6.2006,  00:43 Найти цитируемый пост)
Вывод - писать на асме, гарантированно все куда нужно ложится... и работает...

Давно к этому выводу пришёл. Вообще, микроконтроллеры штука тонкая в этом деле. 
PM MAIL WWW   Вверх
FPMOleg
Дата 16.6.2006, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 15.5.2006

Репутация: нет
Всего: нет



Алгоритм записи байта в EEPROM
1. Ожидание пока EEWE станет равным нулю. 
2. Ожидание равенства нулю бита SPMEN в регистре SPMCSR. 
3. Запись нового адреса ЭСППЗУ в EEAR (опционально). 
4. Запись новых данных в регистр EEDR для записи в ЭСППЗУ (опционально). 
5. Запись лог. 1 в EEMWE, когда в EEWE регистра EECR записан ноль. 
6. Запись лог. 1 в EEWE в течение четырех машинных циклов после установки EEMWE.

При записи байта в EEPROM не забывает отключать все прерывания
Код

 void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Ожидаем окончание предыдущей записи */
while(EECR & (1<<EEWE));
EEAR = uiAddress;
EEDR = ucData;
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);


Код

EEPROM_write:
sbic EECR,EEWE
rjmp EEPROM_write
out EEARH, r18
out EEARL, r17
out EEDR,r16
sbi EECR,EEMWE
sbi EECR,EEWE
ret


ЗЫ: Споры на чем писать программу для МК уже были.   
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0460 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.