|
Mega48-20 не пишет в EEPROM, Что я забыл? |
|
|
|
 |
Ответов
|
Dec 16 2014, 08:56
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата(Сергей Борщ @ Dec 16 2014, 10:00)  Код EECR |= (1<<EEMPE); /* Write logical one to EEMPE */ EECR |= (1<<EEPE); /* Start eeprom write by setting EEPE */ Между установкой EEMPE и установкой EEPE должно пройти не более 4 тактов. Посмотрите, во что вылились эти операторы с вашими настройками компилятора. А чтобы работало железно - не используйте тут '|='. Вы ведь точно знаете сотояние всех остальных битов, вот и пишите каждый раз все биты через '='. Компилятор GCC. Кстати оптимизация О0. Если включить другую, то код ужимается раза в два и более при этом перестает работать. Что-то я упускаю в своем понимании. А как кстати тогда правильно если не использовать '|='?
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Dec 16 2014, 09:08
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(smk @ Dec 16 2014, 10:56)  Компилятор GCC. Тогда используйте <avr/eeprom.h> и описанные в нем eeprom_write_byte(), eeprom_read_byte(). Там все проблемы времянок решены для всех уровней оптимизации: Код #include <avr/eeprom.h>
void test() { eeprom_write_byte((uint8_t *)0x0A, mode); } Цитата(smk @ Dec 16 2014, 10:56)  А как кстати тогда правильно если не использовать '|='? примерно так: Код void EEPROM_write(unsigned int Address, unsigned char Data) { while(EECR & (1<<EEPE)) /* Wait for completion of previous write */ ; EEAR = Address; /* Set up address and Data Registers */ EEDR = Data; EECR = (1<<EEMPE); /* Write logical one to EEMPE */ EECR = (1<<EEMPE)|(1<<EEPE); /* Start eeprom write by setting EEPE */ }
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 16 2014, 09:11
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата(Сергей Борщ @ Dec 16 2014, 11:08)  Тогда используйте <avr/eeprom.h> и описанные в нем eeprom_write_byte(), eeprom_read_byte(). Там все проблемы времянок решены для всех уровней оптимизации: Код #include <avr/eeprom.h>
void test() { eeprom_write_byte((uint8_t *)0x0A, mode); } примерно так: Код void EEPROM_write(unsigned int Address, unsigned char Data) { while(EECR & (1<<EEPE)) /* Wait for completion of previous write */ ; EEAR = Address; /* Set up address and Data Registers */ EEDR = Data; EECR = (1<<EEMPE); /* Write logical one to EEMPE */ EECR = (1<<EEMPE)|(1<<EEPE); /* Start eeprom write by setting EEPE */ } Спасибо. Только я теперь не пойму что они в даташитах пишут и зачем? Раньше, помню, работало.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Dec 16 2014, 13:43
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(smk @ Dec 16 2014, 14:40)  Ну а какой операцией? Операцией присваивания, как и советовал Сергей Борщ. Цитата(Bear_ku @ Dec 16 2014, 14:45)  Нашел старую программу для ATmega128, все было сделано по ДШ и именно с "|=", работает без нареканий. Листинг кода посмотрите. В Вашем случае могла быть некоторая неявная оптимизация, например, битовыми операциями (не помню, попадают ли эти регистры для работы с ними битовыми операциями). Но в любом случае следует избегать непереносимого кода и зависеть от трюков конкретной версии компилятора.
|
|
|
|
|
Dec 17 2014, 03:54
|
Частый гость
 
Группа: Участник
Сообщений: 154
Регистрация: 9-09-11
Пользователь №: 67 076

|
Цитата(IgorKossak @ Dec 16 2014, 18:43)  Но в любом случае следует избегать непереносимого кода и зависеть от трюков конкретной версии компилятора. Переносимость меня абсолютно не волнует. А вот "зависеть от трюков" это видимо действительно было, примеры в ДШ даны для IAR и поэтому в IAR работают без нареканий. Ну а по поводу того, что программа перестает работать при включении оптимизации - это нормально. Проблему можно легко вычислить воспользовавшись средствами отладки. Есть подозрение что виновата переменная consol, попробуйте в ее объявление добавить квалификатор volatile.
Сообщение отредактировал Bear_ku - Dec 17 2014, 03:55
|
|
|
|
|
Dec 17 2014, 07:17
|
Местный
  
Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709

|
Я делал один проект. Сначала взял ATMEGA8535. Проект писал в IAR. Когда прошил программу, все работало, кроме записи в EEPROM. Стал разбираться. Залил давний проект, написанный на асме. Запись в EEPROM работает. Стал сверять в дизасме. Вроде все нормально, а запись EEPROM не работает. Решил проверить эту же программу, но скомпилированную под ATMEGA32. Запись в EEPROM нормально работает. Выходит, что библиотеку записи в EEPROM нужно написать на асме. Но я в IAR так и не смог пока разобраться, как правильно писать и использовать функции на асме. Да и в тот раз обошелся ATMEGA32A. И некогда мне было с асмом в IAR разбираться. Еще один случай. Умер один человек, мне достались его проекты. Написаны в IAR. Его девайсы сделаны на ATMEGA1280. Для сохранения данных использовались внешние EEPROM. То есть, когда-то этот человек тоже испытывал трудности с записью в EEPROM в проектах, созданных в IAR, на некоторых МК AVR.
|
|
|
|
Сообщений в этой теме
smk Mega48-20 не пишет в EEPROM Dec 16 2014, 07:47  Xenia Цитата(smk @ Dec 16 2014, 11:56) Компилят... Dec 16 2014, 09:01   smk Цитата(Xenia @ Dec 16 2014, 11:01) У вас ... Dec 16 2014, 09:04    Сергей Борщ Цитата(smk @ Dec 16 2014, 11:11) Только я... Dec 16 2014, 09:54       smk Цитата(IgorKossak @ Dec 16 2014, 15:43) О... Dec 16 2014, 14:31        IgorKossak Цитата(smk @ Dec 16 2014, 16:31) Да, комп... Dec 16 2014, 19:16         Сергей Борщ Цитата(demiurg1978 @ Dec 17 2014, 09:17) ... Dec 17 2014, 08:00          demiurg1978 Цитата(Сергей Борщ @ Dec 17 2014, 14:00) ... Dec 17 2014, 08:18          Xenia Цитата(Сергей Борщ @ Dec 17 2014, 11:00) ... Dec 17 2014, 08:22 Bear_ku Нашел старую программу для ATmega128, все было сде... Dec 16 2014, 12:45 Сергей Борщ Откровенно говоря - не стоит полагаться на компиля... Dec 16 2014, 14:55 smk Код../trsm_m48.c:21: warning: ... Dec 16 2014, 19:14 smk Ну вот... О1 и уже не работает. прикладываю проект... Dec 16 2014, 20:04 Сергей Борщ Цитата(smk @ Dec 16 2014, 21:14) Вот тако... Dec 16 2014, 20:09 smk так предлагаете unsigned char *0x0A или как? Читае... Dec 16 2014, 20:19 smk в смысле цикл тот
Кодvoid delay (unsigned lon... Dec 16 2014, 21:47 Сергей Борщ Цитата(smk @ Dec 16 2014, 23:47) в чем см... Dec 16 2014, 23:03 Xenia Хочу напомнить, что у IAR EWAVR в хидере intrinsic... Dec 17 2014, 08:01 Сергей Борщ Цитата(demiurg1978 @ Dec 17 2014, 10:18) ... Dec 17 2014, 08:39 demiurg1978 Цитата(Сергей Борщ @ Dec 17 2014, 14:39) ... Dec 17 2014, 09:34
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|