Menu Home

Бесплатная техническая библиотека для любителей и профессионалов Бесплатная техническая библиотека


Начинающим программистам микроконтроллеров PIC. Энциклопедия радиоэлектроники и электротехники

Бесплатная техническая библиотека

Энциклопедия радиоэлектроники и электротехники / Начинающему радиолюбителю

Комментарии к статье Комментарии к статье

[an error occurred while processing this directive]

Исходя из собственного опыта начала изучения программирования микроконтроллеров постараюсь дать несколько практических советов по составлению программ на ассемблере. Все, приведенные ниже, примеры программирования даны применительно к Pic контроллерам среднего семейства Microchip, как наиболее приемлемых для начала освоения, ввиду относительно простой их архитектуры и несложной системы команд ассемблера.

Предлагаемые программы вполне можно применять в виде готовых макросов (законченных подпрограмм).Они не привязаны к конкретному контроллеру, поэтому при применении следует учитывать данные из datasheet-ов.

1.Применение прерываний от переполнения таймера TMR0 (RTCC)

Примем тактовую частоту - Fтакт. = 4,096 МГц (стандартный кварц). Тогда время цикла составит t c = 1 / Fтакт. * 4 = 0,97656 мкс

INI_TMR ; инициализация режима прерываний от RTCC
bsf STATUS,RP0 ; выбираем банк 1
movlw b'00000100'
movwf OPTION ; предделитель для RTCC 1 : 32
bcf STATUS,RP0 ; банк 0
movlw b'10100000'
movwf INTCON ; разрешено прерывание от RTCC
movlw .96 ; загружаем в RTCC предварительное число 96
movwf TMR0

Получим время прерываний:
t i = t c * 32 * (256 - 96 = 160)
t i = 0,97656 * 32 * 160 = 5 000 мкс = 5 мс

Теперь, если в Вашу любую программу ввести бесконечный цикл (так называемый цикл ожи- дания прерывания), и окончание программы переводить на этот цикл, получим временную привязку к 5 мс.И после прерывания программа вернется по адресу, указанном вектором прерываний (чаще это 04h).Для чего это можно использовать - смотри дальше.

Итак:

;
org 0
START ; начало выполнения программы после
; включения питания
org 04h ; а это адрес вектора прерывания, по которому
main ; будет выполняться основная программа
;
START ; здесь обычно происходит обязательная ини-
INI_TMR ; циализация портов, режимов, регистров и т.п.
INI_PORTS
loop
goto loop ; а это и есть бесконечный цикл
;--------------------------------------------------

main
; далее идет тело основной программы,
; в которой обязательно надо создать программу обслуживания прерываний от RTCC,
; вызываемой командой CALL:

ServTMR
btfsc INTCON,RTIF ; проверяем флаг срабатывания прерываний от RTCC и
call SET_TMR ; если "да",то снова инициализируем TMR0
return ; если "нет" - возврат в место вызова ServTMR в
; основной программе main
;
SET_TMR movlw .96
movwf TMR0 ; снова загружаем число 96
bcf INTCON,RTIF ; сбрасываем флаг срабатывания
retfie ; возврат с разрешением прерываний в ServTMR, а
; затем в основную программу main

Пример использования прерывания от RTCC для получения секундного импульса на одном из выходов, скажем, порта В - RB0 : Используем регистр Rsec, который должен быть ранее объявлен в в адресном поле рабочих регистров.

Таким образом на выходе RB0 порта В каждую секунду уровень сигнала будет изменяться то '0' то '1'.

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

Рассмотрим примеры преобразований двоичного кода b2 в двоично - десятичный BCD и наоборот.

В 8 - bit регистре можно записать в двоичном коде число от 0 до 255 ( от b'00000000' до b'11111111' ). Преобразуем двоичное число в три разряда двоично - десятичного кода - "сотни", "десятки" и "единицы". Для этого будем использовать следующие регистры, которые должны быть заранее объявлены в адресном поле рабочих регистров :

Rbin - регистр хранения числа в двоичном коде b2
Rhan - регистр "сотни" кода BCD
Rdec - регистр "десятки" кода BCD
Rsim - регистр "единицы" кода BCD

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

FORM_1S ; в каждом цикле, а он по прерыванию RTCC длится
incf Rsec,w ; 5 Мс, увеличиваем регистр Rsec на 1 до числа 200
xorlw .200 ; (5 мс * 200 = 1 сек)
btfsc STATUS,z
goto OUT_PORT ; при Rsec = 200 флаг z = '1' и переход на управление
; выводом RB0 порта В
return ; возврат в основную программу main
;
OUT_PORT btfss PORTB,0 ; проверяем состояние вывода RB0
goto OUT_ON ; если RB0 ='0', то устанавливаем в '1'
bcf PORTB,0 ; в противном случае - устанавливаем в '0'
goto main ; возврат в основную программу
;
OUT_ON bsf PORTB,0 ; устанавливаем RB0 = '1'
goto main

CON_100 movlw .100 ; вычитаем 100 из Rbin c проверкой, что
subwf Rbin,w ; результат не отрицательный. Флаг 'c' = 1 при
btfss STATUS,c ; результате > или = 0, и 'c' = 0 при < 0
goto CON_10
incf Rhan,f ; подсчет количества "сотен"
movwf Rbin ; результат вычитания сначала храним в регистре
goto CON_100 ;аккумуляторе и только потом возвращаем в Rbin
; чтобы не потерять остаток при отрицательном
; результате вычитания.
CON_10 movlw .10 ; аналогично определяем "десятки"
subwf Rbin,w
btfss STATUS,c
goto end_con
incf Rdec,f
movwf Rbin
goto CON_10;
end_con
movf Rbin,w
movwf Rsim ; после вычитаний заносим остаток в "единицы"
;продолжение выполнения программы

Обратное преобразование BCD - кода в b2. Используем те же регистры Rhan, Rdec, Rsim где находится число в BCD - коде, регистры RbinH - старший разряд и RbinL - младший разряд для чисел ( > 255) в коде b2 и вспомогательные регистры RM1 - "множимое", RM2- "множитель".Для преобразования BCD в b2 нужно умножить "сотни" на 100, "десятки" на 10 и сложить все вместе с "единицами" и с учетом переноса в старший разряд при необ- ходимости.Для умножения используем операцию сложения.

B2X_100 movlw .99 ; преобразование "сотен"
movwf RM2 ; множитель = кол - во сложений (100) минус один
movf Rhan,w
movwf RM1 ; множимое = "сотни"
loopX100 addwf RM1,w btfsc STASTUS,c ; проверяем перенос в старший разряд
incf RbinH,f ; если есть перенос
decfsz RM2,f ; контролируем количество сложений
goto loopX100
movwf RbinL ; результат сложения заносим в регистр мл. разряда
;
B2X_10 movlw .9 ; преобразование "десятков"
movwf RM2 ; множитель = кол - во сложений (10) минус один
movf Rdec,w
movwf RM1 ; множимое = "десятки"
loopX10 addwf RM1,w ; здесь перенос можно не проверять, т.к. результат
decfsz RM2,f ; всегда < 255
goto loopX10
addwf RbinL,f ; добавляем результат преобразования "десятков"
btfsc STATUS,c ; учитывая возможный перенос в разрядах
incf
RbinH,f
movf Rsim,w
addwf Rbin,f ; добавляем "единицы" с учетом возможного переноса
btfsc STATUS,c
incf RbinH,f

Конец преобразованиям и дальнейшее выполнение программы. В регистрах RbinL и RbinH получили 16 - bit число в коде b2.

Для выполнения арифметической операции деления по аналогии с умножением, рассмотренном выше, применяется операция вычитания. Допустим нам нужно произвести деление числа, находящегося в регистрах RHsum (старшие разряды) и RLsum (младшие разряды) - на делитель ( примем делитель не > 255) находящийся в регистре Rdel.

