Реклама на сайте | Помощь сайту   English version | Datasheets 
KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Советы по программированию микроконтроллеров

Советы по программированию микроконтроллеров



Раздел: Микроконтроллеры

Как эмулировать внешние сигналы при отладке программ в MPLAB?

Невозможность менять значение порта как переменную в окне просмотра можно отнести к минусу разработчиков MPLABа. Однако, эмулировать внешние сигналы можно несколькими способами: переключать из одного состояния в другое  заранее выбранный разряд порта,  задавать периодический сигнал или определять форму сигнала в специальном текстовом файле.

В первом случае выберите меню Debug, а в нем пункт Simulator stimuls и Asynchronius stimuls. Появится окно с 12-тью кнопками для изменения состояния. Выберите любую кнопку и щелкните по ней правой кнопкой мыши, выберите Assign pin, чтобы назначить нужный вам разряд нужного порта двойным щелчком левой кнопки в открывшемся меню. Затем опять щелкните правой кнопкой, чтобы выбрать действие: Pulse - изменить состояние на противоположное и опять вернуть в прежнее, Low - установить в низкое состояние, High - установить в высокое состояние, Toggle - изменить на противоположное. Нажав в нужное время соответствующую кнопку, вы измените состояние выбранного разряда порта.

Так выглядит окно для изменения состояния разрядов портов. В частности левая верхняя кнопка запрограммирована для изменения 0 разряда порта RB в низкое состояние.

Во втором случае можно задать периодический сигнал. Откройте пункт меню Debug, а в нем пункт Simulator stimuls и Clock stimuls. В открывшемся окне выберите разряд порта и задайте длительности высокого и низкого состояний в циклах микроконтроллера (один цикл - 4 тактовых импульса Fosc). Затем нажмите кнопку ADD. Выберите появившуюся строку с параметрами и нажмите APPLY. MPLAB поменяет значение в заданное время не зависимо от того в каком режиме вы отлаживаете: в пошаговом или непрерывном.

И еще, можно заранее описать форму входного сигнала в специальном файле и подключить его, выбрав в меню Debug>Simulator Stimuls>Pin Stimuls>Enable... Откроется окно для вызова Вашего файла с расширением .sti.
Создать текстовый файл можно таким образом: выбрать в меню File>New и, в появившемся окне файла, описать входные сигналы. После создания файла сохраните его в папке Вашего проекта, задав ему имя, что-то типа <my prog>.sti. Вот пример файла описывающего некоторые входные сигналы для двух входов RB0 и RB1:


CYCLE  RB1 RB0
20     0   0
41     1   0    ; установить в лог. "1" бит 1 порта PORTB
52     0   1    ; сбросить бит 1 порта PORTB и установить в лог. "1" бит 0 
55     1   1
60     0   0
65     1   0 
76     0   1    ; и так далее....

Первая строка файла должна обязательно начинаться со слова CYCLE или STEP. Подробнее об этом можно прочитать, вызвав Help MPLAB.


Как определить один бит для обращения и модификации в тексте исходного файла?

При написании исходного текста программы на ассемблере в командах, оперирующих отдельными битами (bcf, bsf, btfsc, btfss и др.) приходится указывать не только имя регистра или переменной, но и, через запятую, номер бита, например: btfsc PORTA, 3 или btfsc PORTA,Snd (определив заранее как: Snd equ 3).

Однако, написание таких команд можно упростить, воспользовавшись директивой ассемблера замены текстовой последовательности #DEFINE. Вот пример ее использования:

; определение переменных, констант, регистров
PortSnd    equ 0x05        ; определим порт вывода звука
 #define Snd PortSnd, 3    ; определим Snd как третий бит PortSnd

; непосредственно текст программы
        bsf Snd            ; установим 3-й бит PortSnd в лог. "1"
        movlw 0xF0         ; одна из многих команд
        bcf Snd            ; а теперь сбросим 3-й бит PortSnd

Синтаксис этой директивы: #define <name> [<string>]
Везде, где в тексте программы встретится надпись <name>, она будет заменена на <string>. Применение этой директивы без <string>,  определит <name> для внутреннего использования при проверке директивой #IFDEF. Надо заметить, что просмотр в окне Watch Window, определенной таким образом переменной невозможен. В окне придется указывать имя регистра и номер бита.
И последнее, директива #DEFINE может начинаться с любой позиции в строке, кроме первой. Все, что начинается с первой позиции воспринимается при компилировании как метка. Если это команда, то выдается предупреждающее сообщение: найдена команда в первой позиции строки.


