Код: Выделить всё
if (PINB.3==0){
delay_ms(10);
while (PINB.3==0);
if (OCR0A<0xff)
OCR0A=OCR0A+0x01;
}Код: Выделить всё
if (PINB.3==0){
delay_ms(10);
while (PINB.3==0);
if (OCR0A<0xff)
OCR0A=OCR0A+0x01;
}Не вот так работает как надо:Z_h_e писал(а):Наверное у Вас это условие в цикле. Попробуйте вот так.Но программа будет висеть, пока нажата кнопка. В основном цикле и при правильном использовании прерываний это может быть нормальным.Код: Выделить всё
if (PINB.3==0){ delay_ms(10); while (PINB.3==0); if (OCR0A<0xff) OCR0A=OCR0A+0x01; }
Код: Выделить всё
if (PINB.3==1)
{
OCR0A=0x7f;
}
else
{
delay_ms(5);
if (OCR0A<0xff)
OCR0A=OCR0A+0x01;
}
Попробую пояснить, что я имею в виду.ARV писал(а):ничуть.
это если нет механизма автоматического контроля за местом размещения данных, тогда надо следить за адресами.
как известно, одно из прогрессивных достижений языков высокого уровня заключается как раз в том, что пользователь оперирует не абсолютными адресами ячеек памяти, а абстрактными именами переменных. зачем же отказываться от этого?!
Код: Выделить всё
#define EEPROM_BR_STBY 0x32
#define EEPROM_BR_WORK 0x33именно о том и шла речь - оставьте компилятору компиляторово, не майтесь ерундойrealm писал(а):Результат - переменные находятся совсем не там, где может показаться на первый взгляд
мое мнение - можно и нужноWiseLord писал(а):Да, вполне можно использовать автоматическое размещение их в EEPROM
то есть когда при обновлении прошивки роутера вы потом заново вводите всякие маски подсети и названия точки доступа - это вас не пугает, а для часов ввести 2 числа будильника - это катастрофа? не выдумывайте проблем на пустом месте, это несерьёзно.WiseLord писал(а):Старый EEPROM будет несовместим с предыдущим. И старые настройки вводить придётся заново.
имеет. но лучше сделать ему эвтаназию. если взять за основу логику ваших предыдущих рассуждений: потребовалось убрать из ранее существовавших адресов сохранения 1 байт и добавить 3 области для хранения int... вы считаете, геморрой с пересчетом адресов в ваших константах будет простым? тогда прикиньте, что будет, если вы храните в EEPROM несколько десятков строк и иной раз меняете их содержимое... правда, удобно?WiseLord писал(а):Поэтому ручной контроль адресов в EEPROM вполне имеет право на жизнь
map-файл для этого не годится?WiseLord писал(а):и этот же хидер является "якорем" для десктопного приложения для редактирования этого же бинарника
Вообще-то, пугает. Да, для часов - это ерунда, но, например, заново настраивать три десятка радиостанций в радиоприёмнике - вот это может раздражать.ARV писал(а):когда при обновлении прошивки роутера вы потом заново вводите всякие маски подсети и названия точки доступа - это вас не пугает, а для часов ввести 2 числа будильника - это катастрофа?
А вот это действительно решение. Как-то даже не подумал. По сути, мой вариант с отдельным хидером для адресов - некий суррогат map файла.ARV писал(а):map-файл для этого не годится?
не понятно, о каких текстах идет речь? текст - это как бы тоже штука, подлежащая локализации... т.е. в чем отличие строк из нижней части EEPROM от текста в верхней?WiseLord писал(а):А текстам отдать верхнюю половину с фиксированным стартовым адресом
когда памяти с избытком - почему нет? но EEPROM - самая бестолково используемая память в AVR... и в случае нехватки flash всяким строковым константам там самое место.Аlex писал(а):А я языковые строки храню во флеши, в виде двумерного массива указателей.
вот у вас наверняка есть смартфон. да что там смартфон - любой мобильник не 15-летней давности имеет возможность смены языка интерфейса. вот ответьте мне честно: сколько раз за время эксплуатации вы меняли язык интерфейса? а память-то под эти строки по сути попросту пропадает...Аlex писал(а):И менять язык можно на лету
Если честно, я никогда не занимался впихиванием невпихуемого. Не хватает - берём жирнее...ARV писал(а):когда памяти с избытком - почему нет?
Если этого можно избежать с минимумом затрат - почему бы и нет?то есть когда при обновлении прошивки роутера вы потом заново вводите всякие маски подсети и названия точки доступа - это вас не пугает, а для часов ввести 2 числа будильника - это катастрофа? не выдумывайте проблем на пустом месте, это несерьёзно.
Не могли бы вы пояснить свою мысль, зачем добавились 3 области int?если взять за основу логику ваших предыдущих рассуждений: потребовалось убрать из ранее существовавших адресов сохранения 1 байт и добавить 3 области для хранения int...
В зависимости от реализации. Для #define добавляете sizeof(), для структуры ничего добавлять не надо, разве что для полностью ручного отслеживания будет не так просто.вы считаете, геморрой с пересчетом адресов в ваших константах будет простым?
Самое простое - выделить место под максимальный предполагаемый размер, тем более если строки могут меняться независимо от изменений прошивки.тогда прикиньте, что будет, если вы храните в EEPROM несколько десятков строк и иной раз меняете их содержимое... правда, удобно?
видимо, затраты на избежание этого максимальны, потому как производители роутеров пока не сделали это...COKPOWEHEU писал(а):Если этого можно избежать с минимумом затрат - почему бы и нет?
Возможно дополнительные затраты такие же, как затраты на то, чтобы сделать ход часов на микроволновке без сетевого питания, хотя бы на пол часа.ARV писал(а):видимо, затраты на избежание этого максимальны, потому как производители роутеров пока не сделали это...
Например, живой пример - мой проект часов на светодиодных матрицах. В виде бегущей строки выводится температура с четырёх разных датчиков. У кого-то это могут быть 3 датчика "дома", "на улице", "на балконе", а у кого-то - 2 датчика "в бане", "в комнате" и т.д. Тут-то и возникает необходимость дать пользователю возможность настроить всё это, и EEPROM для этого идеально подходит. Прошивка FLASH одна для всех, а EEPROM у каждого свой - как в плане и языка вообще, так и тонкой настройки под себя.ARV писал(а):немного не одобряю (возможно потому, что не понимаю смысл и важность) идею редактирования строковых констант пользователем
ну так вроде вы и нашли разумное решение проблемы... не зная точно, как сделали вы, но по предыдущему вашему сообщению я для себя нарисовал такой алгоритм:WiseLord писал(а):пример достаточно специфичен, и не всем такое может понадобиться такое
Код: Выделить всё
char *wrd = str;
int idx = N*3 + 2; // это порядковый номер слова в массиве
while(idx){
while(eeprom_read_byte((void*)wrd)) wrd++;
idx--; wrd++;
}
// здесь wrd у вас содержит начало нужного словаКод: Выделить всё
EEPROM char str[] = "слово1\0" "слово2\0" ... "словоN\0"Код: Выделить всё
EEPROM char str[400] = "слово1\0" "слово2\0" ... "словоN\0"Код: Выделить всё
EEPROM struct{
int var; // какие-то настроечные параметры
...
char str[]; // а это тот самый массив строк
} my_config;Вы определитесь где собираетесь хранить настройки - в flash (как в роутерах) или eeprom (как предлагается тут). Когда осознаете разницу, поймете, почему пример с роутером неудачен. Тем более что там адрес каждой настройки как раз может изменяться хоть в процессе работы, и ничего при этом не теряется.ARV писал(а):видимо, затраты на избежание этого максимальны, потому как производители роутеров пока не сделали это...