Светодиод PIC18F26K83 не работает согласно отладчику

Я использую PIC18F26K83 и пытаюсь прочитать значение температуры. Я использую светодиод в качестве инструмента отладки. Однако ведет себя странно. У меня есть 2 массива 1 для сравнения значений АЦП, а другой - для определения температуры из массива значений АЦП. Вот упрощенный код, который должен работать:

int i;
  int k;
 int temperature;
 unsigned int temp_data;
 int temp_ADC_array[34]= { 259,293,332,377,428,487,555,632,720,821,934,1062,1203,1360,1531,1715,1910,2113,2320,2528,2731,2926,3108,3274,3422,3552,3663,3756,3833,3895,3945,3983,4013,4036};
 int temp_array[34]= {125,120,115,110,105,100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5,0,-5,-10,-15,-20,-25,-30,-35,-40 };


void main(){
//Set the pins of the MCU
TRISA.B2=0; //LED
LATA.B2=0;


while(1){

   temp_data=2000;

 for(i =0;i<34; i++){
  if(temp_data>temp_ADC_array[33-i]) {
  temperature = temp_array[33-i];
  break;}}

if(temperature>50){
led=1;}
else{
led=0;}

  delay_ms(5000);
}
}

В приведенном выше коде, поскольку temp_data равен 2000, температура цикла for должна быть 45. И в этом случае в отладчике он показывает 45. Это означает, что светодиод должен быть выключен, потому что температура меньше 50, а также в отладчике я вижу этот вывод светодиода всегда равен нулю. Однако, когда я пробую это с моей схемой, светодиод загорается. В других случаях, когда я тестирую светодиод, он работает хорошо. Где может быть проблема в цикле for? А может проблема в светодиоде? Заранее спасибо. Изменить: я также пробовал это с:

if(temperature<50){
led=1;}
else{
led=0;}

Таким образом, светодиод горит при температуре ‹50, а также при температуре >50? Как это возможно?

Обратите внимание, что я использую MicroC.

Изменить: это весь код, если кому интересно:

#include <stdint.h>
  int i;
  int k;
 int temperature;
 unsigned int temp_data;
 short transmit_data1;
 short transmit_data2;
 uint16_t data_transmit;
 int temp_ADC_array[34]= {  259,293,332,377,428,487,555,632,720,821,934,1062,1203,1360,1531,1715,1910,2113,2320,2528,2731,2926,3108,3274,3422,3552,3663,3756,3833,3895,3945,3983,4013,4036};
 int temp_array[34]= {125,120,115,110,105,100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5,0,-5,-10,-15,-20,-25,-30,-35,-40 };

#define led (LATA.B2)



void Clk_62kHz (){
  NOSC2_BIT =1;
  NOSC1_BIT=1;      //HFINTOSC
  NOSC0_BIT=0;
  FRQ3_BIT =0;
  FRQ2_BIT=0;         //1 MHz
  FRQ1_BIT=0;
  FRQ0_BIT=0;
  NDIV3_BIT =0;
  NDIV2_BIT=1;
  NDIV1_BIT=0;               //Divide 16 =62.5 kHz.
  NDIV0_BIT=0;

  }

void main(){
//Set the pins of the MCU
TRISA.B2=0; //LED
LATA.B2=0;
TRISA.B3=1; //Case Temp A
ANSELA.B3=1;
TRISC.B5=0; //SCLK
TRISC.B6=0; //CS
LATC.B6=1; //Deselect slave
TRISC.B7=0; //DIN
ANSELC.B5=0;
ANSELC.B6=0;
ANSELC.B7=0;
 temperature=0;
    Clk_62kHz();
   //  Clk_8Mhz()  ;
 //PPS Mapping
RC7PPS= 0b00011111 ; //DIN, RC7 = SDIPPS
RC6PPS= 0b00100000; //CS, RC6= SSPPS
RC5PPS= 0b00011110; //SCLK,  RC5=SCKPPS
  //transmit_data= 58112;

transmit_data1=0b11100011;
   //buradan assagisi while loopun icindeydi!!!!!
   LATC.B6=0; //Select the slave


  transmit_data2=0b01111111;





 LATC.B6=1; //deselect the slave && update the data

while(1)
{
    temp_data=2000;
    for(i =0;i<34; i++)
    {
        if (temp_data>temp_ADC_array[33-i])
        {
            temperature = temp_array[33-i];
            if (temperature>50)
            {
                led=1;
            }
            else
            {
                led=0;
            }
        } 
        }
        delay_ms(5000);
    }
}