Как можно питать устройство на PICах от сети ~220 вольт без понижающего трансформатора?

Можно посоветовать достаточно простую схему питания устройства от сети ~220 вольт, которая обеспечивает ток нагрузки при указанных номиналах элементов до 100 мА, что бывает достаточно во многих случаях.

Резистор R2 должен быть рассчитан на рассеиваемую мощность не менее 0,5 Вт, R3 может быть любой. Конденсатор C1 обязательно должен быть рассчитан на напряжение не менее 250 В. Выходное напряжение определяется стабилитроном VS1. Диод VD1 средней мощности  КД209А можно заменить, например, на 1N4007 (распространенный импортный аналог).

ВНИМАНИЕ: Приведенная схема имеет гальваническую связь с сетью ~220 В, поэтому при наладке и установке устройства соблюдайте правила электробезопасности.


 

Почему происходят сбои информации в EEPROM и как от них избавиться?

При использовании внутренней или внешней EEPROM иногда наблюдаются случаи самопроизвольного изменения содержимого ячеек памяти. Происходит это, в основном, в моменты включения/выключения напряжения питания. Возможно, причина в случайном ходе выполнения программы во время переходных процессов. Кстати, данная проблема актуальная и для микроконтроллеров других производителей, например ATMEL.

Если выключение питания происходит в моменты обращения к EEPROM, как внутренней (в микросхемах PIC16F84), так и внешней (типа 24CXX и т. п.) с шиной управления I2C, то тоже существует вероятность нарушения хранимой информации. Сбои могут происходить при проникновении импульсных помех через питающие цепи в процессе работы. Могу предложить несколько способов увеличения надежности сохранности данных: программный и схемотехнические.

В программном способе если приходится хранить всего одну-две ячейки, то можно записывать каждое значение три раза подряд. При считывании проверять попарно на равенство и, если значения отличаются, то сравнивать с третьим и, в зависимости от результатов, можно выявить в какой ячейки данные нарушены. При хранении области данных можно поступить так: во-первых хранить две одинаковых области данных (для восстановления одной в случае сбоя во второй), во-вторых, при каждом изменении данных подсчитывать контрольную сумму области и записывать ее в отдельных ячейках EEPROM. При чтении, чтобы удостовериться в целостности информации нужно тоже подсчитывать контрольную сумму и сверять результат со значением, хранящимся там же. Проделывать такую операцию можно во время инициализации после включения прибора один раз, а можно и всякий раз при чтении данных.

При схемотехническом способе решения проблемы можно добавить несколько элементов, как показано синим цветом на рисунке ниже, для контроля момента выключения или аварии напряжения питания для того, чтобы не производить чтение или запись в EEPROM. В принципе схемотехническое решение может быть любым, выполненным как по приведенной схеме, так и с использованием специализированных микросхем мониторов напряжения или другим способом.
Элементы нужно подобрать таким образом, чтобы при уменьшении питающего напряжения ниже порогового уровня на выводе PORTn микроконтроллера появлялся лог "0". А в подпрограммах обращения к EEPROM прежде чем начать цикл записи или чтения опрашивать этот вывод.

Еще одно возможное решение этой проблемы, предложенное Ждановым Михаилом из Великого Новгорода, практически полностью исключает сбои. Это решение основано на дешевой микросхеме LP2951. Сигнал сброса поступает на PIC когда напряжение питания достигнет 5,7 вольта, а также и при выключении (задаётся диодом). Конденсатор на VCC PICа поддерживает питание некоторое время, срезая переходные процессы.

Для надежного сброса микроконтроллера можно использовать схему на микросхеме DS1233 фирмы Dallas, приведенную ниже. Она надежно отслеживает питание, и запускает микроконтроллер PIC через 0,1 сек после установки номинального. Чтобы помехи по питанию не вызывали ложные сбросы м/с DS1233 включается через цепочку R1C1C2.

