Например TDA7294

Форум РадиоКот • Просмотр темы - Вопросы начинающих PIC ASM
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Ср апр 17, 2024 02:22:06

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 440 ]     ... , , , 9, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Ср янв 04, 2017 09:18:17 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14053
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
"ПОНЕСЛОСЬ!"
:)))
"великие материи" - а про интерес того Пока_без_кота
(и иных начинающих) саапсем "фигвам"/флудням...
:(




А кто его знает?
Один говорит, что пришел в тему троллить, другой, что развлекается.
В МЯУ перенес.
viewtopic.php?f=17&t=140481
Пусть в МЯУ троллят и развлекаются.
aen


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Ср янв 11, 2017 21:28:49 
Потрогал лапой паяльник

Карма: 1
Рейтинг сообщений: 13
Зарегистрирован: Чт авг 08, 2013 01:06:54
Сообщений: 359
Рейтинг сообщения: 0
Доброго времени суток. Делаю таблицу дешифрации для 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.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Ср янв 11, 2017 22:20:46 
Сверлит текстолит когтями
Аватар пользователя

Карма: 25
Рейтинг сообщений: 168
Зарегистрирован: Ср янв 29, 2014 08:41:31
Сообщений: 1231
Откуда: Баку
Рейтинг сообщения: 0
У меня Х из последних версий. Завел в него вашу строку целиком и получил предупреждение
Цитата:
Warning[209] bla-bla-bla 665 : Missing quote

При этом 15-й байт был испорчен (0хА вместо 0хА1), а 16-й отсутствовал вообще.

После этого разделил строку пополам, по 8 байт в каждой: в результате все прошло чисто.
Причину не знаю.

Отсюда вопрос: для чего вам нужна длинная строка? Чем привлекла?

_________________
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Ср янв 11, 2017 22:55:39 
Потрогал лапой паяльник

Карма: 1
Рейтинг сообщений: 13
Зарегистрирован: Чт авг 08, 2013 01:06:54
Сообщений: 359
Рейтинг сообщения: 0
Zhuk72 писал(а):
... для чего вам нужна длинная строка? Чем привлекла?

Да ничем особо. Просто ассемблерный код в сравнении с Сишным, при одинаковом объеме полезной продуктивности, априори более растянут по вертикали. Чтобы меньше скролить экран, стараюсь минимизировать "высоту" кода, упаковывая все в макросы и подпрограммы, распихать их по подключаемым файлам, и заиметь компактный файл главного цикла в котором четко видно общий алгоритм работы программы. Поэтому же вместо кучи строчек с RETLW всегда использовал 1 строчку c dt. А тут оказывается есть какие-то ограничения)) Погуглил по форумам, оказывается в первых версиях MPLAB X вообще нельзя было больше 1 значения в строке. Вот и переходи после этого на "новейшие" ИДЕ :)))


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Чт янв 12, 2017 04:26:24 
Друг Кота
Аватар пользователя

Карма: 138
Рейтинг сообщений: 2712
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 21790
Откуда: Московская область, Фрязино
Рейтинг сообщения: 5
Раз Вам так нравится MPLAB X, предлагаю Вам для просмотра длинного АСМ кода ДВА инструмента.
1. Открывание двух окон (вертикальных) с одинаковым открываемым файлом. Это позволяет смотреть два участка одного текста независимо и параллельно.
2. "Коллапсирование" участков кода (обычно подпрограмм или однотипной их группы). Это делается набором в начале строки текста fcom;<tab>. Сразу после нажатия на табуляцию будет сгенерированы теги "коллапсайдера". Дефолтное имя Вы исправляете на имя сворачиваемого участка, а сам сворачиваемый текст помещаете между тегами открытия и закрытия "коллапсайдера".
Текст становится очень коротким, свернутые участки Вы легко открываете по мере необходимости.


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Чт янв 12, 2017 06:01:31 
Сверлит текстолит когтями
Аватар пользователя

Карма: 25
Рейтинг сообщений: 168
Зарегистрирован: Ср янв 29, 2014 08:41:31
Сообщений: 1231
Откуда: Баку
Рейтинг сообщения: 0
КРАМ писал(а):
Раз Вам так нравится MPLAB X...

У него 8.92

КРАМ писал(а):
Это делается набором в начале строки текста fcom;<tab>...

А вот это сюрприз. Я думал, что коллапсирование работает только в сишных исходниках, в асм тексты я не нашел этого в контекстном меню. Оказываются они таким вот хитрым образом закручиваются. Спасибо! Хотя для меня уже неактуально :)

_________________
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Чт янв 12, 2017 06:12:48 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 81
Рейтинг сообщений: 440
Зарегистрирован: Чт дек 27, 2012 20:46:09
Сообщений: 2024
Откуда: Болгария, г. Лом
Рейтинг сообщения: 2
Цитата:
There is a source file line limit (expanded) of 200 characters.

_________________
Лом - ето город в Болгарии, а не инструмент юстировки електроники.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Чт янв 12, 2017 08:21:39 
Потрогал лапой паяльник

Карма: 1
Рейтинг сообщений: 13
Зарегистрирован: Чт авг 08, 2013 01:06:54
Сообщений: 359
Рейтинг сообщения: 0
botchin писал(а):
..200 characters.

Спасибо, переделал в шестнадцатиричную, и все поместилось с запасом, одной строкой.


Последний раз редактировалось Пока_без_кота Чт янв 12, 2017 09:35:35, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Чт янв 12, 2017 08:42:39 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14053
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Обычно в одной строке больше чем позволяют ограничители страницы буковок не ставлю...
Правда исходники набираю в DPAD - текстовки универсальны для компиляторов любых семейств
(mcs51, pic10/12/16/18, avr, i8080, z80). А уж затем использую в проектах.
Жаль, что на сегодня сайт с проектом того редактора закрыт...
:cry:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Ср янв 25, 2017 18:07:49 
Опытный кот
Аватар пользователя

Карма: 18
Рейтинг сообщений: 44
Зарегистрирован: Чт апр 12, 2012 07:19:59
Сообщений: 859
Откуда: Тюмень
Рейтинг сообщения: 0
Приветствую, где можно набрать простых примеров на asm, типа сложения/вычитания/деления/умножения 8/16 битных чисел, циклы, BCD и семисегментники, прерывания т.п. Нужны простые, лаконичные примеры(лучше с комментариями) для самообучения :solder:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Ср янв 25, 2017 18:35:50 
Сверлит текстолит когтями
Аватар пользователя

Карма: 25
Рейтинг сообщений: 168
Зарегистрирован: Ср янв 29, 2014 08:41:31
Сообщений: 1231
Откуда: Баку
Рейтинг сообщения: 4
http://www.piclist.com/techref/microchip/routines.htm

_________________
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Пн фев 06, 2017 20:42:24 
Потрогал лапой паяльник

Карма: 1
Рейтинг сообщений: 13
Зарегистрирован: Чт авг 08, 2013 01:06:54
Сообщений: 359
Рейтинг сообщения: 0
Доброго времени суток. Возможно ли каким-то образом передать в качестве параметра макроса адрес таблицы ?
Есть код следующего вида:
Спойлер
Код:
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


И таких выводов значений из таблиц есть много, и все они отличаются лишь содержимым таблицы. Или я хочу невозможного ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Пн фев 06, 2017 21:30:03 
Сверлит текстолит когтями
Аватар пользователя

Карма: 25
Рейтинг сообщений: 168
Зарегистрирован: Ср янв 29, 2014 08:41:31
Сообщений: 1231
Откуда: Баку
Рейтинг сообщения: 0
Судя по вашим последним постам, вам уже тесно в рамках ассемблера :)
Переходите на Си.

_________________
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Пн фев 06, 2017 22:13:47 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4510
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Пока_без_кота писал(а):
Возможно ли каким-то образом передать в качестве параметра макроса адрес таблицы ?
А зачем передавать адрес, если можно передавать просто имя (хотя, по большому счёту, имя - это и есть адрес) , которое он будет заменять в тексте ?
Код:
my_macro   MACRO   table_name     ; Вроде так макросы создаются, не помню уже...
  clrf   table_name
  ..........
  ..........
ENDM


my_macro  symbol_pointer   ; Вызов макроса


