Код
while(!ad7799_data_ready());
написать Код
Int7.Wait();
(это OS::TEventFlag - флаг события из ОС scmRTOS. В данном случае сигнал сообщения возникает из прерывания Int7.SignalISR(); ) , то вместо 0х800000 выводится 0хС00000, т.е. появляется "лишняя" единица в старшем предпоследнем разряде. Почему так происходит, - не пойму никак. Код
void ad7799_Init(void)
{
ad7799_reset();
delay_ms(500);
ad7799_init_status = ad7799_status();
// Enable external interrupt INT7
ENABLE_INT7; // Enable external interrupt INT7 falling edge
}
//============================================================
// Запуск непрерывного преобразования на AIN1
//______________________________________________________________________________
void start_Measure(void)
{
ad7799_write_config(1, 0, AD7799_32_GAIN, 1, 1, AD7799_AIN1_CHAN); //burnout, bipolar, gain, ref_det, buf, chan
ad7799_set_mode(AD7799_CONTINUOUS_CONVERSION_MODE, 0, AD7799_470_HZ+rate); //mode, psw=0(OFF), rate
while(!ad7799_data_ready());
ad7799_request_data(1); // 1 -> Continuous Read
PORTB &= ~(1<<DIN); // Held Low in Continuous-Read mode
}
/*** External interrupt handler ***/
#pragma vector=INT7_vect
OS_INTERRUPT void INT7_ISR()
{
OS::TISRW_SS ISRW;
// DISABLE_INT7; // Prevent further external interrupts
Int7.SignalISR();
}
//////////////////////////////////////////////
//-------------------------------------------------------------------------------
OS_PROCESS void TMeasure::Exec() //TProc2
{
for(;;)
{
for(unsigned char volatile i=0; i < nmax; i++)
{
//Int7.Wait(); // Ждем окончания преобразования АЦП (RDY => 0)
while(!ad7799_data_ready());
accumulator += ad7799_read_data(); // Накапливаем результат в аккумуляторе
}
m.data[mux] = accumulator/nmax; // Усреднение результата
accumulator=0;
//Int7.Wait(); // Ждем окончания преобразования АЦП (RDY => 0)
while(!ad7799_data_ready());
ad7799_request_data(0); // 0 -> Not Continuous Read
// Maintain multiplexing of input channels
if(++mux > 1) mux=0;
ad7799_write_config(1, 0, AD7799_32_GAIN, 1, 1, AD7799_AIN1_CHAN+mux); //burnout, bipolar, gain, ref_det, buf, chan
// ad7799_set_mode(AD7799_CONTINUOUS_CONVERSION_MODE, 0, AD7799_16_7_1_HZ); //mode, psw=0(OFF), rate
//Int7.Wait(); // Ждем окончания преобразования АЦП (RDY => 0)
while(!ad7799_data_ready());
ad7799_request_data(1); // 1 -> Continuous Read
PORTB &= ~(1<<DIN); // Held Low in Continuous-Read mode
if(!mux)
{
m.src = TValueADC::AD7799_SRC;
ValueMsg = m; // put the content to the OS::message object
ValueMsg.send(); // send the message
}
Sleep(100);
}
}
{
ad7799_reset();
delay_ms(500);
ad7799_init_status = ad7799_status();
// Enable external interrupt INT7
ENABLE_INT7; // Enable external interrupt INT7 falling edge
}
//============================================================
// Запуск непрерывного преобразования на AIN1
//______________________________________________________________________________
void start_Measure(void)
{
ad7799_write_config(1, 0, AD7799_32_GAIN, 1, 1, AD7799_AIN1_CHAN); //burnout, bipolar, gain, ref_det, buf, chan
ad7799_set_mode(AD7799_CONTINUOUS_CONVERSION_MODE, 0, AD7799_470_HZ+rate); //mode, psw=0(OFF), rate
while(!ad7799_data_ready());
ad7799_request_data(1); // 1 -> Continuous Read
PORTB &= ~(1<<DIN); // Held Low in Continuous-Read mode
}
/*** External interrupt handler ***/
#pragma vector=INT7_vect
OS_INTERRUPT void INT7_ISR()
{
OS::TISRW_SS ISRW;
// DISABLE_INT7; // Prevent further external interrupts
Int7.SignalISR();
}
//////////////////////////////////////////////
//-------------------------------------------------------------------------------
OS_PROCESS void TMeasure::Exec() //TProc2
{
for(;;)
{
for(unsigned char volatile i=0; i < nmax; i++)
{
//Int7.Wait(); // Ждем окончания преобразования АЦП (RDY => 0)
while(!ad7799_data_ready());
accumulator += ad7799_read_data(); // Накапливаем результат в аккумуляторе
}
m.data[mux] = accumulator/nmax; // Усреднение результата
accumulator=0;
//Int7.Wait(); // Ждем окончания преобразования АЦП (RDY => 0)
while(!ad7799_data_ready());
ad7799_request_data(0); // 0 -> Not Continuous Read
// Maintain multiplexing of input channels
if(++mux > 1) mux=0;
ad7799_write_config(1, 0, AD7799_32_GAIN, 1, 1, AD7799_AIN1_CHAN+mux); //burnout, bipolar, gain, ref_det, buf, chan
// ad7799_set_mode(AD7799_CONTINUOUS_CONVERSION_MODE, 0, AD7799_16_7_1_HZ); //mode, psw=0(OFF), rate
//Int7.Wait(); // Ждем окончания преобразования АЦП (RDY => 0)
while(!ad7799_data_ready());
ad7799_request_data(1); // 1 -> Continuous Read
PORTB &= ~(1<<DIN); // Held Low in Continuous-Read mode
if(!mux)
{
m.src = TValueADC::AD7799_SRC;
ValueMsg = m; // put the content to the OS::message object
ValueMsg.send(); // send the message
}
Sleep(100);
}
}
Это делается для того, чтобы не тратить время процессора на опрос бита RDY. Во время Int7.Wait(); ОС передает управление другим процессам. Но почему-то вылазит лишняя единица.
Какие будут предположения по этому поводу?