Перейти к содержанию
    

Не получается читать и писать массив в eeprom

Господа, пытасюь записать массив в eeprom, прочитать его и вывести на экран. Выводятся нули.

Вот код.

Где я не прав?

#include <mega32.h>
#include <delay.h>
#include <stdlib.h>
#include <stdio.h>


#include <disp.h>

#define MAX_DEVICES 5 
#define SEARCH_ROM 0xF0 
#define DS1990_FAMILY_CODE 1 

//Global vaiable defination
unsigned char devices;

// 1 Wire Bus functions
#asm
   .equ __w1_port=0x12;PORTD
   .equ __w1_bit=2 
#endasm
#include <1wire.h>

unsigned char rom_code[MAX_DEVICES,9]; 

  
u08 variable;  
ui16 textcolor;    // color of text
ui16 backcolor;    // color of background

ui16 varvar;   
unsigned char str;
unsigned char i,j,a,b,c,d; 
unsigned long serial;


eeprom unsigned char E_rom_code[5,9];
unsigned char eeprom *ptr_to_eeprom;
unsigned char *ptr_to_ram;
unsigned char rom_code2[MAX_DEVICES,9]; 


void main(void)
{

backcolor=0xBDF7;
textcolor=blue; 

DDRA.0=1;
PORTA.0=1;
DDRD.2=0;          

lcd_init(); 
lcd_clr();         
fill_screen(0xbdf7); 



for (i=0;i<5;i++)                //Заполняю массив
{
for (j=0;j<9;j++)
  {
   rom_code[i][j]=i;
   }
}

for (i=0;i<5;i++)                 //Вывожу содержимое массива в левую часть экрана
{
for (j=0;j<9;j++)
  {
    lcd_setxy(10+j*7,120-i*20);
    lcd_str_ram(rom_code[i][j],f8x14, textcolor);                   
  }
}


ptr_to_ram=rom_code;                  // Записываю переменную rom_code в eeprom
ptr_to_eeprom=E_rom_code;
while (*ptr_to_ram)
      *ptr_to_eeprom++=*ptr_to_ram++;

// copy the string e from EEPROM to
// the string r in RAM
ptr_to_eeprom=E_rom_code;                  // читаю из eeprom в новый массив rom_code2
ptr_to_ram=rom_code2;
while (*ptr_to_eeprom)
      *ptr_to_ram++=*ptr_to_eeprom++;


for (i=0;i<5;i++)                              // Вывожу в правую чать экрана содержимое  rom_code2
{
for (j=0;j<9;j++)
  {
    lcd_setxy(100+j*7,120-i*20);
    lcd_str_ram(rom_code2[i][j],f8x14, textcolor);                    //выводятся нули
  }

}
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какая EEPROM? Почему вы с ней как с RAM обращаетесь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня ATMega32, в дальнейшем будет ATTiny26. ПЛатформа - Codevision

есть переменная unsigned char rom_code[5,9].

Как ее записать и как ее прочитать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня ATMega32

 

С атмегами не работал. Тем не менее, во всех МК EEPROM является "специальной" памятью, с которой надо работать совсем не так, как с RAM. Читайте даташит стр.18-19. Для записи в EEPROM и чтения из нее вам надо обращаться в регистры EEARH, EEARL, EEDR и EECR. А в вашем коде я что-то не вижу, чтобы вы к ним обращались.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это Codevision. Он якобы заботится обо всем сам.

А-а. Ну тогда и обращайтесь в ихний тексуппорт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это Codevision. Он якобы заботится обо всем сам.

 

Наверное сначала ему надо как-то сказать о том, что переменная расположена в eeprom, а не просто unsigned char rom_code[5,9]. Должно быть какое-то волшебное слово, типа unsigned char eeprom rom_code[5,9]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А есть разница между вариантами записи unsigned char eeprom rom_code[5,9] и eeprom unsigned char rom_code[5,9] ??

 

P.S. проблему решил поставив галку "preserve EEPROM" в настройках программирования. ВРодебы что-то получается, продолжаю экспериментировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в codeVisionAVR проще записать

eeprom unsigned char rom_code[MAX_DEVICES,9];

и переменная unsigned char rom_code[MAX_DEVICES,9]; будет находится в eeprom

Дальнейшая работа с переменной, как с обычной.

Изменено пользователем e_one

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отстаньте от EEPROM'а.

Здесь и сам алгоритм копирования принципиально не подходит для копирования таких данных, и название функции "lcd_str_ram" подсказывает, что оно принимает скорее строку, чем то что ей отдают тут...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

P.S. проблему решил поставив галку "preserve EEPROM" в настройках программирования.

Ну ясен перец, эту галку всегда надо ставить первым делом. Программа может быть правильная или нет, но сам процесс заливки новой версии программы без этой галки сотрет EEPROM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...