Re: Вопросы по С/С++ (СИ)
Добавлено: Вт окт 18, 2011 22:31:59
delete
тогда почему при первом включении после прошивки в переменной нужное значение? ведь после прошивки происходит обычный старт контроллера, точно такой же как и при замыкании вывода ресет на землю.......md5sum писал(а):По логике как-раз должна! Иначе накой eeprom?
Код: Выделить всё
eeprom unsigned char str=0;Код: Выделить всё
eeprom unsigned char str;Говорит компилятору о необходимости создать *.eep файл и залить его в МК при прошивке.O-LED писал(а):Код: Выделить всё
eeprom unsigned char str=0;
Код: Выделить всё
eeprom unsigned char str=0;Код: Выделить всё
eeprom unsigned char str;Код: Выделить всё
U_izm = 0;
}
else
{
U_izm += read_adc(1); //Вольтметр
U_izm = 1023 - U_izm ; //инвертирование
U_izm = U_izm ;
} sprintf ?AVT-28 писал(а):Изучаю mikroC чем можно заменить itoa и utoa ?
Код: Выделить всё
void ow_reset(void);
void main (void)
{
while(1)
{
if (ow_reset() == 0)
{
write_1(1 , "good");
}
else
{
write_2(1 , "bad");
}
}
}
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
Код: Выделить всё
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
Код: Выделить всё
//--------------------- Генерация импульса сброса: ---------------------------
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);
}
Код: Выделить всё
float read_temp(void)
{
unsigned char get[10];
unsigned char temp1, temp2, temp5;
float temp3, temp4;
int k;
ow_reset();
write_byte(0xCC);
write_byte(0xBE);
DelayUS(139);
ow_reset();
write_byte(0xCC);
write_byte(0x44);
for (k=0;k<9;k++){get[k]=read_byte();} // получаю 9 байт
temp1 = get[1]; //байт знака
temp2 = get[0]; //байт значения температуры
if (temp1 <= 0x80)
{
temp3 = temp2;
temp4 = temp3*0,5;
FLAG = "plus"; //это для дополнительной проверки. на ЛСД отображается верно.
}
else
{
temp5 = ~temp2+0x01; //инвертирую и прибавляю 1
temp3 = temp5;
temp4 = temp3*(-0,5); //добавляю знак
FLAG = "minus";
}
return(temp4); //функция возвращает значение во float
}
Код: Выделить всё
void main (void)
{
while (1)
{
////////////////////////////////////////////
//Переменные объявлены как: //////
//const char *chTEMP; //
//const char *FLAG; //
/////////////////////////////////////////
sprintf(chTEMP, "%f", read_temp()); // якобы преобразую float в *char
write_1(0, chTEMP); // отображение температуры на первой строке
write_2(0, FLAG); //так сказать проверочный флаг на второй строке (вроде как работает)
}
Код: Выделить всё
void write_1(unsigned char pos, const char *a)
{
lcd_CMD(0x80 + pos); // 1000 0000
while (*a)
{
lcd_write(*a++);
}
}
Код: Выделить всё
void main(void)
{
lcd_init();
while(1)
{
float chb;
const char *chte;
chb = -44,5;
printf(chte,"TEMP: %.1f ", chb);
write_1(5, chte);
write_2(5, "TEST");
}
}
я, конечно, не все подряд прочел и могу что-то пропустить... но что конкретно в приведенном участке кода вы творите? это же беспредел какой-то! char *chte - это у вас что такое? УКАЗАТЕЛЬ. на что он указывает? а хрен его знает! и именно туда (в_хрен_его_знает_куда) вы пишите функцией (кстати, какой функцией - printf?!)...Vlad0o писал(а):сделал еще так проверить (везде использовали именно этот метод). так вообще ничего не отобразилось на экране LCD. даже "TEST". если закомментировать все кроме write_2(5, "TEST"); то слово тест отображается. а так вообще пустой экран.. что то даже не знаю что делатьКод: Выделить всё
void main(void) { lcd_init(); while(1) { float chb; const char *chte; chb = -44,5; printf(chte,"TEMP: %.1f ", chb); write_1(5, chte); write_2(5, "TEST"); } }
Будет глючить. С запретом прерываний там проблема не решена вообще никак.Vlad0o писал(а):Кстати, вот тут http://www.sicklinger.com/en/atmel-avr- ... -in-c.html если кому то нужно будет по работе с DS1820