如果你的專家使用C18編譯器可以給我一個關於我在做什麼錯誤的指針,我將不勝感激。爲了熟悉我開始了一個簡單的溫度計項目: - NTC熱敏電阻 - > 18F2520 - > HD44780。C18:被調用的函數被跳過
獲得鏈調試並生成代碼以轉換AN0輸入電壓後,2.5V中等範圍= 10000歐姆,包括所需的例程以將T℃加載到LCD上。
上面是光禿禿的骨頭,但很好地生成了每秒TºC的新LCD顯示。
下一步是成爲多一點sofhisticated,
在TCALC功能我把超出範圍測試的開始。如果正如我最初決定的那樣,應用程序將測量水溫。 然後Rntc大於28000會是冰,(超出上述範圍) 在有效值的另一端< 1900幾乎變得蒸蒸日上。 我打電話給一個錯誤消息的例程被igmored。
這裏是TCALC代碼改變RNTC成溫度TºC
/**************************************************
Start tcalc
***************************************************/
void tcalc(unsigned char value) // does Rntc to T maths
{
// start read AN0 for ADRESH ADRESL
ADCON0 = 0x03;
while( ADCON0 == 0x03);// loop A/D 11 bits
// notes at end explain 11bit convert in 5 us
Delay10TCYx(20); // +20us saftey margin
ADRESH =0x02; //Dummy we use 512 as test value
ADRESL =0x00;// Dummy 0x200 = d512
Vin= ADRESH*256+ADRESL;
Rntc = (1024.0*Rref)/Vin -Rref;
// Rntc = 29000;//DUMMY test 2hi
/***********************************************
Rntc MUST be valid (in range) test above/below
***********************************************/
if (Rntc>28000) // Rntc too high
{
Rntc_out; //jump to Show HIGH error message
}
dly1sec;
if (Rntc<1900) // Rntc too low
{
Rntc_out; //jump to Show LOW error message
}
/***********************************************
Pairing Rntc value, with T equation coefficients
***********************************************/
if (Rntc>14706) //case 1
{
a = 19.67,b = -1136.15, c = 27335.25 ;
goto Trange_1thru5 ;
}
if (Rntc>8310.8) //case 2
{
a = 9.228,b = -840.85, c =25236.82 ;
goto Trange_1thru5 ;
}
if (Rntc>4910.6) //case 3
{
a = 4.554,b =-567.886, c = 21246.2 ;
goto Trange_1thru5 ;
}
if (Rntc>3019.7) //case 4
{
a = 2.358,b = -373.486, c = 16941.29 ;
goto Trange_1thru5 ;
}
if (Rntc>1924.6) //case 5
{
a = 1.275,b = -245.047, c = 13131.885 ;
goto Trange_1thru5 ;
}
Trange_1thru5:
c= c-Rntc;
T = (-b - sqrt(-b*-b -4*a*c))/(2*a);
/* Quadratic T result chosen has to be lowest */
}
/******************************************************
END tcalc
*******************************************************/
調用的例程「Rntc_out」被如下
/*******************************************************
****** Start Rntc_outofrange ******
********************************************************/
void Rntc_out (unsigned char value)
{
lcdcmd(0x80);//move to top line of LCD
// RntcHL =Rntc;
if (Rntc<1900) //Rntc too low
{
lcddata('R');
lcddata('n');
lcddata('t');
lcddata('c');
lcddata(' ');
lcddata('t');
lcddata('o');
lcddata('o');
lcddata(' ');
lcddata('L');
lcddata('o');
lcddata('w');
lcdcmd(0xC0);//Bottom line of LCD
T = Rntc;
float_to_char;
dly1sec;
dly1sec;
dly1sec;
dly1sec;
dly1sec;// Rntc low on screen 5 seconds
}
if (Rntc>27500) // Rntc too high
{
lcddata('R');
lcddata('n');
lcddata('t');
lcddata('c');
lcddata(' ');
lcddata('t');
lcddata('o');
lcddata('o');
lcddata(' ');
lcddata('H');
lcddata('i');
lcddata('g');
lcddata('h');
lcdcmd(0xC0);//Bottom line of LCD
T = Rntc;
float_to_char;
dly1sec;
dly1sec;
dly1sec;
dly1sec;
dly1sec; // Rntc high on screen 5 seconds */
}
}
/*******************************************************
****** End Rntc_outofrange ******
********************************************************/
基本上我的問題爲超出範圍RNTC的測試時。 代碼被跳過,就好像它不在那裏一樣。
PS如果我將Rntc模塊的代碼作爲Label:並轉到代碼,那麼是超出範圍的測試不會被忽略,並且可以處理該條件。
當然,'goto'策略有一點問題。超出範圍讀數意味着幾秒鐘後,必須再次讀取熱敏電阻。意思是另一個轉到tcalc。 意思自稱。 C18似乎並不喜歡這樣。
如果某種靈魂可以指出我的代碼的錯誤至少在一般情況下,我會非常高興。
請注意'Rntc_out'接受一個參數。 – nneonneo 2013-03-20 00:14:26
@nneonneo:正式注意! – duskwuff 2013-03-20 00:20:40