Переключатель PIC16f877a не читается правильно

У меня проблема с переключателем при использовании функций UART. Я получаю данные и сохраняю их в eeprom. Я думаю, вызовите оператор переключения, чтобы увидеть, что было отправлено. Я прочитал eeprom, и информация верна, но я просто не могу прочитать правильную. Это всегда приходит как ошибка (случай по умолчанию). Я использую компилятор Hi-tech C.

unsigned char tempVal;
tempVal = eeprom_read(cmdByteAddr);
switch(tempVal){
    //Get temperature
    case 30:
        writeByte('T');
        break;
    //Get temp high
    case 31:
        writeByte('T');
        writeByte('H');
        break;
    //Get temp low
    case 32:
        writeByte('T');
        writeByte('L');
        break;
    //Get humidity
    case 41:
        writeByte('H');
        break;
    //Get humidity high
    case 42:
        writeByte('H');
        writeByte('H');
        break;
    //Get humidity low
    case 43:
        writeByte('H');
        writeByte('L');
        break;
    //Error
    default:
        writeByte('E');
        writeByte(eeprom_read(cmdByteAddr));
        break;
}

person user3107657    schedule 16.12.2013    source источник
comment
Таким образом, когда вы достигаете значения по умолчанию, вы снова выполняете (бессмысленное) считывание из EEPROM и печатаете результат после индикатора ошибки «E». Что печатается? Здесь слишком мало информации.   -  person unwind    schedule 16.12.2013


Ответы (1)


Значение, возвращенное из eeprom_read(), не является одним из ваших случаев. switch() работает правильно. Скорректируйте код, чтобы отображать более осмысленную ошибку, используя ту же переменную-переключатель, а не другой вызов eeprom_read().

default:
    writeByte('E');
    writeByte(tempVal);
    break;  // Not sure why you want `break` here.

Если вы по-прежнему получаете неудовлетворительные результаты, попробуйте unsigned tempVal. Иногда компилятор запутывается, хотя и не должен, на данных меньше int. Вам может понадобиться writeUnsigned(tempVal) или его эквивалент.

Вы также можете распечатать cmdByteAddr. Возможно, он находится за пределами диапазона EE.

person chux - Reinstate Monica    schedule 16.12.2013