Сканирование АЦП на PIC32 и передача данных на PC. Доброе время суток господа специалисты! Помогите разобраться в следующей проблеме (хочу сразу оговориться, что я из начинающих, так что и уровень вопросов будет соответсвующий). Я (учусь) программирую на PIC32 пока такие банальные вещи как АЦП, SPI и UART. Вообщем считываю со всех АЦП входов сенсорные данные и отправляю их через UART на комп. Простым поллингом всё получилось прекрасно. Следующим шагом хотел реализовать сканирование всех входов АЦП без DMA. Вроде всё просто и программка работает ...10 секунд, а потом передача данных обрывается. PIC пашет дальше, только без передачи данных. Думал, что может проблема в терминале, испробовал с другими подобными программами-тоже самое. Подскажите пожалуйста в чем проблема!
/*
read_all_sensors.c
*/
#include <p32xxxx.h>
#include <plib.h>
#pragma config POSCMOD=XT, FNOSC=PRIPLL
#pragma config FPLLIDIV=DIV_2, FPLLMUL=MUL_18, FPLLODIV=DIV_1
#pragma config FPBDIV=DIV_2, FWDTEN=OFF, CP=OFF, BWP=OFF
#define SYS_FREQ (72000000L)
#define BAUDRATE 19200
int main( void )
{
int pb_clock;
pb_clock = SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
//***** ADC Initialization
//get sure, that the A/D-Converter is closed
CloseADC10();
// AD1CON1 AD1CON1bits.ON=1; AD1CON1bits.FORM=0; AD1CON1bits.SSRC=7; AD1CON1bits.ASAM=1;
#define PARAM_AD1CON1 ADC_MODULE_ON | ADC_FORMAT_INTG | ADC_CLK_AUTO | ADC_AUTO_SAMPLING_ON
// AD1CON2 AD1CON2bits.VCFG=0; AD1CON2bits.OFFCAL=0; AD1CON2bits.CSCNA=1; AD1CON2bits.SMPI=15;
// AD1CON2bits.BUFM=0; AD1CON2bits.ALTS=0;
#define PARAM_AD1CON2 ADC_VREF_AVDD_AVSS | ADC_OFFSET_CAL_DISABLE | ADC_SCAN_ON | ADC_SAMPLES_PER_INT_16 | ADC_ALT_BUF_OFF | ADC_ALT_INPUT_OFF
// AD1CON3 AD1CON3bits.SAMC=31; AD1CON3bits.ADRC=0; AD1CON3bits.ADCS=18;
#define PARAM_AD1CON3 ADC_SAMPLE_TIME_31 | ADC_CONV_CLK_SYSTEM | ADC_CONV_CLK_19Tcy2
// AD1PCFG AD1PCFG=0xFFFF;
#define PARAM_AD1PCFG ENABLE_ALL_ANA
// AD1CSSL AD1CSSL=0x0000 for scanning-->explanation below
#define PARAM_AD1CSSL 0x0000 // because of AD1CSSL =~(configscan) (for more information see adc10.h)
// AD1CHS AD1CHSbits.CHONA=0;
#define PARAM_AD1CHS ADC_CH0_NEG_SAMPLEA_NVREF
// Settings for ADC-channels
SetChanADC10(PARAM_AD1CHS);
// Settings for ADC-Initialization
OpenADC10(PARAM_AD1CON1, PARAM_AD1CON2, PARAM_AD1CON3, PARAM_AD1PCFG, PARAM_AD1CSSL);
//***** UART Initialization
// U2MODE U2MODEbits.ON=1; U2MODEbits.PDSEL=0; U2MODEbits.STSEL=0; U2MODEbits.BRGH=1;
#define PARAM_U2MODE UART_EN | UART_NO_PAR_8BIT | UART_1STOPBIT | UART_BRGH_FOUR
// U2STA U2STAbits.UTXEN=1;
#define PARAM_U2STA UART_TX_ENABLE
// U2BRG
#define PARAM_BRG (pb_clock/(4*BAUDRATE))-1
OpenUART2(PARAM_U2MODE, PARAM_U2STA, PARAM_BRG);
// RF5 pin - TX-Output
TRISFbits.TRISF5 = 0;
//mAD1SetIntPriority( 3);// INTSetPriority(INT_AD1, 3);
//mAD1SetIntSubPriority( 1);//INTSetSubPriority(INT_AD1, 1);
//
//mAD1ClearIntFlag();//INTClearFlag(INT_AD1);
//mAD1IntEnable( 1);//INTEnable(INT_AD1, 1);
// Interrupt-Initialization
ConfigIntADC10(ADC_INT_PRI_3 | ADC_INT_SUB_PRI_1 | ADC_INT_ON);
EnableADC10();
INTEnableSystemMultiVectoredInt();
while(1);
}
// Interrup Service Routine
void __ISR(_ADC_VECTOR, ipl7) ADC_HANDLER( void)
{
int i;
int adc_result;
char buffer[5];
for (i = 0; i < 16; i++)
{
adc_result = ReadADC10(i);
sprintf(buffer, "%d", adc_result);
putsUART2((char*)buffer);
while ( BusyUART2() );
putcUART2(9);
while ( BusyUART2() );
}
mAD1ClearIntFlag();
}