Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Вопросы начинающего


Автор: Кристиан 2.2.2007, 23:07
Приветствую!

Появилось новое хобби - цифровая электроника. В частности микроконтроллеры.

Начал изучение с книги "Мортон Д. - Микроконтроллеры AVR. Вводный курс."
Впечатление от этой книги было крайне положительное, пока не остановился на одном простом месте, на котором окончательно запутался..
Собственно, причина:

Во вложении простейшая схема(из книги), на которой вывод PB0 отвечает за включение/выключение светодиода, а вход PD0 - за проверку нажатия кнопки. На PD0 устанавливается подтяжка. С PB0 вроде бы все понятно: если подана лог.1, то светодиод не горит, если же на PB0 подать лог.0, то идет ток и светодиод загорается. А вот как быть с PD0 и кнопкой? В книге поданы, на мой взгляд, два абсолютно противоположных примера, хотя автор говорит, что они действуют одинаково.
Вот ключевые фрагменты примеров.
Первый:

Start:
sbis PinD, 0    ; Проверяем, нажата ли кнопка
rjmp LEDoff
sbi PortB, 0    ; Включаем СИД
rjmp Start

LEDoff:
cbi PortB, 0    ; Выключаем СИД
rjmp Start

Прочтя этот код я уже несколько удивлен: почему СИД в этой программе включается и выключается с точностью до наоборот моим предположениям?
Второй пример, по-моему, противоречит первому. Он делает то же самое, что и первый, но не использует блоки условий. Вот он:

Start:
in temp, PinD    ; Считываем состояние кнопки
out PortB, temp    ; Изменяем состояние СИД
rjmp Start

Я не понимаю как отражается нажатие кнопки на вход PD0. Почему когда кнопка не нажата на входе PD0 должна быть лог.1, ведь в этот момент ножка ни к чему не подключена? Сначала думал, что это из-за подтяжки, но симулятор в AVR Studio показывает, что там 0.

В общем, эта проблема не дает мне перейти к практике. Помогите разобраться.

Заранее благодарен.

Автор: Romikgy 2.2.2007, 23:54
Цитата(Кристиан @  2.2.2007,  22:07 Найти цитируемый пост)
rjmp LEDoff

а здесь разве не условный переход должен быть?

Автор: Кристиан 3.2.2007, 00:12
Цитата

а здесь разве не условный переход должен быть? 


Нет, так как здесь в качестве условного блока используется sbis.
Суть команды sbis - пропустить следующую инструкцию, если бит в регистре установлен.

Автор: Romikgy 3.2.2007, 00:22
Цитата(Кристиан @  2.2.2007,  22:07 Найти цитируемый пост)
sbi PortB, 0    ; Включаем СИД

set bit - установка бита, но при установке сид потухнет
Цитата(Кристиан @  2.2.2007,  22:07 Найти цитируемый пост)
cbi PortB, 0    ; Выключаем СИД

clear bit - значит загорится, 
имхо коментарии местами перепутаны

Добавлено @ 00:24 
и еще я бы подтянул бы кнопку резюком к плюсу, а то не всегда может воспринимать лог 1 по обрыву.... имхо

Автор: Кристиан 3.2.2007, 00:39
Romikgy, 
Цитата

имхо коментарии местами перепутаны

Неужели тогда автор напутал и при именовании метки LEDoff?

Цитата

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

Подтяжка к входу PD0? Она включена(написано в первом посте). Но я не очень понимаю смысл этого действия, зачем она нужна? Чтобы при отсутствии тока на входе была лог.1, а при нажатии кнопки - лог.0 ? Объясни, если не сложно.

Автор: cardinal 3.2.2007, 00:41
А вообще поконкретней название темы придумывать надо!

Автор: Кристиан 3.2.2007, 11:00
cardinal, 
Название темы придумывал в расчете на то, что здесь буду задавать все свои вопросы по ходу продвижения в этой области.

Автор: sergejzr 3.2.2007, 12:02
Модератор: Пожалуйста, один топик - один вопрос.
и соответственно
Модератор: Название темы должно отражать ее суть!

Вообще, перед началом неплохо бы и http://forum.vingrad.ruhttp://forum.vingrad.ru/act-SR/f-27.html почитать  smile 

Автор: Romikgy 3.2.2007, 14:07
Цитата(Кристиан @  2.2.2007,  23:39 Найти цитируемый пост)
Неужели тогда автор напутал и при именовании метки LEDoff?

я не знаю, я этой книги не читал....
я сужу по логике вещей (если не забыл асм ) 
Цитата(Кристиан @  2.2.2007,  23:39 Найти цитируемый пост)
Чтобы при отсутствии тока на входе была лог.1, а при нажатии кнопки - лог.0 ? Объясни, если не сложно. 

лог 1 == +5 вольт в идеале (ну или в зависимости от логики)
так вот при высокоимпедансном состоянии входа, (по идее) должно определятся как лог 1, но в силу разных обстоятельств может стать нулем, и тогда буш долго искать косяк, дабы такого не было его специально подтягивают к лог 1

Автор: Кристиан 3.2.2007, 21:00
Вопрос решен.
Автор книги и переводчики немного перемудрили.

Автор: Metal_Heart 5.2.2007, 10:20
Цитата(Кристиан @  2.2.2007,  23:07 Найти цитируемый пост)
Во вложении простейшая схема(из книги), на которой вывод PB0 отвечает за включение/выключение светодиода, а вход PD0 - за проверку нажатия кнопки. На PD0 устанавливается подтяжка. С PB0 вроде бы все понятно: если подана лог.1, то светодиод не горит, если же на PB0 подать лог.0, то идет ток и светодиод загорается.


Светодиод будет гореть при:
 - лог.1:  если он подключен анодом к порту, а катодом - на "землю"
или
 - лог.0:  если он подключен катодом к порту, а анодом - на "+Ep"

судя по описанию, то подходит как раз второй случай:
Цитата(Кристиан @  2.2.2007,  23:07 Найти цитируемый пост)
 если же на PB0 подать лог.0, то идет ток и светодиод загорается.

Смотри схему

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)