Для уменьшения влияния внешних воздействий желательно неиспользуемые выводы микроконтроллера программировать как входы и подключать к шине питания или земли (это уменьшает и энергопотребление за счет отсутствия случайных переключений входных ключей портов). Еще можно оставить неиспользуемые выводы свободными, но при этом запрограммировать их как выходы. А при разводке печатной платы желательно разместить фильтрующий керамический конденсатор, емкостью 0,01-0,1 мкф, между выводами питания микроконтроллера. Обычно эти выводы расположены напротив друг друга. Цепи генератора тактовых импульсов (кварцевый резонатор, RC цепочка) и цепи сброса микроконтроллера лучше делать как можно короче. Вокруг печатной платы по периметру желательно провести шину земли. При такой конфигурации ни включение/выключение рядом силовых приборов, ни подключение осциллографа не вызовет ложных срабатываний или пересбросов процессора.
При разводке печатной платы следует учитывать некоторые моменты. Во-первых, входные сигналы следует вести "к" микроконтроллеру, а не "сквозь" него. Не доводя сигнал до ножки желательно поставить небольшой керамический фильтрующий конденсатор, чтобы короткая импульсная помеха уходила в землю. Затем, для ограничения тока можно поставить сопротивление. Во-вторых, не плохо обвести "землю" вокруг микроконтроллера.


Как получить напряжение отрицательной полярности?

Иногда для питания операционных усилителей или компараторов требуется напряжение отрицательной полярности. Получить его можно просто, используя один из портов микроконтроллера PIC, выдавая непрерывно последовательность импульсов. Схема представлена на рисунке ниже:

Вот еще одна схема получения напряжения отрицательной полярности. Она проще, в ней отсутствует индуктивность. Выходное напряжение составляет примерно -3,5 Вольт при использовании кремниевых диодов. Данную схему можно применять там, где не требуется стабилизированное напряжение, например, для питания некоторых операционных усилителей или компараторов, или для подачи напряжения регулирования контрастности ЖКИ модулей. Иногда это требуется в моделях ЖКИ, рассчитанных на работу при отрицательных температурах.


 

Как сделать сенсорную кнопку в устройстве на PICе?

Можно заменить в устройствах на PIC микроконтроллерах механическую кнопку на емкостную сенсорную. Схема подключения на рисунки ниже:

ВАРИАНТ 1: Сенсорная площадка - любая металлическая пластина небольших размеров (1-2 кв. см.). Идея заключается в том, что при прикосновении к датчику увеличивается суммарная емкость и изменяется время заряда конденсатора C1. Это видно из представленных диаграмм:

При программировании можно поступить таким образом: при включении устройства запрограммировать верхний по схеме вывод как выход и установить его в лог. "0", а нижний как вход. Через небольшую задержку установить на выводе, запрограммированном как выход лог. "1" и запустить таймер. Когда лог. "1" появится на нижнем выводе, запомнить показание таймера. Это будет константа для свободного сенсора. При опросе в процессе работы программы поступать таким же образом и сравнивать полученное значение с запомненным. Если полученное значение превышает константу, то считать, что есть прикосновение к датчику. Разница задержек установления лог. "1" на входе между свободным сенсором и нажатым составляет примерно 1-2 мкс.

ВАРИАНТ 2: схема работает аналогичным образом, только вместо двух портов используется один, который переключается с вывода на ввод. С состоянии ожидания вывод порта запрограммирован как выход и установлен в лог. "0". Конденсатор С2 разряжен. Конденсатор С1 служит для развязки потенциала тела человека и потенциала вывода микроконтроллера. При опросе вывод PICа переключается на ввод и измеряется время появления лог. "1" на этом выводе. Временная диаграмма соответствует той, что описывает в верхней схеме (вариант 1) вывод вход. После этого сравнивается измеренная величина и константа, запомненная и измеренная при инициализации (включении устройства) как в первом случае.


Как сделать простой цифро-аналоговый преобразователь (ЦАП, DAC)?

Если большая точность ЦАП не требуется, то можно обойтись более дешевым способом, без использования специализированных дополнительных микросхем микросхем. Приведем способ 8-ми битного ЦАП с использованием матрицы резисторов R-2R. К недостаткам можно отнести то, что для реализации требуется 8 портов I/O. Ошибка составляет 1 младший разряд.


 

