Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: С ввода на вывод
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
what_you_want
Здравствуйте, стал разбираться с программой Isis для эмулирование МК, столкнулся со странной проблемой. Код:
CODE
.cseg
.org 0
ldi temp,RamEnd ;инициализация стека
out SPL,temp

ldi temp,0xFF ;настройка порта D на вывод
out DDRD,temp

ldi temp,0x00 ;настройка порта B на ввод
out DDRB,temp


Begin:

clr temp1 ;обнуляем регистр temp1
in temp1, PINB ;записываем данные из порта B в темп1
rcall Delay ;задержка
out PORTD, temp1 ;выводим данные в порт D
rcall Delay ;задержка
rjmp Begin ;сначала

; задержка

Delay:
ldi Temp3,0
ldi Temp4,0

Loop:
dec Temp3
brne Loop

dec Temp4
brne Loop

ret


Программа простая, в зависимости от нажатых кнопочек читаем единицы-нули с порта B и передаем их на порт D. Но тем не менее, на выходе всегда горят единицы, вне зависимости от нажатых кнопок. Что я делаю не так?
ut1wpr
Что значит "нажатых кнопочек"? Входы порта B куда замыкаются при нажатии? Это же не очевидно, надо указывать. Если замыкаем на землю, не мешает включить подтягиваюшие резисторы.
Зачем такая большая задержка. Да и вообще, зачем она?
Зачем обнулять временный регистр temp2, если после следующей команды он примет новое значение?
Проверить ещё раз внимательно схему. Кнопко-ногодрыгание должно работать без особых проблем.
Если нет "хомутов".
Код
MainLoop:
  in temp, PINB
  nop                            ; Если очень уж нужна задержка...
  out PORTB, temp
  rjmp MainLoop
SergeyGrig
Позвольте поправить предыдущего отвечающего: в MainLoop должно быть - out PortD,temp (дабы автор темы не принял как должное).
Подтянуть входа "внутренними" средствами:

после

ldi temp,0x00 ;настройка порта B на ввод
out DDRB,temp

поставить:
ldi temp,0xFF
out PortD,temp
what_you_want
все заработало, ошибка была в схеме.


Цитата(SergeyGrig @ Oct 15 2010, 22:40) *
ldi temp,0x00 ;настройка порта B на ввод


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

еще возник вопрос по команде bld

bld temp, 0 ; записываем в нулевой бит регистра temp значение из T

А остальные биты регистра temp чем заполнены? нулями по умолчанию?

tazik
Цитата(what_you_want @ Oct 16 2010, 04:23) *
А остальные биты регистра temp чем заполнены? нулями по умолчанию?


остальные биты не меняются
what_you_want
Цитата(tazik @ Oct 16 2010, 07:44) *
остальные биты не меняются


А если до этого регистр temp не был определен?
demiurg_spb
Цитата(what_you_want @ Oct 16 2010, 12:46) *
А если до этого регистр temp не был определен?
Включаем мозг и после целой секунды размышлений приходим к логичному выводу - остальные биты будут иметь
прежнее значение что и до инструкции BLD (неопределённое в вашем случае).

Начинающему AVR'щику посвящается:
http://www.atmel.com/dyn/resources/prod_do...nts/doc0856.pdf
http://www.atmel.com/dyn/resources/prod_do...nts/doc1022.pdf
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.