ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
2 июня
161311
uwlu (11.07.2009 11:11, просмотров: 1946)
Сканирование АЦП на 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(); }