Полная версия этой страницы:
Есть сансеи по AVRам?
Читаю IN R16,PINA - записывается последний байт, который передавал из порта.
Читаю по-битно
SBIS PINA,0
JMP M
ORI R16,01
M1: SBIS PINA,1
JMP M1
ORI R16,02
M1:
и т.д. - все в порядке. В чем разница? Ведь можно же читать сразу входной байт, где ошибка?
А в чем проверял? На симуляторе небось?
попробуй заменить jmp на rjmp, сам не проверял но у атмела в примерах так.
Между командами записи и чтения поставь NOP и все заработает.
Например:
OUT PORTA, R16
NOP
IN R16, PINA
вы дали не весь код нет команды записи в порт.
непонятно среда, на чем отлаживалась программа (софтверно или на железе).
Бывают ошибки с адресацией к портам ввода вывода.
Входной и выходной имеют различные адреса.
Паузу в виде nop , делать не надо если схема разработана корректно все работает без задержек.
Если проверка в симуляторе и предв.выполнено:
ser
Если выполнено:
ser r16
out DDRA,r16
out PORTA,r16
in r16,PINA ;то без доп.действий в r16 и будет 0хff,
для получения другого результата
-в симуляторе в IO view | PORTA | PINA надо сбросить какой-нибудь флажок непосредственно перед считыванием (in r16,PINA)
-в железе соединить с нулем какой-нибудь контакт PORTA до выполнения соотв.куска программы
Если выполнено:
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 до выполнения соотв.куска программы
NOP после чтения очень помогает
порты обновляются в следующей команде
аналогично на вывод
Не надо вставлять лиший код в программу.
Микруха прекрасно отрабатывает чтение из портов, и не требует дополнительных задержек.
Задержки нужны есле относительно большая емкостная нагрузка на выходе висит. например кнопки и т.п.
IgorKossak
Oct 20 2004, 14:41
Абсолютно прав Maxim и без всяких "если".
В Атмеловских даташитах об этом однозначно говорится, что появление сигнала на выходе порта происходит в следующем такте после исполнения соответствующей команды записи в порт. Поэтому команда чтения из соответствующего пина ОБЯЗАНА отставать от команды записи хотя бы на один такт (команда NOP как минимум), иначе будет считано предыдущее состояние пина.
При пошаговой отладке, например через JTAG, может показаться, что это не верно, т. к. тактовый генератор не останавливается и нужные такты проскакивают как раз между соседними шагами.
-Tумблер-
Dec 2 2004, 11:01
Цитата(IgorKossak @ Oct 20 2004, 17:41)
.. появление сигнала на выходе порта происходит в следующем такте
.. (команда NOP как минимум)..
Почему то у Меги128 (16 мГц) "для гарантии" требуется
2 NOP..
Цитата(-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
Dec 6 2004, 08:26
Ну тогда лучше не 2 NOP, а один RJMP на следующую инструкцию (слово одно, а тактов - два).
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.