Msgstr "В текущем P C 0x74e строки исходного кода не найдены." с двойным в MPLAB X - PullRequest
1 голос
/ 14 февраля 2020

Нужна помощь с простым расчетом на 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 открыто при отладке (закрыто.)

В чем может быть проблема? При необходимости выложу прагмы, карту памяти, ...

...