0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
|
|
1 | |
Работа с портами AVR в CodeVision13.01.2014, 00:33. Показов 46433. Ответов 77
Метки нет (Все метки)
Народ,
подскажите пожалуйста, может ли AVR например установить два бита порта одновременно, не затрагивая остальных, причем именно одновременно. Например я захочу установить 0-й и первый бит порта "B" в единицу, правильно ли будет сделать так применительно к Codivision и вообще? Заранее спасибо и простите за ламерский вопрос... Код
PORTB | = 0x03;
0
|
13.01.2014, 00:33 | |
Ответы с готовыми решениями:
77
CodeVision AVR C работа с EEPROM Работа с портами в AVR Работа с портами ввода-вывода AVR Непонятки c Codevision AVR 1.xxx Инициализация I2C CodeVision AVR |
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
|
|
13.01.2014, 11:17 | 21 |
Сообщение от voyd118
и далее пошагово смотрю в 4-й студии на порт... Код
while (1) { PORTB |=1; PORTB &=~1; PORTB |=(1<<PINB0); PORTB &=~(1<<PINB0); } }
0
|
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
|
|
13.01.2014, 11:39 | 22 |
ну я вроде доступно спросил, попробую по другому. В отладчике вижу два окна PINB и PORTB
в случае: Код
PORTB &=~1; В случае Код
PORTB &=~(1<<PINB0);
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); }
0
|
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
|
|
13.01.2014, 11:50 | 24 |
Сообщение от ShodS
Код
DDRB=0x3F; while (1) { PORTB |=1; PORTB &=~1; PORTB |=(1<<PINB0); PORTB &=~(1<<PINB0); } }
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
Я слышал еще так: "Лучше промолчать и показаться глупым... чем заговорить, и развеять все сомнения..." Но это конечно не про нашего брата :)... В нашем деле не вариант молчать, иначе, поумнеть - шансов нет :)... +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
Сообщение от voyd118
Попробуйте так посмотреть симуляцию: Код
DDRB |= (1<<0); while (1){ PORTB |= (1<<0); asm ("NOP"); PORTB &= ~(1<<0); asm ("NOP"); }
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 |
0
|
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
|
|
13.01.2014, 12:33 | 32 |
Сообщение от oxytt
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> в установленной студии 6 такого файла нет если конечно речь про шестую студию, как работает 5-я и 4-я - не знаю
0
|
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
|
|
13.01.2014, 12:47 | 34 |
0
|
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
|
|
13.01.2014, 12:55 | 35 |
Сообщение от voyd118
забыл что мы про CVAVR)) сам в atmel studyo и мыслю в ее категориях
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
13.01.2014, 13:34 | 36 |
Сообщение от voyd118
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 и PORTB0 это один пин, причем вне зависимости от того какой МК и всегда! вот с другими вашими примерами согласен - так не корректно
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
13.01.2014, 13:59 | 38 |
Сообщение от oxytt
(При желании можно добиться несовпадения значений в 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
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 | |
13.01.2014, 14:23 | |
Помогаю со студенческими работами здесь
40
Codevision avr не выводит на жки sprintf Работа в среде avr codevision Проблема с портами ВВ на AVR Работа с COM портами Работа с COM-портами. работа с портами Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |