Свежие обсуждения
Микроконтроллеры

Ликбез по программированию PIC , vol. # 2

1 11 17

Вопрос по Test01.pbas:

Строки 63, 71, 75, 79 обозначены комментом как задержка. Имеестя в виду задержка на время выполнения одной операции, т.е.1мкс при 4 МГц резонаторе? Её цель?

PS: в железе проверялась работа программы?

 

Задержки предусмотрены между выводом данных в порт и чтением данных из того же порта. Служат для гарантированного установления логических уровней на выводах контроллера перед опросом клавиатуры. Их длительность может быть от 1 до нескольких тактов, в данном случае это не принципиально. Точную величину можно увидеть в ассемблерном файле, который создается при компиляции. Об этом был разговор в "ликбезе-1".
Работа каждой программы тщательно проверяется мной в железе. Иначе для чего я платы сделал?

 

picmaniac , АУ! Вот это "тяпница"! Завтра уже очередная, а picmaniac еще из той не выбрался!

Я разобрался с программой сканирования и прикрутил к схеме индикатор WM1611 на Порт А: RA0 - DI, RA1 - clock, RA2 - H/K. Если не понравится, то можно переставить на Порт В. Проект на mb в аттаче.

PS: до 13-го (ориентировочно) вечером недоступен (нет сети).

58444.rar

 

Схема подключения клавиатуры и индикатора в аттаче.

58458.spl

 

Да жив я, жив... Просто занят по работе и дома сильно. К зиме готовимся. Беру тайм-аут ненадолго.

 

picmaniac: К зиме готовимся.

Наверное берлогу утепляет. А мы тута к зиме привычные, мы обычно к лету готовимся.

 

ПРЕВЕД!!! И берлогу тоже - сегодня вот окно меняли... В основном на работе заморочки.
I'll be back! Мы еще напрограммируем...

 

picmaniac: Мы еще напрограммируем

Как Вам мои дополнения к Вашей проге?

PS: Ув. Левон, пора бы Вам присоединиться к обсуждению, задать вопросы, если появятся. Ведь практически 50%, а то и более Вашего Т.З. по кодовому замку уже спроектировано, а отзыва не слышно.
Скажу по опыту, испытанному на своей шкуре. Намного интересней отследить создание программы от начала до конца, чем залить готовую прошивку и "балдеть" от того, что сабж работоспособен. Поверьте, возможность использовать BASIC (или С) для этих целей на порядок, а то и более, облегчает задачу программирования. Это говорю я, который написал последнюю программу (совсем маленькую - учебную) на "Алгол - 60" и до сего времени практически не имел навыков программирования! ЯВУ - рулят! Правда надо хоть немножко попрактиковаться на ASM-е (см. Likbez-01).

 

Splav56, прога эта не моя, а общая, как википедия. И любой желающий может вносить в неё изменения и дополнения, а затем представлять на всеобщее обозрение. И это я приветствую и одобряю.

Схемка .spl у меня чего-то не открывается. Может лучше её в GIF превратить для показа?

Пару слов о программе. Если она нормально работает с реальным железом - это главный плюс. В этом, можно сказать, и есть цель и смысл её существования на белом свете. Практика - критерий истины.
Программу бегло просмотрел и пока не вижу повода для серьезной критики. Хотелось бы глянуть и на алгоритм. Жаль, что индикатора такого у меня до сих пор нет. Проверил бы в железе. Смотреть подробно пока не получается - устал и голова не соображает.

Немного об оптимизации.

goto в ассемблере неизбежны. В ЯВУ они уже считаются нежелательными. Хороший алгоритм позволяет обойтись без них. Или, хотя бы, свести их к минимуму.

В процедурах, работающих с портами, для универсальности полезно не просто сохранять значение TRISA, но и перенастраивать порт под нужды процедуры. Кто знает, а вдруг RA0 и RA1 были настроены как входы перед вызовом процедуры WT1611out ? Пример есть:

TEMPPORT = PORTB ' Сохранение состояния порта
TEMPTRIS = TRISB ' Сохранение настройки порта
TRISB = TRISB and %00000001 ' RB1,RB2,RB3-выходы, RB4-RB7 входы
TRISB = TRISB or %11110000 ' Настройка RB0 не изменяется

Настройку не требующихся в процедуре выводов лучше не изменять. Был выходом - им и останься, был входом - что ж, сохраняй свою ориентацию. Возможно, потребуется явно задать и состояние защелок (я еще подумаю).
Перед выходом из процедуры - настройку порта и состояние защелок восстанавливаем.
PORTA = TEMPPORT
TRISA = TEMPTRIS ' А не лучше ли наоборот?
Сначала вернуть настройку выводов (вход/выход), а потом уж и восстановить значения в защелках. Хотя... тут тоже есть над чем подумать.

Не обязательно использовать глобальную переменную COUNT в процедуре ClearInd. Там можно и локальную использовать. ClearInd() - скобки не нужны. Просто ClearInd.
Это же касается и TEMPPORT, TEMPTRIS. Они могут быть локальными, хороший компилятор не станет выделять для их хранения лишних ячеек ОЗУ.

Еще одно выявленное мной замечание по mb. Каждую задержку delay_ms, delay_us он преобразует в отдельную последовательность ассемблерных инструкций (посмотрите сгенерированный asm). Это приводит к бесполезному и очень приличному расходу памяти программ. Поэтому, если в программе много одинаковых задержек, гораздо выгоднее один раз использовать delay с фиксированным аргументом, описав процедуру:

sub procedure delay200ms ' Для экономии памяти программ
delay_ms (200)
end sub

А затем уже вызывать эту процедуру сколько угодно раз. Экономия весьма и весьма ощутимая. И если требуется задержка вдвое, втрое длительней - выгодней дважды, трижды вызвать эту процедуру, а не использовать отдельный delay_ms или delay_us.

Вывод последовательности на индикатор, конечно, можем осуществить и "в лоб". Каждому биту - свой кусок кода. Однотипный. И свой кусок памяти программ. Просто и вполне работоспособно. Это хорошо, если битов четыре. А если их 1024? Так что в общем случае неплохо бы использовать тут цикл.

И напоследок то, о чём я уже неоднократно упоминал. При работе с битами регистров портов необходима повышенная внимательность и осторожность. http://www.pro-radio.ru/controllers/2883/

 

Splav56: пора бы Вам присоединиться к обсуждению
.. я чего-то не поспеваю за вами...
Splav56: возможность использовать BASIC (или С) для этих целей на порядок облегчает задачу программирования.
Изучение Бейсика вообще не входило в мои планы. Да у меня и литературы по нему нет... C чего вы вдруг на него перешли? Непонятно. Я думал, хотя бы один язык выучить. А теперь - ассемблер, "С", Basic, что дальше? Совсем запутался.
Splav56: написал последнюю программу на "Алгол - 60"
Ну, я тоже в своё время "нарисовал" какую-то картинку на PL-1 (на ЕС3310)...
Что-то, не хочу признаваться себе в этом, но похоже в последнее время и у меня наблюдается некоторый "упадок", правда не такой как у P-IV... (слава Богу, хотя несколько лет тому назад что-то подобно испытал и я). Мой "ангел-хранитель" на какое-то время покидает меня. Вот и хандрю. Надеюсь скоро "выйду" и догоню... Удачи!