14.08.2013, 19:29
|
|
Вид на жительство
Регистрация: 15.07.2007
Адрес: Одесса
Сообщений: 434
Сказал спасибо: 71
Сказали Спасибо 125 раз(а) в 78 сообщении(ях)
|
Функция if на ассемблере для PIC
Доброе время суток.
Есть небольшой вопросик (хотел его написать года два назад, но всё откладывал ). Привожу цитату (т.к. книжка с "пометками на полях") из книги Тима Уилмсхерста "Разработка встроенных систем с помощью микроконтроллеров PIC" (2008 год, стр. 107,108 ).
Цитата:
|
... если выполняется манипулирование отдельным битом, то это не оказывает воздействия на какие-либо иные разряды порта, в который производится запись. Если нажат соответствующий микропереключатель, то включается светодиод. Вместе с тем даже эта простая задача требует некоторого размышления. Поскольку при нажатии кнопки вход порта переходит в состояние, соответствующее логическому 0, то программе необходимо установить выходной бит в состояние, соответствующее логической 1 (чтобы включить светодиод), при состоянии входа, соответствующее логическому 0, и наоборот. Это подразумевает реализацию процесса выбора - на языке высокого уровня мы могли бы воспользоваться структурой
if ... else
Простая команда пропуска не способна сделать это самостоятельно. Один из способов это реализовать состоит в том, чтобы предварительно установить выходной бит в какое-то одно значение, а затем изменить его, если окажется, что бит установлен неверно.
; главная программа
movlw 00;
movwf porta;
movwf portb;
loop bcf portb, 3; предварительная очистка 3-го разряда порта В
btfss porta, 3;
bsf portb, 3; если кнопка нажата, то установка.
bcf portb, 4; предварительная очистка 4-го разряда порта В
btfss porta, 4;
bsf portb, 4; если кнопка нажата, то установка
goto loop;
end
|
В такой программе будут мерцать светодиоды (так, собственно и было в mplab).
Собственно вопрос: Почему он пишет, что на ассемблере невозможно реализовать функцию if ? (я спрашивал ещё у ребят, они говорили тоже самое).
В начале 90-х я ещё тогда написал эту функцию (полная прога со схемой железа для контроля и управления дизеля) для одного ДАУ (правда на ВМ80).
Вот исправленная программка:
loop btfss porta, 3;
bcf portb, 3;
btfsc porta, 3;
bsf portb, 3;
;
btfss porta, 4;
bcf portb, 4;
btfsc porta, 4;
bsf portb, 4;
goto loop;
end;
Повторю вопрос: разве это не является командой if ? (Никакие светодиоды не мерцают. Всё работает. При этом выход удерживается ).
Или я чего-то недопонимаю?
__________________
И если б не было Одессы, шоб я делал?!
Последний раз редактировалось val_ka; 14.08.2013 в 19:32.
|
|
|
|
14.08.2013, 19:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: Функция if на ассемблере для PIC.
Это не совсем то, о чем речь. У Вас получается if ... if, а речь идет о if ... else. Но результат будет один и тот же.
Нечто похожее на if...else будет если использовать btfss совместно с goto, но блюстителям чистоты кода goto как кость в горле.
Код:
|
l1
btfss porta, 4
goto l2
bsf portb, 4
goto l3
l2
bcf portb, 4
l3
........
goto l1 |
Последний раз редактировалось alvadep; 14.08.2013 в 20:30.
|
|
|
Сказали "Спасибо" alvadep
|
|
|
14.08.2013, 23:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Функция if на ассемблере для PIC.
Сообщение от alvadep
|
но блюстителям чистоты кода goto как кость в горле.
|
Пишите B
PHP код:
|
DECFSZ S_TMP
B $-3
|
Кстати, а почему?
|
|
|
|
14.08.2013, 23:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: Функция if на ассемблере для PIC.
Это больше касается ЯВУ.
http://inf.1september.ru/view_article.php?ID=200800105
Но, честно говоря, мне и на асме не очень нравятся такие переходы. Как по мне, то лучше добавить еще одно условие как у ТС или дополнительную переменную, но сохранить линейность алгоритма.
|
|
|
|
14.08.2013, 23:41
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,565
Сказал спасибо: 5,041
Сказали Спасибо 10,615 раз(а) в 3,604 сообщении(ях)
|
Re: Функция if на ассемблере для PIC.
Сообщение от val_ka
|
В такой программе будут мерцать светодиоды (так, собственно и было в mplab).
|
Да, Вы правы. У меня частенько закрадывается подозрение, что авторы подобных книг умышленно делают в своих примерах такие "бяки". Для пользы читателей. Это заставляет начинающего программиста не просто тупо копировать примеры из книги, а еще и шевелить своими мозгами.
В пиках менять состояние отдельных битов порта чревато последствиями. Поэтому я в подобных случаях пользуюсь вспомогательной переменной в ОЗУ, копией порта, с которой могу делать что угодно, менять любые биты. А когда все биты установлены как хотелось - спокойно посылаю этот байт целиком в порт. Такой способ гарантирует надежную работу порта в условиях сильных помех.
Способ, придуманный Вами,
Сообщение от val_ka
|
btfss porta, 4;
bcf portb, 4;
btfsc porta, 4;
bsf portb, 4;
|
тоже имеет право на жизнь. Да, ложные мигания при этом исключаются. Но и в этом случае работа с отдельными выводами порта не всегда применима. Например, если это динамическая индикация, то формирование состояния порта затянется по времени, и получится размазня. Поэтому все равно лучше сначала тихонько подготовить состояние порта (или нескольких портов) во временной переменной, а когда будет все готово - быстренько переписать переменную в порт.
По сути вопроса - чистым эквивалентом структуры if ... then ... else я считаю
Сообщение от alvadep
|
если использовать btfss совместно с goto
|
Потому что этот вариант позволяет задавать не один, а любое количество операторов и для then, и для else, как и в классических языках высокого уровня.
|
|
|
Сказали "Спасибо" Alex9797
|
|
|
14.08.2013, 23:49
|
|
Гражданин KAZUS.RU
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
|
Re: Функция if на ассемблере для PIC.
Сообщение от alvadep
|
мне и на асме не очень нравятся такие переходы
|
Не представляю себе эффективный код без излишеств на асме без goto.
|
|
|
|
14.08.2013, 23:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: Функция if на ассемблере для PIC.
Flopix, а далеко ходить не надо. Сравните пример ТС и мой с операторами goto. Казалось бы мелочи, но тем не менее более читабельный код у ТС. И я ведь не отказываюсь от goto, просто стараюсь использовать как можно реже, дабы не получилось так называемого спагетти-кода.
P.S. Иногда стоит перекомпоновать куски программы так чтобы избавится от лишних переходов. Мое мнение.
Последний раз редактировалось alvadep; 15.08.2013 в 00:03.
|
|
|
Сказали "Спасибо" alvadep
|
|
|
15.08.2013, 00:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,565
Сказал спасибо: 5,041
Сказали Спасибо 10,615 раз(а) в 3,604 сообщении(ях)
|
Re: Функция if на ассемблере для PIC.
Сообщение от Flopix
|
Не представляю себе эффективный код без излишеств на асме без goto.
|
Я тоже.
Если взять программу, написанную на языке высокого уровня, в которой нет ни одного goto, а потом посмотреть машинные коды, в которые эта прога компилируется - там в глазах рябить будет от обилия этих самых "goto"! Ведь без них - никак не обойтись.
|
|
|
|
15.08.2013, 00:26
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: Функция if на ассемблере для PIC.
Сообщение от val_ka
|
В такой программе будут мерцать светодиоды (так, собственно и было в mplab).
|
Бред! Старый, добрый Хайтеч СТД:
Код:
|
25: if(!GPIO3) GPIO0 = 1;
3F8 1985 BTFSC GPIO, 0x3
3F9 2BFC GOTO 0x3fc
3FA 1405 BSF GPIO, 0
3FB 2BFD GOTO 0x3fd
26: else
27: {
28: GPIO0 = 0;
3FC 1005 BCF GPIO, 0
29: } |
И где тут что-то будет мерцать?
Последний раз редактировалось nahimovv; 15.08.2013 в 00:31.
|
|
|
|
15.08.2013, 00:27
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: Функция if на ассемблере для PIC.
Сообщение от alvadep
|
Но, честно говоря, мне и на асме не очень нравятся такие переходы. Как по мне, то лучше добавить еще одно условие как у ТС или дополнительную переменную, но сохранить линейность алгоритма.
|
Ужос! "Как всё запущено!"(С)
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:10.
|
|