Перейти к содержанию
    

С ввода на вывод

Здравствуйте, стал разбираться с программой Isis для эмулирование МК, столкнулся со странной проблемой. Код:

.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. Но тем не менее, на выходе всегда горят единицы, вне зависимости от нажатых кнопок. Что я делаю не так?

Изменено пользователем what_you_want

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что значит "нажатых кнопочек"? Входы порта B куда замыкаются при нажатии? Это же не очевидно, надо указывать. Если замыкаем на землю, не мешает включить подтягиваюшие резисторы.

Зачем такая большая задержка. Да и вообще, зачем она?

Зачем обнулять временный регистр temp2, если после следующей команды он примет новое значение?

Проверить ещё раз внимательно схему. Кнопко-ногодрыгание должно работать без особых проблем.

Если нет "хомутов".

MainLoop:
  in temp, PINB
  nop                            ; Если очень уж нужна задержка...
  out PORTB, temp
  rjmp MainLoop

Изменено пользователем IgorKossak

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Позвольте поправить предыдущего отвечающего: в MainLoop должно быть - out PortD,temp (дабы автор темы не принял как должное).

Подтянуть входа "внутренними" средствами:

 

после

 

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

out DDRB,temp

 

поставить:

ldi temp,0xFF

out PortD,temp

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

все заработало, ошибка была в схеме.

 

 

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

 

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

 

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

 

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

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

остальные биты не меняются

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

остальные биты не меняются

 

А если до этого регистр temp не был определен?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если до этого регистр 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...