c pic
person Günkut Ağabeyoğlu    schedule 05.08.2019    source источник
comment
В первом коде led всегда присваивается 0   -  person Giampietro Seu    schedule 05.08.2019
comment
Вы пробовали отладчик?   -  person Mike    schedule 05.08.2019
comment
Да, он входит в оператор if в цикле for, когда i=17 и делает температуру =45. Затем он переходит к части if (температура > 50) и оставляет светодиод выключенным. Как и должно быть, но светодиод в цепи загорается, когда я пытаюсь. Таким образом, отладчик и вывод GPIO не совпадают.   -  person Günkut Ağabeyoğlu    schedule 05.08.2019
comment
ANSEL зарегистрироваться в порядке?   -  person Mike    schedule 05.08.2019
comment
@Mike Ansel из LED Pin?   -  person Günkut Ağabeyoğlu    schedule 05.08.2019
comment
Да, вам пришлось переключить светодиодный пин на цифровой с помощью регистра ANSEL.   -  person Mike    schedule 06.08.2019


Ответы (2)


Основной цикл выглядит сумасшедшим... Попробуйте это

while(1)
{
    temp_data=2000;
    for(i =0;i<34; i++)
    {
        if (temp_data>temp_ADC_array[33-i]) 
        {
            temperature = temp_array[33-i];
            if (temperature>50)
            {
                led=1;
            }
            else
            {
                led=0;
            }
        }
        delay_ms(5000);
    } 
}

и надеюсь, вы определите led

person Mike    schedule 05.08.2019
comment
Задержка находится в пределах цикла поиска. - person Michaël Roy; 07.09.2019

Проверка внутри цикла неверна.

Ваш цикл из «всего кода», поскольку он отличается от «упрощенного» кода:

for(i =0;i<34; i++)
{
    if (temp_data > temp_ADC_array[33-i])   // since temp_ACD_array[0] = 259, 
                                            // this will trigger immediately.
    {
        temperature = temp_array[33-i];     // when you enter the test, 
                                            // temp_ADC_array[33-i] < temp_data
                                            // AND temp_ADC_array[33-(i + 1)] < temp_data
                                            // so temperature is wrong.
        if (temperature>50)
        {
            led=1;    // you turn the LED on, but keep on looping, eventually
                      // you may enter the 'else' part and turn the LED off. 
        }
        else
        {
            led=0;
        }
    } 
    delay_ms(5000);  // I suspect this should not be there, but outside
                     // the lookup loop.
}

Я знаю, что здесь я немного придирчив, но вот что делает с нами встроенное оборудование... Разве температура всегда не равна 125 - (5 * i)? Избавление от массива temp_array, вероятно, упростило бы анализ кода.

Кроме того, вы хотите, чтобы значение ì указывало, где чтение находится между temp_ADC_array[33-(i-1)] and temp_ADC_array[33-i]. Спуск вниз по массиву значений АЦП должен исправить это.

Вы также хотите, чтобы светодиод срабатывал один раз, поэтому действие по его включению/выключению должно быть вне цикла.

for (i = 33; i >= 0; --i)  // ADC values going down... stops when i==-1, or 
                          // value in array is less or equal to the reading.
{
     if (temp_ADC_array[i] <= temp_data)
         break;           // we're done getting the temperature index
}

temperature = 125 - (5 * i);  // compute the temp, range is +130° to -40°
                              // an alternative would be to indicate error if i == -1.

led = (temperature > 50); // turn the LED ON or OFF

delay_ms(5000);           // wait, or go on with the rest of the program...
person Michaël Roy    schedule 07.09.2019