theBMV 0 29 сентября, 2015 Опубликовано 29 сентября, 2015 · Жалоба Добрый день. Имею PIC32MX150F128B и пытаюсь на нем запустить АЦП в режиме сканирования одного (пока одного) канала с автосэмплированием. Частота периферии 24 МГц. Tad = 83 нс (д. б. > 63 нс по даташиту). Ts = 166 нс (д. б. > 132 нс по даташиту). Мой код #include <xc.h> #include <sys/attribs.h> #include "peripheral/peripheral.h" void main() { PLIB_INT_MultiVectorSelect(INT_ID_0); PLIB_INT_Enable(INT_ID_0); // Fin = 48 MHz, Fp = 24 MHz PLIB_DEVCON_SystemUnlock(DEVCON_ID_0); PLIB_OSC_SysPLLMultiplierSelect(OSC_ID_0, 24); PLIB_OSC_SysPLLOutputDivisorSet(OSC_ID_0, OSC_SYSPLL_OUT_DIV_2); PLIB_OSC_PBClockDivisorSet(OSC_ID_0, OSC_PERIPHERAL_BUS_1, 2); PLIB_DEVCON_SystemLock(DEVCON_ID_0); // Порт на вход, аналоговый режим PLIB_PORTS_DirectionInputSet(PORTS_ID_0, PORT_CHANNEL_B, PORTS_BIT_POS_1); PLIB_PORTS_PinModePerPortSelect(PORTS_ID_0, PORT_CHANNEL_B, PORTS_BIT_POS_1, PORTS_PIN_MODE_ANALOG); // Вкл АЦП, автоматическое по 1 сэмплу на прерывание, сканирование 1 канала PLIB_ADC_Enable(ADC_ID_1); AD1CON3bits.ADCS = 0; // Tad = Tpb * 2 = 83 ns (> 65 ns) AD1CON3bits.SAMC = 2; // Ts = Tad * 2 = 166 ns (> 132 ns) PLIB_ADC_InputScanMaskAdd(ADC_ID_1, ADC_INPUT_SCAN_AN11); PLIB_ADC_ConversionStopSequenceEnable(ADC_ID_1); PLIB_ADC_ConversionTriggerSourceSelect(ADC_ID_1, ADC_CONVERSION_TRIGGER_INTERNAL_COUNT); PLIB_ADC_SamplesPerInterruptSelect(ADC_ID_1, ADC_1SAMPLE_PER_INTERRUPT); PLIB_ADC_MuxAInputScanEnable(ADC_ID_1); // Прерывание приоритет 5 подприоритет 2 PLIB_INT_VectorPrioritySet(INT_ID_0, INT_VECTOR_AD1, INT_PRIORITY_LEVEL5); PLIB_INT_VectorSubPrioritySet(INT_ID_0, INT_VECTOR_AD1, INT_SUBPRIORITY_LEVEL2); PLIB_INT_SourceEnable(INT_ID_0, INT_SOURCE_ADC_1); // Запуск PLIB_ADC_SampleAutoStartEnable(ADC_ID_1); while(1); } void __ISR(_ADC_VECTOR , IPL5SOFT) ADCInterruptServiceRoutine() { // Пустое чтение PLIB_ADC_ResultGetByIndex(ADC_ID_1, 0); Nop(); PLIB_INT_SourceFlagClear(INT_ID_0, INT_SOURCE_ADC_1); // Перезапуск PLIB_ADC_SampleAutoStartEnable(ADC_ID_1); } Проблема в следующем: когда код запущен в режиме отладки и я выставляю брейкпоинт на Nop(); в прерывании, а затем смотрю в регистр ADC1BUF0, то вижу значение, например, 14 (на ножке действительно есть какое-то напряжение). А когда по F5 запускаю программу от брейкпоинта до брейкпоинта, то получаю совсем другое значение 635. И обратно: стоит убрать брейкпоинт и запустить программу, а затем опять поставить, опять получаю 14. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться