roboforum.ru

Технический форум по робототехнике.

Магический кристалл

Re: Магический кристалл

Victorovych » 02 мар 2010, 16:07

1) да
2),3) пишется 0b, in temp,pd0 работать не будет, командой in можно заслать регистр в регистр(общего назначения), например так in temp,pind
4) да

Re: Магический кристалл

Vovan » 02 мар 2010, 16:14

Ответы на все Ваши вопросы есть в книге:
Джона Мортона Микроконтроллеры AVR Вводный курс. Там же есть примеры, упражнения, описания мк-роллеров и великолепные примеры программ на асм.

Re: Магический кристалл

GrayHunter » 02 мар 2010, 16:25

Спасибо за ответы.
2),3) пишется 0b, in temp,pd0 работать не будет
не понял. у меня есть ATmega8L (насколько я понимаю, порты у неё идентичны с ATmega8), там есть 8 портов D (с PD0 по PD7), 8 портов B (с PB0 по PB7) и 7 портов C (с PC0 по PC6). Так вот, мне нужно использовать порты D и B.
Чтобы загрузить данные из порта PD0 в регистр Temp я написал in Temp,PD0 ,но Вы говорите, что это работать не будет. Как тогда правильно написать?
(есть у меня подозрение, что я ошибаюсь, думая, что каждая ножка/лапка МК имеет свой индивидуальный порт - как прокомментируете?)

Ответы на все Ваши вопросы есть в книге:
Джона Мортона Микроконтроллеры AVR Вводный курс. Там же есть примеры, упражнения, описания мк-роллеров и великолепные примеры программ на асм.
Спасибо, помню её (давно читал), сегодня вечером засяду снова читать.

Re: Магический кристалл

Victorovych » 02 мар 2010, 16:52

portd - это обозначение регистра $12
pd0 - это обозначение 0 бита, этого регистра

Re: Магический кристалл

boez » 02 мар 2010, 17:37

Просто для ясности понятий - портом в контексте AVR, да и не только, обычно зовут весь порт целиком - Port B, Port D. И состоит он из 8 бит/ножек/разрядов порта - PD0...PD7 для PortD.

Так вот, каждому порту соответствует три регистра ввода-вывода (пусть это порт D для ясности) - DDRD, PORTD и PIND. Первые два - для вывода командой out, читать командой in их можно, но прочтешь ровно то, что вывел последний раз командой out. А вот PIND - для ввода, данные в нем соответствуют реальным сигналам на ножках порта. Ну и еще с DDRD и PORTD удобно работать командами установки/снятия бита - это как раз для работы с отдельными ножками, а с PIND - командами перехода если бит установлен/сброшен.

И в любом случае, даже если команда работает с отдельным битом порта - указывается отдельно имя порта целиком и отдельно номер или имя бита.

Re: Магический кристалл

GrayHunter » 02 мар 2010, 19:50

Интересно...но запутано. Сейчас, чтобы получить данные с конкретной ножки/бита, я прописал так (мне нужно сделать 123, в случае если на ножке 0, иначе 321):
Код: Выделить всёРазвернуть
ldi In_Screen,1  ; константу 1 в регистр In_Screen
in Temp,PD0  ; получаем данные с ножки PD0
cp In_Screen,Temp  ; сравниваем
breq 123  ; если 0, то 123
jmp 321  ; иначе 321

Исходя из того, что вы мне написали выше, мой вариант должен быть нерабочим. Но как сделать правильно я так и не понял. Неужели чтобы узнать данные с одной ножки/бита придётся получать данные со всех ножек этого порта (in Temp,portD), а потом сравнивать его с константой, содержащей инфу о всех ножках/битах порта (ldi In_Screen,0d00000001)? :shock:

P.S.- мне надо, чтобы если две определённые ножки МК соприкоснулись, то чтобы произошло действие. Значит на одну ножку надо подавать 1, а со второй надо считывать инфу и сравнивать её с нулём, например. Так вот как считывать инфу с конкретной ножки я и не могу понять - с остальным вроде разобрался.

Re: Магический кристалл

Michael_K » 02 мар 2010, 20:26

Неужели чтобы узнать данные с одной ножки/бита придётся получать данные со всех ножек этого порта

Да. Причем, читать нужно регистр PIND

Можно сделать проще
Код: Выделить всёРазвернуть
sbis  PIND,0  ; пропускаем следующую команду, если нулевой бит в регистре PIND равен единице


Добавлено спустя 7 минут 29 секунд:
Затея же с "соприкасающимися ножками" довольно странная.

Во-первых, почему бы вам не коротить ногу на землю (а не на соседнюю ногу).
Во-вторых, лучше ловить ноль, а не единицу. Так можно использовать встроенную подтяжку.

Когда вы проверяете уровень на оторванной от всего ноге (просто висящей в воздухе),
то вы не сможете рассчитывать на какой-то определенный уровень - там может оказаться как ноль
так и единица в зависимости от погоды на луне. Поэтому стОит использовать подтяжку,
которая будет притягивать высокоомную ногу куда-нибудь.
Подтяжки есть встроенные в проц и они тянут вверх - к единице.

Re: Магический кристалл

GrayHunter » 02 мар 2010, 20:33

Можно сделать проще
очень интересно, спасибо. Значит, если мне нужно сделать 123, в случае если на ножке PD5 находится 0, то выглядеть это будет так:
Код: Выделить всёРазвернуть
sbis  PIND,5  ; получаем данные с ножки PD5
jmp 123  ; если 0, то 123
jmp 321  ; иначе 321

Правильно?

Затея же с "соприкасающимися ножками" довольно странная.

Во-первых, почему бы вам не коротить ногу на землю (а не на соседнюю ногу).
Во-вторых, лучше ловить ноль, а не единицу. Так можно использовать встроенную подтяжку.

Когда вы проверяете уровень на оторванной от всего ноге (просто висящей в воздухе),
то вы не сможете рассчитывать на какой-то определенный уровень - там может оказаться как ноль
так и единица в зависимости от погоды на луне. Поэтому стОит использовать подтяжку,
которая будет притягивать высокоомную ногу куда-нибудь.
Подтяжки есть встроенные в проц и они тянут вверх - к единице.
Мне нужно, чтобы происходило определённое действие в случае замыкания контактов. Как сделать программное размыкание при физическом замыкании контактов я не знаю.
Пример: Кристалл вставляют в гнездо (где бы оно ни находилось, например, в украшении), замыкаются определёные контакты и МК понимает, что его вставили в украшение. Вот какая цель этого.
Последний раз редактировалось GrayHunter 02 мар 2010, 20:37, всего редактировалось 2 раз(а).

Re: Магический кристалл

Duhas » 02 мар 2010, 20:34

вроде бы абсолютно )

Re: Магический кристалл

Michael_K » 02 мар 2010, 20:47

Мне нужно, чтобы происходило определённое действие в случае замыкания контактов

Зачем же замыкать две ноги?
Замкните ОДНУ ногу на землю!!!

Re: Магический кристалл

GrayHunter » 02 мар 2010, 21:07

расскажите подробнее об этом, пожалуйста, и как это реализовать через встроенные возможности МК.

Я себе слабо представляю что МК сможет понять, если на ноге будет 1, который будет замыкаться на землю. Где здесь ввод-то? :pardon:

Re: Магический кристалл

Vovan » 02 мар 2010, 21:21

Предлагаю ТС изложить алгоритм на русском языке, затем начать писать программу и, убедившись, что что-то не работает или имеется ошибка компиляции, задавать вопросы...
Правильно составленое тз и понятный псевдокод - залог успеха! :)
Кроме того, тогда предметно можно разговаривать, а не абстрактно типо "правильно ли я делаю" (потому что каждое действие имеет свой конечный смысл, цель :wink: ).
ЗЫ: почему бы всё-таки ТС не прочитать конкретно про порты "ввода-вывода" у Мортона? Ну настолько ясно там написано и про "встроенные" и про внешние возможности МК, что не понять просто невозможно...

Re: Магический кристалл

Michael_K » 02 мар 2010, 21:38

расскажите подробнее об этом, пожалуйста, и как это реализовать через встроенные возможности МК.

Я себе слабо представляю что МК сможет понять, если на ноге будет 1, который будет замыкаться на землю. Где здесь ввод-то? :pardon:


1. Настраиваете ногу на вход с подтяжкой:
- в регистр PORT (в нужный битик) кладем единичку
- в регистр DDR (в тот же битик) кладем нолик
2. Проверяете сотсояние ноги
- читаете нужный битик в регистре PIN

Что происходит:
Когда нога оторвана, висит в воздухе, никуда не замкнута, вы считываете единицу
(единица появляется на ноге из-за того что включена встроенная подтяжка)
Когда нога замыкается на землю, на ней, естественно становится ноль.
Что тут может быть непонятного. Это штатное, стандартное, типовое решение.
Подтяжки для того и встроены, чтобы задавать определенное состояние оторванным ногам...

Re: Магический кристалл

GrayHunter » 02 мар 2010, 22:44

1. Настраиваете ногу на вход с подтяжкой:
- в регистр PORT (в нужный битик) кладем единичку
- в регистр DDR (в тот же битик) кладем нолик
2. Проверяете сотсояние ноги
- читаете нужный битик в регистре PIN
Значит, если мне нужно сделать 123, в случае если на ножке PD5 находится 0, то выглядеть это будет так:

Код: Выделить всёРазвернуть
ldi Temp,0d00000000
out DDRD,Temp
ldi Temp,0d00100000
out PortD,Temp
sbis  PIND,5  ; получаем данные с ножки PD5
jmp 123  ; если 0, то 123 (есть замыкание)
jmp 321  ; иначе 321 (нет замыкания)
(при этом ножка порта PD5 замыкаться будет на ножку GND) Правильно?

А если взяться голыми руками (может быть мокрыми) только за ножку порта PD5, то тоже будет замыкание (0)?

Re: Магический кристалл

Michael_K » 02 мар 2010, 23:28

Да, все правильно.

А если взяться голыми руками (может быть мокрыми) только за ножку порта PD5, то тоже будет замыкание (0)?

Без подтяжки - однозначно да - на ноге будет болтаться что попало
(на вашем пальце много наводок, например 50 герц от сети).

С включенной подтяжкой _обычно_ нет...
Но если действительно наводки - проблема, то можно сделать внешнюю подтяжку помощнее -
поставить снаружи резистор, скажем килоом, с ноги на плюс питания проца.
(встроенная подтяжка - порядка нескольких десятков килоом)


Rambler\'s Top100 Mail.ru counter