Форум РадиоКот https://radiokot.ru/forum/ |
|
Вопросы начинающих PIC ASM https://radiokot.ru/forum/viewtopic.php?f=58&t=125684 |
Страница 9 из 22 |
Автор: | BOB51 [ Ср янв 04, 2017 09:18:17 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
"ПОНЕСЛОСЬ!" "великие материи" - а про интерес того Пока_без_кота (и иных начинающих) саапсем "фигвам"/флудням... А кто его знает? Один говорит, что пришел в тему троллить, другой, что развлекается. В МЯУ перенес. viewtopic.php?f=17&t=140481 Пусть в МЯУ троллят и развлекаются. aen |
Автор: | Пока_без_кота [ Ср янв 11, 2017 21:28:49 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
Доброго времени суток. Делаю таблицу дешифрации для 7-сегментного индикатора (общий анод). Решил сделать расширенный вариант, и кроме цифр 0-9 добавил шестнадцатеричные А-F. Добавляю в таком виде: СпойлерКод: dt b'00101000',b'01111110',b'10100100',b'01100100',b'01110010',b'01100001',b'00100001',b'01111100',b'00100000',b'01100000',b'00110000',b'00100011',b'10101001',b'00100110',b'10100001',b'10110001' Дизассемблер превращает это в: СпойлерКод: 046 3428 RETLW 0x28 84: dt b'00101000',b'01111110',b'10100100',b'01100100',b'01110010',b'01100001',b'00100001',b'01111100',b'00100000',b'01100000',b'00110000',b'00100011',b'10101001',b'00100110',b'10100001',b'10110001' 047 347E RETLW 0x7e 048 34A4 RETLW 0xa4 049 3464 RETLW 0x64 04A 3472 RETLW 0x72 04B 3461 RETLW 0x61 04C 3421 RETLW 0x21 04D 347C RETLW 0x7c 04E 3420 RETLW 0x20 04F 3460 RETLW 0x60 050 3430 RETLW 0x30 051 3423 RETLW 0x23 052 34A9 RETLW 0xa9 053 3426 RETLW 0x26 054 34A1 RETLW 0xa1 055 3402 RETLW 0x2 Видно, что последнее, 16 значение, превращено в какой-то бред - RETLW 0x2 Делаю ход конем, выношу это последнее значение отдельным dt: СпойлерКод: 046 3428 RETLW 0x28 84: dt b'00101000',b'01111110',b'10100100',b'01100100',b'01110010',b'01100001',b'00100001',b'01111100',b'00100000',b'01100000',b'00110000',b'00100011',b'10101001',b'00100110',b'10100001' 047 347E RETLW 0x7e 048 34A4 RETLW 0xa4 049 3464 RETLW 0x64 04A 3472 RETLW 0x72 04B 3461 RETLW 0x61 04C 3421 RETLW 0x21 04D 347C RETLW 0x7c 04E 3420 RETLW 0x20 04F 3460 RETLW 0x60 050 3430 RETLW 0x30 051 3423 RETLW 0x23 052 34A9 RETLW 0xa9 053 3426 RETLW 0x26 054 34A1 RETLW 0xa1 055 34B1 RETLW 0xb1 85: dt b'10110001' Вуаля, все как надо Это какое-то ограничение на количество значений в строке после dt ? Есть способ побороть ? Работаю в MPLAB 8.92. |
Автор: | Zhuk72 [ Ср янв 11, 2017 22:20:46 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
У меня Х из последних версий. Завел в него вашу строку целиком и получил предупреждение Цитата: Warning[209] bla-bla-bla 665 : Missing quote При этом 15-й байт был испорчен (0хА вместо 0хА1), а 16-й отсутствовал вообще. После этого разделил строку пополам, по 8 байт в каждой: в результате все прошло чисто. Причину не знаю. Отсюда вопрос: для чего вам нужна длинная строка? Чем привлекла? |
Автор: | Пока_без_кота [ Ср янв 11, 2017 22:55:39 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
Zhuk72 писал(а): ... для чего вам нужна длинная строка? Чем привлекла? Да ничем особо. Просто ассемблерный код в сравнении с Сишным, при одинаковом объеме полезной продуктивности, априори более растянут по вертикали. Чтобы меньше скролить экран, стараюсь минимизировать "высоту" кода, упаковывая все в макросы и подпрограммы, распихать их по подключаемым файлам, и заиметь компактный файл главного цикла в котором четко видно общий алгоритм работы программы. Поэтому же вместо кучи строчек с RETLW всегда использовал 1 строчку c dt. А тут оказывается есть какие-то ограничения)) Погуглил по форумам, оказывается в первых версиях MPLAB X вообще нельзя было больше 1 значения в строке. Вот и переходи после этого на "новейшие" ИДЕ |
Автор: | КРАМ [ Чт янв 12, 2017 04:26:24 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
Раз Вам так нравится MPLAB X, предлагаю Вам для просмотра длинного АСМ кода ДВА инструмента. 1. Открывание двух окон (вертикальных) с одинаковым открываемым файлом. Это позволяет смотреть два участка одного текста независимо и параллельно. 2. "Коллапсирование" участков кода (обычно подпрограмм или однотипной их группы). Это делается набором в начале строки текста fcom;<tab>. Сразу после нажатия на табуляцию будет сгенерированы теги "коллапсайдера". Дефолтное имя Вы исправляете на имя сворачиваемого участка, а сам сворачиваемый текст помещаете между тегами открытия и закрытия "коллапсайдера". Текст становится очень коротким, свернутые участки Вы легко открываете по мере необходимости. |
Автор: | Zhuk72 [ Чт янв 12, 2017 06:01:31 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
КРАМ писал(а): Раз Вам так нравится MPLAB X... У него 8.92 КРАМ писал(а): Это делается набором в начале строки текста fcom;<tab>... А вот это сюрприз. Я думал, что коллапсирование работает только в сишных исходниках, в асм тексты я не нашел этого в контекстном меню. Оказываются они таким вот хитрым образом закручиваются. Спасибо! Хотя для меня уже неактуально |
Автор: | botchin [ Чт янв 12, 2017 06:12:48 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
Цитата: There is a source file line limit (expanded) of 200 characters.
|
Автор: | Пока_без_кота [ Чт янв 12, 2017 08:21:39 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
botchin писал(а): ..200 characters. Спасибо, переделал в шестнадцатиричную, и все поместилось с запасом, одной строкой. |
Автор: | BOB51 [ Чт янв 12, 2017 08:42:39 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
Обычно в одной строке больше чем позволяют ограничители страницы буковок не ставлю... Правда исходники набираю в DPAD - текстовки универсальны для компиляторов любых семейств (mcs51, pic10/12/16/18, avr, i8080, z80). А уж затем использую в проектах. Жаль, что на сегодня сайт с проектом того редактора закрыт... |
Автор: | xterro [ Ср янв 25, 2017 18:07:49 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
Приветствую, где можно набрать простых примеров на asm, типа сложения/вычитания/деления/умножения 8/16 битных чисел, циклы, BCD и семисегментники, прерывания т.п. Нужны простые, лаконичные примеры(лучше с комментариями) для самообучения |
Автор: | Zhuk72 [ Ср янв 25, 2017 18:35:50 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
http://www.piclist.com/techref/microchip/routines.htm |
Автор: | Пока_без_кота [ Пн фев 06, 2017 20:42:24 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
Доброго времени суток. Возможно ли каким-то образом передать в качестве параметра макроса адрес таблицы ? Есть код следующего вида: СпойлерКод: Menu_1_routine clrf symbol_pointer String_1 movfw symbol_pointer call Table_Menu_1 andlw 0FFh btfsc STATUS,Z goto Out_1 call Send_LCD_Symbol incf symbol_pointer goto String_1 Out_1 return И таких выводов значений из таблиц есть много, и все они отличаются лишь содержимым таблицы. Или я хочу невозможного ? |
Автор: | Zhuk72 [ Пн фев 06, 2017 21:30:03 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
Судя по вашим последним постам, вам уже тесно в рамках ассемблера Переходите на Си. |
Автор: | Аlex [ Пн фев 06, 2017 22:13:47 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
Пока_без_кота писал(а): Возможно ли каким-то образом передать в качестве параметра макроса адрес таблицы ? А зачем передавать адрес, если можно передавать просто имя (хотя, по большому счёту, имя - это и есть адрес) , которое он будет заменять в тексте ?Код: my_macro MACRO table_name ; Вроде так макросы создаются, не помню уже... clrf table_name .......... .......... ENDM my_macro symbol_pointer ; Вызов макроса Да и не выиграете Вы ничего макросом, ни в объёме кода, ни в быстродействии. Вот если функцию создадите, то уже будет выигрыш по коду. Там уже придётся передавать адрес, и через косвенную его обрабатывать. |
Автор: | Albert_V [ Пн фев 06, 2017 22:30:13 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
Пока_без_кота, лень читать все ваши посты что бы узнать под какой PIC вы пишите программу. Для PIC18 (8bit): СпойлерКод: CODEPAGE_5x8 dw (Let_00) dw (Let_01) dw (Let_02) dw (Let_03) 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 СпойлерКод: CODEPAGE_5x8: .pword paddr(Let_00) .pword paddr(Let_01) .pword paddr(Let_02) .pword paddr(Let_03) Let_00: .byte 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00 Let_01: .byte 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00 Let_02: .byte 0x42, 0x61, 0x51, 0x49, 0x46, 0x00 Let_03: .byte 0x21, 0x41, 0x45, 0x4B, 0x31, 0x00 |
Автор: | BOB51 [ Вт фев 07, 2017 07:08:19 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
Пока_без_кота писал(а): Доброго времени суток. Возможно ли каким-то образом передать в качестве параметра макроса адрес таблицы ? ... И таких выводов значений из таблиц есть много, и все они отличаются лишь содержимым таблицы. Или я хочу невозможного ? Векторный переход по смещению и базовому адресу? У стандартных среднемладших для подобных фокусов используются команды, модифицирующие PCL . Только надо при том помнить про содержимое pclath и про то, что перенос при переполнении PCL в результате операций с ним автоматически не распространяется на pclath - воть тута надо макрос шкарябать (как и для временного хранения исходного значения pclath). У "улучшенных" среднемладших и 18-й несколько получше "фокусы" получаются. |
Автор: | Пока_без_кота [ Вт фев 07, 2017 09:33:16 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
Всем доброго времени суток. Спасибо, даже не ожидал такого внимания к моему вопросу. Отвечаю всем по порядку. 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 Menu_2 add_PCL_symbol_pointer_0x100 dt "2.Guard Off",0 Menu_3 add_PCL_symbol_pointer_0x100 dt "3.Current Alarm",0 Menu_4 add_PCL_symbol_pointer_0x100 dt "4.Current Malfunction",0 Menu_5 add_PCL_symbol_pointer_0x100 dt "5.Option",0 ;=========================== Menu_1_Submenu_1 add_PCL_symbol_pointer_0x100 dt "1.Garage",0 Menu_1_Submenu_2 add_PCL_symbol_pointer_0x100 dt "2.Doors",0 Menu_1_Submenu_3 add_PCL_symbol_pointer_0x100 dt "3.House",0 ;---------- Table_Submenu code 0x200-4 Menu_2_Submenu_1 add_PCL_symbol_pointer_0x200 dt "1.Garage",0 Menu_2_Submenu_2 add_PCL_symbol_pointer_0x200 dt "2.Doors",0 Menu_2_Submenu_3 add_PCL_symbol_pointer_0x200 dt "3.House",0 ;---------- Menu_3_Submenu_1 add_PCL_symbol_pointer_0x200 dt "1.Review",0 Menu_3_Submenu_2 add_PCL_symbol_pointer_0x200 dt "2.Shut Off",0 Menu_3_Submenu_3 add_PCL_symbol_pointer_0x200 dt "3.FAQ",0 ;---------- Menu_4_Submenu_1 add_PCL_symbol_pointer_0x200 dt "1.Review",0 Menu_4_Submenu_2 add_PCL_symbol_pointer_0x200 dt "2.Shut Off",0 Menu_4_Submenu_3 add_PCL_symbol_pointer_0x200 dt "3.FAQ",0 ;---------- Menu_5_Submenu_1 add_PCL_symbol_pointer_0x200 dt "1.Configuration",0 Menu_5_Submenu_2 add_PCL_symbol_pointer_0x200 dt "2.Settings",0 Menu_5_Submenu_3 add_PCL_symbol_pointer_0x200 dt "3.About",0 ;=========================== Menu_1_Submenu_1_action ; Выполняем действие 1 подпункта 1 пункта nop return Menu_1_Submenu_2_action ; Выполняем действие 2 подпункта 1 пункта nop return Menu_1_Submenu_3_action ; Выполняем действие 3 подпункта 1 пункта nop return ;---------- Menu_2_Submenu_1_action ; Выполняем действие 1 подпункта 2 пункта nop return Menu_2_Submenu_2_action ; Выполняем действие 2 подпункта 2 пункта nop return Menu_2_Submenu_3_action ; Выполняем действие 3 подпункта 2 пункта nop return ;---------- Menu_3_Submenu_1_action ; Выполняем действие 1 подпункта 3 пункта nop return Menu_3_Submenu_2_action ; Выполняем действие 2 подпункта 3 пункта nop return Menu_3_Submenu_3_action ; Выполняем действие 3 подпункта 3 пункта nop return ;---------- Menu_4_Submenu_1_action ; Выполняем действие 1 подпункта 4 пункта nop return Menu_4_Submenu_2_action ; Выполняем действие 2 подпункта 4 пункта nop return Menu_4_Submenu_3_action ; Выполняем действие 3 подпункта 4 пункта nop return ;---------- Menu_5_Submenu_1_action ; Выполняем действие 1 подпункта 5 пункта nop return Menu_5_Submenu_2_action ; Выполняем действие 2 подпункта 5 пункта nop return Menu_5_Submenu_3_action ; Выполняем действие 3 подпункта 5 пункта nop return ;=========================== end |
Автор: | Пока_без_кота [ Пн мар 13, 2017 19:20:38 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
Доброго времени суток. Я как всегда со своим извечным "А можно ли лучше ?" Делаю простенький термометр на 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 ; Возврат с посчитанными значениями десятков и единиц |
Автор: | PicNik [ Пн мар 13, 2017 20:03:39 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
incf index,1 movlw 0ah subwf index,0 btfss STATUS,Z ;--edinici goto now clrf index incf sdvig,1 movlw 0ah subwf sdvig,0 btfss STATUS,Z ;--desjatki goto now goto ind |
Автор: | botchin [ Пн мар 13, 2017 21:00:31 ] |
Заголовок сообщения: | Re: Вопросы начинающих PIC ASM |
AN526 Microchip И часть оттуда: Код: BinBCD clrf MSD
movwf LSD gtenth movlw .10 subwf LSD,W BTFSS STATUS,C goto over movwf LSD incf MSD, F goto gtenth over retlw 0 |
Страница 9 из 22 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |