прерываний нет, там меньше 4 тактов. Код же я привел.Понимаю очень просто - пишу а потом читаю. Проект выкладываю. Он для протеуса, но в железе такая же фигняa_skr писал(а): не более 4-х тактов (запретить прерывания).
как понимаете, что "не работает"? выкладывайте "неработающий" проект.
WinAvr в вопросах и ответах
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
- Реклама
Во-первых, в функциях записи-чтения вы работаете без указателей, уберите адрес
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));//////
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));//////
ну, это не полный проект. возможно, дело в структуре EEPROM_Map. вот, с явным указанием адреса все работает:

- Вложения
-
- mega88_test.zip
- (19.68 КБ) 230 скачиваний
если этот элемент - EEPROM_Map.isParamsSet - содержит адрес в EE, то да; а если EEPROM_Map имеет атрибут EEMEM и резервирует пространство в EE под структуру, то все правильно - берется адрес элемента структуры и приводится к short.urry писал(а):Во-первых, в функциях записи-чтения вы работаете без указателей, уберите адрес
EEPROM_WriteByte((unsigned short)EEPROM_Map.isParamsSet, 0xFA);
зачем? следующая запись не начнется, пока предыдущая не закончится.urry писал(а):Во-вторых, вы не даете времени записаться - эти 10 мс или сколько там по шиту
PS. и чтение тоже не начнется - там тоже есть ожидание окончания записи.
Последний раз редактировалось a_skr Ср июл 17, 2013 12:42:23, всего редактировалось 1 раз.
Да, я не заметил, что битик окончания записи анализируется при чтении, можно не дублировать.
- Реклама
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
cорри, сильно извиняюсь, структуру то я и не приложил. Но дело не в этом. Добавил в ваш проект свою структуру и все заработало. Будем думать. Магия какая-то.....
в программировании магии не бывает. выложите полностью неработающий проект 
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
если оптимизацию изменить на 1, то не пишетеa_skr писал(а):в программировании магии не бывает. выложите полностью неработающий проект
Проект выкладывать?
Мой пример работает (в протеусе) при любой оптимизации. Выкладывайте, конечно. Даже интересно.
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
т.е. значения записываемые меняли (т.к. после одной удачной записи он запоминает данное состояние даже при перезапуске симуляции) и делали принудительную пересборку (make clean и make all)?a_skr писал(а):Мой пример работает (в протеусе) при любой оптимизации.
извиняюсь за долгое молчание. Проект на работе а с интернетом там проблематичноВыкладывайте, конечно. Даже интересно.
- Вложения
-
- tes.rar
- (18.53 КБ) 194 скачивания
да, действительно, на оптимизации 0 - протеус ругается по поводу 4-х тактов, на оптимизации 1 - не ругается, но тоже не работает.alex1126 писал(а):т.е. значения записываемые меняли (т.к. после одной удачной записи он запоминает данное состояние даже при перезапуске симуляции) и делали принудительную пересборку (make clean и make all)?
Спойлер
Код: Выделить всё
o=0:
EECR |= (1<<EEMPE);
d6: af e3 ldi r26, 0x3F ; 63
d8: b0 e0 ldi r27, 0x00 ; 0
da: ef e3 ldi r30, 0x3F ; 63
dc: f0 e0 ldi r31, 0x00 ; 0
de: 80 81 ld r24, Z
e0: 84 60 ori r24, 0x04 ; 4
e2: 8c 93 st X, r24
EECR |= (1<<EEPE);
e4: af e3 ldi r26, 0x3F ; 63
e6: b0 e0 ldi r27, 0x00 ; 0
e8: ef e3 ldi r30, 0x3F ; 63
ea: f0 e0 ldi r31, 0x00 ; 0
ec: 80 81 ld r24, Z
ee: 82 60 ori r24, 0x02 ; 2
f0: 8c 93 st X, r24
o=1:
EECR |= (1<<EEMPE);
84: ef e3 ldi r30, 0x3F ; 63
86: f0 e0 ldi r31, 0x00 ; 0
88: 80 81 ld r24, Z
8a: 84 60 ori r24, 0x04 ; 4
8c: 80 83 st Z, r24
EECR |= (1<<EEPE);
8e: 80 81 ld r24, Z
90: 82 60 ori r24, 0x02 ; 2
92: 80 83 st Z, r24
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
нет. При 2 все работает. Но мой проект компилируется только при оптимизации равной 1. Я не ради причуды так издеваюсь. Я ранее писал какие ошибки при этом получаются, ответов не было. Могу повторить, но, на мой взгляд, проще разобраться почему в еепром не пишет при о=1. Можно как-нить для локального куска кода изменить оптимизацию? Или ассемблеровскую вставку делать? Я так понимаю что при оптимизации между командами, где должно быть не более 4 таквот, получается больше?a_skr писал(а):действительно, на оптимизации 0 - протеус ругается по поводу 4-х тактов, на оптимизации 1 - не ругается, но тоже не работает.
Проект, неработающий при оптимизации 2,3,s есть у Вас?
любой, корректно написанный, проект компилируется и работает при любом уровне оптимизации (если влезет при o=0 или o=1).
проще - использовать библиотечные функции, описанные в avr/eeprom.h, например, void eeprom_update_byte (uint8_t *__p, uint8_t __value). НО, это не избавит Вас от ошибок в Вашем коде, который, почему-то не работает при включении оптимизации, которая, на мой взгляд, просто необходима в проектах для AVR.При 2 все работает. Но мой проект компилируется только при оптимизации равной 1. Я не ради причуды так издеваюсь. Я ранее писал какие ошибки при этом получаются, ответов не было. Могу повторить, но, на мой взгляд, проще разобраться почему в еепром не пишет при о=1
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
код работает. Просто не компилируется, как я понял что то куда то не помещается.a_skr писал(а):проще - использовать библиотечные функции, описанные в avr/eeprom.h, например, void eeprom_update_byte (uint8_t *__p, uint8_t __value). НО, это не избавит Вас от ошибок в Вашем коде, который, почему-то не работает при включении оптимизации, которая, на мой взгляд, просто необходима в проектах для AVR.
Вообщем то вопрос был, в конце-концов, сформулирован довольно точно. Вместо непосредственного ответа пошли советы "не использовать этот код", "поменять уровень оптимизации", "переписать проект". Ну а че не посоветовали вместо авр пик взять? Меня интересует как заставить работать кусок кода из даташита при оптимизации равной единицы.
что-то куда-то...alex1126 писал(а):код работает. Просто не компилируется, как я понял что то куда то не помещается.
alex1126 писал(а): Меня интересует как заставить работать кусок кода из даташита при оптимизации равной единицы.
Код: Выделить всё
asm volatile("sbi %0, %1" :: "I" (_SFR_IO_ADDR(EECR)),"M" (EEMPE));
asm volatile("sbi %0, %1" :: "I" (_SFR_IO_ADDR(EECR)),"M" (EEPE));
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
Там сто килобайт кода, прошивка почти под завязку. Ошибка при линковке. Я писал ранее:a_skr писал(а):что-то куда-то...код в студию!
Если при компиляции поставить уровень оптимизации 1, то компилируется нормально. Если же увеличивать (2,3,s), то начинается ругань при линковке:
Код: Выделить всё
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
Если код уменьшить. То нормально соберется. Но опять мы уехали не в ту степь. Я спрашивал про другое.
это куда вставлять?a_skr писал(а):Код: Выделить всё
asm volatile("sbi %0, %1" :: "I" (_SFR_IO_ADDR(EECR)),"M" (EEMPE)); asm volatile("sbi %0, %1" :: "I" (_SFR_IO_ADDR(EECR)),"M" (EEPE));
Блин уже три страницы говорится об ошибке, которую мы должны исправить в коде, которого не видели.Там сто килобайт кода, прошивка почти под завязку. Ошибка при линковке. Я писал ранее:
Сударь, вы случайно не тролль?
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
нету никакой ошибке в коде. Он работает. Вопрос был про другое.vitalik_1984 писал(а):Блин уже три страницы говорится об ошибке, которую мы должны исправить в коде, которого не видели.
Сударь, вы случайно не тролль?
Видать это какая то секретная разработка, раз все время только кусочек выкладывается, который отношение к некомпилируемому коду имеет посредственное отношение.
Нам непонятно возможно проблема кроется совсем не в этом участке кода, который вы выкладываете, просто последствия тех неправильных строк видны именно в записи чтении.
Тот участок кода что вы привели отлично компилируется на всех уровнях оптимизации.
Непонятно как у вас при оптимизации 2 все работает, если компилируется только на уровне оптимизации 1?
Что то вы не договариваете. Это как починить сломанный телефон по телефону, который сломан.
Попробуйте полностью заново создать проект будто его только что сочинили. Только код программы оставьте тот, что есть. Может все и решится.
И покажите наконец код. Уже не раз говорилось об этом. Может кто соберет этот проект исправив уже замыленную для вашего глаза ошибку.
Нам непонятно возможно проблема кроется совсем не в этом участке кода, который вы выкладываете, просто последствия тех неправильных строк видны именно в записи чтении.
Тот участок кода что вы привели отлично компилируется на всех уровнях оптимизации.
alex1126 писал(а):a_skr писал(а):
действительно, на оптимизации 0 - протеус ругается по поводу 4-х тактов, на оптимизации 1 - не ругается, но тоже не работает.
Проект, неработающий при оптимизации 2,3,s есть у Вас?
нет. При 2 все работает. Но мой проект компилируется только при оптимизации равной 1.
Непонятно как у вас при оптимизации 2 все работает, если компилируется только на уровне оптимизации 1?
Что то вы не договариваете. Это как починить сломанный телефон по телефону, который сломан.
Попробуйте полностью заново создать проект будто его только что сочинили. Только код программы оставьте тот, что есть. Может все и решится.
И покажите наконец код. Уже не раз говорилось об этом. Может кто соберет этот проект исправив уже замыленную для вашего глаза ошибку.


