Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
03.12.2011, 00:38
|
|
Вид на жительство
Регистрация: 07.09.2007
Адрес: Дерёвня Ишимбай
Сообщений: 419
Сказал спасибо: 65
Сказали Спасибо 136 раз(а) в 87 сообщении(ях)
|
Мигание светодиодом :)
Проще некуда!
Необходимо организовать мигание светодиода в цикле (ассемблер).
MAIN
Если в предыдущем цикле светодиод горел, то погасить
Если в предыдущем цикле светодиод не горел, то включить
GOTO MAIN
Думал, думал но получается только так (возможно просто уже поздно):
MAIN
Включить
Выключить (сразу переключает, а должен только после повторного вызова MAIN)
GOTO MAIN
На Си брал переменную байт и прибавлял ++ когда равна 0 то погасить, 1 - включить, 3 - ... (делал что-то там). В общем не хочется городить огород. Может кто знает простое и красивое решение?
|
|
|
Сказали "Спасибо" Slava-martyn
|
|
|
03.12.2011, 00:58
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: Мигание светодиодом :)
Сообщение от Slava-martyn
|
Необходимо организовать мигание светодиода в цикле (ассемблер).
|
Жесть!!!
Что... изобрели кроссплатформенный ассемблер???
Или может... проц укажете??? Обычно такое делается командой инверсии бита... если такая существует... или через проверку флага... если включен, то выключить, иначе - включить...
|
|
|
|
03.12.2011, 02:58
|
|
Супер-модератор
Регистрация: 09.06.2011
Сообщений: 2,676
Сказал спасибо: 74
Сказали Спасибо 1,806 раз(а) в 654 сообщении(ях)
|
Re: Мигание светодиодом :)
Самое простое и красивое решение - через функцию XOR, которая дает возможность проинвертировать произвольные биты. Например, если светодиод находится на 0-й линии порта, работающего на вход и на выход, то в общем случае это будет что-то вроде (в стиле проца КР580):
Цитата:
|
MAIN
IN PORT
XRI 1
OUT PORT
CALL DELAY_1CEK
GOTO MAIN
|
Либо "ксорим" значение переменной "LED", хранящей состояние линий порта "PORT", если он работает только на выход, и его значение прочитать непосредственно нельзя:
Цитата:
|
MAIN
LDA LED
XRI 1
STA LED
OUT PORT
CALL DELAY_1CEK
GOTO MAIN
|
Если берем конкретный проц, например PIC, то проще всего сделать так:
Цитата:
|
MAIN
movlw 1
xorwf PORTB, f
call DELAY_1CEK
goto MAIN
|
Подразумевается, что светодиод подключен к линии RB0, настроенной на выход.
Последний раз редактировалось RECTO; 03.12.2011 в 03:32.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо RECTO за это сообщение:
|
|
|
03.12.2011, 04:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: Мигание светодиодом :)
Для мигания светодиодом команда "xorwf PORTB" еще, куда не шла, но для серьезных проектов лучше так не делать. Эта команда выполняется по типу чтение-модификация-запись. Чтение происходит непосредственно с линий порта, а запись в выходные защелки. Такая модификация чревата тем, что с линий порта легко наловить помех, и это может привести, в данном случае, к нарушению последовательности чередования состояний светодиода.
Лучше как во втором варианте
Цитата:
|
"ксорим" значение переменной "LED", хранящей состояние линий порта "PORT"
|
|
|
|
Сказали "Спасибо" alvadep
|
|
|
03.12.2011, 04:48
|
|
Супер-модератор
Регистрация: 09.06.2011
Сообщений: 2,676
Сказал спасибо: 74
Сказали Спасибо 1,806 раз(а) в 654 сообщении(ях)
|
Re: Мигание светодиодом :)
Сообщение от alvadep
|
Для мигания светодиодом команда "xorwf PORTB" еще, куда не шла, но для серьезных проектов лучше так не делать. Эта команда выполняется по типу чтение-модификация-запись. Чтение происходит непосредственно с линий порта, а запись в выходные защелки. Такая модификация чревата тем, что с линий порта легко наловить помех, и это может привести, в данном случае, к нарушению последовательности чередования состояний светодиода.
|
Если конфигурация порта по ходу дела меняться не будет, то можно. Входным линиям ведь абсолютно без разницы, что там записано в выходные защелки. А с выходов (в данном случае) всегда будет читаться то, что Вы туда ранее записали. Я ведь не зря для примера использовал порт В, а не порт А, например.
|
|
|
|
03.12.2011, 07:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Мигание светодиодом :)
Если АВР - то достаточно в каждом цикле записывать единицу в ПИН-регистр ножки
|
|
|
|
03.12.2011, 10:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Мигание светодиодом :)
И что характерно, ни одного камента от ТС: Slava-martyn.
Похоже, он нас проверил, умеем ли мы делать ЭТО.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
03.12.2011, 10:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: Мигание светодиодом :)
Сообщение от RECTO
|
Если конфигурация порта по ходу дела меняться не будет, то можно. Входным линиям ведь абсолютно без разницы, что там записано в выходные защелки. А с выходов (в данном случае) всегда будет читаться то, что Вы туда ранее записали. Я ведь не зря для примера использовал порт В, а не порт А, например.
|
А чем порт В отличается от порта А?
Тут дело не в смене конфигурации. Пример. В выходной регистр RB0 записан 0. При чтении RB0 (как бы не был настроен порт, читаем с пина, а не с регистра), мы ожидает там 0, но прошла помеха и мы считали 1. Теперь инвертируем и получаем тоже состояние, что и было. И такие случаи не редки.
|
|
|
Сказали "Спасибо" alvadep
|
|
|
03.12.2011, 11:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207
Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)
|
Re: Мигание светодиодом :)
Сообщение от niXto
|
в каждом цикле записывать единицу в ПИН-регистр ножки
|
Про это мало кто знает, но во многих новых AVR работает команда
SBI PINx, n 'например SBI PINB,4
Она меняет состояние на выходе этого пина на противоположное. Выполняется за один такт.
|
|
|
|
03.12.2011, 11:23
|
|
Гражданин KAZUS.RU
Регистрация: 14.11.2008
Сообщений: 701
Сказал спасибо: 298
Сказали Спасибо 283 раз(а) в 193 сообщении(ях)
|
Re: Мигание светодиодом :)
Сообщение от lsa
|
Про это мало кто знает, но во многих новых AVR работает команда
SBI PINx, n 'например SBI PINB,4
Она меняет состояние на выходе этого пина на противоположное. Выполняется за один такт.
|
Вы, наверное, ещё не проснулись, но об этом niXto и написал. И эта команда была и есть во всех АВР, и "старых" и "новых".
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:45.
|
|