Простейший код, хочу понимания...

Обсуждаем контроллеры компании Atmel.
Ответить
Scopex
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср янв 21, 2015 20:03:13

Простейший код, хочу понимания...

Сообщение Scopex »

Добрый день умудрённые опытом котяры! Подскажите бестолковому...
Пытаюсь чему то учиться... на досуге просматриваю простейшие вещи, вот возник вопрос, почему при выполнении строчек кода в секции while(1) каждый раз меняется содержимое регистра PIND ?
при записи нулей в PORTD пишется в PIND - 0b00000001, при записи единиц пишется в PIND - 0b00000000
заранее спасибо

Код: Выделить всё

#include <avr/io.h>
int main(void)
{
DDRD = 0b00000001; // 
PORTD = 0b00000011; //

while(1)
{
PORTD &= ~((1 << PD1)|(1 << PD0)); //пишем в PORTD два нолика

PORTD |= ((1 << PD1)|(1 << PD0)); //пишем в PORTD две единицы
} 
}
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18591
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Простейший код, хочу понимания...

Сообщение ARV »

это вы в отладчике студии смотрите?
PIND вы не записываете и не читаете в коде.
в PIND попадают сигналы извне МК. вы настроили один пин порта на вывод, поэтому уровень на нем обновляется мгновенно, когда вы выводите в него единичку. обновленный уровень переносится в PIND - вы его видите.

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

Мой уютный бложик... заходите!
Реклама
Scopex
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср янв 21, 2015 20:03:13

Re: Простейший код, хочу понимания...

Сообщение Scopex »

да, в отладчике AVR Studio
но позвольте, вы пишите:
ARV писал(а): в PIND попадают сигналы извне МК.
т.е. получается судя по вашим словам поттяжка выхода PORTD к единице не должна влиять на PIND да и при инициализации этого не происходит...
или я чего то не понимаю?
Последний раз редактировалось Scopex Пт июл 31, 2015 13:59:38, всего редактировалось 1 раз.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18591
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Простейший код, хочу понимания...

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Scopex
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср янв 21, 2015 20:03:13

Re: Простейший код, хочу понимания...

Сообщение Scopex »

т.е. получается:

1. если пин порта сконфигурирован на ВЫХОД и подтянут к плюсу командой PORTx.y это всегда будет приводить к тому что в регистре PINx.y всегда будет тоже самое?


2. если пин порта сконфигурирован на ВХОД и подтянут к плюсу командой PORTx.y это не меняет PINx.y при условии что на ножку МК извне ничего не подаётся...
естественно если извне повесить например кнопку, то будет в зависимости от кнопки...
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18591
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Простейший код, хочу понимания...

Сообщение ARV »

если пин сконфигурирован, как выход, то вывод 1 в PORT будет включать достаточно мощный драйвер (не подтяжка!) и на физическом пине МК появится мощный уровень логической 1. разумеется, и в регистр PIN этот уровень поступит. попытка "передавить" этот уровень кнопкой может привести к выгоранию порта.

если пин сконфигурирован, как вход, то вывод 1 в PORT включает очень маломощную подтяжку (не драйвер!), которую безболезненно можно передавить в 0 внешним контактом. в этом случае PIN будет отражать реальное значение уровня на физическом пине: если пин болтается, то в PIN будет 1 из-за подтяжки, если пин прижат к земле, то не смотря на подтяжку в PIN будет 0.

Но это все в реальной схеме (или в протеусе), а в студии будет так, как я описал ранее.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Scopex
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср янв 21, 2015 20:03:13

Re: Простейший код, хочу понимания...

Сообщение Scopex »

спасибо большое за ответ
вот и думай теперь где правильнее изучать логику :)
Шутка конечно, понятно что Протеус в данном случае отражает реальную ситуацию...
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Простейший код, хочу понимания...

Сообщение Mishany »

реальная ситуация отразится только в железе.
Kamelot
Открыл глаза
Сообщения: 64
Зарегистрирован: Пн июн 22, 2015 08:30:17

Re: Простейший код, хочу понимания...

Сообщение Kamelot »

Если порт сконфигурирован на ВЫХОД то просто забей на порт PIN, не смотри туда и не читай все равно там делать нечего.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Простейший код, хочу понимания...

Сообщение ILYAUL »

Kamelot писал(а):Если порт сконфигурирован на ВЫХОД то просто забей на порт PIN, не смотри туда и не читай все равно там делать нечего.
А Вы хотя бы знаете , что запись 1 в порт PIN может кардинально изменить ситуацию на выходе , и при этом пох как сконфигурирован порт?
Kamelot
Открыл глаза
Сообщения: 64
Зарегистрирован: Пн июн 22, 2015 08:30:17

Re: Простейший код, хочу понимания...

Сообщение Kamelot »

ILYAUL писал(а): А Вы хотя бы знаете , что запись 1 в порт PIN может кардинально изменить ситуацию на выходе , и при этом пох как сконфигурирован порт?
Если в DDR 1 то ничего она не изменит.

тут даже на сайте про это написано:
Соответственно, если, скажем, PX3 настроен на ввод, то бесполезно писать что-либо в 3-й бит PortX, поскольку оно не будет выведено.
И наоборот, если например, PX5 настроен на вывод, то прочитав 5-й бит PinD, мы всегда обнаружим 0.

http://radiokot.ru/start/mcu_fpga/avr/06/
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18591
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Простейший код, хочу понимания...

Сообщение ARV »

