Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Есть сансеи по AVRам?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
bigen
Читаю IN R16,PINA - записывается последний байт, который передавал из порта.
Читаю по-битно
SBIS PINA,0
JMP M
ORI R16,01
M1: SBIS PINA,1
JMP M1
ORI R16,02
M1:
и т.д. - все в порядке. В чем разница? Ведь можно же читать сразу входной байт, где ошибка?
Ander
А в чем проверял? На симуляторе небось?
maegg
попробуй заменить jmp на rjmp, сам не проверял но у атмела в примерах так.
Maxim
Между командами записи и чтения поставь NOP и все заработает.
Например:
OUT PORTA, R16
NOP
IN R16, PINA
alt
вы дали не весь код нет команды записи в порт.
непонятно среда, на чем отлаживалась программа (софтверно или на железе).
Бывают ошибки с адресацией к портам ввода вывода.
Входной и выходной имеют различные адреса.

Паузу в виде nop , делать не надо если схема разработана корректно все работает без задержек.
bvn123
Если проверка в симуляторе и предв.выполнено:
ser
bvn123
Если выполнено:
ser r16
out DDRA,r16
out PORTA,r16
in r16,PINA ;то без доп.действий в r16 и будет 0хff,

для получения другого результата
-в симуляторе в IO view | PORTA | PINA надо сбросить какой-нибудь флажок непосредственно перед считыванием (in r16,PINA)
-в железе соединить с нулем какой-нибудь контакт PORTA до выполнения соотв.куска программы
bvn123
Если выполнено:
ser r16
out DDRA,r16
out PORTA,r16
in r16,PINA ;то без доп.действий в r16 и будет 0хff,

для получения другого результата
-в симуляторе в IO view | PORTA | PINA надо сбросить какой-нибудь флажок НЕПОСРЕДСТВЕННО перед считыванием (in r16,PINA), после следующего шага галочка восстановится (для симулятора AVR Studio 3.xx)
-в железе соединить с нулем какой-нибудь контакт PORTA до выполнения соотв.куска программы
DIM
NOP после чтения очень помогает
порты обновляются в следующей команде
аналогично на вывод
alt
Не надо вставлять лиший код в программу.
Микруха прекрасно отрабатывает чтение из портов, и не требует дополнительных задержек.
Styv
И это точно!
Himer
Задержки нужны есле относительно большая емкостная нагрузка на выходе висит. например кнопки и т.п.
IgorKossak
Абсолютно прав Maxim и без всяких "если".
В Атмеловских даташитах об этом однозначно говорится, что появление сигнала на выходе порта происходит в следующем такте после исполнения соответствующей команды записи в порт. Поэтому команда чтения из соответствующего пина ОБЯЗАНА отставать от команды записи хотя бы на один такт (команда NOP как минимум), иначе будет считано предыдущее состояние пина.
При пошаговой отладке, например через JTAG, может показаться, что это не верно, т. к. тактовый генератор не останавливается и нужные такты проскакивают как раз между соседними шагами.
-Tумблер-
Цитата(IgorKossak @ Oct 20 2004, 17:41)
.. появление сигнала на выходе порта происходит в следующем такте

.. (команда NOP как минимум)..
*


Почему то у Меги128 (16 мГц) "для гарантии" требуется
2 NOP..
sad.gif
Idler
Цитата(-Tумблер- @ Dec 2 2004, 14:01)
Цитата(IgorKossak @ Oct 20 2004, 17:41)
.. появление сигнала на выходе порта происходит в следующем такте

.. (команда NOP как минимум)..
*


Почему то у Меги128 (16 мГц) "для гарантии" требуется
2 NOP..
:(
*



Потому, что даташиты внимательно читать надо. Открой DS на AT90Sxx и на ATMEGAxx, зайди в раздел I/O Ports, и посмотри схему любого порта.
В мегах на всех входах появилась такая штука, как "Synchronizer" - цепочка из защелки и D-триггера. Соответственно, им еще такт нужен. На самом деле, пол-такта, но пол-нопа в программу не засунешь. Ну, и плюс вышеупомянутый ноп.
IgorKossak
Ну тогда лучше не 2 NOP, а один RJMP на следующую инструкцию (слово одно, а тактов - два).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.