WiseLord, большое спасибо за подсказку! Проблема действительна была в адресе. Я как-то и упустил, что с префиксом чипы имеют другой. Поставил 0х70 и всё заработало!
Спасибо!
PS. за неполноценный "плюс" я знал, заранее подкинул всё через транзистор.
_________________ Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
ИЧСХ, читается она тоже как 0x8F03 или 36611 вместо 911! Перевод K_div в uint не помогает.
Неверно используете приведение к типу при вычислении eeprom_val .
А как надо?
WiseLord писал(а):
Вообще-то, последовательность двух байтов 8F03 в eeprom - это как раз 911
В протеусе считывается 36611. В реальном железе, судя по поведению программы - тоже.
Добавлено after 57 minutes 46 seconds: Тут фишка в том, что если я просто делаю
Код:
K_div = EEPROM_VAL;
в обход eeprom, то всё прекрасно работает. Но стоит пропустить число через eeprom и всему капец. Причём и в протеусе, и в железе. То есть состояние чипа роли не играет.
AVR - LittleEndian. Поэтому последовательность байтов, например, 134679AB в EEPROM - это число 0xAB794613.
В avr-gcc eeprom_write_word() и eeprom_read_word() работают нормально. Число пишется "с LE-перевёртыванием" в eeprom, но оно же и читается оттуда с перевёртыванием, в итоге всё ОК.
Возможно, у CV какой-то глюк при работе с EEPROM на предмет записи-чтения мультибайтовых переменных. Потому что
Код:
K_div = division_factor;
Должно читаться как из eeprom (:020000008F036C) как число 0x038F
Возможно, глюк связан ещё и с тем, что двухбайтовая переменная читается в четырёхбайтовую.
AVR - LittleEndian. --- Возможно, глюк связан ещё и с тем, что двухбайтовая переменная читается в четырёхбайтовую.
Дык если он литл эндиан, то он и читать и писать должен одинаково. А получается, читает наоборот. Может, глюк версии CV?
Я пробовал делать K_div двухбайтной - та же фигня.
Добавлено after 1 hour 51 minute: так, кажется разобрался. Гадский протеус 1 раз подсасывает eeprom в проект и более не обновляет его из файла, даже если останавливать симуляцию полностью или перезагружать протеус. Сброс делается командой Debug => Reset Persistent Model Data Вроде помогло - стало работать правильно в симуляции. Почему не работало в железе - отдельный вопрос... Буду проверять дальше.
Собрал двухдатчиковый термометр на DS18B20 и дисплее 1602.
Положительный диапазон измеряет отлично, но вот с "минусом" проблема. Целые выводятся правильно, а десятые как-бы нет ...
Вот часть кода:
Спойлер
Код:
/***************************************************** Chip type : ATmega8 Program type : Application AVR Core Clock frequency: 8,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/
/*температурная функция*/ int temper[2]; int H; void temperature(void) // функция по работе с термо-датчиком { for (H=0;H<ds18b20_devices;H++) { temper[H]=ds18b20_temperature(&ds18b20_rom_codes[H][0])*10; // специально умножил на 10 для вывода десятых частей if (temper[H]>10000) //если датчик выдаёт больше 1000*10 { temper[H]=40960-temper[H]; //отнимаем от данных 4096*10 temper[H]=-temper[H]; //и ставим знак "минус" }
Аlex, спасибо, это уяснил. Однако уже час бьюсь в вариантами вывода минусовой температуры. Максимум могу вывести что-то вроде: -5.-7 градусов. Убрать знак "минус" не получается. Даже ввёл отдельную переменную для хранения не отрицательной десятичной доли температуры - не помогло.
_________________ Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
Аlex, спасибо за дополнительную инфу. Нашёл в сети пример поинтересней и проще, наверное.
Код:
if (temper[H]>10000) //если датчик выдаёт больше 1000 { temper[H]=~ temper[H]+1; //инвертируем sig = 1; // выбрасываем флаг того, что у нас минусовая температура }
В цикле проверка флага sig . если 1, то ставим минус в строке форматирования. В сумме - работает. Правда в момент перехода от плюса к минусу есть секундный "зависон".
_________________ Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
temper[H]=ds18b20_temperature(&ds18b20_rom_codes[H][0])*10; // специально умножил на 10 для вывода десятых частей if (temper[H]>10000) //если датчик выдаёт больше 1000*10 { temper[H]=40960-temper[H]; //отнимаем от данных 4096*10 temper[H]=-temper[H]; //и ставим знак "минус" }
Какая-то абсолютно ненужная магия чисел. Зачем? Датчик в первых двух байтах ROM уже выдаёт нормальное число (с точки зрения знака) для температуры: 16 * T.
Не нужна дробная часть - просто поделить готовое число на 16 и вывести на экран.
Нужна дробная часть - умножить готовое число на 5 (получим 80 * T) и поделить на 8 (получим 10 * T). Ну и выводим на экран, вставив точку перед последним знаком.
Здравствуйте, не знаю в правильную ли тему я пишу но попрошу Вас помочь, пытался найти решение в уже созданных темах но не нашел. Возникла проблема в работе программы cvavr 3.12, можете посмотреть в приложенной картинке. В краце: 2 месяца работал в этой программе, все хорошо шло, сделал перерыв на неделю, зашел и тут такие дела. Решил снести переустановить, тоже самое. Скачал поставил версию 3.10 ничего не поменялось. Подумал, что какие нибудь настройки остаются или другие программы конфликтуют, потому удалил весь комплекс программ avr, atmel, proteus и тд., почистил временные фалы, почистил реестр клинером, а потом ручками, но все тоже самое. Дополнительно к скрину скажу, что при старте программы подгружаеться весь интерфейс и затем просто сворачивается. Кто знает решение, у кого какие мысли подскажите.
Добавлено after 2 hours 4 minutes 12 seconds: Все проблема решена запуском десяток совтин по очистке ненужных файлов и реестра, какая точно помогла не известно.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 51
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения