what_you_want 0 15 октября, 2010 Опубликовано 15 октября, 2010 (изменено) · Жалоба Здравствуйте, стал разбираться с программой 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. Но тем не менее, на выходе всегда горят единицы, вне зависимости от нажатых кнопок. Что я делаю не так? Изменено 15 октября, 2010 пользователем what_you_want Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ut1wpr 0 15 октября, 2010 Опубликовано 15 октября, 2010 (изменено) · Жалоба Что значит "нажатых кнопочек"? Входы порта B куда замыкаются при нажатии? Это же не очевидно, надо указывать. Если замыкаем на землю, не мешает включить подтягиваюшие резисторы. Зачем такая большая задержка. Да и вообще, зачем она? Зачем обнулять временный регистр temp2, если после следующей команды он примет новое значение? Проверить ещё раз внимательно схему. Кнопко-ногодрыгание должно работать без особых проблем. Если нет "хомутов". MainLoop: in temp, PINB nop ; Если очень уж нужна задержка... out PORTB, temp rjmp MainLoop Изменено 15 октября, 2010 пользователем IgorKossak Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyGrig 0 15 октября, 2010 Опубликовано 15 октября, 2010 · Жалоба Позвольте поправить предыдущего отвечающего: в MainLoop должно быть - out PortD,temp (дабы автор темы не принял как должное). Подтянуть входа "внутренними" средствами: после ldi temp,0x00 ;настройка порта B на ввод out DDRB,temp поставить: ldi temp,0xFF out PortD,temp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
what_you_want 0 15 октября, 2010 Опубликовано 15 октября, 2010 · Жалоба все заработало, ошибка была в схеме. ldi temp,0x00 ;настройка порта B на ввод порты по умолчанию же на ввод настроены, можно обойтись без этого присваивания, как я понял. еще возник вопрос по команде bld bld temp, 0 ; записываем в нулевой бит регистра temp значение из T А остальные биты регистра temp чем заполнены? нулями по умолчанию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tazik 0 16 октября, 2010 Опубликовано 16 октября, 2010 · Жалоба А остальные биты регистра temp чем заполнены? нулями по умолчанию? остальные биты не меняются Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
what_you_want 0 16 октября, 2010 Опубликовано 16 октября, 2010 · Жалоба остальные биты не меняются А если до этого регистр temp не был определен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 16 октября, 2010 Опубликовано 16 октября, 2010 · Жалоба А если до этого регистр 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться