Быстрое чтение цифровых входов Arduino DUE
- Войдите на сайт для отправки комментариев
Пт, 29/04/2016 - 11:08
Коллеги! Второй день бьюсь с задачкой.
Имеем Ардуинку DUE надо единовременно прочитать байт данных на цифровых входах сравнить значение байта и в соответствии с результатом выдать определенный сигнал.
Проблема вот в чем, стандартное обращение копец какое медленное и побитное до кучи -> можем потерять часть данных. Решил обратиться напрямую к регистрам. Доселе с 32-х разрядными МК не работал и логику работы с регистрами не знаю.
Раскурил мануал и забугорные форумы, худо-бедно разобрался как считать и записать в регистры отдельные биты. А вот с Байтом не пойму...
По форуму искал - не нашел ничего похожего.
Может делал кто подобную задачу - покидайте примерчики пожалуйста.
Я не уверен, т.к. сам с этим МК не работал, но возможно так?
1
pinsStatus = PIOA->PIO_PDSR;
//считать весь порт А, только там 4 байта (PA0-PA31)
А чтобы записать сразу несколько бит, вроде так:
1
PIOA->PIO_OWER = value_;
//разрешаем запись нужных битов в PIO_ODSR
2
PIOA->PIO_ODSR = value;
//записываем значение в порт А
3
PIOA->PIO_OWDR = 0xFFFFFFFF;
//обнуляем единицами, если надо работать с другими битами в PIO_OWER и PIO_ODSR
4
PIOA->PIO_OWER = value2_;
//разрешаем запись нужных битов в PIO_ODSR
5
PIOA->PIO_ODSR = value2;
//записываем значение в порт А
Порты 32-битные (4 байта). Даташит, полезная ссылка.
Если хотите действительно погрузиться, то читайте не форумы, а документацию атмела
с этим МК не работал, но там наверняка есть оабота с портом ввода вывода как с одним байтом или словом или даже двойным словом учитывая разрядность ядра этого МК
а что за задача? Может она немного иначе решается
Я не уверен, т.к. сам с этим МК не работал, но возможно так?
1
pinsStatus = PIOA->PIO_PDSR;
//считать весь порт А, только там 4 байта (PA0-PA31)
А чтобы записать сразу несколько бит, вроде так:
1
PIOA->PIO_OWER = value_;
//разрешаем запись нужных битов в PIO_ODSR
2
PIOA->PIO_ODSR = value;
//записываем значение в порт А
3
PIOA->PIO_OWDR = 0xFFFFFFFF;
//обнуляем единицами, если надо работать с другими битами в PIO_OWER и PIO_ODSR
4
PIOA->PIO_OWER = value2_;
//разрешаем запись нужных битов в PIO_ODSR
5
PIOA->PIO_ODSR = value2;
//записываем значение в порт А
Порты 32-битные (4 байта). Даташит, полезная ссылка.
Спасибо.
По ссылочке уже поковырял материал, куда копать понял и полез в даташит.
Строчку попробовал pinsStatus = PIOA->PIO_PDSR; //считать весь порт А, только там 4 байта (PA0-PA31)
Чего то считывает, но что это за число и откуда оно взялось, вообще не ясно.
В общем штудируйте даташит, глава 31 (31.5.4 Output Control, 31.5.5 Synchronous Data Output, 31.5.8 Inputs, 31.7 Parallel Input/Output Controller (PIO) User Interface).
P.S. Поправочка, не все порты 32-битные:
Если хотите действительно погрузиться, то читайте не форумы, а документацию атмела
с этим МК не работал, но там наверняка есть оабота с портом ввода вывода как с одним байтом или словом или даже двойным словом учитывая разрядность ядра этого МК
а что за задача? Может она немного иначе решается
СОбственно вкуриванием Даташита сейчас и занимаюсь. Инфа есть (с 618 страницы) но носит она описательный характер, я пока не могу понять последовательность действий для настройки портов и считывания оттуда только нужных мне значений.
Задача такова: Имеем МК, в нем расчитана и записана табличка функции SINуса из 1000 значений на период. С цифровых входов считываем бит данных, в нем живет бит ВКЛ/ВЫКЛ и частота выдачи синуса на аналоговый выход Дуинки.
На внешнем устростве (пром ПЛК задается частота и соответственно включение и выключение генерации (чтения табличных данных) а с Дуинки выдается синусоида на 3-е устройство (исполнительное). DUE выбрал исключительно из-за высокой частоты работы и возможности последующего наращивания системы.
Покурите даташит на той странице, где описана структура SRAM - там интресно рассказано об отображении файла РОН и портов. :)