1. при чтении температуры из датчика вы обязаны считывать 8 байт + CRC, среди которых только первые 2 будут значением температуры, а остальные - всякие внутренние регистры. так вот, регистры датчиков разные для разных семейств, в частности, есть биты, которые всегда установлены в 1 и по ним можно отличить семейства - читайте даташиты. то есть переделки вашей программы должны быть минимальными.
2. листинг не смотрел, ответить не могу - подождите кого-либо, кто на это решится.
3. запустите первое преобразование до входа в главный цикл и дождитесь, пока преобразование кончится. в этом случае ваш главный цикл отработает уже с корректными показаниями температуры.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
//гланый цикл
volatile uint16_t Data;
int main (void)
{
UartInit ();
while(1){
_delay_ms (500);
uint8_t *pointer = (uint8_t*) 0x70;
*pointer = 0x11;
*(pointer+1) = 0xff;
Data = *pointer;
Data |= (*(pointer+1) << 8);
UartTransmitHexInt (Data);
UartTransmitSymb (0x0D);
}
}
В и тоге в Data должно получится 0xFF11... а у меня получается 0x0011...
Толи прот моросит... толи на сам деле такой результат будет (значит AVRST моросит)... ну или как обычно я мороСЮ...
volatile uint16_t Data;
int main (void)
{
UartInit ();
while(1){
_delay_ms (500);
uint8_t *pointer = (uint8_t*) 0x70;
*pointer = 0x11;
*(pointer+1) = 0xff;
Data = *pointer;
Data |= (((uint16_t)*(pointer+1)) << 8);
UartTransmitHexInt (Data);
UartTransmitSymb (0x0D);
}
}
Хе... если выключаю оптимизацию, то все ОК... но размер становиться в 10 раз больше!!!
Кста... при выключенной оптимизации и без приведения к 16-ти разрядам - дает нормальный результат...
Siarzhuk писал(а):Либо сдвиньте Data перед OR-еньем его со вторым байтом (условия задачи чисто умозрительны - так что сменой последовательности байтов в результате, полагаю, можно пренебречь
Первая строчка - без вопросов, Data присваивается 0x11.
А во второй строчке *(pointer+1) - восьмибитное число, сдвинув которое 8 раз влево, Вы получаете 0. Вот и итоговое число не меняется. Результат и должен быть 0x0011.
Вот если эта строчка записывалась как-то так:
WiseLord писал(а):А во второй строчке *(pointer+1) - восьмибитное число, сдвинув которое 8 раз влево, Вы получаете 0. Вот и итоговое число не меняется. Результат и должен быть 0x0011.
На сам деле, как я понял не совсем так...
Дело в том, что если слева от "=" стоит 16-ти разрядная переменная, то справа, выражения автоматически приводятся к 16-ти разрядам...
Так что в данном случае приведение справа к 16-ти разрядам - необязательно...
WiseLord писал(а):Вот если эта строчка записывалась как-то так:
В общем, как я понял, не стоит сдвигать результат чтения по указателю... т.к. компилятор это иногда решает не верно...
Лучше сначала прочитать в переменную старшее значение, потом переменную сдвинуть, а потом добавить младшее значение...
В итоге я так и сделал...
shads писал(а):На сам деле, как я понял не совсем так...
Дело в том, что если слева от "=" стоит 16-ти разрядная переменная, то справа, выражения автоматически приводятся к 16-ти разрядам...
Так что в данном случае приведение справа к 16-ти разрядам - необязательно...
Неявное преобразование в данном случае возможно либо при присваивании - когда уже поздно, либо promote to int в арифметической операции справа - которой там вроде как и не наблюдается (а есть побитовая).
В любом случае наблюдаемая катастрофическая разница на выходе оптимизированного и неоптимизированного вариантов лишает дискуссию о стандартности того или иного решения всякой почвы кроме эмпирического "так не ходи", да.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR!
при первом запуске проверяю содержимое епрома, если оно больше-меньше нужного интервала - записываю туда начальное значение 0xF424. Дальше захожу в "настройки", изменяю это значение например на 0xF420, считываю программатором епром - вижу там число 0xF420. Т.е. константа изменилась и записалась.
Дальше самое интересное, перезапускаю устройство, в епром записывается начальное значение 0xF424, хотя там уже лежало число 0xF420
calibrate=calibrate_eeprom;
if (0xF618<calibrate<0xF230) {
calibrate=0xF424;
calibrate_eeprom=calibrate;
};