2013-03-20 95 views
0

如果你的专家使用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似乎并不喜欢这样。

如果某种灵魂可以指出我的代码的错误至少在一般情况下,我会非常高兴。

回答

1

要调用的函数,你需要使用括号并把它传递它的参数,你可能会想遵循了回报:

Rntc_out(Rntc); // I'm guessing this is the parameter you want? 
return; 

我看叫号等功能你的程序缺少括号。你也需要修复这些。

+0

请注意'Rntc_out'接受一个参数。 – nneonneo 2013-03-20 00:14:26

+0

@nneonneo:正式注意! – duskwuff 2013-03-20 00:20:40