Бесплатная техническая библиотека
Начинающим программистам микроконтроллеров 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
Смотрите другие статьи раздела Начинающему радиолюбителю.
Читайте и пишите полезные комментарии к этой статье.
<< Назад
Последние новости науки и техники, новинки электроники:
Оптимальная продолжительность сна
12.11.2025
Сон играет ключевую роль в поддержании здоровья, когнитивных функций и общего самочувствия. Несмотря на широко распространенный стереотип о восьмичасовом сне, последние исследования показывают, что оптимальная продолжительность сна для большинства здоровых взрослых ближе к семи часам.
Эволюционный биолог из Гарварда, Дэниел Э. Либерман, утверждает, что традиционная норма восьми часов сна - это скорее культурное наследие индустриальной эпохи, чем биологическая необходимость. По его словам, полевые исследования, проведенные в сообществах, не использующих электричество, показывают, что средняя продолжительность сна составляет 6-7 часов, что значительно отличается от общепринятого стандарта.
Современные эпидемиологические данные подтверждают этот взгляд. Исследования выявили так называемую "U-образную кривую" зависимости между продолжительностью сна и рисками для здоровья. Минимальные показатели заболеваемости и смертности наблюдаются именно у людей, спящих около семи часов в сутки. ...>>
Дефицит кислорода усиливает выброс закиси азота
12.11.2025
Парниковые газы играют ключевую роль в изменении климата, а закись азота (N2O) - один из наиболее опасных среди них. Этот газ не только втрое сильнее углекислого газа в удержании тепла, но и разрушает озоновый слой. Недавнее исследование американских ученых показало, что микробы в зонах с низким содержанием кислорода активно производят N2O, усиливая глобальные климатические риски.
Команда из Университета Пенсильвании изучала прибрежные воды у Сан-Диего и провела наблюдения на глубинах от 40 до 120 метров в Восточной тропической северной части Тихого океана - одной из крупнейших зон дефицита кислорода. Исследователи сосредоточились на том, как морские микроорганизмы превращают нитраты в закись азота.
В ходе работы выяснилось, что существует два пути образования N2O. Один путь начинается с нитрата, другой - с нитрита. На первый взгляд более короткий путь должен быть эффективнее, однако микробы, использующие нитрат, продуцируют больше газа, поскольку этот "сырьевой" источник более д ...>>
Омега-3 помогают молодым кораллам выживать
11.11.2025
Сохранение коралловых рифов становится все более актуальной задачей в условиях глобального изменения климата. Молодые кораллы особенно уязвимы на ранних стадиях развития, когда стрессовые условия и нехватка питательных веществ могут привести к высокой смертности. Недавнее исследование ученых из Технологического университета Сиднея показывает, что специальные пищевые добавки способны существенно повысить выживаемость личинок кораллов.
В ходе работы исследователи разработали особый состав "детского питания" для коралловых личинок. В него вошли масла, богатые омега-3 жирными кислотами, а также важные стерины, необходимые для формирования клеточных мембран. Личинки, получавшие эти добавки, развивались быстрее, становились крепче и демонстрировали более высокую устойчивость к стрессовым факторам.
Особое внимание ученые уделили липидам. Анализ показал, что личинки активно усваивают эти вещества, что напрямую влияет на их жизнеспособность. Стерины, содержащиеся в корме, повышают устойчи ...>>
Случайная новость из Архива Трехэкранный ноутбук MAX16 Triple Screen Laptop
10.09.2025
На рынок выходит ноутбук MAX16 Triple Screen Laptop, который оснащен тремя экранами.
Основной дисплей устройства имеет диагональ 16 дюймов, а по его бокам закреплены два дополнительных экрана по 10.5 дюймов каждый. Они раскрываются на шарнирах, создавая панорамное рабочее пространство. В закрытом состоянии боковые панели складываются внутрь, полностью прикрывая центральный экран, что делает ноутбук удобным для транспортировки. В разложенном виде суммарная диагональ изображения достигает 29.5 дюйма, хотя между панелями остаются заметные рамки.
Интерес вызывает и конструкция корпуса. Размеры MAX16 в сложенном виде составляют 374 на 261 на 28 миллиметров, а вес - около 2.6 килограмма. Эти параметры делают устройство крупнее большинства стандартных ноутбуков, но дополнительное пространство экрана компенсирует относительную массивность.
Производительность ноутбука обеспечивают процессоры Intel Core двенадцатого поколения из серии Alder Lake-P. Доступны конфигурации с Core i7-1260P и Core i7-1270P, к которым можно добавить до 64 гигабайт оперативной памяти DDR4-3200. Хранилище представлено твердотельным накопителем PCIe 4.0, что гарантирует высокую скорость работы с данными.
Среди дополнительных возможностей стоит отметить батарею емкостью 77 ватт-часов, стереодинамики, клавиатуру с подсветкой, сканер отпечатков пальцев и веб-камеру на 1 мегапиксель. Набор портов включает USB-C с поддержкой DisplayPort Alt Mode и USB-PD, три классических USB-A, разъем HDMI, Ethernet и комбинированный 3.5-миллиметровый выход для наушников.
Любопытно, что производитель заявил поддержку внешних графических ускорителей. Однако отсутствие интерфейсов Thunderbolt, USB4 или OCuLink вызывает вопросы о том, насколько реально подключение таких решений на практике. Таким образом, перспектива превращения MAX16 в полноценный игровой ноутбук остается неочевидной.
Базовый вариант с процессором Core i7-1260P обойдется примерно в 700 долларов, а более мощная версия с Core i7-1270P стоит почти 1200 долларов. Такое расхождение в цене отражает разницу в возможностях, но в обоих случаях покупатель получает необычное устройство с расширенным функционалом.
|
Другие интересные новости:
▪ Микросхема IR25750L для измерения тока
▪ Мамонту поставили градусник
▪ Бумага, сохраняющая энергию электричества
▪ Персональная фармацевтика
▪ Взрослые слоны успокаивают молодежь
Лента новостей науки и техники, новинок электроники
Интересные материалы Бесплатной технической библиотеки:
▪ раздел сайта Микроконтроллеры. Подборка статей
▪ статья Звездные войны. Крылатое выражение
▪ статья Что такое ананас? Подробный ответ
▪ статья Начальник отдела ИТ инфраструктуры департамента информационных технологий. Должностная инструкция
▪ статья Гирлянда на мигающих светодиодах. Энциклопедия радиоэлектроники и электротехники
▪ статья Регулируемый преобразователь напряжения для ЛДС. Энциклопедия радиоэлектроники и электротехники
Оставьте свой комментарий к этой статье:
Главная страница | Библиотека | Статьи | Карта сайта | Отзывы о сайте

www.diagram.com.ua 2000-2025
|