Результат будем заносить в регистры RHrez и RLrez (старшие и младшие разряды соответственно) :

OP_DEL
movf Rdel,w
subwf Rlsum,w
btfss STATUS,c ; проверяем не отрицательный ли результат?
goto DEF_carry ; если "да", то проводим заем из ст. разряда
incf RLrez,f ; подсчитываем кол-во вычитаний с учетом
btfsc STATUS,c ; возможного переноса в старший разряд
incf RHrez,f
movwf RLsum ; восстанавливаем остаток, что бы не потерять
goto OP_DEL ; при отрицательном результате вычитания
;
DEF_carry
movlw 0h
xorwf RHsum,w ; все ли заняли из старшего разряда в младший?
btfsc STATUS,z ; если "да", т.е. RHdel = 0 и в OP_DEL отри-
goto OUT_ DEL ; цат. результат - конец делению и выход
decf RHsum,f ; если "нет" - заем из старшего разряда и про-
incf RLrez,f ; должаем дальше
btfsc STATUS,c ; проверка необходимости переноса в ст.разряд
incf RHrez,f
goto OP_DEL

Автор: Владимир Д., degvv@mail.ru; Публикация: cxem.net

Смотрите другие статьи раздела Начинающему радиолюбителю.

Читайте и пишите полезные комментарии к этой статье.

<< Назад

Последние новости науки и техники, новинки электроники:

Вкусовые пристрастия формируются еще в утробе 30.05.2026

Предпочтения человека к еде закладываются задолго до первого прикорма. Современная наука подтверждает, что ребенок начинает знакомиться с ароматами и вкусами пищи еще до рождения, через околоплодные воды. Новое международное исследование показало, что регулярное потребление определенных продуктов беременной женщиной может формировать долгосрочные пищевые предпочтения у ребенка, сохраняющиеся даже спустя годы после появления на свет. Ученые из университетов Великобритании, Франции и Нидерландов провели эксперимент с участием беременных женщин. Одной группе будущих мам давали капсулы с порошком капусты кейл, другой - с порошком моркови. Реакцию детей на эти запахи проверяли в три этапа: сначала в утробе матери с помощью 4D-УЗИ на поздних сроках беременности, затем в возрасте трех месяцев и, наконец, когда детям исполнилось три года. Результаты оказались весьма убедительными. Дети женщин, принимавших порошок кейла, положительно реагировали на запах этой капусты, но негативно - на ар ...>>

Монитор Philips 24B2D5300 с двумя экранами 120 Гц 30.05.2026

Компания Philips разработала интересное устройство, которое решает эту задачу элегантно и технологично. Новый монитор 24B2D5300 оснащен сразу двумя полноценными экранами - один спереди, другой сзади. Такая конструкция особенно востребована в банках, на рецепциях, в медицинских центрах и коворкингах, где важна прозрачность взаимодействия. Обе панели монитора представляют собой IPS-матрицы с диагональю 23,8 дюйма и разрешением Full HD (1920x1080 пикселей). Каждая из них поддерживает частоту обновления 120 Гц, что пока остается редкостью для бизнес-ориентированных моделей. Высокая частота обновления обеспечивает плавное изображение даже при динамичном контенте, делая работу за монитором более комфортной и презентации - более качественными. Пользователи могут выбирать между двумя основными режимами работы: дублирование одного и того же изображения на оба экрана или использование дисплеев как полностью независимых. Благодаря этому сотрудник может видеть на своей стороне рабочую информ ...>>

Цыплята из искусственного яйца, напечатанного на 3D-принтере 29.05.2026

Компания Colossal Biosciences, известная своими амбициозными инициативами по "воскрешению" вымерших животных, достигла важного прорыва. Специалистам удалось вырастить цыплят из полностью искусственного яйца, созданного с помощью 3D-печати. Эта технология рассматривается как значительный шаг на пути к возможному возрождению одного из самых впечатляющих представителей исчезнувшей фауны - гигантского моа. Южноостровной гигантский моа (Dinornis robustus) был одной из самых высоких птиц в истории Земли. Самки этого нелетающего родственника страусов могли вырастать выше двух метров и дотягиваться до пищи на высоте до 3,6 метра. Эти гиганты обитали в Новой Зеландии, однако полностью исчезли примерно в XV веке после активной охоты со стороны первых поселенцев-маори. Теперь Colossal Biosciences пытается вернуть подобных птиц в современный мир с помощью передовых биоинженерных решений. Искусственное яйцо, разработанное компанией, состоит из титановой решетчатой оболочки, изготовленной на 3 ...>>

Случайная новость из Архива

Новый рекорд скорости для электромобилей 26.10.2014

Австралийские студенты, входящие в группу Sunswift, установили рекорд средней скорости электромобиля на дистанции 500 км. Достижение официально зафиксировано Международной автомобильной ассоциацией (Federation Internationale de l'Automobile).

Учащиеся австралийского Университета нового южного Уэльса (University of New South Wales, UNSW) разработали электрокар под названием eVe, который смог на одной зарядке батареи преодолеть 500 км, развивая среднюю скорость 107 км/ч. Прежний рекорд, зафиксированный еще 26 лет назад, равен 73 км/ч.

Sunswift eVe имеет на крыше солнечные панели, которые питают аккумуляторы дополнительной энергией. Во время фиксации рекорда эти панели были отключены. Благодаря использованию солнечных элементов запас хода eVe на электрической тяге может достигать 800 км.

Полная зарядка батарей, общий вес которых равен 60 кг, от бытовой электросети длится около 8 часов. На скорости 100 км/ч потребление энергии составляет всего 20 кВтч. Для сравнения, Tesla Model S расходует 67 кВтч на скорости 89 км/ч.

Создатели Sunswift eVe надеются сделать разработанный электромобиль коммерческим продуктом в 2015 г. До этого времени разработчики обещают доработать машину, в том числе снизить время зарядки, повысить запас хода, а также улучшить интерьер автомобиля, сделав его традиционным.

Между тем, стало известно о разработке первого в Италии электрического суперкара. Проектированием новинки занимается местная фирма Tecnicar, которая изготавливает небольшие мотоциклы и туристические паровозики на электротяге.

Спортивный автомобиль получит название Lavinia и силовую установку мощностью около 800 л.с. Она обеспечит машине максимальную скорость в 300 км/ч и разгон с 0 до 100 км/ч за 3,5 с. Предполагается, что электросуперкар сможет преодолевать без подзарядки расстояние в 290 км.

Другие интересные новости:

▪ Углеродный 3D-каркас улучшит аноды литий-ионных батарей

▪ Новый тип наноловушек для изучения свойств белков

▪ Секрет лютика

▪ Продукты и напитки стали слаще

▪ Уличные фонари Тайбэя оснастят умными светодиодными лампами

Лента новостей науки и техники, новинок электроники

 

Интересные материалы Бесплатной технической библиотеки:

▪ раздел сайта Компьютерные устройства. Подборка статей

▪ статья Последние будут первыми. Крылатое выражение

▪ статья Какой птице дали названия как минимум четыре разных государства? Подробный ответ

▪ статья Наблюдение за мочеотделением. Медицинская помощь

▪ статья Адаптер для звуковой сигнализации. Энциклопедия радиоэлектроники и электротехники

▪ статья 300 Вт усилитель для сабвуфера. Энциклопедия радиоэлектроники и электротехники

[an error occurred while processing this directive] Оставьте свой комментарий к этой статье:

Имя:


E-mail (не обязательно):


Комментарий:





Главная страница | Библиотека | Статьи | Карта сайта | Отзывы о сайте

www.diagram.com.ua

www.diagram.com.ua
2000-2026