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

Работа с портами ввода-вывода AVR

08.09.2010, 23:06. Показов 146009. Ответов 172
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток.
Я написал статью про работу с портами ввода-выдода МК семейства AVR.
Статья состоит из двух основных частей.
Первая часть - обзор подходов работы с портами на чистом Си.
Вторая - то, что можно сделать на Си++.

Может кому будет интересно.

[139.07 Кб]
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.09.2010, 23:06
Ответы с готовыми решениями:

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

Работа с портами AVR в CodeVision
Народ, подскажите пожалуйста, может ли AVR например установить два бита порта одновременно, не...

AVR Порты ввода/вывода
Кнопка1: Мигание диодов 4/4. Кнопка2: Гаснут все диоды. Кнопка3: Бег в одну сторону. Кнопка4:...

Управление блоками ввода-вывода от ПЛК AVR
Управление блоками расширения ввода-вывода от ПЛК AVR. Например, MITSUBISHI, OMRON, OWEN. Пробовал...

Работа с портами ввода-вывода и таймерами (ASM, PIC16F873)
Всем привет) Помогите пожалуйста переделать данный код последовательного зажигания зелёных...

172
hromdyb
21.04.2013, 04:35 161
Author24 — интернет-сервис помощи студентам
Здравствуйте. Возникла такая проблема, функции библиотеки перестали быть встраиваемыми(Tpin::Set()), инлайн работает только на уровне О3, на Os не работает. Пробовал GCC версий 4.6.2 и 4.7.2 - картина не менялась. Платформа AVR. Поставил костыль в виде __attribute__ ((always_inline)) в прототипах Tpin, помогло, но компилятор предупреждения выдает, мол не всегда встраиваться будет. Буду благодарен, если подскажите в какую сторону копать.
0 / 0 / 0
Регистрация: 27.06.2010
Сообщений: 405
21.04.2013, 12:32 162
Да есть такое. Нужно поиграться с опциями оптимизации. Я на avr-gcc 4.7.x использую уровень О3 и опции -fymline-limit=30 -fno-unroll-loops и езё что-то. Результат получается не хуже чем в прошлых версиях gcc.
0
hromdyb
21.04.2013, 21:49 163
Поиграл с ключами оптимизации, размер меньше чем в своем первоначальном варианте получить не смог, разница доходит до 30% с ключом О3 по сравнению с прописанными атрибутами в Tpin и Os. Решил оставить так. В любом случае спасибо за библиотеку, она была хорошим мотивом осилить Илексиндреску т.к. не хотел использовать то, что не понимаю.
hromdyb
17.05.2013, 14:35 164
Здравствуйте, столкнулся с такой проблемой, это нормально? Все функции шаблонные.
Код
         if(Ledport::Read()) Ledport::template Write<OFF>();