Как упростить работу с отладочным кристаллом и продлить срок службы?

При использовании отладочных JW кристаллов большая часть времени уходит на его стирание. Да и каждое стирание уменьшает срок службы кристалла. На самом, деле стирать каждый раз кристалл нет необходимости, поскольку реальная программа обычно многократно помещается в его объеме. Нужно просто дописывать новые версии программы в старшие адреса, до заполнения ПЗУ. Команды перехода к новой версии записываются друг за другом, начиная с адреса сброса. Предыдущие команды замещаются командой NOP. Таким образом можно не только сократить время на отладку программы но и увеличить срок службы кристалла. Проверено!

Следует заметить, что некоторые кристаллы имеют страничную организацию памяти. Например, в 16C505 подпрограммы могут располагаться в первых 256 ячейках памяти программ (0x000 - 0x100). Связано это с тем, что в команде перехода к подпрограмме call присутствует только 8 бит адреса ячейки памяти начала подпрограммы, девятый бит теряется (устанавливается в "0"), а десятый берется из бита PA0 регистра STATUS. Правда замечено, что возможно вызывать подпрограммы из второй половины области памяти программ, расположенные в первых 256 ячейках этой половины. Тоесть, из области 0x200 - 0x3FF можно вызывать подпрограммы из области 0x200 - 0x2FF. Только при этом должен быть установлен в "1" бит PA0 регистра STATUS для правильного возврата из подпрограммы.


Есть PIC(+5В) и есть К561ИД1(Дешифратор +12В). Как согласовать логические уровни? Не сгорит ли PIC если попытаться подтянуть выходные линии PIC до 12В через резисторы?

Подтянуть не удастся потому, что практически все порты имеют полный КМОП драйвер при использовании портов как выходы. И еще, порты имеют защитные диоды на  землю и питание.

В некоторых контроллерах есть порт (например в PIC16F84 это RA4), выполненный по схеме "открытый сток". Его можно подтянуть до 12В, но такой порт только один.


Нужно запрограммировать контроллер PIC12С508 некой программой и при этом использовать внутренний генератор.

Загвоздка в константе калибровки. Порывшись в интернете и найдя там примеры программ окончательно запутался. В одном месте сказано, что это выполняется командой MOVWF OSCCAL, а в описании PIC12CХХХ вообще сказано MOVLW XX где ХХ - значение калибровки. Помогите пожалуйста прояснить ситуацию.

При использовании внутреннего RC генератора необходимо использовать калибровочную константу для получения более точного значения частоты. Поэтому константа для каждого кристалла разная и записана на заводе в последней ячейке памяти: для PIC12C508 в ячейке 0x1FF, для PIC12C509 в 0x3FF. Но записана там не сама константа, а команда, заносящая эту константу во временный регистр WREG - MOVLW XX (где ХХ - калибровочная константа). При конфигурации с внутренним RC генератором выполнение программы начинается не с 0-го адреса, а с последнего, то есть с этой самой команды, а только потом переходит на 0-ой. И вот, чтобы занести эту константу в нужный регистр OSCCAL, сама программа должна начинаться (по адресу 000) с команды MOVWF OSCCAL, которая переносит содержимое регистра WREG (калибровочную константу) в регистр OSCCAL. Конечно не принципиально, чтобы первой командой была именно MOVWF OSCCAL, это может быть и команда перехода, но только не команда, модифицирующая регистр WREG. Но такая команда обязательно должна быть.

При программировании однократных кристаллов в последнюю ячейку не должно ничего записываться, чтобы не нарушить команду и константу. При использовании отладочных кристаллов (с ультрафиолетовым стиранием) обязательно надо прочитать содержимое памяти и записать где-нибудь (лучше на самом корпусе) калибровочную константу. Потому, что при стирании сотрется и сама константа тоже. И в программе для отладочного кристалла должна быть записана команда MOVLW XX в последней ячейке. Например, так:


    ORG 0x1FF   ; это для 508, для 509 будет 0x3FF
    MOVLW XX    ; где ХХ - и есть прочитанная константа

Потом, при подготовки программы для однократного (OTP) кристалла эти строчки надо будет убрать (закомментировать).


Источник: http://disall.narod.ru
 © 2003—2017 «Электронный портал»Обр@тная связь