C18: вызываемая функция пропускается

Я был бы очень признателен, если бы ваши эксперты по использованию компилятора C18 могли указать мне, что я делаю неправильно. Чтобы познакомиться, я начал проект простого термометра: термистор NTC --> 18F2520 --> HD44780.

После отладки цепочки и написания кода для преобразования входного напряжения AN0, среднего диапазона 2,5 В = 10000 Ом, все было хорошо, включая необходимые процедуры для вывода TºC на ЖК-дисплей.

Вышеупомянутое было голым костяком, но работало хорошо, производя новый ЖК-дисплей TºC каждую секунду.

Следующим шагом было стать немного более изощренным,

В начале функции tcalc я поставил тест вне диапазона. Если, как я изначально решил, приложение будет измерять температуру воды. Тогда Rntc больше 28000 будет льдом (вне диапазона выше). На другом конце допустимых значений ‹1900 становится почти паром. Подпрограмма, которую я вызывал, чтобы выдать сообщение об ошибке, игнорировалась.

Вот код 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 как метку : и перейду к коду, то да, тест на выход за пределы диапазона не будет проигнорирован, и условие может быть обслужено.

Конечно, у уловки «goto» есть небольшая проблема. Показания за пределами диапазона означают, что через несколько секунд показания термистора должны быть снова считаны. означает еще один переход к tcalc. значит сам себя зовет. C18, похоже, это не нравится.

Я был бы очень рад, если бы какая-нибудь добрая душа хотя бы в общих чертах указала на ошибку моего кода.


c c18
person Fred Mah    schedule 20.03.2013    source источник


Ответы (1)


Чтобы вызвать функцию, вам нужно использовать круглые скобки и передать ей ее аргумент, и вы, вероятно, захотите продолжить это с возвратом:

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

Я вижу ряд других вызовов функций в вашей программе с отсутствующими скобками. Вам нужно будет исправить это тоже.

person Community    schedule 20.03.2013
comment
Обратите внимание, что Rntc_out принимает параметр. - person nneonneo; 20.03.2013