Когда старшая цифра результата будет в ACC - просто PUSH ACC и - вуалая - она в стеке .
Но вообще можно ещё лучше : пользовать R0 R1 как индексные и держать числа в РПД . Причём hex исходное можно даже упакованное ! Что весьма упрощает и "укомпактивает" .
Тогда просто : MOV A,@R1 ; ANL A,#00001111b для чётных нибблов ,потом MOV A,@R1 ; SWAP A ; ANL A,#00001111b для нечётных нибблов ,потом DEC R1 ;
Ну а класть результат в РПД всё ж таки неупаковванными BCD цифрами : MOV @R0,A ; DEC R0 ;
( ,тем более, что выводить на индикацию неупаковванные BCD цифры проще ).
< виртуальная "кнопочка" >--( WWW ) <- Убедительная просьба интересующимся старыми компьютерами типа РК86 - не пишите в теме в барахолке, пишите Ваши вопросы в ( лс ) пожалуйста
Появились снова вопросы . Могут ли одновременно работать два таймера/счётчика? Один в режиме счётчика, а другой для организации часов реального времени.
Могут.
Даже может быть изменен приоритет прерываний.
Единственное условие - разумный интервал во времени исполнения прерываний/очередности исполнения сопутствующих задач.
А не подскажите, для энкодера каков алгоритм сопряжения?
У меня поначалу было представление сотворить это как опрос двух кнопок. То есть перед опросом портов с энкодером предварительно в один из регистров заносим 1. Предположим, с вывода a поступает импульс - инкремент регистра (2 получится), если с вывода b - декремент регистра (получится 0), проверяем, если > 0 то вращение вправо (условно), если содержимое регистра = 0, то вращение влево. Ну а дальше тупо накопление кол-ва импульсов с соответствующим знаком
Доброго времени суток. Надо написать кусок кода, который будет для 2 старших битов байта делать сдвиг влево не трогая остальные биты. Написал вот так, можно ли "быстрее, выше, сильнее" ?
Спойлер
Process_Messages: ; Переводит установленные (01) сообщения в активные (10), а непрочитанные активные (10) сбрасывает в неактивные (00). Неактивные (00) - пропускаются.
mov R0, #first_messages ; Берем первое сообщение
Process_Next_Messages:
mov A, @R0 ; Загоняем в аккумулятор
anl A, #11000000b ; Зануляем тело сообщения
jz Next_Messages ; Если неактивно (00) - берем следующее
rl A ; Иначе сдвигаем влево, получая в 2 старших байтах новое состояние для этого сообщения (01 становится 10, 10 становится 00, 11 - невозможное состояние)
anl A, #11000000b ; Зануляем испорченое тело сообщения
mov new_message_state,A ; Сохраним полученую маску нового состояния сообщения
mov A, @R0 ; Повторно загоняем сообщение в аккумулятор
anl A, #00111111b ; Зануляем старое состояние сообщения
orl A, new_message_state ; Даем сообщению новое состояние
mov @R0, A ; И загоняем назад
Next_Messages:
inc R0 ; Берем следующее сообщение
djnz message_counter,Process_Next_Messages ; Перебор всех сообщений
Пока_без_кота писал(а):Доброго времени суток. Надо написать кусок кода, который будет для 2 старших битов байта делать сдвиг влево не трогая остальные биты. Написал вот так, можно ли "быстрее, выше, сильнее" ?
...
Можно, если вспомнить про "битовый процессор" - используем или непосредственную перестановку бит в регистрах области битовой адресации (0х20-0х2F) или прямоадресуемые биты акумулятора (см.РСФ) и какой - либо из регистров с прямоадресуемыми битами.
примерно так:
mov c,bit
mov bit,c
где bit = адресу соответствующего бита.
Всем здравствуйте.
Подскажите, у каких производителей есть 80C31/51 с быстрыми ядрами и флэшем на борту? Имею в виду быстрее, чем средние 12 тактов на команду, где-то видел, что есть 1 такт на команду.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Доброго времени суток.
На 16 пиках смастерил себе макрос, который создает таблицу переходов на нужное количество. Очень удобная получилась штука. Не смог удержаться, чтобы не попытаться сообрудить что-то подобное для любимых MCS-51 и словил облом
Требуется создать таблицу переходов вида:
Тут ежли по макросам - зависит от компилятора, а не от системы команд.
Конкретику читать надо...
Там где-то было об объединении символьных строк (с51asm) и операторах
<...> и % ... вобщем раздел "макрооператоры" вычитывать надо...
С эти пока не разобрался, но попробовав другую IDE (Keil), убедился, что макрос "irpc" MCStudio обрабатывает некорректно (не согласно найденных примеров для этой IDE) А жаль.
Может ли кто-то привести в качестве примера 2 файла исходников на асме, которые в Keil транслируются и собираются в 1 hex, а то у меня что-то никак не получается перенести проект из нескольких файлов из MCStudio в Keil. Гуглю уже 2 день, и ничего внятного. Вот так не получается:
File: ADD.asm
;Add routine which will be called from other file
PUBLIC ADDNUM ;declare function as public
ADDNUM_ SEGMENT CODE ;define code segment for linker
RSEG ADDNUM_ ;select segment ADDNUM
ADDNUM: ;Our add routine
MOV R2,R1
ADD R2,R0
RET
File: Test.asm
EXTRN CODE (ADDNUM) ;define the external symbol
CSEG at 0 ;code starts at 0
MOV R0,#50 ;Some dummy instructions
MOV R1,#51
ACALL ADDNUM ;lets call this routine which is in second file
Там по синтаксису весьма значительная разница (между keil-подобными исходниками и MCStudio).
Надо весьма придирчиво переписывать...
Погляну... Как разумемс выше приведенное (add.asm) надо библиотекой сделать?
NAME Test
EXTRN CODE (ADDNUM) ;define the external symbol
CSEG at 0 ;code starts at 0
MOV R0,#50 ;Some dummy instructions
MOV R1,#51
ACALL ADDNUM ;lets call this routine which is in second file
JMP 0
END
NAME _ADD
;Add routine which will be called from other file
PUBLIC ADDNUM ;declare function as public
ADDNUM_ SEGMENT CODE ;define code segment for linker
RSEG ADDNUM_ ;select segment ADDNUM
ADDNUM: ;Our add routine
MOV R2, A
ADD A, @R0
RET
END
Как видите, были минимальные ошибки в синтаксисе
P.S. Еще, конечно, можно просто "include" если проект небольшой.
Добавлено after 1 minute 36 seconds:
BOB51 писал(а):... Как разумемс выше приведенное (add.asm) надо библиотекой сделать?
Там (в MCStudio) это понятие автономно компилируемого файла - библиотекаря в полном (обычном для трехкомпонентной системы ассемблер-линкер-библиотекарь) понимании там нету, только подключаемые файлы. Просто синтаксис директив упрощенный. Из-за того и практически не пользуюсь, хотя сама IDE и дополнительные средства отладки там превосходные...
ОЙ-ОЙ!
А таки обшибок в задачке мнооогооо...
Ежли у нас "изолированная" подпрограмма - т.е. может вызываться когда захочет и где захочет с задачей
только сменить значение в регистрах РОН указываемых в параметрах при вызове... Забыли про PSW и акумулятор...
Да и все действия делаются только с участием акумулятора...
Итог:
задача
имеем перед вызовом параметры в R0 и R1
по завершении результат сложения двух данных имевшихся в @R0 и @R1 размещается в R2
используется текущий регистровый банк
BOB51, Rtmip, спасибо вам огромное, за то, что помогаете!!! Это реально единственно более-менее живая тема по MCS-51 во всем рунете. Собственно предистория. Когда-то давно, я уже вопрошал в этой теме по поводу IDE для MCS-51. ARV, посоветовал мне MCStudio, за что ему огромное спасибо, это действительно стоящая вещь. Она достаточно проста, но в тоже время достаточно функциональна в плане отладки. Я учился на ней и горя не знал. Но вот передо мной стала проблема повторного использования уже написаного кода, и решил разбивать свои постепенно усложняющиеся проекты на отдельные модули. С помощью опять же ARV-а у меня все прекрасно получилось на этой IDE, хотя она изначально для этого не предназначена. Как писал BOB51, в MCStudio нет понятия библиотек, там просто подключаемые файлы. Поэтому я просто делал основной файл *.asm, а все подключаемые модули - *.inc
Умея все это, я уже давненько написал свой динамический диспетчер, который достает задачи из очереди и выполняет их. Он нормально работал. Потом я решил освоить 16 Пики (спасибо BOB51, он реально очень помог), и написал этот же (с небольшими изминениями, учитывая меньшие ресурсы пиков) диспетчер, и он получился реально прикольнее, я поприменял кучу макросов, благодаря которым настройка диспетчера становилась интуитивно понятной и простой. Я решил усовершенствовать макросами свой диспетчер на MCS-51 и столкнуля с глюками/ограничениями MCStudio и решил перенести его в Keil. Сегодня вечером попробую сделать, как написал Rtmip и отпишусь
2 BOB51 - задачка в примере взята с интернетов, там просто какй-то кусок кода, до котрого мне нет дела, прошу прощения, если ввел в заблуждение, я просто показал по какому принцыпу я делал многофайловый проект в Keil и получил облом.
Последний раз редактировалось Пока_без_кота Ср окт 12, 2016 14:26:39, всего редактировалось 2 раза.
у меня сохранилась версия MCStudio в "расширенном" варианте. этот вариант умеет работать с Си (подмножество SDCC) и, самое интересное, умеет работать в режиме FBD и (если не путаю ничего) в режиме, аналогичном Algoritm Builder.
FBD - это когда рисуется блок-схема обработки данных из всяких блоков (счетчик, триггер, элемент И и т.п.), а потом из этого генерируется исходник Си, который потом можно и подправить при необходимости.
Автор сего продукта на все ранее имевшиеся у меня контакты (а так же на найденные в интернете) никак не откликается... так что если кому интересно, могу предоставить инсталляторы - думаю, для автора ценность этого продукта давно нулевая, и он не обидется...
правда по неизвестным мне причинам все инсталляторы детектируются антивирусами, как заразные, но сильно сомневаюсь, что это на самом деле так: я у себя устанавливал, и никаких эффектов не возникло. видимо, какие-то особенности кода Delphi 7 сейчас пугают антивирусы...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Увы, похоже вы с ARV-ом про разные IDE говорите, он про MCStudio, а вы про MCU8051 IDE (тоже весьма ненеплохая штука, если подскажете, как в ней сделать проект из нескольких файлов - буду благодарен, ибо я и в ней пытался, но не получилось)
Ну да... я ж про ту самую MCU8051IDE v1.4.9 (http://www.moravia-microsystems.com/mcu-8051-ide/)...
Делал я заготовку под многофайловики там...
По такому же принципу, как и для моих "слэнговых" конструкций под c51asm...
Только вот с "переводом" синтаксиса/директив... мал поднатрахалси и на время отложил дальнейшее освоение.
У c51asm синтаксис под keil подгонялся, возможности явно поболее, а вот наглядность... G...
Кстати... можно мои последние проекты попробовать в keil сунуть - теоретически должон слопать...