asvhmao писал(а):команда movfw это тоже самое что и movf или есть отличия?
С точки зрения функции им выполняемой, отличий не должно быть. Но всё зависит от ассемблера и компилятора вами применяемого. Т.е. как он сиё воспринимает читайте в документации на применяемый вами инструментарий программирования.
(Например какой- нибудь MPLAB ххх - см. таблицу стандартных команд на данный МК и макросы, понимаемые используемым компилятором).
[uquote="asvhmao",url="/forum/viewtopic.php?p=4437238#p4437238"]Просматриваю разные тексты, иногда попадается команда movfw это тоже самое что и movf или есть отличия?...[/uquote]
Есть система команд "среднемладших" (
) и есть дополнительные "удобные макросы" от компилятора в Mplab IDE (созданные на основе того же исходного набора команд), смотрим (запустив IDE):
HELP -> Topics... -> MPASM Assembler -> OK -> reference -> 12-Bit/14-Bit Instruction Width Pseudo-Instructions
там полный перечень применяемых с описанием "начинки".
Запустился генератор, еле остановил. Пока не разобрался, как правильно совмещать нулевую позицию таблицы и ноль в регистре, где идёт подсчёт, для полной остановки. Сделал двойную проверку на ноль, при нажатии на кнопку и после вычитания единицы.
MPLAB 8.10 кушает movfw и movf , правда пока ещё делаю ctrl+c --->. ctrl+v из разных кусков Работает и то и другое.
Почитав про таймеры и процедуры с ними, предыдущие вопросы отпали сами собой.
В остальном работает как задумывалось. В железе и на точность ещё не проверял,.
„Выживает не самый сильный и не самый умный, а тот, кто лучше всех приспосабливается к изменениям.“
— Чарлз Дарвин
Понятно, что обращаясь в любом банке по старшим адресам, попадаешь в нулевой. Всего 16 ячеек. А можно из любого же банка обращаться по адресам нулевого, то есть 70-7Fh?
[uquote="yor",url="/forum/viewtopic.php?p=4441139#p4441139"]Понятно, что обращаясь в любом банке по старшим адресам, попадаешь в нулевой.[/uquote]
В системе команд этой платформы есть абсолютная адресация. То есть в самой команде содержится (может содержаться) не только код операции, но и АДРЕС ОПЕРАНДА. При длине команды 14 бит на адрес операнда остается только 7 бит. Таким образом можно адресовать только 128 регистров ОЗУ. Чтобы увеличить это количество, в качестве старших разрядов используется два бита РЕГИСТРА СОСТОЯНИЙ процессора (STATUS) - RP0 и RP1. Эти биты удлинят адрес и реальное обращение будет к ПОЛНОМУ адресу.
При обращении к старшим 16 регистрам 7-битного адреса, расширение адреса маскируется (выключается). Поэтому в каждом банке эти 16 регистров фактически повторяются.
[uquote="yor",url="/forum/viewtopic.php?p=4441139#p4441139"]... можно из любого же банка обращаться по адресам нулевого, то есть 70-7Fh?
...[/uquote]
Можно.
Но придется работать с компилятором в режиме относительной адресации.
Регистры, размещенные в области обозначенной в документации как "доступ к 70-7F"(accesses 70-7F) объявляется как
секция UDATA_SHR.
У некоторых "малолапых" это единственный вариант для работы с ОЗУ (те же pic12f629/675 к примеру).
Для данного случая выбираем шаблон проекта из
" C:\Program Files\Microchip\MPASM Suite\Template\Object "
к примеру файлики шаблонов
12F629TMPO.asm
16F628ATMPO.asm
Не пойдет.
udata_shr - не может иметь адрес. Это директива для линкера, который располагает все имена регистров в диапазоне адресов доступном из всех банков. То есть в этих самых 16 адресах.
Количество байт под этой директивой не должно превышать 16, иначе линкер при сборке кода выдаст ошибку.
При обращении по абсолютному адресации нужно либо следить за банком и его переключать по необходимости, либо всегда переключать, чтобы не ошибаться.
Макрос переключения banksel <name_reg>, либо прямое присвоение битам RP0 и RP1 регистра STATUS соответствующих значений.
Для сравнительно новых МК управление банками происходит посредством регистра BSR. Поскольку объем ОЗУ потребовал более двух дополнительных разрядов.
Скорее не 16, а в зависимости от конкретного МК.
Взять тот же pic12f629 - там второй банк ОЗУ полное отображение на первом.
Если пишем программу в мплабе, то спаси является частью самого мплаба (находится в его основном каталоге).
Там есть папки с шаблон-заготовками как для абсолютного так и для относительного режима - это (наличие разных и несовместимых в одном файле директив и правил написания текста исходника) главное различие компилятора ассемблера для пиков и ассемблеров для АВР/mcs51.
Те шаблоны удобны еще и тем, что в них уже прописан обязательный для конкретного кристалла минимум для начальной инициализации.
Жаль что иногда ошибки попадаются.
[uquote="BOB51",url="/forum/viewtopic.php?p=4441297#p4441297"]Взять тот же pic12f629 - там второй банк ОЗУ полное отображение на первом.[/uquote]
Потому что там память маленькая.
Я же говорю конкретно для ТС с его случаем. Дай Бог ему освоить этот частный случай.
границы таки прописаны достаточно явно...
И так по каждому кристаллу, обрабатываемому имеющейся версией мплаба (и его "сопутствующими компонентами").
Итогом в каждом проекте под ассемблером имеем три обязательных вспомогательных файла
файл описания ресурсов железа МК
name_mk.inc (C:\Program Files\Microchip\MPASM Suite);
файл настроек линкера
name_mk_g.lkr (C:\Program Files\Microchip\MPASM Suite\LKR);
и в зависимости от предпочтений в работе выбираем шаблон:
name_mkTMPO.asm (C:\Program Files\Microchip\MPASM Suite\Template\Object)
или
name_mkTEMP.asm (C:\Program Files\Microchip\MPASM Suite\Template\Code).
А дальше уж свою прожку пишем.
Поправил названия файлов шаблонов...
Просклерозил однако чуток...
Последний раз редактировалось BOB51 Ср июл 05, 2023 17:03:39, всего редактировалось 1 раз.
А таймеры после срабатывания (окончания счёта, переполнения, выставления флага прерывания) продолжают считать или нет? pic16f648 В документации не могу найти про этот момент.
То есть надо в первых командах подпрограммы прерывания их останавливать, чтобы не утикали. Хотя, он своё дело сделал, всё равно перезаряжать. Или поправку вносить.
yor, в 16F628/648 можете запускать и останавливать timer1 (bit_0 TMR1ON) и timer2 (bit_2 TMR2ON). У timer0 нет такой возможности. Нaзовите одну причину для этого запроса? Просто убрать перерывание, a пусть timer0 работает. Перед новым использованием присвойте начальное значение и вкл. прерывание ON. В PIC18 есть возможность начать и остановить timer0 (T0CON0 EN).