Я использую 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);
}
}
led
всегда присваивается 0 - person Giampietro Seu   schedule 05.08.2019