Вроде разобрался как сделать. Не знаю правильно или нет, но работает. В файле bmp180.c сделал изменения. Калибровочная величина записывается в 0x19 байт eeprom. Можно уходить в обе стороны. Выкладываю код. Может кому пригодится и автор покритикует...
1. Лучше в eeprom.h добавить макрос, по аналогии с другими ячейками. 2. Коррекцию проводить не в драйвере bmp180, а непосредственно при выводе на экран. Т.е., в функции loadTempString(), там где вызывается bmp180GetPressure(). 3. К коррекции лучше добавить +1. Тогда значение ячейки eeprom по умолчанию (0xFF = -1) будет как бы нулём и не будет влиять на показания.
Спасибо за критику. По поводу eeprom.h сразу хотел так сделать. Но не смог реализовать, так как не хватает знаний и опыта в программировании. Потихоньку изучаю... Добавил в eeprom.h строку #define EEPROM_BMP180CORR 0x19. Теперь разбираюсь как извлечь для подстановки сюда -> eeprom_read_byte((uint8_t*)0x19);
Чудеса раньше так делал и не получалось, а теперь после подсказки все собралось. Наверное допустил синтаксическую ошибку. Спасибо, WiseLord, за подсказку!
А можно еще вопрос? Хочу изменить ширину пробела до 2-х символов (0x00, 0x00, VOID, VOID, VOID). Но во всех настройках портится первый символ и бегущая строка раньше обрывается. Не подскажете где копать?
При выводе цифр есть фишка - все они должны быть одной ширины, такой же как и пробел - чтобы было проще реализовать разного рода мигания и скроллинги. Поэтому простым способом, наверное, не получится сделать.
Хотя можете попробовать.
В коде есть несколько вызовов типа mkNumberString(value, 2, ' '). Это формирование строчки из некоторого числа value. двойка - это ширина (в символах) на выходе, ' ' - это пробел, которым будут заполнены нулевые символы в начале. То есть, для числа 34 сформируется строка "34", а для числа 2 - строка " 2". А если вызывать как mkNumberString(value, 2, '0') - то соотвестсвенно сформировались бы "23" и "02".
В общем, идея следующая. Найти по коду эти вызовы, там где они вызываются с пробелом. Вместо пробела подставить другой символ, например 0xBE. Сейчас он не используется (в font-cp1251-08.c), и там идёт сплошная заливка знакоместа, если вдруг такой символ встретится.
Нужно отрисовать этот символ в пробел (0x00, 0x00, 0x00, 0x00, VOID), и вызывать теперь mkNumberString(value, 2, 0xBE); Тогда все статичные цифры будут отображаться как раньше, без сдвигов. А уже основной пробел можно обрезать до двух-трёх пикселов.
Или взять не 0xBE, а какой-нибудь другой символ, из таблицы CP1251, наименее нужный (типа 0xAC).
В общем, идея следующая. Найти по коду эти вызовы, там где они вызываются с пробелом. Вместо пробела подставить другой символ, например 0xBE. Сейчас он не используется (в font-cp1251-08.c), и там идёт сплошная заливка знакоместа, если вдруг такой символ встретится.
Нужно отрисовать этот символ в пробел (0x00, 0x00, 0x00, 0x00, VOID), и вызывать теперь mkNumberString(value, 2, 0xBE); Тогда все статичные цифры будут отображаться как раньше, без сдвигов. А уже основной пробел можно обрезать до двух-трёх пикселов.
Сделал все следуя Вашим разъяснениям. Считаю, получилось Но немного по-другому... Вместо пробела и в коде (там где он используется), и в надписях использовал символ "]" 0x5D. Так проще писать когда нужно в редакторе eeprom использовать "короткий пробел". Благодарю!
Нужно извлечь последовательность из n-го количества байт. Задаю начальный адрес(start), буфер промежуточного хранения(buff[]) и длину последовательности(bytes).
Пока написал только температуру и давление. Сначала не мог понять почему не инициализировался датчик. Потом посмотрел как сделано чтение в rtc.c и поменял местами команды I2C_ACK, I2C_NOACK. Заработало. Формула расчета очень громоздкая. А если ее привести требуемым значениям, то вовсе не влазит в 8kb.
bme280.cСпойлер
Код:
#include <string.h> #include <util/delay.h>
#include "bme280.h" #include "i2csw.h"
static int16_t temperature = 0; static int16_t pressure = 0;
// read the raw ADC data from the I2C registers bme280ReadMem(BME280_ADC_DATA_START, data, BME280_ADC_RAWDATA_BYTES); pres_raw = bme280_20bit_reg(data[0], data[1], data[2]); temp_raw = bme280_20bit_reg(data[3], data[4], data[5]);
Сейчас этот форум просматривают: zmey71 и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения