WinAvr в вопросах и ответах
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: WinAvr в вопросах и ответах
Во-первых, в функциях записи-чтения вы работаете без указателей, уберите адрес
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));//////
- Реклама
Re: WinAvr в вопросах и ответах
ну, это не полный проект. возможно, дело в структуре EEPROM_Map. вот, с явным указанием адреса все работает:

- Вложения
-
- mega88_test.zip
- (19.68 КБ) 225 скачиваний
Re: WinAvr в вопросах и ответах
если этот элемент - 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 раз.
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: WinAvr в вопросах и ответах
Да, я не заметил, что битик окончания записи анализируется при чтении, можно не дублировать.
- Реклама
Re: WinAvr в вопросах и ответах
в программировании магии не бывает. выложите полностью неработающий проект 
Re: WinAvr в вопросах и ответах
если оптимизацию изменить на 1, то не пишетеa_skr писал(а):в программировании магии не бывает. выложите полностью неработающий проект
Проект выкладывать?
Re: WinAvr в вопросах и ответах
Мой пример работает (в протеусе) при любой оптимизации. Выкладывайте, конечно. Даже интересно.
Re: WinAvr в вопросах и ответах
т.е. значения записываемые меняли (т.к. после одной удачной записи он запоминает данное состояние даже при перезапуске симуляции) и делали принудительную пересборку (make clean и make all)?a_skr писал(а):Мой пример работает (в протеусе) при любой оптимизации.
извиняюсь за долгое молчание. Проект на работе а с интернетом там проблематичноВыкладывайте, конечно. Даже интересно.
- Вложения
-
- tes.rar
- (18.53 КБ) 190 скачиваний
Re: WinAvr в вопросах и ответах
да, действительно, на оптимизации 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
Re: WinAvr в вопросах и ответах
нет. При 2 все работает. Но мой проект компилируется только при оптимизации равной 1. Я не ради причуды так издеваюсь. Я ранее писал какие ошибки при этом получаются, ответов не было. Могу повторить, но, на мой взгляд, проще разобраться почему в еепром не пишет при о=1. Можно как-нить для локального куска кода изменить оптимизацию? Или ассемблеровскую вставку делать? Я так понимаю что при оптимизации между командами, где должно быть не более 4 таквот, получается больше?a_skr писал(а):действительно, на оптимизации 0 - протеус ругается по поводу 4-х тактов, на оптимизации 1 - не ругается, но тоже не работает.
Проект, неработающий при оптимизации 2,3,s есть у Вас?
Re: WinAvr в вопросах и ответах
любой, корректно написанный, проект компилируется и работает при любом уровне оптимизации (если влезет при o=0 или o=1).
проще - использовать библиотечные функции, описанные в avr/eeprom.h, например, void eeprom_update_byte (uint8_t *__p, uint8_t __value). НО, это не избавит Вас от ошибок в Вашем коде, который, почему-то не работает при включении оптимизации, которая, на мой взгляд, просто необходима в проектах для AVR.При 2 все работает. Но мой проект компилируется только при оптимизации равной 1. Я не ради причуды так издеваюсь. Я ранее писал какие ошибки при этом получаются, ответов не было. Могу повторить, но, на мой взгляд, проще разобраться почему в еепром не пишет при о=1
Re: WinAvr в вопросах и ответах
код работает. Просто не компилируется, как я понял что то куда то не помещается.a_skr писал(а):проще - использовать библиотечные функции, описанные в avr/eeprom.h, например, void eeprom_update_byte (uint8_t *__p, uint8_t __value). НО, это не избавит Вас от ошибок в Вашем коде, который, почему-то не работает при включении оптимизации, которая, на мой взгляд, просто необходима в проектах для AVR.
Вообщем то вопрос был, в конце-концов, сформулирован довольно точно. Вместо непосредственного ответа пошли советы "не использовать этот код", "поменять уровень оптимизации", "переписать проект". Ну а че не посоветовали вместо авр пик взять? Меня интересует как заставить работать кусок кода из даташита при оптимизации равной единицы.
Re: WinAvr в вопросах и ответах
что-то куда-то...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));
Re: WinAvr в вопросах и ответах
Там сто килобайт кода, прошивка почти под завязку. Ошибка при линковке. Я писал ранее: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));
Re: WinAvr в вопросах и ответах
вместо этого:
EECR |= (1<<EEMPE);
EECR |= (1<<EEPE);
EECR |= (1<<EEMPE);
EECR |= (1<<EEPE);
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: WinAvr в вопросах и ответах
Блин уже три страницы говорится об ошибке, которую мы должны исправить в коде, которого не видели.Там сто килобайт кода, прошивка почти под завязку. Ошибка при линковке. Я писал ранее:
Сударь, вы случайно не тролль?
Re: WinAvr в вопросах и ответах
нету никакой ошибке в коде. Он работает. Вопрос был про другое.vitalik_1984 писал(а):Блин уже три страницы говорится об ошибке, которую мы должны исправить в коде, которого не видели.
Сударь, вы случайно не тролль?
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: WinAvr в вопросах и ответах
Видать это какая то секретная разработка, раз все время только кусочек выкладывается, который отношение к некомпилируемому коду имеет посредственное отношение.
Нам непонятно возможно проблема кроется совсем не в этом участке кода, который вы выкладываете, просто последствия тех неправильных строк видны именно в записи чтении.
Тот участок кода что вы привели отлично компилируется на всех уровнях оптимизации.
Непонятно как у вас при оптимизации 2 все работает, если компилируется только на уровне оптимизации 1?
Что то вы не договариваете. Это как починить сломанный телефон по телефону, который сломан.
Попробуйте полностью заново создать проект будто его только что сочинили. Только код программы оставьте тот, что есть. Может все и решится.
И покажите наконец код. Уже не раз говорилось об этом. Может кто соберет этот проект исправив уже замыленную для вашего глаза ошибку.
Нам непонятно возможно проблема кроется совсем не в этом участке кода, который вы выкладываете, просто последствия тех неправильных строк видны именно в записи чтении.
Тот участок кода что вы привели отлично компилируется на всех уровнях оптимизации.
alex1126 писал(а):a_skr писал(а):
действительно, на оптимизации 0 - протеус ругается по поводу 4-х тактов, на оптимизации 1 - не ругается, но тоже не работает.
Проект, неработающий при оптимизации 2,3,s есть у Вас?
нет. При 2 все работает. Но мой проект компилируется только при оптимизации равной 1.
Непонятно как у вас при оптимизации 2 все работает, если компилируется только на уровне оптимизации 1?
Что то вы не договариваете. Это как починить сломанный телефон по телефону, который сломан.
Попробуйте полностью заново создать проект будто его только что сочинили. Только код программы оставьте тот, что есть. Может все и решится.
И покажите наконец код. Уже не раз говорилось об этом. Может кто соберет этот проект исправив уже замыленную для вашего глаза ошибку.
Re: WinAvr в вопросах и ответах
все отлично компилируется. Но не работает. Ранее был уже выложен проект который не работает при о=1vitalik_1984 писал(а):Видать это какая то секретная разработка, раз все время только кусочек выкладывается, который отношение к некомпилируемому коду имеет посредственное отношение.
мнения разделилисьТот участок кода что вы привели отлично компилируется на всех уровнях оптимизации.a_skr писал(а):
действительно, на оптимизации 0 - протеус ругается по поводу 4-х тактов, на оптимизации 1 - не ругается, но тоже не работает.
разговор уже про другой проектНепонятно как у вас при оптимизации 2 все работает, если компилируется только на уровне оптимизации 1?


