реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Mega48-20 не пишет в EEPROM, Что я забыл?
IgorKossak
сообщение Dec 16 2014, 19:16
Сообщение #16


Шаман
******

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



Цитата(smk @ Dec 16 2014, 16:31) *
Да, компилятор я понимаю, это может быть причиной. А присваивание это я так понимаю состоит из трех этапов. Сначала вычитать, потом изменить и прописать обратно. В STM регистры специально заточены под присваивание. Но там обстоятельства таковы что это допустимо. Может Вы имеете в виду операции типа REGISTR |= 0x01; ?

Присваивание это просто запись, а то, что Вы описали, называется чтение-модификация-запись. Т. е. надо так, как Вам советовали:
Код
  EECR = (1<<EEMPE); /* Write logical one to EEMPE */
  EECR = (1<<EEMPE)|(1<<EEPE); /* Start eeprom write by setting EEPE */
Go to the top of the page
 
+Quote Post
smk
сообщение Dec 16 2014, 20:04
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Ну вот... О1 и уже не работает. прикладываю проект для студии целиком. На самом деле действительно интересно что происходит. С кейлом таких чудес небыло ни разу. Не суть, просто хочу понять что происходит...
Прикрепленный файл  tr.rar ( 21.31 килобайт ) Кол-во скачиваний: 49


Цитата(IgorKossak @ Dec 16 2014, 21:16) *
Присваивание это просто запись, а то, что Вы описали, называется чтение-модификация-запись. Т. е. надо так, как Вам советовали:
Код
  EECR = (1<<EEMPE); /* Write logical one to EEMPE */
  EECR = (1<<EEMPE)|(1<<EEPE); /* Start eeprom write by setting EEPE */

Ну пусть так. Однако серийное изделие (лет более 5-ти) на Тини24 работает и повторяется .... правда перепер на STM8S0003F, но это детали... и на тини отлично все работает. Версия компилятора не изменилась. В чем смысл тогда?

оптимизация Os сильно убыстряет циклы мигания
Код
      PORTC = 0b00010000;
      delay(30000);
      PORTC = 0b00000000;
      delay(30000);


Это почему?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 16 2014, 20:09
Сообщение #18


Гуру
******

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



Цитата(smk @ Dec 16 2014, 21:14) *
Вот такое предупреждение. Что опять не так? Указатель нужен?
Да, нужен. смотрите еще раз:
Код
    eeprom_write_byte((uint8_t *)0x0A, mode);

А теперь смотрите на свой код:
Код
mode = eeprom_read_byte (0x0A);
Видите разницу около 0x0A?

Цитата(smk @ Dec 16 2014, 21:31) *
Ну вот... О1 и уже не работает.
Естественно. Ваша функция delay не делает с точки зрения компилятора ничего полезного. Наоборот, она делает маленькую быструю программу большой и медленной. Оптимизатор выкинул ее нафиг.

Изучайте <util/delay.h>

Цитата(smk @ Dec 16 2014, 21:14) *
С кейлом таких чудес небыло ни разу.
Там настолько плохой компилятор, что не умеет выкидывать пустые циклы?

Цитата(smk @ Dec 16 2014, 21:14) *
на тини отлично все работает. Версия компилятора не изменилась. В чем смысл тогда?
Откройте листинги, сравните, найдите разницу.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
smk
сообщение Dec 16 2014, 20:19
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



так предлагаете unsigned char *0x0A или как? Читает и пишет правильно.

Код
mode = eeprom_read_byte (0x0A);


а на мой взгляд делей делает очень полезную штуку. как компилятору сказать?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
smk
сообщение Dec 16 2014, 21:47
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



в смысле цикл тот
Код
void delay (unsigned long t)
{
  while(t--);
}


и еще, delay_ms... сразу дало большой довесок коду. включил оптимизацию, но это привело программу в нерабочий вид. хотя код ужало. в чем смысл?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 16 2014, 23:03
Сообщение #21


Гуру
******

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



Цитата(smk @ Dec 16 2014, 23:47) *
в чем смысл?
В чтении документации. В ней все написано. И про большой код и про оптимизацию. И смею вас заверить - delay_ms работает именно так, как описано в документации. Что вы понимаете под нерабочим видом программы телепатировать не получается.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Bear_ku
сообщение Dec 17 2014, 03:54
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 154
Регистрация: 9-09-11
Пользователь №: 67 076



Цитата(IgorKossak @ Dec 16 2014, 18:43) *
Но в любом случае следует избегать непереносимого кода и зависеть от трюков конкретной версии компилятора.
Переносимость меня абсолютно не волнует. А вот "зависеть от трюков" это видимо действительно было, примеры в ДШ даны для IAR и поэтому в IAR работают без нареканий.

Ну а по поводу того, что программа перестает работать при включении оптимизации - это нормально. Проблему можно легко вычислить воспользовавшись средствами отладки. Есть подозрение что виновата переменная consol, попробуйте в ее объявление добавить квалификатор volatile.

Сообщение отредактировал Bear_ku - Dec 17 2014, 03:55
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Dec 17 2014, 07:17
Сообщение #23


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



Я делал один проект. Сначала взял ATMEGA8535. Проект писал в IAR. Когда прошил программу, все работало, кроме записи в EEPROM. Стал разбираться. Залил давний проект, написанный на асме. Запись в EEPROM работает. Стал сверять в дизасме. Вроде все нормально, а запись EEPROM не работает. Решил проверить эту же программу, но скомпилированную под ATMEGA32. Запись в EEPROM нормально работает. Выходит, что библиотеку записи в EEPROM нужно написать на асме. Но я в IAR так и не смог пока разобраться, как правильно писать и использовать функции на асме. Да и в тот раз обошелся ATMEGA32A. И некогда мне было с асмом в IAR разбираться.
Еще один случай. Умер один человек, мне достались его проекты. Написаны в IAR. Его девайсы сделаны на ATMEGA1280. Для сохранения данных использовались внешние EEPROM. То есть, когда-то этот человек тоже испытывал трудности с записью в EEPROM в проектах, созданных в IAR, на некоторых МК AVR.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 17 2014, 08:00
Сообщение #24