Да и не выиграете Вы ничего макросом, ни в объёме кода, ни в быстродействии. Вот если функцию создадите, то уже будет выигрыш по коду. Там уже придётся передавать адрес, и через косвенную его обрабатывать.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Пн фев 06, 2017 22:30:13 
Друг Кота
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1859
Зарегистрирован: Чт сен 12, 2013 00:54:12
Сообщений: 4119
Откуда: ЗаМКАДье. Там, где ЦУП
Рейтинг сообщения: 0
Медали: 5
Получил миской по аватаре (5)
Пока_без_кота, лень читать все ваши посты что бы узнать под какой 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
Для PIC24 (16bit) (ASM30) /не самый лучший вариант/:
Спойлер
Код:
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
Реальный адрес начала блока данных Let_XX получите при чтении данных по базовому адресу CODEPAGE_5x8 (адрес метки) + смещение по числу (строке) нужного блока данных.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Вт фев 07, 2017 07:08:19 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14053
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Пока_без_кота писал(а):
Доброго времени суток. Возможно ли каким-то образом передать в качестве параметра макроса адрес таблицы ?
...
И таких выводов значений из таблиц есть много, и все они отличаются лишь содержимым таблицы. Или я хочу невозможного ?


Векторный переход по смещению и базовому адресу?
8)
У стандартных среднемладших для подобных фокусов используются команды, модифицирующие PCL .
Только надо при том помнить про содержимое pclath и про то, что перенос при переполнении PCL в результате операций с ним автоматически не распространяется на pclath - воть тута надо макрос шкарябать (как и для временного хранения исходного значения pclath).
У "улучшенных" среднемладших и 18-й несколько получше "фокусы" получаются.
:beer:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Вт фев 07, 2017 09:33:16 
Потрогал лапой паяльник

Карма: 1
Рейтинг сообщений: 13
Зарегистрирован: Чт авг 08, 2013 01:06:54
Сообщений: 359
Рейтинг сообщения: 0
Всем доброго времени суток. Спасибо, даже не ожидал такого внимания к моему вопросу. Отвечаю всем по порядку.
2 Zhuk72
Си уже по чуть-чуть начал учить, просто уже сделал проект простой древовидной менюшки на ассемблере, и хотел его "причесать", потому что в бессмертный PIC16F84 (1к слов) еле влезла менюшка 5 пунктов меню по 3 подпункта в каждом пункте (вместе с выводом на ЖК дисплей названий всех пунктов и подпунктов).

2 Аlex
Насчет использования макроса и пользе функции. Я понимаю что макрос не даст мне выиграша ни в чем, кроме общего восприятия кода в месте использования макроса. Я и хочу его использовать лишь для передачи внутрь процедуры адреса таблица в качестве параметра. Проблема в том что я не знаю, как передать АДРЕС ТАБЛИЦЫ в качестве параметра внутрь процедуры.

2 Albert_V
Все гораздо запущенее, я пишу для 12/16 Пиков :))) Но за примеры спасибо, утянул себе в примеры, на будущее.

2 BOB51
Нет, это уже есть реализовано, надо именно предать внутрь процедуры АДРЕС ТАБЛИЦЫ. Передать 8-битный указатель проблемы нет. А а вот адрес таблицы не умею :dont_know:

П.С. Кажется до меня дошло, как реализовать задуманное, я просто подходил не с той стороны, позже отпишусь...

П.П.С. Спасибо всем, у меню получилось реализовать задуманное. Менюшка похудела до 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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Пн мар 13, 2017 19:20:38 
Потрогал лапой паяльник

Карма: 1
Рейтинг сообщений: 13
Зарегистрирован: Чт авг 08, 2013 01:06:54
Сообщений: 359
Рейтинг сообщения: 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                  ; Возврат с посчитанными значениями десятков и единиц


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Пн мар 13, 2017 20:03:39 
Прорезались зубы
Аватар пользователя

Карма: 26
Рейтинг сообщений: 66
Зарегистрирован: Вс июл 10, 2011 14:41:10
Сообщений: 223
Рейтинг сообщения: 0
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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы начинающих PIC ASM
СообщениеДобавлено: Пн мар 13, 2017 21:00:31 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 81
Рейтинг сообщений: 440
Зарегистрирован: Чт дек 27, 2012 20:46:09
Сообщений: 2024
Откуда: Болгария, г. Лом
Рейтинг сообщения: 0
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

_________________
Лом - ето город в Болгарии, а не инструмент юстировки електроники.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 440 ]     ... , , , 9, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y