Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.66/228: Рейтинг темы: голосов - 228, средняя оценка - 4.66
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
1

Работа с портами AVR в CodeVision

13.01.2014, 00:33. Показов 46433. Ответов 77
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Народ,

подскажите пожалуйста, может ли AVR например установить два бита порта одновременно, не затрагивая остальных, причем именно одновременно. Например я захочу установить 0-й и первый бит порта "B" в единицу, правильно ли будет сделать так применительно к Codivision и вообще? Заранее спасибо и простите за ламерский вопрос...

Код
PORTB | = 0x03;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.01.2014, 00:33
Ответы с готовыми решениями:

CodeVision AVR C работа с EEPROM
На железе не работает, в протеусе все ОК. Как только отключаю запись в eeprom на железе начинает...

Работа с портами в AVR
Здравствуйте! Столкнулся с задачей и не знаю как реализовать, надеюсь на вашу помощь. ...

Работа с портами ввода-вывода AVR
Всем доброго времени суток. Я написал статью про работу с портами ввода-выдода МК семейства AVR....

Непонятки c Codevision AVR 1.xxx
Всем привет. Дублирую пост с RU_rodyo_electr. Началось все с того что решил прикрутить...

Инициализация I2C CodeVision AVR
Здравствуйте! Столкнулся с проблемой при работе с I2C с микроконтроллером ATMega328 (16МГц, а...

77
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
13.01.2014, 11:17 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от voyd118
ну вот в том то и вопрос, я проверяю в простом тесте...

Код:
DDRB=0x3F;

и далее пошагово смотрю в 4-й студии на порт...
Код
while (1)
{
PORTB |=1;
PORTB &=~1;
PORTB |=(1<<PINB0);
PORTB &=~(1<<PINB0);
}
}
а вопрос в чем? не путайте PINB и PINB0. Первое порт, второе константа препроцессора
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
13.01.2014, 11:39 22
ну я вроде доступно спросил, попробую по другому. В отладчике вижу два окна PINB и PORTB

в случае:
Код
PORTB &=~1;
обнуляется 0-й бит порта и устанавливается PINB

В случае
Код
PORTB &=~(1<<PINB0);
PINB остается неизменным
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
13.01.2014, 11:44 23
Если вы не настраивали DDRB, то по идее так и должно быть в реальности (удивлен что симуляция это учитывает)...
Дело в том что по умолчанию (без настройки DDRB) вывод единиц в PORTB подключает резисторы подтяжки...
Так вот вы сначала подтяжку подключили, а потом отключили... Но на входе PINB высокий потенциал остается на какое то время, т.к. входы КМОП и заряд на выводе долго сохраняется.....

Если сделать так:
Код
DDRB |= (1<<0);
while (1){
PORTB |= (1<<0);
PORTB &= ~(1<<0);
}
То в регистре PINB вы увидете то что хотели...
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
13.01.2014, 11:50 24
Цитата Сообщение от ShodS
Если вы не настраивали DDRB, то по идее так и должно быть в реальности (удивлен что симуляция это учитывает)...
Дело в том что по умолчанию (без настройки DDRB) вывод единиц в PORTB подключает резисторы подтяжки...
Так вот вы сначала подтяжку подключили, а потом отключили... Но на входе PINB высокий потенциал остается на какое то время, т.к. входы КМОП и заряд на выводе долго сохраняется.....
простите, не понял, объясните мне пожалуйста пошагово, можете просто прокомментировать код? Спасибо.

Код
DDRB=0x3F;

while (1)
{
PORTB |=1;
PORTB &=~1;
PORTB |=(1<<PINB0);
PORTB &=~(1<<PINB0);
}
}
P.S. "лучше я задам дурацкий вопрос, чем уйду с умным видом :)"
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
13.01.2014, 11:55 25
Если надо прокомментировать ваш код, пожалуйста...
Код
DDRB=0x3F;//настраиваем на вывод следуюoие линии порта B, (0x00111111)
while (1)//начало бесконечного цикла
{
PORTB |=1;//устанавливаем бит 0 порта B
PORTB &=~1;//сбрасываем бит 0 порта B
PORTB |=(1<<PINB0);//устанавливаем бит 0 порта B
PORTB &=~(1<<PINB0);//сбрасываем бит 0 порта B
}//возвращаемся в начало цикла
}
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
13.01.2014, 11:59 26
Цитата Сообщение от voyd118
"лучше я задам дурацкий вопрос, чем уйду с умным видом :)"
:)...
Я слышал еще так:
"Лучше промолчать и показаться глупым... чем заговорить, и развеять все сомнения..."

Но это конечно не про нашего брата :)...
В нашем деле не вариант молчать, иначе, поумнеть - шансов нет :)...
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
13.01.2014, 12:05 27
Цитата Сообщение от ShodS
Цитата Сообщение от voyd118
"лучше я задам дурацкий вопрос, чем уйду с умным видом :)"
:)...
Я слышал еще так:
"Лучше промолчать и показаться глупым... чем заговорить, и развеять все сомнения..."

Но это конечно не про нашего брата :)...
В нашем деле не вариант молчать, иначе, поумнеть - шансов нет :)...

+1 :)))
0
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 584
13.01.2014, 12:11 28
SomdS говорит :Если вы не настраивали DDRB, то по идее так и должно быть в реальности (удивлен что симуляция это учитывает)...
Дело в том что по умолчанию (без настройки DDRB) вывод единиц в PORTB подключает резисторы подтяжки...
----
Как это без настройки DDRB (по умолчанию 0) при выводе 1 в PORTB включится резистор подтяжки? Даже если и включится нам то что с того если параллельно ему будет открыт полевик?
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
13.01.2014, 12:14 29
Цитата Сообщение от Ommykytotor
Как это без настройки DDRB (по умолчанию 0) при выводе 1 в PORTB включится резистор подтяжки который PullUp?
Именно!.....

Цитата Сообщение от voyd118
непонятно следующее:
Понял почему так происходит...
Попробуйте так посмотреть симуляцию:
Код
   DDRB |= (1<<0);
while (1){
PORTB |= (1<<0);
asm ("NOP");
PORTB &= ~(1<<0);
asm ("NOP");
}
Дело в том, что значение PINB становится доступно тактом позже... наверное именно поэтому, если переключение идет сразу друг за другом, мы не видим результат в PINB... Как то так...
0
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
13.01.2014, 12:30 30
не маловажная вещь
в начале программы стоит #include <avr/io.h> ?

именно в этом файлике правильно назначаются все константы для работы с переферией под МК выбранный в параметрах проекта
В свойствах проекта соответственно должен быть выбран правильный МК

кстати насчет особенностей
то что PORTB в режиме ввода управляет подтяжками справедливо для ряда старых МК, но не очень справедливо для более новых
например в attiny10 за поддятжки отвечает другой регистр
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
13.01.2014, 12:32 31
Дело в том, что значение PINB становится доступно тактом позже... наверное именно поэтому, если переключение идет сразу друг за другом, мы не видим результат в PINB... Как то так...
Cпасибо, теперь более менее понятно...
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
13.01.2014, 12:33 32
Цитата Сообщение от oxytt
не маловажная вещь
в начале программы стоит #include <avr/io.h> ?

именно в этом файлике правильно назначаются все константы для работы с переферией под МК выбранный в параметрах проекта
В свойствах проекта соответственно должен быть выбран правильный МК

кстати насчет особенностей
то что PORTB в режиме ввода управляет подтяжками справедливо для ряда старых МК, но не очень справедливо для более новых
например в attiny10 за поддятжки отвечает другой регистр
подключена только tiny85.h
0
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
13.01.2014, 12:40 33
мы вправе создавать косяки собственными руками

вам нужно включить avr/io.h, вот строка из него:
Код
#elif defined (__AVR_ATtiny85__)
#  include <avr/iotn85.h>
где вы взяли tiny85.h и зачем он я не знаю.
в установленной студии 6 такого файла нет

если конечно речь про шестую студию, как работает 5-я и 4-я - не знаю
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
13.01.2014, 12:47 34
где вы взяли tiny85.h и зачем он я не знаю.
в установленной студии 6 такого файла нет

если конечно речь про шестую студию, как работает 5-я и 4-я - не знаю
честно говоря, не очень понятно зачем мне нужна io.h в CodeVision, я же не в IAR-е....
0
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
13.01.2014, 12:55 35
Цитата Сообщение от voyd118
честно говоря, не очень понятно зачем мне нужна io.h в CodeVision, я же не в IAR-е....
извините, глупость сморозил

забыл что мы про CVAVR))
сам в atmel studyo и мыслю в ее категориях
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
13.01.2014, 13:34 36
Цитата Сообщение от voyd118
Код:
PORTB |=(1<<PINB0);
PORTB &=~(1<<PINB0);voyd118, избегайте такого фривольного смешивания дефайнов. Так Вы закладываете в свои проекты мину замедленного действия - обязательно бабахнет потом в виде трудноотслеживаемых ошибок, непонятных сбоев.

Вот эти строчки все генерируют один и тот же код (ну совпало так - мало ли дефайнов с одним и тем же числовым значением!):
Код
  PORTB |= (1 << PORTB0);
PORTB |= (1 << PINB0);
PORTB |= (1 << PINC0);
PORTB |= (1 << ADC0);
Ваш вариант - второй. А какой правильный и почему - догадываетесь?
0
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
13.01.2014, 13:38 37
Цитата Сообщение от OtyxPM
Ваш вариант - второй. А какой правильный и почему - догадываетесь?
это я ему рекомендовал PINB0 писать

объясните мне в чем разница? физически и по смыслу PINB0 и PORTB0 это один пин, причем вне зависимости от того какой МК и всегда!

вот с другими вашими примерами согласен - так не корректно
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
13.01.2014, 13:59 38
Цитата Сообщение от oxytt
объясните мне в чем разница? физически и по смыслу PINB0 и PORTB0 это один пин, причем вне зависимости от того какой МК и всегда
PINB, PORTB, DDRB - это три разных регистра, они физически существуют независимо. Так же, как и регистры из двух последних примеров. Разные они.
(При желании можно добиться несовпадения значений в PORTB0 и PINB0, если что.)

Именованные константы PINBx, PORTBx, DDRBx заведены для обозначения битов в конкретных регистрах, а не взамен чисел 0...7. Смысл замены чисел на именованные константы - во-первых, избежать ошибок с использованием не тех регистров/битов/значений, и во-вторых - сделать понятным применение в алгоритме тех или иных регистров/битов.
Поэтому для операций с битом 0 регистра PORTB надо использовать дефайн PORTB0, а не какой-то другой, кончающийся на эту цифру 0. :-) В том числе и PINB0 не стОит использовать. Иначе почему бы не DDRB0? А там и до других двух примеров недалеко, если следовать такой логике.
0
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
13.01.2014, 14:11 39
ну вот это называется, "ты мне что дал, то я и перепутал" :), мне проще и понятнее обращаться либо к целому порту и накладывать на него маску если надо поднять/приземлить несколько ног одновременно, или обращаться к конкретному биту порта, имхо так нагляднее.... Насколько я понял, регистр DDRB отвечает за направление работы порта, PORTB -> обращение к целому порту, а PINB позволяет обращаться к конкретному пину....
Поправьте меня пожалуйста, если я не прав.
0
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
13.01.2014, 14:23 40
Цитата Сообщение от OtyxPM
Именованные константы PINBx, PORTBx, DDRBx заведены для обозначения битов в конкретных регистрах, а не взамен чисел 0...7. Смысл замены чисел на именованные константы - во-первых, избежать ошибок с использованием не тех регистров/битов/значений, и во-вторых - сделать понятным применение в алгоритме тех или иных регистров/битов.
Поэтому для операций с битом 0 регистра PORTB надо использовать дефайн PORTB0, а не какой-то другой, кончающийся на эту цифру 0. :-) В том числе и PINB0 не стОит использовать. Иначе почему бы не DDRB0? А там и до других двух примеров недалеко, если следовать такой логике.
и да и нет
PORTXY и PINXY определения для смысловой ссылки на номера битов в привязке к физическим пинам портов
Да, PORTX и PINX это разные регистры, но привязка физических пинов к этим регистрам совпадает всегда и по смыслу и по факту

я бы согласился, что правильнее (красивее) для PORTX исопльзовать PORTXY, а для PINX - PINX
если бы не одно но, точнее сложившаяся удобная практика

когда описывается в программе логическое назначение какого-то порта то обычно применяют такие дефайны:

Код
#define BEEP_DDR DDRB
#define BEEP_PORT PORTB
#define BEEP_PIN PINB
#define BEEP_MASK (1 << PINB0)
последний дефайн будет использован как для установки порта на вывод
Код
BEEP_DDR |= BEEP_MASK
для управлением состоянием
Код
BEEP_PORT |= BEEP_MASK
так и для проверки состояния
Код
BEEP_PIN & BEEP_MASK
а вы как делаете?
0
13.01.2014, 14:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.01.2014, 14:23
Помогаю со студенческими работами здесь

Codevision avr не выводит на жки sprintf
#include &lt;mega8.h&gt; #include &lt;delay.h&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; //...

Работа в среде avr codevision
Суть: начался семестр, предпоследний (читал правила создания темы про то что не писать &quot;помогите&quot;,...

Проблема с портами ВВ на AVR
Добрый день. Возникла проблема при работе с портами ввода-вывода на модуле AVR Pinboard II. Написал...

Работа с COM портами
Здравствуйте...Хочу через ком порты подключить два ардуино мега.Первый для передачи данных второй...

Работа с COM-портами.
Необходимо написать программу, получающую время с ком-порта (вообще не представляю как это сделать)...

работа с портами
Контролер ЕЛТ имеет порт адреса 3д4 в который записывает номер регистра элт которому будет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru