angir 0 17 ноября, 2005 Опубликовано 17 ноября, 2005 (изменено) · Жалоба ДД. Столкнулся с следуйщей проблемой: не хватает скорости АЦП у 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 Изменено 17 ноября, 2005 пользователем angir Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
greg 0 18 ноября, 2005 Опубликовано 18 ноября, 2005 · Жалоба Да в общем то никогда вопросов не было, привожу фрагменты кода, который работает и позволяет обновлять данные с частотой больше 12000 раз в секунду (зависит от программы интерпретации результатов иззмерения Сode_Сompare). Код приведён для Pic12f675 (тактовая частота 4 MHz). Fragment.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
upc2 0 18 ноября, 2005 Опубликовано 18 ноября, 2005 · Жалоба << После чего при каждом прерывании выполняется следуйщий алгоритм: начало преобразования (adcon -> go), выход из прерывания. При следуйщем прерывании - контролируем бит go - если не сбросился, ждем следуйщего прерывания и по новой.... >> При таком алгоритме нет синхронизации между прерыванием таймера и преобразованием АЦП.При кварце 4 МГц таймер прерывается каждые 83 мксек.Время преобразования АЦП ~25 мксек. Остается 58 мксек(58 однотактных команд).Необходимо тщательно проанализировать программу , чтобы время выполнения остальных команд не превысило это время.(Морока). АЦП работает на пределе.Таймер я бы выбросил и организовал работу по прерыванию АЦП , а не таймера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
angir 0 19 ноября, 2005 Опубликовано 19 ноября, 2005 · Жалоба Частота пика - 20 мегагерц, по времени преобразования - все ок. В чем дело - сам не пойму. Проверил все уже сто раз. Прерывание на время преобразования не нужно делать - я контролирую флаг done. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
upc2 0 21 ноября, 2005 Опубликовано 21 ноября, 2005 · Жалоба PIC16F676 не имеет ни одного полноценного порта.Он предназначен для построения цифровых регуляторов. Как вы оцениваете результат измерения? Вероятно там и причина. В вашем фрагменте вы считываете 1 байт измерения, а надо два.Где неточность? Для чего таймер? Для использования АЦП в Sleep режиме? Но это работает на внутренний RC генератор 4МГц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bav 0 22 ноября, 2005 Опубликовано 22 ноября, 2005 · Жалоба Попробуй синхронизировать АЦП от кварцевого генератора, уменьши время преобразования АЦП (не ниже рекомендуемого). Если переключаешь каналы, делай задержку перед преобразованием и т. д. (как написано в DataSheet). Проверь, не изменяются ли данные, приходящие с АЦП другими подпрограммами (может что-то не успевает выполниться). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
angir 0 24 ноября, 2005 Опубликовано 24 ноября, 2005 · Жалоба Самое интересное, что этот-же код прекрасно работает в 16f87x Серии, конечно, с учетом разницы перифирии - и на 20000 раз в секунду. Ладно, с 676 я забил. Правда, я у 676 заводские константы потер - может и в этом дело было... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться