подскажите пожалуйста, должна ли переменная находящаяся в еепром, которой присваивается значение во время определения, после перезагрузки контроллера сохранять свое "старое" значение?
по логике вроде как не должна, а на практике, после перезагрузки остаётся прошлое значение.
тогда почему при первом включении после прошивки в переменной нужное значение? ведь после прошивки происходит обычный старт контроллера, точно такой же как и при замыкании вывода ресет на землю.......
по идеи, каждый старт должен записывать в переменную str значение 0
Код:
eeprom unsigned char str=0;
а вот если при объявлении переменной ей ничего не присваивать, тогда и должно сохраняться "старое" значение. а если старого не было(при первом включении) то в переменной должен быть всякий мусор.
Говорит компилятору о необходимости создать *.eep файл и залить его в МК при прошивке. Если программа в процессе своей работы изменит значение переменной, то при следующем старте значение на 0 не сбросится.
_________________ — Не говорите мне что делать и я не скажу куда Вам идти...
Сделав так получил только полурезультат , то есть выводился результат на экран от 0 до 1023. С моими измениями стало правильно инвертировано , но диапазон показаний уменьшился от 146 до 0
Карма: 67
Рейтинг сообщений: 1066
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19953 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
AVT-28 писал(а):
Изучаю mikroC чем можно заменить itoa и utoa ?
sprintf ?
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
void ow_reset(void) { bit presence; DQ = 0; //pull DQ line low DelayUS(640); // leave it low for 480us DQ = 1; // allow line to return high DelayUS(94); // wait for presence presence = DQ; // get presence signal DelayUS(501); // wait for end of timeslot
} // 0=presence, 1 = no part
Так вот пытаюсь компилировать - выдает ошибку С193 в этом месте (if (ow_reset() == 0)).
Так же пытался сделать как написано было в примере к 1-wire. Но тут возник другой вопрос.
Код:
unsigned char ow_reset(void) { unsigned char presence; DQ = 0; //pull DQ line low delay(29); // leave it low for 480us DQ = 1; // allow line to return high delay(3); // wait for presence presence = DQ; // get presence signal delay(25); // wait for end of timeslot return(presence); // presence signal returned } // 0=presence, 1 = no part
Вот эта функция. Как мне правильно ее объявить и потом вызвать для сравнения if (ow_reset() == 0) ? А то я много вариантов перепробовал и пока не очень получилось. Разве что только глобальную переменную использовать.
bool TReset(void) { char si; Port_OWP1_0; //OWP <- 0 Delay_us(500); //delay 500 uS si = __save_interrupt(); __disable_interrupt(); //запрещение прерываний Port_OWP1_Z; //OWP <- 1 Delay_us(14); //delay 14 uS if(Pin_OWP1) //если OWP = 0, то ошибка { Delay_us(52); //delay 52 uS if(!Pin_OWP1) //если OWP = 1, то ошибка { __restore_interrupt(si); //восстанавление прерываний Delay_us(250); //delay 250 uS if(Pin_OWP1) //если OWP = 0, то ошибка { return(1); //если ошибок нет, термометр присутствует } } } __restore_interrupt(si); //восстанавление прерываний в случае ошибки return(0); }
//---------- Запись/чтение байта по однопроводной шине: ----------
char TByte(char dat) { char res; for(char i = 0; i < 8; i++) { res = res >> 1; if(TBit(dat & 1)) res |= 0x80; else res &= ~0x80; dat = dat >> 1; } return(res); }
//---------- Запись/чтение бита по однопроводной шине: ----------
bool TBit(bool b) { char si; si = __save_interrupt(); __disable_interrupt(); //запрещение прерываний Port_OWP1_0; //OWP <- 0 Delay_us(2); //delay 2 uS if(b) Port_OWP1_Z; //bit = 1, OWP <- 1 Delay_us(13); //delay 13 uS bool owp = Pin_OWP1; //чтение порта Delay_us(45); //delay 45 uS Port_OWP1_Z; //OWP <- 1 __restore_interrupt(si); //восстанавление прерываний Delay_us(2); //delay 2 uS return(owp); }
sprintf(chTEMP, "%f", read_temp()); // якобы преобразую float в *char write_1(0, chTEMP); // отображение температуры на первой строке write_2(0, FLAG); //так сказать проверочный флаг на второй строке (вроде как работает)
}
Значение FLAG отображается на экране, а температура нет. Возможно вся беда в sprintf, а точнее в том что я не шарю в Cи. Подскажите, пожалуйста, как можно решить проблему.
На всякий случай функция отображение информации на ЛСД.
сделал еще так проверить (везде использовали именно этот метод). так вообще ничего не отобразилось на экране LCD. даже "TEST". если закомментировать все кроме write_2(5, "TEST"); то слово тест отображается. а так вообще пустой экран.. что то даже не знаю что делать
сделал еще так проверить (везде использовали именно этот метод). так вообще ничего не отобразилось на экране LCD. даже "TEST". если закомментировать все кроме write_2(5, "TEST"); то слово тест отображается. а так вообще пустой экран.. что то даже не знаю что делать
я, конечно, не все подряд прочел и могу что-то пропустить... но что конкретно в приведенном участке кода вы творите? это же беспредел какой-то! char *chte - это у вас что такое? УКАЗАТЕЛЬ. на что он указывает? а хрен его знает! и именно туда (в_хрен_его_знает_куда) вы пишите функцией (кстати, какой функцией - printf?!)...
короче, надо делать так: 1. объявляете массив символов для хранения промежуточных строк char str[25]; // размер массива должен быть на 1 символ больше, чем самая длинная строка 2. пишите в этот массив свои значения sprintf(str,"%i", 123); 3. выводите сформированную строку на дисплей write_1(1, str);
и никакой самодеятельности!
_________________ битва с дураками проиграна, победители торжествуют. слава победителям!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения