Технический форум по робототехнике.
Victorovych » 02 мар 2010, 16:07
1) да
2),3) пишется 0b, in temp,pd0 работать не будет, командой in можно заслать регистр в регистр(общего назначения), например так in temp,pind
4) да
Vovan » 02 мар 2010, 16:14
Ответы на все Ваши вопросы есть в книге:
Джона Мортона Микроконтроллеры AVR Вводный курс. Там же есть примеры, упражнения, описания мк-роллеров и великолепные примеры программ на асм.
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 Вводный курс. Там же есть примеры, упражнения, описания мк-роллеров и великолепные примеры программ на асм.
Спасибо, помню её (давно читал), сегодня вечером засяду снова читать.
Victorovych » 02 мар 2010, 16:52
portd - это обозначение регистра $12
pd0 - это обозначение 0 бита, этого регистра
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 - командами перехода если бит установлен/сброшен.
И в любом случае, даже если команда работает с отдельным битом порта - указывается отдельно имя порта целиком и отдельно номер или имя бита.
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)
? P.S.- мне надо, чтобы если две определённые ножки МК соприкоснулись, то чтобы произошло действие. Значит на одну ножку надо подавать 1, а со второй надо считывать инфу и сравнивать её с нулём, например. Так вот как считывать инфу с конкретной ножки я и не могу понять - с остальным вроде разобрался.
Michael_K » 02 мар 2010, 20:26
Неужели чтобы узнать данные с одной ножки/бита придётся получать данные со всех ножек этого порта
Да. Причем, читать нужно регистр PIND
Можно сделать проще
- Код: Выделить всё • Развернуть
sbis PIND,0 ; пропускаем следующую команду, если нулевой бит в регистре PIND равен единице
Добавлено спустя 7 минут 29 секунд:Затея же с "соприкасающимися ножками" довольно странная.
Во-первых, почему бы вам не коротить ногу на землю (а не на соседнюю ногу).
Во-вторых, лучше ловить ноль, а не единицу. Так можно использовать встроенную подтяжку.
Когда вы проверяете уровень на оторванной от всего ноге (просто висящей в воздухе),
то вы не сможете рассчитывать на какой-то определенный уровень - там может оказаться как ноль
так и единица в зависимости от погоды на луне. Поэтому стОит использовать подтяжку,
которая будет притягивать высокоомную ногу куда-нибудь.
Подтяжки есть встроенные в проц и они тянут вверх - к единице.
GrayHunter » 02 мар 2010, 20:33
Можно сделать проще
очень интересно, спасибо. Значит, если мне нужно сделать 123, в случае если на ножке PD
5 находится 0, то выглядеть это будет так:
- Код: Выделить всё • Развернуть
sbis PIND,5 ; получаем данные с ножки PD5
jmp 123 ; если 0, то 123
jmp 321 ; иначе 321
Правильно?
Затея же с "соприкасающимися ножками" довольно странная.
Во-первых, почему бы вам не коротить ногу на землю (а не на соседнюю ногу).
Во-вторых, лучше ловить ноль, а не единицу. Так можно использовать встроенную подтяжку.
Когда вы проверяете уровень на оторванной от всего ноге (просто висящей в воздухе),
то вы не сможете рассчитывать на какой-то определенный уровень - там может оказаться как ноль
так и единица в зависимости от погоды на луне. Поэтому стОит использовать подтяжку,
которая будет притягивать высокоомную ногу куда-нибудь.
Подтяжки есть встроенные в проц и они тянут вверх - к единице.
Мне нужно, чтобы происходило определённое действие в случае замыкания контактов. Как сделать программное размыкание при физическом замыкании контактов я не знаю.
Пример: Кристалл вставляют в гнездо (где бы оно ни находилось, например, в украшении), замыкаются определёные контакты и МК понимает, что его вставили в украшение. Вот какая цель этого.
Последний раз редактировалось
GrayHunter 02 мар 2010, 20:37, всего редактировалось 2 раз(а).
Duhas » 02 мар 2010, 20:34
вроде бы абсолютно )
Michael_K » 02 мар 2010, 20:47
Мне нужно, чтобы происходило определённое действие в случае замыкания контактов
Зачем же замыкать две ноги?
Замкните ОДНУ ногу на землю!!!
GrayHunter » 02 мар 2010, 21:07
расскажите подробнее об этом, пожалуйста, и как это реализовать через встроенные возможности МК.
Я себе слабо представляю что МК сможет понять, если на ноге будет 1, который будет замыкаться на землю. Где здесь ввод-то?
Vovan » 02 мар 2010, 21:21
Предлагаю ТС изложить алгоритм на русском языке, затем начать писать программу и, убедившись, что что-то не работает или имеется ошибка компиляции, задавать вопросы...
Правильно составленое тз и понятный псевдокод - залог успеха!
Кроме того, тогда предметно можно разговаривать, а не абстрактно типо "правильно ли я делаю" (потому что каждое действие имеет свой конечный смысл, цель
).
ЗЫ: почему бы всё-таки ТС не прочитать конкретно про порты "ввода-вывода" у Мортона? Ну настолько ясно там написано и про "встроенные" и про внешние возможности МК, что не понять просто невозможно...
Michael_K » 02 мар 2010, 21:38
расскажите подробнее об этом, пожалуйста, и как это реализовать через встроенные возможности МК.
Я себе слабо представляю что МК сможет понять, если на ноге будет 1, который будет замыкаться на землю. Где здесь ввод-то?
1. Настраиваете ногу на вход с подтяжкой:
- в регистр PORT (в нужный битик) кладем единичку
- в регистр DDR (в тот же битик) кладем нолик
2. Проверяете сотсояние ноги
- читаете нужный битик в регистре PIN
Что происходит:
Когда нога оторвана, висит в воздухе, никуда не замкнута, вы считываете единицу
(единица появляется на ноге из-за того что включена встроенная подтяжка)
Когда нога замыкается на землю, на ней, естественно становится ноль.
Что тут может быть непонятного. Это штатное, стандартное, типовое решение.
Подтяжки для того и встроены, чтобы задавать определенное состояние оторванным ногам...
GrayHunter » 02 мар 2010, 22:44
1. Настраиваете ногу на вход с подтяжкой:
- в регистр PORT (в нужный битик) кладем единичку
- в регистр DDR (в тот же битик) кладем нолик
2. Проверяете сотсояние ноги
- читаете нужный битик в регистре PIN
Значит, если мне нужно сделать 123, в случае если на ножке PD
5 находится 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)?
Michael_K » 02 мар 2010, 23:28
Да, все правильно.
А если взяться голыми руками (может быть мокрыми) только за ножку порта PD5, то тоже будет замыкание (0)?
Без подтяжки - однозначно да - на ноге будет болтаться что попало
(на вашем пальце много наводок, например 50 герц от сети).
С включенной подтяжкой _обычно_ нет...
Но если действительно наводки - проблема, то можно сделать внешнюю подтяжку помощнее -
поставить снаружи резистор, скажем килоом, с ноги на плюс питания проца.
(встроенная подтяжка - порядка нескольких десятков килоом)