Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


Закрытая тема
Опции темы
Непрочитано 14.08.2013, 19:29   #1
val_ka
Вид на жительство
 
Регистрация: 15.07.2007
Адрес: Одесса
Сообщений: 434
Сказал спасибо: 71
Сказали Спасибо 125 раз(а) в 78 сообщении(ях)
val_ka на пути к лучшему
По умолчанию Функция 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.
val_ka вне форума  
Непрочитано 14.08.2013, 19:47   #2
alvadep
Почётный гражданин KAZUS.RU
 
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
alvadep на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" alvadep
Alex9797 (14.08.2013)
Непрочитано 14.08.2013, 23:04   #3
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Функция if на ассемблере для PIC.

Сообщение от alvadep Посмотреть сообщение
но блюстителям чистоты кода goto как кость в горле.
Пишите B
PHP код:
DECFSZ    S_TMP
B    
$-


Кстати, а почему?
omercury вне форума  
Непрочитано 14.08.2013, 23:25   #4
alvadep
Почётный гражданин KAZUS.RU
 
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
alvadep на пути к лучшему
По умолчанию Re: Функция if на ассемблере для PIC.

Это больше касается ЯВУ.
http://inf.1september.ru/view_article.php?ID=200800105
Но, честно говоря, мне и на асме не очень нравятся такие переходы. Как по мне, то лучше добавить еще одно условие как у ТС или дополнительную переменную, но сохранить линейность алгоритма.
alvadep вне форума  
Непрочитано 14.08.2013, 23:41   #5
Alex9797
Почётный гражданин KAZUS.RU
 
Аватар для Alex9797
 
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,565
Сказал спасибо: 5,042
Сказали Спасибо 10,611 раз(а) в 3,604 сообщении(ях)
Alex9797 на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" Alex9797
val_ka (15.08.2013)
Непрочитано 14.08.2013, 23:49   #6
Flopix
Гражданин KAZUS.RU
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: Функция if на ассемблере для PIC.

Сообщение от alvadep Посмотреть сообщение
мне и на асме не очень нравятся такие переходы
Не представляю себе эффективный код без излишеств на асме без goto.
Flopix вне форума  
Сказали "Спасибо" Flopix
Alex9797 (14.08.2013)
Непрочитано 14.08.2013, 23:59   #7
alvadep
Почётный гражданин KAZUS.RU
 
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
alvadep на пути к лучшему
По умолчанию Re: Функция if на ассемблере для PIC.

Flopix, а далеко ходить не надо. Сравните пример ТС и мой с операторами goto. Казалось бы мелочи, но тем не менее более читабельный код у ТС. И я ведь не отказываюсь от goto, просто стараюсь использовать как можно реже, дабы не получилось так называемого спагетти-кода.

P.S. Иногда стоит перекомпоновать куски программы так чтобы избавится от лишних переходов. Мое мнение.

Последний раз редактировалось alvadep; 15.08.2013 в 00:03.
alvadep вне форума  
Сказали "Спасибо" alvadep
val_ka (15.08.2013)
Непрочитано 15.08.2013, 00:00   #8
Alex9797
Почётный гражданин KAZUS.RU
 
Аватар для Alex9797
 
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,565
Сказал спасибо: 5,042
Сказали Спасибо 10,611 раз(а) в 3,604 сообщении(ях)
Alex9797 на пути к лучшему
По умолчанию Re: Функция if на ассемблере для PIC.

Сообщение от Flopix Посмотреть сообщение
Не представляю себе эффективный код без излишеств на асме без goto.
Я тоже.

Если взять программу, написанную на языке высокого уровня, в которой нет ни одного goto, а потом посмотреть машинные коды, в которые эта прога компилируется - там в глазах рябить будет от обилия этих самых "goto"! Ведь без них - никак не обойтись.
Alex9797 вне форума  
Непрочитано 15.08.2013, 00:26   #9
nahimovv
Заблокирован
 
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
nahimovv на пути к лучшему
По умолчанию 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.
nahimovv вне форума  
Непрочитано 15.08.2013, 00:27   #10
nahimovv
Заблокирован
 
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
nahimovv на пути к лучшему
По умолчанию Re: Функция if на ассемблере для PIC.

Сообщение от alvadep Посмотреть сообщение
Но, честно говоря, мне и на асме не очень нравятся такие переходы. Как по мне, то лучше добавить еще одно условие как у ТС или дополнительную переменную, но сохранить линейность алгоритма.
Ужос! "Как всё запущено!"(С)
nahimovv вне форума  
Закрытая тема

Закладки


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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Апгрейд и комплектующие для ноутбуков mikesmith Барахолка электронных компонентов 28 17.05.2023 23:25
Книги dosikus Делимся опытом 11242 29.12.2015 23:45
Source Boost IDE для PIC - пора лечить ! avr123-nm-ru Микроконтроллеры, АЦП, память и т.д 10 11.09.2009 15:23
[Решено] Сборник перлов любителей кабельщины mikesmith Отвлекитесь, эмбеддеры! 135 14.08.2007 15:49


Часовой пояс GMT +4, время: 06:50.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot