программирование датчиков на PIC16F15323 два входа АЦП работают нормально по отдельности, но вместе входные данные меняют выходные данные

#c #sensors #mplab #adc

#c #датчики #mplab #АЦП

Вопрос:

я программирую датчики на PIC16F15323-I / P до сих пор я добавил два датчика (датчик уровня воды, датчик напряжения) проблема в том, что когда я добавляю второй датчик, он переключается между входами, датчик уровня воды принимает выходной сигнал для датчика напряжения, а датчик напряжения принимает выходной сигнал уровня водыдатчик я удалил один датчик из кода в то время, когда выходные данные хороши для них обоих, но вместе — нет. я не понимаю, в чем проблема моего кода, если кто-нибудь может мне помочь, пожалуйста

это код

 #include "Config.h"
  int result=0;
  int result1=0;
void pins ()
{
   TRISC2 = 1;// set RC as voltage sesnor input 
   TRISC5 = 0;// Green LED
   TRISA0 = 0;//relay output 
   TRISC1 = 0;// water level sensor led 
   TRISA1 = 1;//water level sensor input 
}


 void voltage_sensor ()
{
int result1=0;

// Select convertion clock 16Mhz = 101
    
    ADCON1bits.ADCS0=1;
    ADCON1bits.ADCS1=0;
    ADCON1bits.ADCS2=1;
    
             // to store data ( analog channel)
    
    ADCON0bits.CHS0=0; // store the address for analog pin RC2 voltage sensor
    ADCON0bits.CHS1=1;
    ADCON0bits.CHS2=0;
    ADCON0bits.CHS3=0;
    ADCON0bits.CHS4=1;
    ADCON0bits.CHS5=0;  
       
            // result of input 
    
     ADCON1bits.ADFM=1; 
     
    
             //port configuration
    
    ADCON1bits.ADPREF0=0;
    ADCON1bits.ADPREF1=0;
      
             //set statues bit
    ADCON0bits.GOnDONE=1;//start the conversion 
      
            //switch on ADC
      
    ADCON0bits.ADON =1;// turn on the ADC 
              
    ADCON0bits.GOnDONE==1;// start the conversion 
    
    result1=((ADRESH<<8) ADRESL);// to turn on all the 10 ADC 
           if (result1<800)
               
        {
           PORTC = 0b100000;  // PORTC1 green light 
           PORTA = 0b000000;//PORTA0 relay 
               
        }
        
        else
        {__delay_ms(10000);
           PORTC = 0b000000;
           PORTA = 0b000001;
        }
     
            }

    void watersensor ()
{
    int result=0;

// Select convertion clock 16Mhz = 101
    
    ADCON1bits.ADCS0=1;
    ADCON1bits.ADCS1=0;
    ADCON1bits.ADCS2=1;
    
             // to store data ( analog channel)
    
    ADCON0bits.CHS0=1; 
    ADCON0bits.CHS1=0;
    ADCON0bits.CHS2=0;
    ADCON0bits.CHS3=0;
    ADCON0bits.CHS4=0;
    ADCON0bits.CHS5=0; // store the address for analog pin RA1 
  
   
            // result of input 
    
     ADCON1bits.ADFM=1; 
   
             //port configuration
    
      ADCON1bits.ADPREF0=0;
      ADCON1bits.ADPREF1=0;
      
             //set statues bit
      ADCON0bits.GOnDONE=1;//start the conversion 
      
            //switch on ADC
      
      ADCON0bits.ADON =1;// turn on the ADC 
              
   ADCON0bits.GOnDONE==1;// start the conversion 
   result=((ADRESH<<8) ADRESL);// to turn on all the 10 ADC 
      if (result>550)
        {
            PORTC = 0b000010;  // PORTC1 
          
        }
        else 
        {
            PORTC = 0b000000; 
        }
        }

void main() 
{

    pins();
    while(1)
    {
  
        __delay_ms(1);
        {
            voltage_sensor(result1);
            result1=0;
        }
         __delay_ms(1);
        {   
            watersensor(result);
            result=0;
    }
}
}
  

Комментарии:

1. Вероятно, было бы полезно, если бы вы сначала узнали немного больше о кодировании на языке C. Есть некоторые вещи, которые я не понимаю: почему вы вызываете функции *sensor с аргументами, когда они объявлены без каких-либо? И почему вы определяете result переменные глобально, а также локально внутри функций?

2. я знал об этих

3. я не думаю, что вы отвечаете на мой вопрос, подумал

4. поможет ли изменение аргумента?

5. Я не знаю, решит ли это вашу проблему, но если вы очистите свой код, выполните правильное форматирование (отступ), используйте вызовы функций и переменные так, как они должны использоваться, и попытайтесь устранить избыточные части кода, тогда было бы намного проще помочь вам с вашим кодом. Я задал эти вопросы, потому что я не понимаю, что вы делаете в своем коде, и поэтому не могу вам помочь. Также, вероятно, есть опечатка ADCON0bits.GOnDONE == 1; — сравнение без какой-либо причины… вероятно, это должен быть просто знак равенства.

Ответ №1:

На самом деле очень сложно отлаживать ваш код, и я не могу предвидеть, что вы действительно пытаетесь сделать со своим кодом

проблема в том, что когда я добавляю второй датчик, он переключается между входами, датчик уровня воды принимает выходной сигнал для датчика напряжения, а датчик напряжения принимает выходной сигнал датчика уровня воды

Что вы подразумеваете под «принимает выходные данные»? Что вы подразумеваете под «переключением между входами»?

Кроме этого, я не совсем понимаю, что вы пытаетесь сделать, и спрашиваю, у меня есть один маленький снимок в синем:

Возможно исправление

Попробуйте изменить ваши назначения PORTC таким образом (не перезаписывая предыдущее состояние)

Также проверьте, действительно ли PORTC (и другие ПОРТЫ) имеют ширину всего 6 бит! Если они этого не делают, вам может потребоваться соответствующим образом изменить свои назначения.

 /* ... */

void voltage_sensor() {

  /* ... your code */

  if (result1 < 800)

  {
    PORTC = PORTC | 0b100000; // PORTC1 green light
    PORTA = 0b000000; // PORTA0 relay

  }

  else {
    __delay_ms(10000);
    PORTC = PORTC amp; 0b011111;
    PORTA = 0b000001;
  }
}

void watersensor() {

  /* ... your code */

  if (result > 550) {
    PORTC = PORTC | 0b000010; // PORTC1

  } else {
    PORTC = PORTC amp; 0b111101;
  }
}

/* ... */

  

Комментарии:

1. например, я подключаю датчик уровня воды к желтому свету, а датчик напряжения — к зеленому свету и реле, но когда я его компилирую, датчик уровня воды принимает зеленый свет, а реле и датчик напряжения принимают желтый светодиод, что не имеет смысла, это то, что я подразумеваю под заменой