"великие материи" - а про интерес того Пока_без_кота (и иных начинающих) саапсем "фигвам"/флудням...
А кто его знает? Один говорит, что пришел в тему троллить, другой, что развлекается. В МЯУ перенес. viewtopic.php?f=17&t=140481 Пусть в МЯУ троллят и развлекаются. aen
Доброго времени суток. Делаю таблицу дешифрации для 7-сегментного индикатора (общий анод). Решил сделать расширенный вариант, и кроме цифр 0-9 добавил шестнадцатеричные А-F. Добавляю в таком виде: Спойлер
... для чего вам нужна длинная строка? Чем привлекла?
Да ничем особо. Просто ассемблерный код в сравнении с Сишным, при одинаковом объеме полезной продуктивности, априори более растянут по вертикали. Чтобы меньше скролить экран, стараюсь минимизировать "высоту" кода, упаковывая все в макросы и подпрограммы, распихать их по подключаемым файлам, и заиметь компактный файл главного цикла в котором четко видно общий алгоритм работы программы. Поэтому же вместо кучи строчек с RETLW всегда использовал 1 строчку c dt. А тут оказывается есть какие-то ограничения)) Погуглил по форумам, оказывается в первых версиях MPLAB X вообще нельзя было больше 1 значения в строке. Вот и переходи после этого на "новейшие" ИДЕ
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Раз Вам так нравится MPLAB X, предлагаю Вам для просмотра длинного АСМ кода ДВА инструмента. 1. Открывание двух окон (вертикальных) с одинаковым открываемым файлом. Это позволяет смотреть два участка одного текста независимо и параллельно. 2. "Коллапсирование" участков кода (обычно подпрограмм или однотипной их группы). Это делается набором в начале строки текста fcom;<tab>. Сразу после нажатия на табуляцию будет сгенерированы теги "коллапсайдера". Дефолтное имя Вы исправляете на имя сворачиваемого участка, а сам сворачиваемый текст помещаете между тегами открытия и закрытия "коллапсайдера". Текст становится очень коротким, свернутые участки Вы легко открываете по мере необходимости.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Это делается набором в начале строки текста fcom;<tab>...
А вот это сюрприз. Я думал, что коллапсирование работает только в сишных исходниках, в асм тексты я не нашел этого в контекстном меню. Оказываются они таким вот хитрым образом закручиваются. Спасибо! Хотя для меня уже неактуально
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Обычно в одной строке больше чем позволяют ограничители страницы буковок не ставлю... Правда исходники набираю в DPAD - текстовки универсальны для компиляторов любых семейств (mcs51, pic10/12/16/18, avr, i8080, z80). А уж затем использую в проектах. Жаль, что на сегодня сайт с проектом того редактора закрыт...
Приветствую, где можно набрать простых примеров на asm, типа сложения/вычитания/деления/умножения 8/16 битных чисел, циклы, BCD и семисегментники, прерывания т.п. Нужны простые, лаконичные примеры(лучше с комментариями) для самообучения
Заголовок сообщения: Re: Вопросы начинающих PIC ASM
Добавлено: Пн фев 06, 2017 22:13:47
Модератор
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Пока_без_кота писал(а):
Возможно ли каким-то образом передать в качестве параметра макроса адрес таблицы ?
А зачем передавать адрес, если можно передавать просто имя (хотя, по большому счёту, имя - это и есть адрес) , которое он будет заменять в тексте ?
Код:
my_macro MACRO table_name ; Вроде так макросы создаются, не помню уже... clrf table_name .......... .......... ENDM
my_macro symbol_pointer ; Вызов макроса
Да и не выиграете Вы ничего макросом, ни в объёме кода, ни в быстродействии. Вот если функцию создадите, то уже будет выигрыш по коду. Там уже придётся передавать адрес, и через косвенную его обрабатывать.
Let_00 db 3E,41,00,00,00,3E,04,08,04,3E,00,00,00,41,3E,00 ; MONO Let_01 db 3E,7F,5B,55,55,55,6D,7F,7D,7D,41,7D,7D,7F,3E,00 ; STEREO Let_02 db 1C,14,1C,22,7F,00,00,00,00,22,14,08,14,22,00,00 ; MUTE Let_03 db 1C,1C,7F,41,41,41,41,41,41,41,41,41,41,41,41,7F ; BATT
Для PIC24 (16bit) (ASM30) /не самый лучший вариант/: Спойлер
Реальный адрес начала блока данных Let_XX получите при чтении данных по базовому адресу CODEPAGE_5x8 (адрес метки) + смещение по числу (строке) нужного блока данных.
Доброго времени суток. Возможно ли каким-то образом передать в качестве параметра макроса адрес таблицы ? ... И таких выводов значений из таблиц есть много, и все они отличаются лишь содержимым таблицы. Или я хочу невозможного ?
Векторный переход по смещению и базовому адресу?
У стандартных среднемладших для подобных фокусов используются команды, модифицирующие PCL . Только надо при том помнить про содержимое pclath и про то, что перенос при переполнении PCL в результате операций с ним автоматически не распространяется на pclath - воть тута надо макрос шкарябать (как и для временного хранения исходного значения pclath). У "улучшенных" среднемладших и 18-й несколько получше "фокусы" получаются.
Всем доброго времени суток. Спасибо, даже не ожидал такого внимания к моему вопросу. Отвечаю всем по порядку. 2 Zhuk72 Си уже по чуть-чуть начал учить, просто уже сделал проект простой древовидной менюшки на ассемблере, и хотел его "причесать", потому что в бессмертный PIC16F84 (1к слов) еле влезла менюшка 5 пунктов меню по 3 подпункта в каждом пункте (вместе с выводом на ЖК дисплей названий всех пунктов и подпунктов).
2 Аlex Насчет использования макроса и пользе функции. Я понимаю что макрос не даст мне выиграша ни в чем, кроме общего восприятия кода в месте использования макроса. Я и хочу его использовать лишь для передачи внутрь процедуры адреса таблица в качестве параметра. Проблема в том что я не знаю, как передать АДРЕС ТАБЛИЦЫ в качестве параметра внутрь процедуры.
2 Albert_V Все гораздо запущенее, я пишу для 12/16 Пиков Но за примеры спасибо, утянул себе в примеры, на будущее.
2 BOB51 Нет, это уже есть реализовано, надо именно предать внутрь процедуры АДРЕС ТАБЛИЦЫ. Передать 8-битный указатель проблемы нет. А а вот адрес таблицы не умею
П.С. Кажется до меня дошло, как реализовать задуманное, я просто подходил не с той стороны, позже отпишусь...
П.П.С. Спасибо всем, у меню получилось реализовать задуманное. Менюшка похудела до 740 слов при том же функционале.
Спойлер
Код:
include MicroMenu_Lib.h include HD44780_Lib.h
MicroMenu_Lib_udata udata_shr symbol_pointer res 1
global symbol_pointer extern Send_LCD_Symbol,Send_LCD_Command,Delay_4ms,Debounce_Delay ;=========================== MicroMenu code 0x100-4A ;=========================== Kursor movlw b'10001111' ; Установим курсор на последний символ 1 строки call Send_LCD_Command movlw '<' ; И нарисуем там указатель текущего пункта меню call Send_LCD_Symbol movlw SECOND_LINE ; Переводим указатель на вторую строку call Send_LCD_Command return ; И приступаем к отрисовке следующего пункта меню ;=========================== Num_of_Submenu_Table ; Возвращаем количество пунктов нужного подменю, следить, чтобы все элементы данной таблицы находились на одной странице movfw index_menu clrf PCLATH ; bsf PCLATH,0 ; Если таблица размещена до адреса 0x0FF, закоментировать addwf PCL retlw_num_of_submenu_punkts ;=========================== Switch_Menu call Debounce_Delay movlw CLR_DISP call Send_LCD_Command call Delay_4ms ; Обязательная задержка после очистки дисплея !!! call Switch_Menu_routine ; Рисуем текущий пункт меню call Kursor ; Нарисуем признак текущего пункта меню incf index_menu ; Берем следующий пункт movfw index_menu sublw NUM_OF_MAIN_MENU_PUNKTS ; Сравниваем с количеством пунктов меню btfsc STATUS,Z goto Correct_index_menu call Switch_Menu_routine decf index_menu ; Не забудем вернуть назад текущий пункт меню return Correct_index_menu ; Достигли последнего пункта меню, следующим отображаем 1 пункт clrf index_menu call Switch_Menu_routine movlw NUM_OF_MAIN_MENU_PUNKTS-1 movwf index_menu return
Switch_Menu_routine ; Подпрограмма вывода названия пункта меню на дисплей clrf symbol_pointer String call Switch_Menu_Table andlw 0FFh btfsc STATUS,Z return call Send_LCD_Symbol incf symbol_pointer goto String ;---------- Switch_Submenu ; Поместим курсор на нужный подпункт нужного пункта call Debounce_Delay movlw CLR_DISP call Send_LCD_Command call Delay_4ms ; Обязательная задержка после очистки дисплея !!! call Switch_Submenu_routine ; Рисуем текущий подпункт меню call Kursor ; Нарисуем признак текущего подпункта меню incf index_submenu call Num_of_Submenu_Table subwf index_submenu,w ; Сравниваем с количеством подпунктов меню btfsc STATUS,Z goto Correct_index_submenu call Switch_Submenu_routine decf index_submenu ; Не забудем вернуть назад текущий подпункт меню return Correct_index_submenu ; Достигли последнего подпункта меню, следующим отображаем 1 попункт clrf index_submenu call Switch_Submenu_routine call Num_of_Submenu_Table movwf index_submenu decf index_submenu
return
Switch_Submenu_routine ; Подпрограмма вывода названия пункта подменю на дисплей clrf symbol_pointer String_ call Switch_Submenu_Table andlw 0FFh btfsc STATUS,Z return call Send_LCD_Symbol incf symbol_pointer goto String_ ;=========================== Switch_Menu_Table movfw index_menu clrf PCLATH bsf PCLATH,0 addwf PCL ; Эта команда должна находится в ячейке с адресом 0x0FF goto_Punkt_Menu ; Макрос, создает теблицу переходов на пункты меню ;---------- Switch_Submenu_Table movfw index_menu clrf PCLATH bsf PCLATH,0 addwf PCL goto_Menu_X_Table ; Макрос, создает переходы на все подпункты меню goto_Punkt_Submenu ; Супермакрос, создает цепочку макросов, в количестве пунктов меню ;=========================== Action_Switch ; Выполним действие, на котором находится курсор call Debounce_Delay movlw CLR_DISP call Send_LCD_Command call Delay_4ms ; Обязательная задержка после очистки дисплея !!! movfw index_menu ; Берем выбраный пункт меню clrf PCLATH bsf PCLATH,0 addwf PCL ; Переходим на нужную ветку goto_Menu_X_Table_action ; Макрос, создает переходы на все подпункты меню goto_Punkt_Submenu_action ; Супермакрос, создает цепочку макросов, в количестве веток выполняемых действий ;=========================== Menu_1 add_PCL_symbol_pointer_0x100 dt "1.Guard On",0
Доброго времени суток. Я как всегда со своим извечным "А можно ли лучше ?" Делаю простенький термометр на 12 Пике, со светодиодным индикатором. Решил для лучшего понимания сам написать процедуру перекодировки двоичного числа в двоично-десятичное. Пока только на 2 разряда, температура дома вряд-ли перевалит за сотню)) Все получилось, но интересует, как можно улучшить код. Спойлер
Код:
Bin_2_BCD_Lite movlw .10 ; Задаем счетчик десятков movwf counter clrf decades_num ; Обнуляем количество десятков clrf units_num ; Обнуляем количество единиц movfw conv_value ; Заносим проверяемое значение в рабочий регистр Loop_decades movwf conv_value_temp ; Сохраняем полученное значение в промежуточную ячейку movlw .10 subwf conv_value_temp,w ; Вычитаем 10, сохраняем в рабочий регистр btfss STATUS,C ; Если возник флаг займа, goto Decades_End ; Прекращаем вычитать десятки incf decades_num ; Иначе увеличиваем количество десятков в проверяемом числе decfsz counter ; Перебор возможного количества десятков goto Loop_decades clrf decades_num ; Обнуляем количество посчитанных десятков, количество единиц и так останется равным 0 retlw 0 ; Ошибка, возврат с нулевыми значениями десятков и единиц Decades_End movlw .10 ; Задаем счетчик единиц movwf counter Loop_units movlw .1 subwf conv_value_temp ; Вычитаем 1 btfss STATUS,C ; Если возник флаг займа, goto Units_End ; Прекращаем вычитать единицы incf units_num ; Иначе увеличиваем количество единиц в проверяемом числе decfsz counter ; Перебор возможного количества единиц goto Loop_units clrf decades_num ; Обнуляем количество посчитанных десятков clrf units_num ; Обнуляем количество посчитанных единиц retlw 0 ; Ошибка, возврат с нулевыми значениями десятков и единиц Units_End retlw 1 ; Возврат с посчитанными значениями десятков и единиц
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения