Справочник по программировани BASCOM-8051 (М.Л. Кулиш, 2001). Справочник по программированию bascom8051 Краснодар 2001
Скачать 6.61 Mb.
|
===================================== Справочник по программированию «Bascom-8051» == 'подпрограммы загрузки данных в синтезатор Sload_9850: Set B_fqud : Reset B_fqud 'сбросить интерфейс Set B_clk : Reset B_clk 'защелкнуть код последовательного режима Set B_fqud : Reset B_fqud 'разрешить последовательный режим 'выдвинуть данные из R_bd в режиме 3 (мл. сначала , _/\_) Shiftout B_data , B_clk , R_bd , 3 'выдвинуть последний байт с режимом и фазой Temp = 0 : Shiftout B_data , B_clk , Temp , 3 Set B_fqud : Reset B_fqud 'исполнять загруженные данные Return '------------------------------------------ Почти всегда точность аналоговых преобразователей недостаточна для решения измерительной задачи. В данном случае речь идет измерения или воспроизведения абсолютного значения напряжения, тока или чего-либо еще. Типичная точность аналоговых преобразователей составляет единицы или, в лучшем случае, доли процента – результат неидеальности технологии их производства. С другой стороны, стабильность метрологических характеристик этих же преобразователе на два-три порядка (десятичных) превосходит их параметрическую точность. Таким образом, выравнивая масштаб преобразования с внешним эталоном, можно достичь повышения их точности до значений стабильности (временной, температурной), нелинейности и шумов. Такая операция называется калибровкой, в результате которой устанавливается коэффициент преобразования АЦП или ЦАП. Калибровка может производиться в аналоговом виде, например, подстройкой напряжения опорного источника, но нас будет интересовать только цифровая калибровка. Ее преимущества очевидны. Во-первых, аналоговая часть схемы не усложняется. Во-вторых, калибровка может проводиться без доступа внутрь калибруемого объекта, и с удаленным объектом тоже. Самое замечательное, что калибровка производится в том состоянии устройства, в котором он и работает. Имеется возможность снизить и случайные составляющие операции калибровки. В итоге, повышается точность измерительного преобразователя, причем даже в большей степени, чем при аналоговой калибровке. Результаты цифровой калибровки, представляющие собой цифровые коэффициенты обычно размещаются в энергонезависимой памяти, чтобы их можно было воспроизвести при повторном включении питания калибруемого устройства. Не останавливаясь на методах организации хранения данных калибровки (это отдельный вопрос), рассмотрим методы калибровки. Практически все методы цифровой калибровки можно свести всего к двум видам: а) калибровки масштаба (коррекция мультипликативной составляющей погрешности). Конечно, калибровка масштаба может состоять из нескольких составляющих, но, все равно, каждый раз, это будет операция умножения на корректирующий масштабный коэффициент, зависимый от каких то параметров; б) калибровка смещения (коррекция аддитивной составляющей погрешности преобразователя). Можно еще говорить о калибровке нелинейности преобразователя, но этот метод применяется очень редко и всегда в дополнение, к уже указанным. Калибровка смещения измерительного тракта учитывается путем вычитания из текущих показаний, значения, ранее запомненного при измерении напряжения на закороченном входе (U = 0). Поправка масштаба производится умножением на коэффициент, определенный как отношения эталонного значения к текущим показаниям при подаче на вход напряжения, равного эталонному значению. В программе монитора АЦП AD7711A, приведенной выше, применена и калибровка смещения и масштаба по указанной схеме. Там же имеется процедура калибровки, когда с клавиатуры подается команда произвести калибровку нуля или масштаба. В демонстрационной программе все несколько упрощено, но требуемый порядок полностью выполнен (вначале калибровка нуля, затем масштаба). Калибровка ЦАП реализуются также, но с точностью, наоборот, вследствие обратного направления преобразования загружаемого кода. Вначале приводится в действие масштабный коэффициент, а затем из значения загружаемого кода вычитается поправка смещения нуля. Порядок же определения коэффициентов и для ЦАП и для АЦП одинаков - вначале определяется поправка смещения, а затем масштаба. Это значительно облегчает процедуру определения поправочных коэффициентов, делая процесс одноступенчатым (без итерационных циклов). Как указывалось выше, скорость измерения АЦП обычно намного превосходит возможности устройств передачи и отображения данных. Так происходит потому, что конечным приемником информации является человек, для которого пределом комфортного восприятия считается частота смены данных в пределах до 3 - 5 Гц. Это обстоятельство можно использовать с максимальной пользой, например, организовать усреднение избыточных отсчетов АЦП. В результате, достигается повышение точности и разрешающей способности за счет дополнительного подавления шумов и помех. Особенно актуальна эта мера для многоразрядных АЦП (более 14 - 16 разрядов), младшие разряды которых не всегда могут быть реализованы в одиничном цикле преобразования. Усреднение может производиться простым суммированием нескольких отсчетов, так и с помощью алгоритмов цифровой фильтрации. Отличие фильтрации от усреднения в том, что при усреднении поток данных визуально прореживается (данные поступают реже), а при фильтрации скорость выдачи данных может остается прежней, однако, каждый выходной отсчет цифрового фильтра будет нести какую-то часть предыдущих отсчетов. Для ============================================================================= 18-9 ===================================== Справочник по программированию «Bascom-8051» == наблюдателя процесса фильтрации также важен промежуток вхождения в стационарный режим фильтрации после ее включения, т.е. пока необходимый объем обрабатываемых данных еще не накоплен, на выходе программы не должно быть сбойных показаний. Это возможно, если при включении режима фильтрации сбросить параметр фильтрации, имеющий значение, аналогичное постоянной времени обычного фильтра, а затем плавно увеличивать его (соответственно и степень фильтрации до заданной). Ниже представлен фрагмент программы, содержащий самую простую подпрограмму цифровой фильтрации. В представленном примере предусмотрена реализация плавного вхождения в процесс фильтрации. Представленная программа аналогична фильтру первого порядка. Для повышения порядка фильтра достаточно включить в процесс обработки две-три (или более) аналогичные программы, работающие последовательно и с различными коэффициентами, которые и установят характер (модель) фильтра. '------------------------------------------------------------------------ ' Программа обработки по формуле фильтра первого порядка ' вызывается каждый раз в цикле измерения '------------------------------------------------------------------------ Dim B_stan As Bit 'бит стабильность Dim Uav As Single 'выходное значение Dim R_an As Single 'параметр фильтрации Dim Uc As Single 'текущие показания Dim Tmp As Single 'временные данные Dim N_m As Const 0.9 'параметр уменьшения Dim N_f As Const 0.3 'окончательное значение R_an R_an = 1 'исходное значение параметра фильтрации B_stan = 0 'сбросить при включении фильтрации ' Uav = Uav(1-1/N) + Uc/N - КЛАССИЧЕСКАЯ ФОРМУЛА ФИЛЬТРА ' Uav = Uav(1-n) + Uc*n - УПРОЩЕННАЯ ФОРМУЛА 'ОБЕСПЕЧИВАЕТ СОКРАЩЕНИЕ ВРЕМЕНИ ВЫЧИСЛЕНИЙ (ИСКЛЮЧАЕТСЯ ДЕЛЕНИЕ И 'ОДНО ДЕЙСТВИЕ) И ПРАКТИЧЕСКИ НЕОТЛИЧИМА ОТ КЛАССИЧЕСКОГО ВАРИАНТА 'ПРИ НАБЛЮДЕНИИ ПО ИНДИКАТОРУ ' ГДЕ: n - ТЕКУЩЕЕ ЗНАЧЕНИЕ ПАРАМЕТРА УСРЕДНЕНИЯ (R_an) ' Uc - ДАННЫЕ АЦП ' Uav - ТЕКУЩЕЕ И НОВОЕ СРЕДНЕЕ ЗНАЧЕНИЕ 'ЗНАЧЕНИЕ КОНСТАНТЫ ФИЛЬТРАЦИИ, КОТОРОЕ ПРИ ВКЛЮЧЕНИИ РЕЖИМА ФИЛЬТРА 'РАВНО 1, ЗАТЕМ С КАЖДЫМ ИЗМЕРИТЕЛЬНЫМ ТАКТОМ УМЕНЬШАЕТСЯ 'В 1.11 РАЗА(1/N_m) ДО МИНИМАЛЬНОГО ЗНАЧЕНИЯ (N_f). ЗНАЧЕНИЯ N_m И N_f 'ПОДОБИРАЮТСЯ ЭКСПЕРИМЕНТАЛЬНО, ЧТОБЫ ОБЕСПЕЧИТЬ КОМФОРТНОЕ ВРЕМЯ 'УСТАНОВЛЕНИЯ, И ДОСТАТОЧНОЕ ПОДАВЛЕНИЕ ШУМОВ. Comp_av: If B_stan = 1 Then 'установился стационарный режим? Goto C_av2 'теперь достигли окончательного значения? End If R_an = R_an * N_m 'изменим значение параметра фильтрации If R_an < N_f Then 'теперь достигли окончательного значения? Set B_stan 'да - поставим бит стабильности End If C_av2: Tmp = 1 - R_an 'вычтем константу фильтрации из единицы Uav = Uav * Tmp 'возьмем из суммы соответствующую часть Tmp = Uc * R_an 'возьмем часть показаний АЦП Uav = Uav + Tmp 'сложим с суммой Return При программировании средствами Bascom часто приходится использовать переменные, не соответствующие по длине разрядной сетке ЦАП. При этом загружаемый в ЦАП код размещается в младших разрядах переменной, в результате чего, возникает опасность переполнения разрядной сетки. Чтобы исключить такую возможность необходимо перед преобразованием проверять максимальное значение вводимого числа или числа, полученного после вычислений. Легкость программирования Bascom провоцирует применение неоптимальных схем обработки данных (в первую очередь по критерию производительности). Чтобы успешно бороться с этим «злом», рекомендуется в максимальной степени применять обработку данных на низком уровне (непосредственно в кодах загрузки ЦАП или с выходным кодом АЦП). Это, конечно, сложнее для программиста, но дает существенный выигрыш, т.к. ============================================================================= 18-10 ===================================== Справочник по программированию «Bascom-8051» == целые двоичные числа быстрее обрабатываются и занимают меньше места в памяти. На низком уровне рекомендуется выполнять следующие операции: а) анализировать перегрузку АЦП и осуществлять выбор пределов измерения, если это требуется. Это дает возможность предельно быстро реагировать на изменения входного сигнала, отдавая на «высший уровень» данные, действительно пригодные для получения конечного результата; б) корректировать смещения АЦП и ЦАП, соответственно сохраняя поправки смешения в виде целых двоичных чисел; в) осуществлять первичное усреднение данных АЦП и при необходимости преобразовывать в двухполярный вид; г) записывать в массив или осуществлять сортировку, например по величине; д) вычислять в прерываниях. ============================================================================= 18-11 ===================================== Справочник по программированию «Bascom-8051» == 19. Программирование устройств с шиной Microwire В новой версии компилятора Bascom (начиная с 1.20) добавлены операторы для работы с микросхемами, имеющими последовательный интерфейс Microwire. Интерфейс Microwire внешне во многом похож на SPI – те же четыре линии (DI – прием данных, DO – выдача данных, CS – выбор кристалла, Clk – синхронизация). Однако, отличие от SPI существенно – число посылаемых бит не кратно восьми. Таким образом, полноценная реализация интерфейса Microwire имеющимися операторами SPI или аппаратным SPI затруднительна. Основное применение интерфейса Microwire связано с микросхемами энергонезависимой памяти серии 93С06 – 93С57, главное достоинство которых связано с высокой надежностью хранения данных и с очень высокой скоростью считывания. Современные микросхемы с интерфейсом Microwire (серия 45Сххх) имеют наибольшую емкость из всех микросхем с последовательным доступом. Микросхемы с шиной Microwire могут работать с 8-ми и 16-разрядными данными. Выбор длины слова производится подключение вывода “ORG” шине питания (16 разрядов) или к общему проводу (8 разрядов). Соответственно этому изменяется длина адреса. Компилятор «узнает» о способе подключения микросхемы с помощью опции AL (длина адреса) оператора конфигурации Config Microwire (см главу 4). Там же описывается подключение линий шины к микроконтроллеру. Для работы с шиной Microwire предусмотрено четыре оператора: а) оператор MWINIT – устанавливает выводы, предназначенные для интерфейса Microwire, в исходное состояние. Применяется в начале программы, после сброса процессора; б) оператор MWREAD – считывает значение в переменную из интерфейса Microwire. Применяется столько раз, сколько нужно произвести операций считывания данных. В зависимости от длины слова данных работает с одно или двух байтными переменными. Адрес может быть задан в непосредственном виде или с помощью одно- или двухбайтной переменной; в) оператор MWWRITE – записывает значение переменной в интерфейс Microwire. Записывает одно или двухбайтные данные. Адрес также может быть задан в непосредственном виде или с помощью одно- или двухбайтной переменной. После этого оператора необходимо применять оператор временной задержки на 2-10 мс (см. описание применяемой микросхемы), т.к. опрос готовности устройства, в которое производится запись, не выполняется; г) оператор MWWOPCODE – записывает в устройство код операции на шине Microwire. Все возможные операции приведены в справочных данных микросхем, но две из них должны применяться всегда. Это – разрешение записи (и стирания) перед началом работы и запрещение записи (стирания) после окончания работы. После некоторых команд, например, общего стирания или общей записи также необходимо применять оператор задержки на время, указанное в описании применяемой микросхемы. Однако лучше применить программу ожидания готовности, например, следующую: Set Cs : Bitwait Dout Set : Reset Cs Ниже приведена таблица, содержащая изображения временных диаграмм, формируемых описанными операторами с 16-битном и 8-битном режимах. Далее предлагается пример тестовой программы с использованием шины Microwire. В этой программе создается и записывается в микросхему EEPROM массив двухбайтовых чисел, а затем он считывается обратно. Для усложнения задачи и демонстрации возможностей Bascom микросхема 93С46 включена в 8-разрядном режиме, а двухбайтовые значения записываются и считываются в два приема. Такое решение наиболее часто применяется практически, когда приходится сохранять значения переменных различной длины. В этом примере применена дополнительная программа (Mwrdyw), написанная на ассемблере и обеспечивающая ожидание появления сигнала готовности микросхемы, в которую произведена запись. Особенность этой подпрограммы заключается в том, что ожидание готовности производится только 10 мс, благодаря чему становится невозможным «зависание» процессора при неисправности микросхемы EEPROM, а при исправной микросхеме скорость работы программы увеличивается. ============================================================================= 19-1 ===================================== Справочник по программированию «Bascom-8051» == Оператор Временная диаграмма 16-битный режим Mwwopcode &B100110000 , 9 Генерировать команду разрешения записи и стирания (для 93С46 вывод “ORG”=1) _____________________________________ __| |__ CS _ _ _ _ _ _ _ _ _ ____| |_| |_| |_| |_| |_| |_| |_| |_| |____ Clk ___ ___ ___ ___| |___ ___| |___ ___ ___ ___ ___ DI SB OP1 OP2 1 1 0 0 0 0 Mwwopcode &B100000000 , 9 Генерировать команду запрещения записи и стирания (для 93С46 вывод “ORG”=1) _____________________________________ __| |__ CS _ _ _ _ _ _ _ _ _ ____| |_| |_| |_| |_| |_| |_| |_| |_| |____ Clk ___ ___| |___ ___ ___ ___ ___ ___ ___ ___ ___ DI SB OP1 OP2 0 0 0 0 0 0 Mwread X , &B110 , 0 , 2 Считать значение из ячейки по адресу 0 в переменную X (два байта) (для 93С46 вывод “ORG”=1) _________________________________________________ _ __________ __| |__ CS _ _ _ _ _ _ _ _ _ _ _ _ _ _ ____| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_ _ __| |_| |____ Clk ___ ___ ___ ___ ___ ___ ___ ___ ___| |___X___X___X___X___X___X___\____________ _ _________ ___ DI SB OP1 OP2 A5 A4 A3 A2 A1 A0 0 0 0 0 0 0 ___ ___ ___ _ _ ___ ___ -------------------------------------__X___X___X___X _ _X___X___X___ DO 0 D15 D14 D13 D1 D0 Mwwrite X , &B101 , 0 , 2 Записать значение переменной X (два байта) в ячейку с адресом 0 (для 93С46 вывод “ORG”=1) _________________________________________________ _ __________ __| |__ CS _ _ _ _ _ _ _ _ _ _ _ _ _ _ ____| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_ _ __| |_| |____ Clk ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ _ _ ___ ___ ___| |___| X___X___X___X___X___X___X___X___X___X _ _X___X___X___ DI SB OP1 OP2 A5 A4 A3 A2 A1 A0 D15 D14 D13 D1 D0 0 0 0 0 0 0 8-битный режим Mwwopcode &B1001100000,10 Генерировать команду разрешения записи и стирания (для 93С46 вывод “ORG”=0) ________________________________________ __| |__ CS _ _ _ _ _ _ _ _ _ _ ____| |_| |_| |_| |_| |_| |_| |_| |_| |_| |____ Clk ___ ___ ___ ___| |___ ___| |___ ___ ___ ___ ___ ___ DI SB OP1 OP2 1 1 0 0 0 0 0 Mwwopcode &B1000000000,10 Генерировать команду запрещения записи и стирания (для 93С46 вывод “ORG”=0) ________________________________________ __| |__ CS _ _ _ _ _ _ _ _ _ _ ____| |_| |_| |_| |_| |_| |_| |_| |_| |_| |____ Clk ___ ___| |___ ___ ___ ___ ___ ___ ___ ___ ___ ___ DI SB OP1 OP2 0 0 0 0 0 0 0 Mwread Y , &B110 , 0 , 1 Считать значение из ячейки по адресу 0 в переменную Y (1 байт) (для 93С46 вывод “ORG”=0) _________________________________________________ _ __________ __| |__ CS _ _ _ _ _ _ _ _ _ _ _ _ _ _ ____| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_ _ __| |_| |____ Clk ___ ___ ___ ___ ___ ___ ___ ___ ___ ___| |___X___X___X___X___X___X___X___\_________ _ ____________ DI SB OP1 OP2 A6 A5 A4 A3 A2 A1 A0 0 0 0 0 0 0 0 ___ ___ _ _ ___ ___ -----------------------------------------__/___X___X _ _X___X___X___ DO 0 D7 D6 D1 D0 Mwwrite Y , &B101 , 0 , 1 Записать значение переменной Y ( 1 байт) в ячейку с адресом 0 (для 93С46 вывод “ORG”=0) _________________________________________________ _ __________ __| |__ CS _ _ _ _ _ _ _ _ _ _ _ _ _ _ ____| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_ _ __| |_| |____ Clk ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ _ _ ___ ___ ___| |___| X___X___X___X___X___X___X___X___X___X _ _X___X___X___ DI SB OP1 OP2 A6 A5 A4 A3 A2 A1 A0 D7 D6 D1 D0 0 0 0 0 0 0 0 ============================================================================= 19-2 |