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

ATMega8: не получается запись в EEPROM

На выходе стабильно получается d=0xFF. С напряжением питания МК всё в порядке(5,2В от лабораторного источника). Вот мой код, вроде, делаю всё по даташиту(там, правда, есть ещё пункт " Wait until SPMEN in SPMCR becomes zero", в примере кода они его опускают, но даже если добавить, ничего не меняется. Пробовал менять контроллер(явно из другой партии) - ничего не меняется. Пытался писать в ячейки с другими адресами - тоже не получается.

#include <iom8.h>
#include <ina90.h>         
#define bit(n) (1<<(n))                  /* set i-bit */
#define setbit(port,n) (port|=bit(n))    /* set n-bit in port */
#define clrbit(port,n) (port&=(~bit(n))) /* clr n-bit in port */

#define EEMWE 2 //EEPROM Master write enable bit
#define EEWE 1 // EEPROM write enable bit
#define EERE 0 //EEPROM read enable bit

unsigned char x, d=0;

void WriteEEPROM(unsigned char adr, unsigned char data)
{
 while(EECR&(1<<EEWE)); //wait for the previous EEPROM operation to be ended
 EEAR=adr; EEDR=data; //enter  adress and data to the registers
 _CLI();              // forbid interruptions
 setbit(EECR,EEMWE); // let write
 setbit(EECR,EEWE); // command to write
 _SEI();             //let interruptions  
}

unsigned char ReadEEPROM(unsigned char adress)
{
 while(EECR&(1<<EEWE)); //wait for the previous EEPROM operation to be ended
 EEAR=adress;     //enter  adress
 setbit(EECR,EERE); // command to read
 x=EEDR;           //save EEDR  
 return x; //return data
}

void main(void)
{
DDRB=0xFF; PORTB=0x00; // PORTB out
WriteEEPROM(0,1);

for(;;)
 {    
  d=ReadEEPROM(0);
  if(d==1) setbit(PORTB,0); else if(d==0xFF) setbit(PORTB,1);       
 }            
}      

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


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

А если оптимизацию, например, -O3 поставить?

Приведите листинг получившихся функций чтения/записи.

P.S. Думаю, что дело в наличии cli/sei. Уберите их.

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


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

40 минут назад, Ascold сказал:

setbit(EECR,EEMWE); // let write
 setbit(EECR,EEWE); // command to write

В какие ассемблерные команды выливается эта конструкция? Выполняется ли это условие из документации?

image.png.32c140afe675ac858fa0bb6c06c6dc68.png

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


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

Значит догадки о злощавых 4 тактах, которые чуть подробнее расписал Сергей, подтвердились.

P.S. Пишите функцию на ассемблере или, что еще лучше, подключите <avr/eeprom.h> и дергайте готовые eeprom_read_byte() и eeprom_write_byte(). Эти варианты работать будут железобетонно при любых оптимизациях.

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


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

On 10/4/2023 at 4:24 AM, Arlleex said:

Значит догадки о злощавых 4 тактах, которые чуть подробнее расписал Сергей, подтвердились.

Приветствую всех! Сталкивался с подобной ситуацией. Компилятор IAR. Микроконтроллер ATMEGA32. Проект на си. Прибор, матричная клавиатура, символьный дисплей. Меню, параметры. Программа работает, при вводе параметров и попытке сохранить в EEPROM данные не сохраняются. В дизасм смотрел, вроде все нормально. Делаю в AVR-Studio тестовый проект на ассемблере. Все сохраняется. Я тогда торопился, нужно было срочно добить проект. Точно не помню, то ли замена на ATMEGA32A мне тогда помогла, то ли версию IAR сменил.

Что там за тема про 4 такта? Можно ссылочку?

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


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

1 hour ago, demiurg1978 said:

Что там за тема про 4 такта? Можно ссылочку?

Datasheet на микроконтроллер. Раздел про EEPROM.

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


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

Вместе с компилятором обычно дают готовые функции работы с EEPROM, которые сами делают как надо, и даже есть функции с проверкой содержимого ячейки чтобы экономить ресурс памяти.

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


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

15 hours ago, Точка Опоры said:

Datasheet на микроконтроллер. Раздел про EEPROM.

Вы меня знаете. AVR-ки хорошо знаю. Сказал же, написал тестовую программу на асме. Я хотел посмотреть ответ Сергея.

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


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

37 минут назад, demiurg1978 сказал:

Я хотел посмотреть ответ Сергея.

Я привел снимок из документации и 4 такта выделил красным. Какой ответ вы от меня еще ожидаете?

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


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

10 часов назад, demiurg1978 сказал:

Вы меня знаете. AVR-ки хорошо знаю.

:biggrin: 

Хорошо знаю, но даташитов не читаю. Ткните носом, плиз 😢

Извините, не смог сдержаться.

Просто совсем недавно сам программированием EEPROM ATmega занимался.

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


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

13 hours ago, Сергей Борщ said:

Я привел снимок из документации и 4 такта выделил красным. Какой ответ вы от меня еще ожидаете?

Теперь увидел. В последнее время режим как попало. Прихожу поздно, часто ночами сижу. Пардон. Сразу ваш тот ответ не увидел. Тему читал уставший и невыспавшийся.

4 hours ago, A.V.Avtomat said:

:biggrin: 

Хорошо знаю, но даташитов не читаю. Ткните носом, плиз 😢

Извините, не смог сдержаться.

Просто совсем недавно сам программированием EEPROM ATmega занимался.

Сергей Борщ и Точка Опоры меня хорошо знают. Толику знаний и от них получил. AVR-ками занимаюсь с 2007 года. Несколько лет на асме. Потом си. 

Я выше уже написал. Тему невнимательно прочитал. Думал, где то упустил ответ, почему компилятор сделал неправильно запись в EEPROM.

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


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

57 минут назад, demiurg1978 сказал:

Теперь увидел. В последнее время режим как попало. Прихожу поздно, часто ночами сижу. Пардон. Сразу ваш тот ответ не увидел. Тему читал

Я выше уже написал. Тему невнимательно прочитал. Думал, где то упустил ответ, почему компилятор сделал неправильно запись в EEPROM.

Потому, что IAR - самый идиотский софт для ATmega.

При наличии Microchip Studio пользоваться IAR - тупиковый путь.

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


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

1 hour ago, A.V.Avtomat said:

...

Я всегда пользовался студией. Самая адекватная и стабильная это 4.19. Проекты пишу на IAR. Симуляцию делаю в AVR-Studio. Нужную периферию проверяю уже на железе. Если требуется с осциллографом.

Знаю как работает МК. Знаю как должна работать программа. Знаю как должна работать периферия. Если требуется, пишу тестовые куски кода. Написал этап работы, прогнал в симуляторе. Потом в железе.

Итог. Практически всегда уже пишу так, что работает сразу. За редким исключением.

Microchip Studio это наследие AVR-Studio. Со всеми ее недостатками.

Мой профессиональный багаж. Электронные устройства, блоки управления станками, промышленного оборудования.

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

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


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

Я в IAR использовал переменные EEPROM как есть. Потому и получил гранату.

__eeprom u08 ee_parameter_1;

ee_parameter_1 = 0x55;

Именно в моем случае решение проблемы использовать функции read_eeprom_byte (). write_eeprom_byte (). Ну и соответственно нужная разрядность. u08, u16, u32.

Либо самописные функции. В соответствии с даташитами.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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