Страница 4 из 4

Re: 80C51GB

Добавлено: Вт ноя 29, 2011 09:02:29
МитяРа
seedbutcher писал(а):Если будет возможность
Те или иные приёмы и предпочтения в оформлении программы - вещь сугубо индивидуальная, хотя общие правила всё-же есть..
Главное из них одно, что-бы программа хорошо читалась и можно было-бы вспомнить, что она делает, например через год..
Всё остальное, как то, писать команды большими или маленькими буквами, давать меткам те или иные имена - это, как себя приучишь..
Мя например пишу программу маленькими буквами, а большими - определения, имена регистров и непосредственные значения данных..

Вот, в качестве примера оформления посмотри одну из моих стареньких правда программ..
Мя ни на чём не настаиваю, просто ты должен выработать "свой стиль"..
Что-то можешь у мя перенять, а что-то сам выдумаешь..

Re: 80C51GB

Добавлено: Вт ноя 29, 2011 09:13:01
seedbutcher
А вот можно еще пару комментариев про лишние команды?
А то опыта нет совсем.
Спасибо за пример! Изучу в свободное время. он для atmel?

Re: 80C51GB

Добавлено: Вт ноя 29, 2011 09:32:32
МитяРа
seedbutcher писал(а):он для atmel?
Для любой 51-класики и для СиЛабса тоже подойдёт, только настройка последовательного порта чуть подправится..
Это мя делал для отладочного модуля загрузчик, что-бы не прошивать микросхему, а загружать программу в ОЗУ, которое находилось в области памяти программ..
seedbutcher писал(а):можно еще пару комментариев про лишние команды?
Вот например, ты вызываешь отдельную подпрограмму при обработке прерывания.

Код: Выделить всё

ORG 07BH                       ; прерывание по завершению преобразования в АЦП0
CALL INTER_ANGLE               ; вызов подпрограммы обработки углов
RETI                           ; возврат из прерывания
Т.е. у тя получается, что пришло прерывание, ты прыгаешь на подпрограмму INTER_ANGLE, потом после её RET-а прыгаешь обратно, а потом по RETI выходишь из прерывания..
Одна из команд возврата - лишняя..

Надо было написать:

Код: Выделить всё

ORG 07BH                       ; прерывание по завершению преобразования в АЦП0
LJMP INTER_ANGLE               ; вызов подпрограммы обработки углов
А в конце подпрограммы INTER_ANGLE поставить RETI..

И ещё такой совет:
В системе команд МК51 нет команд jmp и call, а то, что ты написал, это псевдо-команды транслятора, который вместо них подставляет конкретные команды sjmp, ajmp, ljmp и acall и lcall в зависимости от длины вызова/перехода..

Не привыкай к просто jmp и call - ставь конкретную команду..

P.S. И ещё, не забывай в подпрограммах обработки прерываний и в остальных подпрограммах сохранять И и возвращать ИЗ стека значения регистров, которые данная подпрограмма изменяет..
Это не относится к тем регистрам, через которые могут передаваться/возвращаться параметры подпрограмме..

Т.е. в начале твоей подпрограммы INTER_ANGLE должны быть строчки:

Код: Выделить всё

push ACC
push PSW
push B
А в конце, перед командой возврата, наоборот:

Код: Выделить всё

pop B
pop PSW
pop ACC
Обращаю внимание, что в этих командах аккумулятор надо писать, именно так - ACC, а непросто А..
И слово состояния, PSW для порядка сохраняется, что-б не терялись флаги основной программы..

Re: 80C51GB

Добавлено: Вт ноя 29, 2011 17:11:56
seedbutcher
Понял)
Тут есть разница. Можно обработчик углов писать именно как подпрограмму и тогда вызывать через CALL и в конце писать RET. Это одно.
А вот писать LJMP и перемещать RETI, это уже другое. это просто переход на адрес без организации подпрограммы.

Re: 80C51GB

Добавлено: Вт ноя 29, 2011 17:18:38
МитяРа
seedbutcher писал(а):это просто переход на адрес без организации подпрограммы.
Как это? И ret и reti это оба возврата из подпрограммы, только одна из просто подпрограммы, а другая из подпрограммы обработки соответствующего прерывания..
Как собственно у тя и сделано..

Если-бы у тя подпрограмма INTER_ANGLE вызывалась в программе ещё где-то, то мя про ljmp и reti не написал-бы..

Re: 80C51GB

Добавлено: Вт ноя 29, 2011 17:23:17
seedbutcher
Просто она у меня вызывается именно через CALL. Но Вы правы, можно просто заменить на ljmp.

Re: 80C51GB

Добавлено: Вт ноя 29, 2011 17:29:44
МитяРа
seedbutcher писал(а):можно просто заменить на ljmp.
Если просто заменишь на ljmp , но не заменишь ret на reti, то "упрыгаешь" далеко-далеко..

Кстати, у тя в программе нет настройки стека..
Его в принципе почти всегда хватает установленного по умолчанию, но не всегда так бывает..

Re: 80C51GB

Добавлено: Вт ноя 29, 2011 17:34:15
seedbutcher
МитяРа писал(а):
seedbutcher писал(а):можно просто заменить на ljmp.
Если просто заменишь на ljmp , но не заменишь ret на reti, то "упрыгаешь" далеко-далеко..
Это понятно.
Стек я думаю не трогать пока. Если в дальнейшем надо будет, то переопределю.

Re: 80C51GB

Добавлено: Вт ноя 29, 2011 19:26:36
seedbutcher
Ну и вот еще.
Все же ASM или C? и почему? А то в интернете мнений просто очень-очень много

Re: 80C51GB

Добавлено: Ср ноя 30, 2011 08:14:56
BOB51
прямое управление ресурсами МК, прикладные библиотеки и наиболее оптимальное самостоятельное распределение ресурсов при объёмах пзу до 10кило машинных кодов - предпочтение асму, математика, работа различных ОС, большой (32-64 и более кило) объём пзу - предпочтение С.
Лучший результат - доскональное знание того и другого, желательно не менее чем в 3-4 различных семействах(системах) :beer:

Re: 80C51GB

Добавлено: Ср ноя 30, 2011 09:43:09
МитяРа
Мяу всем..
BOB51 писал(а):Лучший результат - доскональное знание того и другого,
Соглашусь полностью.. Хотя сам пишу исключительно на Асме..
Всё зависит от конкретной задачи.. Иногда самым оптимальным будет Си-шная программа с Ассемблерными вставками..

Re: 80C51GB

Добавлено: Ср ноя 30, 2011 12:19:23
BOB51
жаль только, что для асма и С требуется разный подход - асм требует знаний железа и схемотехники, а С наоборот - абстрагирования от мелочей (на первый взгляд)
кроме того помощ по асму в большинстве случаев строится с подходом "освоение с нуля", а вот для С - наоборот :"азы вы уже давно знаете"
ну и диалкетов... :cry:

Re: 80C51GB

Добавлено: Ср ноя 30, 2011 12:46:16
МитяРа
Ну да, ну да..

seedbutcher, гляжу аватарку кошачью завёл, значит прижился.. :))