Ascold 0 3 октября, 2023 Опубликовано 3 октября, 2023 · Жалоба На выходе стабильно получается 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); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 3 октября, 2023 Опубликовано 3 октября, 2023 · Жалоба А если оптимизацию, например, -O3 поставить? Приведите листинг получившихся функций чтения/записи. P.S. Думаю, что дело в наличии cli/sei. Уберите их. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 3 октября, 2023 Опубликовано 3 октября, 2023 · Жалоба 40 минут назад, Ascold сказал: setbit(EECR,EEMWE); // let write setbit(EECR,EEWE); // command to write В какие ассемблерные команды выливается эта конструкция? Выполняется ли это условие из документации? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ascold 0 3 октября, 2023 Опубликовано 3 октября, 2023 · Жалоба Поставил оптимизацию в компиляторе, проблема решилась. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 3 октября, 2023 Опубликовано 3 октября, 2023 · Жалоба Значит догадки о злощавых 4 тактах, которые чуть подробнее расписал Сергей, подтвердились. P.S. Пишите функцию на ассемблере или, что еще лучше, подключите <avr/eeprom.h> и дергайте готовые eeprom_read_byte() и eeprom_write_byte(). Эти варианты работать будут железобетонно при любых оптимизациях. 1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg1978 1 8 декабря, 2023 Опубликовано 8 декабря, 2023 · Жалоба On 10/4/2023 at 4:24 AM, Arlleex said: Значит догадки о злощавых 4 тактах, которые чуть подробнее расписал Сергей, подтвердились. Приветствую всех! Сталкивался с подобной ситуацией. Компилятор IAR. Микроконтроллер ATMEGA32. Проект на си. Прибор, матричная клавиатура, символьный дисплей. Меню, параметры. Программа работает, при вводе параметров и попытке сохранить в EEPROM данные не сохраняются. В дизасм смотрел, вроде все нормально. Делаю в AVR-Studio тестовый проект на ассемблере. Все сохраняется. Я тогда торопился, нужно было срочно добить проект. Точно не помню, то ли замена на ATMEGA32A мне тогда помогла, то ли версию IAR сменил. Что там за тема про 4 такта? Можно ссылочку? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Точка Опоры 38 8 декабря, 2023 Опубликовано 8 декабря, 2023 · Жалоба 1 hour ago, demiurg1978 said: Что там за тема про 4 такта? Можно ссылочку? Datasheet на микроконтроллер. Раздел про EEPROM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vov4ick 39 8 декабря, 2023 Опубликовано 8 декабря, 2023 · Жалоба Вместе с компилятором обычно дают готовые функции работы с EEPROM, которые сами делают как надо, и даже есть функции с проверкой содержимого ячейки чтобы экономить ресурс памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg1978 1 8 декабря, 2023 Опубликовано 8 декабря, 2023 · Жалоба 15 hours ago, Точка Опоры said: Datasheet на микроконтроллер. Раздел про EEPROM. Вы меня знаете. AVR-ки хорошо знаю. Сказал же, написал тестовую программу на асме. Я хотел посмотреть ответ Сергея. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 8 декабря, 2023 Опубликовано 8 декабря, 2023 · Жалоба 37 минут назад, demiurg1978 сказал: Я хотел посмотреть ответ Сергея. Я привел снимок из документации и 4 такта выделил красным. Какой ответ вы от меня еще ожидаете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A.V.Avtomat 24 9 декабря, 2023 Опубликовано 9 декабря, 2023 · Жалоба 10 часов назад, demiurg1978 сказал: Вы меня знаете. AVR-ки хорошо знаю. Хорошо знаю, но даташитов не читаю. Ткните носом, плиз 😢 Извините, не смог сдержаться. Просто совсем недавно сам программированием EEPROM ATmega занимался. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg1978 1 9 декабря, 2023 Опубликовано 9 декабря, 2023 · Жалоба 13 hours ago, Сергей Борщ said: Я привел снимок из документации и 4 такта выделил красным. Какой ответ вы от меня еще ожидаете? Теперь увидел. В последнее время режим как попало. Прихожу поздно, часто ночами сижу. Пардон. Сразу ваш тот ответ не увидел. Тему читал уставший и невыспавшийся. 4 hours ago, A.V.Avtomat said: Хорошо знаю, но даташитов не читаю. Ткните носом, плиз 😢 Извините, не смог сдержаться. Просто совсем недавно сам программированием EEPROM ATmega занимался. Сергей Борщ и Точка Опоры меня хорошо знают. Толику знаний и от них получил. AVR-ками занимаюсь с 2007 года. Несколько лет на асме. Потом си. Я выше уже написал. Тему невнимательно прочитал. Думал, где то упустил ответ, почему компилятор сделал неправильно запись в EEPROM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A.V.Avtomat 24 9 декабря, 2023 Опубликовано 9 декабря, 2023 · Жалоба 57 минут назад, demiurg1978 сказал: Теперь увидел. В последнее время режим как попало. Прихожу поздно, часто ночами сижу. Пардон. Сразу ваш тот ответ не увидел. Тему читал Я выше уже написал. Тему невнимательно прочитал. Думал, где то упустил ответ, почему компилятор сделал неправильно запись в EEPROM. Потому, что IAR - самый идиотский софт для ATmega. При наличии Microchip Studio пользоваться IAR - тупиковый путь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg1978 1 9 декабря, 2023 Опубликовано 9 декабря, 2023 (изменено) · Жалоба 1 hour ago, A.V.Avtomat said: ... Я всегда пользовался студией. Самая адекватная и стабильная это 4.19. Проекты пишу на IAR. Симуляцию делаю в AVR-Studio. Нужную периферию проверяю уже на железе. Если требуется с осциллографом. Знаю как работает МК. Знаю как должна работать программа. Знаю как должна работать периферия. Если требуется, пишу тестовые куски кода. Написал этап работы, прогнал в симуляторе. Потом в железе. Итог. Практически всегда уже пишу так, что работает сразу. За редким исключением. Microchip Studio это наследие AVR-Studio. Со всеми ее недостатками. Мой профессиональный багаж. Электронные устройства, блоки управления станками, промышленного оборудования. Изменено 9 декабря, 2023 пользователем demiurg1978 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg1978 1 10 декабря, 2023 Опубликовано 10 декабря, 2023 · Жалоба Я в IAR использовал переменные EEPROM как есть. Потому и получил гранату. __eeprom u08 ee_parameter_1; ee_parameter_1 = 0x55; Именно в моем случае решение проблемы использовать функции read_eeprom_byte (). write_eeprom_byte (). Ну и соответственно нужная разрядность. u08, u16, u32. Либо самописные функции. В соответствии с даташитами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться