Страница 1 из 1
как в asm занести значение регистра в один пин порта?
Добавлено: Пн дек 29, 2008 15:05:59
Alexeus
Atmega8
командой in я могу считать в регистр R16 с пина PB3 значение логического уровня, а как теперь с R16 передать это значение, ну например, в PB4?
Добавлено: Пн дек 29, 2008 16:04:14
akl
Здравствуйте. Может быть так
CLR R16
OUT DDRB,R16 ; порт В на ввод
IN R16,PINB
BST R16,6
BLD R16,7
PUSH R16
SER R16
OUT DDRB,R16 ; порт В на вывод
POP R16
OUT PORTB,R16
Добавлено: Пн дек 29, 2008 16:16:29
Alexeus

команды то какие малознакомые... а не затруднит комментари напротив основных строчек отписать?
Добавлено: Пн дек 29, 2008 19:37:07
Callous
2 Alexeus
Хотелось бы поинтересоватся, а как вы хотите затолкать 8 разрадное число в 1 пин????? Либо я не понимаю чегото. Если в порт то тогда akl правильно все написал. Если же "а как теперь с R16 передать это значение, ну например, в PB4?" имеется ввиду последовательная передача то это совсем другое. Уточните пожалуста.
Добавлено: Пн дек 29, 2008 21:36:38
Alexeus
да вот не 8 разрядное я хочу затолкать... а лог. уровень только с одного входа/пина.
значит на PB3 (вход) есть некий лог. уровень, пусть это будет высокий лог. уровень- "1", могу я его записать в R16 типа in R16,PB3 или нет? как этот лог. уровень будет представлен в регистре R16- как "1" или как "00000001" (тогда да, получается 8разрядов...)
ну а потом я из регистра хотел вывести, например на PB4 (ну светодиод у меня там подключен. альтернативные решения не нужно предлагать

нужно вот такой пример рассмотреть)
Добавлено: Пн дек 29, 2008 22:04:12
smac
Alexeus писал(а):да вот не 8 разрядное я хочу затолкать... а лог. уровень только с одного входа/пина.
значит на PB3 (вход) есть некий лог. уровень, пусть это будет высокий лог. уровень- "1", могу я его записать в R16 типа in R16,PB3 или нет? как этот лог. уровень будет представлен в регистре R16- как "1" или как "00000001" (тогда да, получается 8разрядов...)
ну а потом я из регистра хотел вывести, например на PB4 (ну светодиод у меня там подключен. альтернативные решения не нужно предлагать

нужно вот такой пример рассмотреть)
Все просто, вы не можете прочитать состояние одного пина в регистр, вы можете прочитать только состояние всего порта, например так
далее в регистре r16 , бит, соответсвующий PB3 (скорее всего бит № 3 если считать с 0) будет иметь такое же логическое состояние как ваш пин. Т. е если в PINB3 была лог. 1, то и в регистре R16 бит № 3 будет равен 1.
Вы наверное спросите, а почему у меня компилируется с такой командой in R16,PB3? Отвечу. Компилятор не знает что такое PB3, вместо этого символьного значения подставляется число, определенное в файле m8def.inc, уверен на 90% что это число 3, т. е. командой выполняется команда in R16,PB3 то вы читаете в R16 регистр ввода - вывода с номером 3, т. е. TWDR
Добавлено: Вт дек 30, 2008 01:38:36
Alexeus
а если "in R16,pinc" -что будет в регистре, ведь порт "С" семибитный, а регистр 8ми...
Добавлено: Вт дек 30, 2008 02:54:27
smac
Alexeus писал(а):а если "in R16,pinc" -что будет в регистре, ведь порт "С" семибитный, а регистр 8ми...
Седьмой бит скорее всего прочитается как 0, в любом случае не стоит обращать на него внимания. (Главное, что регистр R16 имеет кол-во бит не меньшее чем PINC).
Добавлено: Вт дек 30, 2008 11:54:57
Alexeus
Например у меня 7пинов порта"Б" сконфигурирован на выход и только пин порта "Б", допустим PB4, на вход... как мне в асме (пример кода) считать значение именно PB4? или считать весь порт со всей мишурой, а потом как то вычислить PB4...
Добавлено: Вт дек 30, 2008 16:28:26
akl
Можно так:
SBIC PINB,4
RJMP PINB4_SET
PINB4_CLR:
NOP
.
.
.
.
PINB4_SET:
NOP
.
.
.
.
Добавлено: Вт дек 30, 2008 22:40:20
smac
Alexeus писал(а):Например у меня 7пинов порта"Б" сконфигурирован на выход и только пин порта "Б", допустим PB4, на вход... как мне в асме (пример кода) считать значение именно PB4? или считать весь порт со всей мишурой, а потом как то вычислить PB4...
А зачем вычислять то? Можно так, как вам уже предложили, а можно так:
далее по биту с номером PB4, принимать решение
или
Код: Выделить всё
in r16, PINB ; читаем
bst r16, PB4; копируем интересующий нас бит в бит T регистра SREG
; далее можно принять решение по T или
bld anyreg, anybit ; (0<anybit<7) - копируем из бита T в любой бит любого РОН (r0-r31)
Добавлено: Ср дек 31, 2008 20:51:03
Pooher
in tmp, PinB
andi tmp, 0b00010000
(если пин был сброшен, то tmp=0, если установлен, то 0х10 (0b00010000))
PS. Чот народ под новый год мудрить начал...

Добавлено: Пт янв 02, 2009 10:30:53
YurkaM
Pooher писал(а):Чот народ под новый год мудрить начал...

Действительно
Можно вообще не читать PinB, а сразу проверять нужный пин:
Код: Выделить всё
sbic PINB,4 ; если В4=0, то следующую команду пропускаем
rjmp _B4set ; переход если B4=1
...........; здесь работаем если B4=0