Во-первых, в функциях записи-чтения вы работаете без указателей, уберите адрес
EEPROM_WriteByte((unsigned short)EEPROM_Map.isParamsSet, 0xFA);
Во-вторых, вы не даете времени записаться - эти 10 мс или сколько там по шиту, закончите функцию записи так же, как и начали
while(EECR & (1<<EEPE));//////
EEAR = Addr;
EEDR = Data;
EECR |= (1<<EEMPE);
EECR |= (1<<EEPE);
while(EECR & (1<<EEPE));//////
urry писал(а):Во-первых, в функциях записи-чтения вы работаете без указателей, уберите адрес
EEPROM_WriteByte((unsigned short)EEPROM_Map.isParamsSet, 0xFA);
если этот элемент - EEPROM_Map.isParamsSet - содержит адрес в EE, то да; а если EEPROM_Map имеет атрибут EEMEM и резервирует пространство в EE под структуру, то все правильно - берется адрес элемента структуры и приводится к short.
urry писал(а):Во-вторых, вы не даете времени записаться - эти 10 мс или сколько там по шиту
зачем? следующая запись не начнется, пока предыдущая не закончится.
PS. и чтение тоже не начнется - там тоже есть ожидание окончания записи.
Последний раз редактировалось a_skr Ср июл 17, 2013 12:42:23, всего редактировалось 1 раз.
a_skr писал(а):ну, это не полный проект. возможно, дело в структуре EEPROM_Map. вот, с явным указанием адреса все работает:
cорри, сильно извиняюсь, структуру то я и не приложил. Но дело не в этом. Добавил в ваш проект свою структуру и все заработало. Будем думать. Магия какая-то.....
a_skr писал(а):Мой пример работает (в протеусе) при любой оптимизации.
т.е. значения записываемые меняли (т.к. после одной удачной записи он запоминает данное состояние даже при перезапуске симуляции) и делали принудительную пересборку (make clean и make all)?
Выкладывайте, конечно. Даже интересно.
извиняюсь за долгое молчание. Проект на работе а с интернетом там проблематично
alex1126 писал(а):т.е. значения записываемые меняли (т.к. после одной удачной записи он запоминает данное состояние даже при перезапуске симуляции) и делали принудительную пересборку (make clean и make all)?
да, действительно, на оптимизации 0 - протеус ругается по поводу 4-х тактов, на оптимизации 1 - не ругается, но тоже не работает. Спойлер
a_skr писал(а):действительно, на оптимизации 0 - протеус ругается по поводу 4-х тактов, на оптимизации 1 - не ругается, но тоже не работает.
Проект, неработающий при оптимизации 2,3,s есть у Вас?
нет. При 2 все работает. Но мой проект компилируется только при оптимизации равной 1. Я не ради причуды так издеваюсь. Я ранее писал какие ошибки при этом получаются, ответов не было. Могу повторить, но, на мой взгляд, проще разобраться почему в еепром не пишет при о=1. Можно как-нить для локального куска кода изменить оптимизацию? Или ассемблеровскую вставку делать? Я так понимаю что при оптимизации между командами, где должно быть не более 4 таквот, получается больше?
любой, корректно написанный, проект компилируется и работает при любом уровне оптимизации (если влезет при o=0 или o=1).
При 2 все работает. Но мой проект компилируется только при оптимизации равной 1. Я не ради причуды так издеваюсь. Я ранее писал какие ошибки при этом получаются, ответов не было. Могу повторить, но, на мой взгляд, проще разобраться почему в еепром не пишет при о=1
проще - использовать библиотечные функции, описанные в avr/eeprom.h, например, void eeprom_update_byte (uint8_t *__p, uint8_t __value). НО, это не избавит Вас от ошибок в Вашем коде, который, почему-то не работает при включении оптимизации, которая, на мой взгляд, просто необходима в проектах для AVR.
a_skr писал(а):проще - использовать библиотечные функции, описанные в avr/eeprom.h, например, void eeprom_update_byte (uint8_t *__p, uint8_t __value). НО, это не избавит Вас от ошибок в Вашем коде, который, почему-то не работает при включении оптимизации, которая, на мой взгляд, просто необходима в проектах для AVR.
код работает. Просто не компилируется, как я понял что то куда то не помещается.
Вообщем то вопрос был, в конце-концов, сформулирован довольно точно. Вместо непосредственного ответа пошли советы "не использовать этот код", "поменять уровень оптимизации", "переписать проект". Ну а че не посоветовали вместо авр пик взять? Меня интересует как заставить работать кусок кода из даташита при оптимизации равной единицы.
Linking: main.elf
avr-gcc -mmcu=atmega88pa -I. -gdwarf-2 -DF_CPU=7372800UL -O2 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o -std=gnu99 -MMD -MP -MF .dep/main.elf.d main.o --output main.elf -Wl,-Map=main.map,--cref -lm
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/bin/ld.exe: main.elf section .text will not fit in region text
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/bin/ld.exe: region text overflowed by 838 bytes
make.exe: *** [main.elf] Error 1
причем чем выше уровень оптимизации тем размер оверфловеда больше. Вообщем что это такое и как лечить? Это не тоже самое когда код больше 8 килобайт, он нормально компилится и в 8,5кб и пишет при этом что размер 102%, это помоему какая внутренняя херня с линковкой.
Если код уменьшить. То нормально соберется. Но опять мы уехали не в ту степь. Я спрашивал про другое.
vitalik_1984 писал(а):Блин уже три страницы говорится об ошибке, которую мы должны исправить в коде, которого не видели.
Сударь, вы случайно не тролль?
нету никакой ошибке в коде. Он работает. Вопрос был про другое.
Видать это какая то секретная разработка, раз все время только кусочек выкладывается, который отношение к некомпилируемому коду имеет посредственное отношение.
Нам непонятно возможно проблема кроется совсем не в этом участке кода, который вы выкладываете, просто последствия тех неправильных строк видны именно в записи чтении.
Тот участок кода что вы привели отлично компилируется на всех уровнях оптимизации.
alex1126 писал(а):a_skr писал(а):
действительно, на оптимизации 0 - протеус ругается по поводу 4-х тактов, на оптимизации 1 - не ругается, но тоже не работает.
Проект, неработающий при оптимизации 2,3,s есть у Вас?
нет. При 2 все работает. Но мой проект компилируется только при оптимизации равной 1.
Непонятно как у вас при оптимизации 2 все работает, если компилируется только на уровне оптимизации 1?
Что то вы не договариваете. Это как починить сломанный телефон по телефону, который сломан.
Попробуйте полностью заново создать проект будто его только что сочинили. Только код программы оставьте тот, что есть. Может все и решится.
И покажите наконец код. Уже не раз говорилось об этом. Может кто соберет этот проект исправив уже замыленную для вашего глаза ошибку.
vitalik_1984 писал(а):Видать это какая то секретная разработка, раз все время только кусочек выкладывается, который отношение к некомпилируемому коду имеет посредственное отношение.
все отлично компилируется. Но не работает. Ранее был уже выложен проект который не работает при о=1
Тот участок кода что вы привели отлично компилируется на всех уровнях оптимизации.
a_skr писал(а):
действительно, на оптимизации 0 - протеус ругается по поводу 4-х тактов, на оптимизации 1 - не ругается, но тоже не работает.
мнения разделились
Непонятно как у вас при оптимизации 2 все работает, если компилируется только на уровне оптимизации 1?