Нужна помощь с простым расчетом на PIC24FJ128GB204. Используя MPLAB X 5.2, компилятор XC16, ICD4.
У меня есть датчик, который возвращает данные в 6 байтов: [temp MSB] [temp LSB] [CRC] [влажность MSB] [влажностьLSB] [crc]
Формула для температуры (R C = необработанный счет): T (градус C) = -45 + 175 * (RC / (2 ^ 16-1)) Как часто бывает, у меня было он работал правильно, но как-то изменил что-то и не может найти проблему.
Моя функция:
int8_t SHT31_ConvertData( uint8_t MeasurementData[],
int16_t * TempResult,
uint8_t * RHResult){
// converts data from raw counts to temp (deg C) and RH (%)
// __attribute__((aligned(2))) double TempCelcius = 0;
double TempCelcius = 0;
uint16_t TempRaw,RHRaw = {0};
double RH = 0;
// combine both bytes to get raw temperature value
TempRaw = (MeasurementData[0] << 8);
TempRaw += MeasurementData[1];
TempCelcius = TempRaw;
TempCelcius /= 0xFFFF;
TempCelcius *= 175;
TempCelcius -= 45;
TempCelcius *= 100;
*TempResult = (int)TempCelcius;
// combine both bytes to get raw relative humidity value
RHRaw = (MeasurementData[3] << 8);
RHRaw += MeasurementData[4];
RH = RHRaw;
RH /= 0xFFFF;
RH *= 100;
*RHResult = RH;
return 1;
}
Во время отладки у меня иногда (скажем, 50% времени) возникают проблемы с вычислениями чаще всего в строках TempCelcius = TempRaw;
или TempCelcius /= 0xFFFF;
.
Консоль отладчика будет иметь такие строки, как "Строки исходного кода не найдены при текущем P C 0x74e. Открыть представление памяти программы чтобы увидеть разбор кода инструкции. " Инструкция для этого адреса в памяти программы будет (например) ADD W8, W8, W8
. В этой ячейке памяти всегда будет команда.
У меня пока недостаточно информации, чтобы решить эту проблему самостоятельно, поэтому я нашел следующие возможные причины:
- Vcap with слишком высокое ESR (проверено)
- WDT включено (проверено, HW также отключено в прагмах)
- необработанное прерывание (добавлено _DefaultInterrupt с проверкой точки останова)
- Доступ к слову или длинному по нечетному адресу (таким образом, исключение ошибки адреса) (на самом деле это не совсем понятно. Попытка
__attribute__((aligned(2))) double TempCelcius = 0;
в надежде на выравнивание.) - Деление на 0 (думаю, дело не в этом)
- Плохо инициализированные указатели (учитывая мое мастерство в C, это может иметь место, но я не использую указатели в этой части кода)
- Окно SFR открыто при отладке (закрыто.)
В чем может быть проблема? При необходимости выложу прагмы, карту памяти, ...