Kamelot писал(а):тут даже на сайте про это написано:
Соответственно, если, скажем, PX3 настроен на ввод, то бесполезно писать что-либо в 3-й бит PortX, поскольку оно не будет выведено.
И наоборот, если например, PX5 настроен на вывод, то прочитав 5-й бит PinD, мы всегда обнаружим 0.

http://radiokot.ru/start/mcu_fpga/avr/06/
не читайте глупости.
правильное поведение следующее:

А) в DDRх все нули (для простоты) - порт работает целиком на ввод
A.1) Запись в PORTx единиц приведет к тому, что включатся подтяжки в соответствующих разрядах. Это означает, что на ножках МК, ни к чему не подключенных, 100% появятся высокие уровни. при чтении PINx 100% будут единицы для этих разрядов. Уровни на ножках МК, соединенных с какими-то цепями схемы, могут быть любыми, соответственно значения в PINx так же будут либо 0, либо 1 в зависимости от реального уровня напряжения на соответствующей ножке.
A.2) Чтение PORTx всегда будет возвращать то, что ранее туда записали
А.3) Запись в PORTx всех нулей отключит все подтяжки. Уровни сигналов на всех ножках МК станут неопределенными, неподключенные никуда могу сохранять прежний уровень напряжения, оставшийся от предыдущего состояния, т.е. PINx для тех разрядов, которые ранее были с подтяжками или на которые ранее из схемы приходили высокие уровни, будут оставаться в 1, остальные будут содержать значение в зависимости от сигналов, поступающих на МК из схемы. Единичные уровни разрядов PINx, оставшихся от предыдущих "подтяжек" могут самопроизвольно перейти в 0 из-за разряда входной емкости (утечки). При этом нулевые разряды на болтающихс ножках могут ровно так же самопроизвольно из-за тех же утечек перейти в 1-ое состояние. Короче говоря, в этом случае болтающиеся ноги - полная неопределенность.
A.4) Запись 0 в PINx не влияет ни на что.
А.5) Запись 1 в PINx для этого режима мною не изучена, я не могу предсказать результат - кто знает, конкретизируйте.

Б) в DDRx все 1 - порт работает целиком на вывод
Б.1) Запись в PORTx любых сигналов приведет к переключению драйверов пинов в соответствующие уровни. Ток пина при этом должен быть ограничен исключительно внешними цепями схемы, никаких ограничителей втекающего или вытекающего тока внутри МК нет. Попытка подать 0 из схемы на ногу, выводящую 1, равно как и подача 1 на ногу, выводящую 0, может привести к выгоранию порта.
Б.2) При чтении PINx в его разрядах будут отображаться реальные уровни сигналов на ножках. Если МК пытается выдать 1, но внешняя схема такова, что напряжение на ноге проседает до 1,2 вольта - в соответствующем разряде PINx вы прочтете 0, хотя в PORTх будет 1. аналогично и для противоположной ситуации.
Б.3) Запись в PINx значения 0 никак не влияет ни на что
Б.4) Запись 1 в разряды PINx для МК "свежих" серий (все с буквой А, многие с буквой Р, некоторые обычные, но выпуска после 2010 года ориентировочно - уточнять в даташитах) приведет к инвертированию уровня на ножке МК, при этом состояние регистра PORTx будет сохранено прежним. Это самая важная особенность архитектуры.

P.S. не смотря на то, что ассемблер Atmel не делает разницы между заглавными и прописными буквами, очень рекомендую использовать наименованияя регистров и портов теми символами, как указано в документации. В частности, никаких portb, PortB, PORTb или portB - только PORTB. аналогично и для всех других. это сбережет вам много нервов в будущем.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Простейший код, хочу понимания...

Сообщение ILYAUL »

A.2) Чтение PORTx всегда будет возвращать то, что ранее туда записали
ТОЛЬКО чтение PINx
всегда будет возвращать то, что ранее туда записали
PORTx , если он просел - вернёт 0
Kamelot
Открыл глаза
Сообщения: 64
Зарегистрирован: Пн июн 22, 2015 08:30:17

Re: Простейший код, хочу понимания...

Сообщение Kamelot »

ARV писал(а):Б.4) Запись 1 в разряды PINx для МК "свежих" серий (все с буквой А, многие с буквой Р, некоторые обычные, но выпуска после 2010 года ориентировочно - уточнять в даташитах) приведет к инвертированию уровня на ножке МК, при этом состояние регистра PORTx будет сохранено прежним. Это самая важная особенность архитектуры.
А вот про инвертирование состояния ножки с сохранением значения я действительно не знал.

Получается когда
DDRA = 0xFF
PORTA =0x0;
PINA = 0xFF;

то на ножках порта A будут 1. (высокий уровень), я правильно понял?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18591
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Простейший код, хочу понимания...

Сообщение ARV »

ILYAUL писал(а):
A.2) Чтение PORTx всегда будет возвращать то, что ранее туда записали
ТОЛЬКО чтение PINx
всегда будет возвращать то, что ранее туда записали
PORTx , если он просел - вернёт 0
вы невнимательно прочли написанное: PORTx всегда хранит то, что туда ранее записали, при этом по барабану, что на самом деле творится на ножках МК.
чтение PINx всегда будет возвращать реальные уровни на ножках, независимо от того, что там пытались вывести на них.
Kamelot писал(а):Получается когда
DDRA = 0xFF
PORTA =0x0;
PINA = 0xFF;

то на ножках порта A будут 1. (высокий уровень), я правильно понял?
да, для МК с "новой" архитектурой будет именно так. причем если делать так

Код: Выделить всё

while(1) PINB = 0xFF;
на выходах порта мы получим генерацию
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ответить

Вернуться в «AVR»