Гуру
******

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



Цитата(demiurg1978 @ Dec 17 2014, 09:17) *
Выходит, что библиотеку записи в EEPROM нужно написать на асме.
Я порой вам удивляюсь. ИАР еще пятнадцать лет назад имел квалификатор __eeprom. Достаточно было прочитать документацию, объявить переменную с таким квалификатором и просто читать-писать ее как обычную переменную. Компилятор подставлял доступ к eeprom куда нужно сам и этот доступ всегда 100% работал. Вот какой смысл было изобретать велосипед и реализовывать свои процедуры чтения/записи? Причем судя по вашему описанию велосипед-то получился с квадратными колесами.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Xenia
сообщение Dec 17 2014, 08:01
Сообщение #25


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Хочу напомнить, что у IAR EWAVR в хидере intrinsics.h (он ко всем типам МК относится) определены следующие макросы:
Код
#define __EEPUT(ADR,VAL)  {while (EECR & 0x02); EEAR = (ADR); EEDR = (VAL); EECR = 0x04; EECR = 0x02;}
#define __EEGET(VAR, ADR) {while (EECR & 0x02); EEAR = (ADR); EECR = 0x01; (VAR) = EEDR;}

С одной стороны полезно на это посмотреть, а то и позаимствовать.
С другой стороны, когда используется именно этот компилятор, можно этими макросами пользоваться.
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Dec 17 2014, 08:18
Сообщение #26


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



Цитата(Сергей Борщ @ Dec 17 2014, 14:00) *
Я порой вам удивляюсь. ИАР еще пятнадцать лет назад имел квалификатор __eeprom. Достаточно было прочитать документацию, объявить переменную с таким квалификатором и просто читать-писать ее как обычную переменную. Компилятор подставлял доступ к eeprom куда нужно сам и этот доступ всегда 100% работал. Вот какой смысл было изобретать велосипед и реализовывать свои процедуры чтения/записи? Причем судя по вашему описанию велосипед-то получился с квадратными колесами.

Сергей, вы заранее не исходите из ваших предположений, ладно?
Все на месте, один и тот же проект, на ATMEGA8535 запись в EEPROM не работает, на ATMEGA32\A работает.
Код
__eeprom u08 ee_empty_val = 0;
__eeprom u16 ee_tim_heat_val = 12;
__eeprom u16 ee_tim_formovka_val = 12;
__eeprom u16 ee_tim_pnevmosyem_val = 6;

Этот случай давно был. На сахаре мне тогда ответили, что, возможно, придется писать свою библиотеку для работы с EEPROM на асме.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Dec 17 2014, 08:22
Сообщение #27


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Сергей Борщ @ Dec 17 2014, 11:00) *
Я порой вам удивляюсь. ИАР еще пятнадцать лет назад имел квалификатор __eeprom. Достаточно было прочитать документацию, объявить переменную с таким квалификатором и просто читать-писать ее как обычную переменную. Компилятор подставлял доступ к eeprom куда нужно сам и этот доступ всегда 100% работал. Вот какой смысл было изобретать велосипед и реализовывать свои процедуры чтения/записи? Причем судя по вашему описанию велосипед-то получился с квадратными колесами.


Проблема именно в том, что у топикстартера компилятор не IAR, а GCC:
Цитата(smk @ Dec 16 2014, 11:56) *
Компилятор GCC.

Однако те макросы, которые я привела из IAR, легко вживляемы в GCC.
А вот __eeprom приживить едва ли будет возможно, т.к. это не просто определение типа, а в придачу встроенные возможности.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 17 2014, 08:39
Сообщение #28


Гуру
******

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



Цитата(demiurg1978 @ Dec 17 2014, 10:18) *
Сергей, вы заранее не исходите из ваших предположений, ладно?
Все на месте, один и тот же проект, на ATMEGA8535 запись в EEPROM не работает, на ATMEGA32\A работает.
Видимо недопонял. Получается, была ошибка в компиляторе?

Цитата(Xenia @ Dec 17 2014, 10:22) *
Проблема именно в том, что у топикстартера компилятор не IAR, а GCC:
Ксения, с топикстартером уже давно разобрались и перешли к стадии "бойцы вспоминают минувшие дни". Практически дословно содержимое вашего макроса уже было в этой теме на прошлой странице. И там же было обсосано, почему так лучше не делать.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Dec 17 2014, 09:34
Сообщение #29


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



Цитата(Сергей Борщ @ Dec 17 2014, 14:39) *
Видимо недопонял. Получается, была ошибка в компиляторе?

Получается, что так. Досконально я не разбирался. Включал разные степени оптимизации кода. Смотрел в дизасме. А так как проект тогда оброс некоторыми дополнительными функциями, и размер кода увеличился, и запись в EEPROM заработала на другом МК, мне тем более пришлось взять вместо ATMEGA8535, ATMEGA32A. Кстати, прикол в том, что запись в EEPROM работает на МК, выпущенных позднее ATMEGA8535.
Нужно уделить время, сесть и понять разницу между моим рабочим проектом на асме и дизасмом в IAR. Тогда не до этого было. Сейчас тоже со свободным временем не очень...

Сообщение отредактировал demiurg1978 - Dec 17 2014, 09:37
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 02:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01514 секунд с 7
ELECTRONIX ©2004-2016