angir (17.11.2005 19:47, просмотров: 3921)
Проблемы с скоростью АЦП у PIC16f676. ДД.
Столкнулся с следуйщей проблемой: не хватает скорости АЦП у pic. Исходно задача стоит следуйщим образом: есть прерывание по таймеру, срабатывает со скоростью 12000 раз в секунду. Надо используя прерывание в том числе запускать АЦП и получать с него данные.
Алгоритм работы с АЦП у меня следуйщий: при инициализации портов и т.д. задаю режим работы - от внутреннего опорника, 0-й канал. После чего при каждом прерывании выполняется следуйщий алгоритм: начало преобразования (adcon -> go), выход из прерывания. При следуйщем прерывании - контролируем бит go - если не сбросился, ждем следуйщего прерывания и по новой.... Так вот: если прерывание идет с частотой например 1000 раз в секунду - все отлично работает. А на 12000 раз в секунду - вылетает из ацп постоянный код, не зависящий от входного напряжения. Сам сигнал на входе - очень медленно меняющийся, снаружи стоят кондеры в 0.1 и 1 мкф. Бился и так и этак. Пробывал и такую схему: в 1-ом прерывании программирую АЦП, во втором - запускаю, далее контролирую состояние бита GO/~Done, пока не снимется и по новой. Получается таже балалайка. Временные параметры на зарядку внутреннего конденсатора в пике - соблюдены.... Может кто-нибудь что-нибудь подскажет????? 2-ой день сижу с этой проблемой. Я конечно понимаю, что она, возможно и пустяковая, но тем не менее...
Сама программа - на ассемблере... оргинал кода привести сейчас не могу - по памяти боюсь ошибиться примерно вот такая конструкция.Сам пик - 16f676....
start_irq
BTFSC ad_status,0
goto start_ad
movlw 0x41
movwf ADCON
BSF ad_status,0
goto next_irq
start_ad
BTFSC ad_status,1
goto wait_ad
BSF ADCON, GO
BSF ad_status,1
goto next_irq
wait_ad
BTFSC ADCON,GO
goto next_irq
MOVF adresh,w
movwf ad_result
CLRF ad_status
next_irq
retfie