#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. например, я подключаю датчик уровня воды к желтому свету, а датчик напряжения — к зеленому свету и реле, но когда я его компилирую, датчик уровня воды принимает зеленый свет, а реле и датчик напряжения принимают желтый светодиод, что не имеет смысла, это то, что я подразумеваю под заменой