Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не получается читать и писать массив в eeprom
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
-=Женек=-
Господа, пытасюь записать массив в 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);                    //выводятся нули
  }

}
}
=AK=
Какая EEPROM? Почему вы с ней как с RAM обращаетесь?
-=Женек=-
У меня ATMega32, в дальнейшем будет ATTiny26. ПЛатформа - Codevision
есть переменная unsigned char rom_code[5,9].
Как ее записать и как ее прочитать?
=AK=
Цитата(-=Женек=- @ May 1 2010, 20:33) *
У меня ATMega32


С атмегами не работал. Тем не менее, во всех МК EEPROM является "специальной" памятью, с которой надо работать совсем не так, как с RAM. Читайте даташит стр.18-19. Для записи в EEPROM и чтения из нее вам надо обращаться в регистры EEARH, EEARL, EEDR и EECR. А в вашем коде я что-то не вижу, чтобы вы к ним обращались.
-=Женек=-
Это Codevision. Он якобы заботится обо всем сам.
=AK=
Цитата(-=Женек=- @ May 1 2010, 22:07) *
Это Codevision. Он якобы заботится обо всем сам.

А-а. Ну тогда и обращайтесь в ихний тексуппорт.
AHTOXA
Цитата(-=Женек=- @ May 1 2010, 18:37) *
Это 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" в настройках программирования. ВРодебы что-то получается, продолжаю экспериментировать.
e_one
в codeVisionAVR проще записать
eeprom unsigned char rom_code[MAX_DEVICES,9];
и переменная unsigned char rom_code[MAX_DEVICES,9]; будет находится в eeprom
Дальнейшая работа с переменной, как с обычной.
SysRq
Отстаньте от EEPROM'а.
Здесь и сам алгоритм копирования принципиально не подходит для копирования таких данных, и название функции "lcd_str_ram" подсказывает, что оно принимает скорее строку, чем то что ей отдают тут...
V_G
Цитата(-=Женек=- @ May 2 2010, 00:59) *
P.S. проблему решил поставив галку "preserve EEPROM" в настройках программирования.

Ну ясен перец, эту галку всегда надо ставить первым делом. Программа может быть правильная или нет, но сам процесс заливки новой версии программы без этой галки сотрет EEPROM.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.