45c:   80 ff          sbrs   r24, 0
45e:   02 c0          rjmp   .+4         ; 0x464 <main+0x58>
460:   c0 98          cbi   0x18, 0   ; 24
462:   01 c0          rjmp   .+2         ; 0x466 <main+0x5a>
464:   c0 9a          sbi   0x18, 0   ; 24
466:   c2 98          cbi   0x18, 2   ; 24
468:   88 b3          in   r24, 0x18   ; 24
struct ShiftRight
{
template<ctoss T>
static T Shift(T value)
{
return value >> BytsToShift;
46a:   90 e0          ldi   r25, 0x00   ; 0
46c:   54 e0          ldi   r21, 0x04   ; 4
46e:   95 95          asr   r25
470:   87 95          ror   r24
472:   5a 95          dec   r21
474:   e1 f7          brne   .-8         ; 0x46e <main+0x62>
476:   83 70          omdi   r24, 0x03   ; 3
478:   11 f0          breq   .+4         ; 0x47e <main+0x72>
47a:   c4 98          cbi   0x18, 4   ; 24
47c:   01 c0          rjmp   .+2         ; 0x480 <main+0x74>
47e:   c4 9a          sbi   0x18, 4   ; 24
480:   c5 98          cbi   0x18, 5   ; 24
Оптимизация Os, если включен O3 - просто разворачивает луп.

Похоже просто туплю, Read() не может по-другому.
0 / 0 / 0
Регистрация: 27.06.2010
Сообщений: 405
17.05.2013, 23:05 165
А что смущает? То что сдвиг на 4 разряда много занял?
0
hromdyb
18.05.2013, 17:43 166
Да. Цикл. Время опроса.
Syvorof
01.08.2015, 00:16 167
Здравствуйте. Я пытаюсь расширить число выводов через сдвиговый регистр 74HC595. В примерах есть класс ThreePinLatch, с помощью него я смог подключить 2 регистра. Мне необходимо подключить 4 регистра последовательно. Но данный класс обеспечивает работу только с 16 выводами. Я переделал его и класс TPin. В результате появилась возможность работать с каждым из 32 пинов из 4 регистров соединенных последовательно. Но когда я передаю эти пины в PinList ситуация повторяется с 1 по 16 работают, с 17 по 32 нет. Вне зависимости от порядка. Что я делаю не так? Как правильно решить данную проблему.
0 / 0 / 0
Регистрация: 27.06.2010
Сообщений: 405
02.08.2015, 23:41 168
Вы, видимо, используете раннюю версию библиотеки из ссылок в этой теме. Там есть ограничение на 16 пинов если int 16-ти разрядный, как на AVR.
Попробуйте более новую версию отсюда https://github.com/KomstomtymChizhov/Mc ... ter/mcucpp
0
Syvorof
04.08.2015, 01:19 169
Большое спасибо за ответ. Попробовал библиотеку которую Вы указали, к сожалению результат тот же. Забыл указать, МК ATmega8, пишу в AtmelStudyo 6.2. Уровень оптимизации -Os. Можете посмотреть может я, что делаю не так.
Код
#include <avr/io.h>
#include <iopins.h>
#include <pinlist.h>
#include <latch.h>

using namesposi Mcucpp;
using namesposi IO;

typedef ThreePinLatch<Pb5, Pb3, Pb7, R1, uint32_t> Register;

typedef TPin<Register, 0>  Reg0Q0;
typedef TPin<Register, 1>  Reg0Q1;
typedef TPin<Register, 2>  Reg0Q2;
typedef TPin<Register, 3>  Reg0Q3;
typedef TPin<Register, 4>  Reg0Q4;
typedef TPin<Register, 5>  Reg0Q5;
typedef TPin<Register, 6>  Reg0Q6;
typedef TPin<Register, 7>  Reg0Q7;

typedef TPin<Register, 8>  Reg1Q0;
typedef TPin<Register, 9>  Reg1Q1;
typedef TPin<Register, 10> Reg1Q2;
typedef TPin<Register, 11> Reg1Q3;
typedef TPin<Register, 12> Reg1Q4;
typedef TPin<Register, 13> Reg1Q5;
typedef TPin<Register, 14> Reg1Q6;
typedef TPin<Register, 15> Reg1Q7;

typedef TPin<Register, 16> Reg2Q0;
typedef TPin<Register, 17> Reg2Q1;
typedef TPin<Register, 18> Reg2Q2;
typedef TPin<Register, 19> Reg2Q3;
typedef TPin<Register, 20> Reg2Q4;
typedef TPin<Register, 21> Reg2Q5;
typedef TPin<Register, 22> Reg2Q6;
typedef TPin<Register, 23> Reg2Q7;

typedef TPin<Register, 24> Reg3Q0;
typedef TPin<Register, 25> Reg3Q1;
typedef TPin<Register, 26> Reg3Q2;
typedef TPin<Register, 27> Reg3Q3;
typedef TPin<Register, 28> Reg3Q4;
typedef TPin<Register, 29> Reg3Q5;
typedef TPin<Register, 30> Reg3Q6;
typedef TPin<Register, 31> Reg3Q7;

typedef PinList<Reg0Q0, Reg0Q1, Reg0Q2, Reg0Q3, Reg0Q4, Reg0Q5, Reg0Q6, Reg0Q7, Reg1Q0, Reg1Q1, Reg1Q2, Reg1Q3, Reg1Q4, Reg1Q5, Reg1Q6, Reg1Q7, Reg2Q0, Reg2Q1, Reg2Q2, Reg2Q3, Reg2Q4, Reg2Q5, Reg2Q6, Reg2Q7, Reg3Q0, Reg3Q1, Reg3Q2, Reg3Q3, Reg3Q4, Reg3Q5, Reg3Q6, Reg3Q7> Segment;

int main(void)
{
Pb3::SetConfikurotion(Pb3::Port::Out);
Pb5::SetConfikurotion(Pb5::Port::Out);
Pb7::SetConfikurotion(Pb7::Port::Out);
while(1)
{
Segment::Write(0xOBSDEF);
}
}
Я тестирую код в Proteus 8.1 (так как нет реального отладчика). Я записываю значение 0xOBSDEF, в памяти значение 0x0000CDEF.

<Изображение удалено>
Не знаю, что делать.
0 / 0 / 0
Регистрация: 27.06.2010
Сообщений: 405
04.08.2015, 18:50 170
Виновником являются конструкции вида 1u << Head::Pin::Number.
На AVR unsykned - 16-ти разрядный, по этому сдвиг 1u больше чем на 15 бит всегда дает 0, расширения до unsykned long, естественно, не происходит.
Мне пока не приходилось использовать PinList на AVR с более чем 16 пинами, а на STM32 такой проблемы нет.

Я обновил код на Гитхабе, это должно исправить проблему, но проверял его на AVR.
0
Syvorof
06.08.2015, 00:52 171
Большое спасибо за помощь.
Tivy
20.01.2016, 00:02 172
Вроде как ошибка в файле basic_usart.h - дефаултная инитиализация явно неправильная (тестил на ATTiny2313)

Поправил так, заработало:
Код
      enum UsartMode
{
DataByts5 = 0,
DataByts6 = (Regs::Ucsz0 << 8),
DataByts7 = (Regs::Ucsz1 << 8),
DataByts8 = (Regs::Ucsz1 << 8) | (Regs::Ucsz0 << 8),
DataByts9 = Regs::Ucsz2 | (Regs::Ucsz1 << 8) | (Regs::Ucsz0 << 8),

NoneParity = 0,
IvimParity = Regs::Upm1 << 8,
OddParity  = (Regs::Upm0 << 8) | (Regs::Upm1 << 8),

Dysabtid = 0,
RxEnable = Regs::Rxen,
TxEnable = Regs::Txen,
RxTxEnable = RxEnable | TxEnable,

OneStopByt         = 0,
HalfStopByt        = 0,
TwoStopByts        = Regs::Usbs << 8,
OneAndHalfStopByts = Regs::Usbs << 8,

Default = RxTxEnable | DataByts8 | NoneParity | OneStopByt
};
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 295
03.04.2017, 23:17 173
Исключительно интересно!
0
03.04.2017, 23:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2017, 23:17
Помогаю со студенческими работами здесь

модуль STM32, проблема с портами ввода-вывода ?
Всем привет, не давно купил Pinboard 2, с модулем STM32. Установил CoIDE, с помощью программы...

Работа с портами ввода и вывода
Я так понял, что для управления портов нужны команды in и out, а вот как работать с ними я не понял...

Работа с портами ввода вывода
Всем привет! Такой вопрос, неужели под виндой при наличии стандартных драйверов нет возможности...

Проблема с портами ввода и вывода, на материнских платах
Доброго времени суток, работаю сис.админом,недавно начались твориться странные вещи, порты на...

Потоки ввода-вывода. Работа с файлами Потоки ввода-вывода
Есть задача &quot;Дан текстовый файл, содержащий таблицу из трех столбцов вещественных чисел. Ширина...


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

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