DUE

RedD
Offline
Зарегистрирован: 29.06.2018

Как считать ЦЕЛИКОМ порт, или записать ЦЕЛИКОМ порт ?

Или для этого нужен драйвер ?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Вспомнился анекдот:

Шерлок Холмс и Ватсон летели на воздушном шаре и совершили вынужденную посадку в пустыне. Вокруг от горизонта до горизонта - один песок... Вдруг видят - проходит мимо человек. Ватсон спрашивает у него:
- Вы не могли бы сказать хотя бы приблизительно, где мы находимся?
В ответ слышат:
- Не только приблизительно, но и совершенно точно - вы находитесь в корзине воздушного шара!
Холмс:
- Этот человек - программист!
Ватсон (изумленно):
- Как Вы об этом узнали, Холмс?
Холмс:
- Элементарно, Ватсон! Только у программиста мог быть такой абсолютно точный и абсолютно бесполезный ответ.

andriano, ;-)

RedD
Offline
Зарегистрирован: 29.06.2018

Дайте пример записи в порт С, числа 367 ...

В какой регистр нужно писать то хоть ???

PIOC->PIO_ODSR = 367 так будет правильно ?

 

RedD
Offline
Зарегистрирован: 29.06.2018

И еще сеществует ли библиотека, объединяющая пины, в виртуальные порты, 

Допустим мне нужно сделать три порта по 16 бит, и писать по этим портам ....

RedD
Offline
Зарегистрирован: 29.06.2018

НЕ не работает, дайте пример записи в порт(целиком) числа 367 ....

RedD
Offline
Зарегистрирован: 29.06.2018

И чтение порта С тоже целиком ....

RedD
Offline
Зарегистрирован: 29.06.2018

Побитно работает , а целиком весь порт как 

REG_PIOC_OER = 0x1 <<22;     //22 пин порта С на вывод

REG_PIOC_SODR = 0x1 << 22;  //22 пин порта С пишем 1

Как все тоже самое только с портом целиком ???

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

RedD, в  выражении  REG_PIOC_SODR = 0x1 << 22; вы проводите операцию именно с портом целиком. Вот если б было REG_PIOC_SODR |= 0x1 << 22;  тогда с конкретным 22м битом. Изучите уже двоичные операции.

RedD
Offline
Зарегистрирован: 29.06.2018

dimax пишет:

RedD, в  выражении  REG_PIOC_SODR = 0x1 << 22; вы проводите операцию именно с портом целиком. Вот если б было REG_PIOC_SODR |= 0x1 << 22;  тогда с конкретным 22м битом. Изучите уже двоичные операции.

Щас проверю, .....

RedD
Offline
Зарегистрирован: 29.06.2018

Нет именно с 22 битом порта С, получается так

pinMode(8, OUTPUT); <->  REG_PIOC_OER = 0x1 <<22; (8 пин DUE, 22 бит порта С на вывод)

digitalWrite(8,HIGH); <->  REG_PIOC_SODR = 0x1 << 22; (8 пин DUE, 22 бит выдать 1 )

Я проверил высокий уровень только на 22 бите порта С

RedD
Offline
Зарегистрирован: 29.06.2018

Не получается целиком писать в порт С,

Мне нужно писать именно в порт, а не побитно, нужен пример допустим как в порт C записать 0x24AC

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

RedD пишет:

digitalWrite(8,HIGH); <->  REG_PIOC_SODR = 0x1 << 22; (8 пин DUE, 22 бит выдать 1 )

Я проверил высокий уровень только на 22 бите порта С

Естественно только на нём, все другие вы ведь сбросили в ноль.  Выучите уже двоичные операции, перестанете задавать идиотские вопросы.

RedD
Offline
Зарегистрирован: 29.06.2018

А это просто догическое сложение, и в данном случае толку от него нет так как мы работаем конкретно с 22 битом ,а не со всем портом

REG_PIOC_SODR |= 0x1 << 22

RedD
Offline
Зарегистрирован: 29.06.2018

Я их и не выставил чтобы сбросить то, вот в чем засада то

А чтобы сбросит нужно CODR использовать , а не SODR

CODR clear

SODR set

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

RedD, ещё раз вам говорю -все проблемы у вас исключительно из-за того, что вы не понимаете двоичных операций. В данном случае вы не понимаете операции "битовый сдвиг".  Вернее что-то понимаете, но в голове точно нет всей полноты картины.  Конструкция REG_PIOC_SODR = 0x1 << 22;  без сдвига это будет выглядеть как    REG_PIOC_SODR=0x400000;  это уже похоже на запись в "весь порт" ??

PS И писать нужно в ODSR

RedD
Offline
Зарегистрирован: 29.06.2018

dimax пишет:

RedD, ещё раз вам говорю -все проблемы у вас исключительно из-за того, что вы не понимаете двоичных операций. В данном случае вы не понимаете операции "битовый сдвиг".  Вернее что-то понимаете, но в голове точно нет всей полноты картины.  Конструкция REG_PIOC_SODR = 0x1 << 22;  без сдвига это будет выглядеть как    REG_PIOC_SODR=0x400000;  это уже похоже на запись в "весь порт" ??

PS И писать нужно в ODSR

Пробовал REG_PIOC_SODR=0xFFFF; (весь порт в 1) не работает, щас еще раз попробую

 

RedD
Offline
Зарегистрирован: 29.06.2018

Понял, архитектура 32 разрядная, нужно писать 0xffffffff, заработало, 

Сенк за то что помог разобраться )

RedD
Offline
Зарегистрирован: 29.06.2018

PS И писать нужно в ODSR , 

Нужно попробовать, писать в ODSR, щас проверим 

RedD
Offline
Зарегистрирован: 29.06.2018

Все работает, да писать нужно в ODSR ....

Есть ведь знающие люди на этом форуме, .... респект )

RedD
Offline
Зарегистрирован: 29.06.2018

Еще обратил внимани на PB26(22 пин ардуино) постоянно высокий уровень, и не управляется, это у меня она неисправна ?

Или я чего то не понимаю ?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

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

RedD
Offline
Зарегистрирован: 29.06.2018

dimax пишет:

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

А не встречал либу, чтобы из разных пинов можно было порты допустим 16 битные сделать, так скажем виртуальные, а работать с ними как с обычными портами ?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

dimax пишет:

...Только у программиста мог быть такой абсолютно точный и абсолютно бесполезный ответ.

andriano, ;-)

dimax, кроме категорий полезно/бесполезно есть еще опасно/безопасно, и мне кажется, что внимание ТС следовало бы обратить именно на этот аспект.

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

А, судя по исходному сообщению, задача, поставленная ТС в принципе неразрешима, зато чревато непредсказуемыми последствиями. В частности, как можно записать или считать порт ЦЕЛИКОМ, есди его именнно ЦЕЛИКОМ физически не существует - в наличии лишь 31 разряд. Далее, далеко не все из этих 31 выведены с ног контроллера на гребенку контактов Due. И, наконец, один из разрядов отвечает за стирание flash-памяти. Уверены ли мы, что это именно то, что нам нужно?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

RedD пишет:

А не встречал либу, чтобы из разных пинов можно было порты допустим 16 битные сделать, так скажем виртуальные, а работать с ними как с обычными портами ?

Вряд ли это технически возможно. Думаю, максимум, что можно реализовать, - это выбрать произвольные 16 разрядов одного 32-разрядного регистра. Что, в принципе, может быть полезно из-за того, что часть разрядов может быть не выведено на гребенку или использоваться по другому назначению. Но попытка собрать отдельные биты из разных регистров, думаю, неизбежно приведет к их неодновременному срабатыванию.

RedD
Offline
Зарегистрирован: 29.06.2018

ok

RedD
Offline
Зарегистрирован: 29.06.2018

Как сделать одного 32 разрядного порта 4-ре 8-ми разрядных ?

RedD
Offline
Зарегистрирован: 29.06.2018

Писать в регистр и сдвигать нга нужное число бит ?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

RedD, что вы хотите сделать? Решение всегда зависит от конкретной цели. Можно читать/писать байты со сдвигом. Но врядли на плате Due есть такой порт, где на разъём выведены все его 32 пина.

RedD
Offline
Зарегистрирован: 29.06.2018

Задача такая, 

Есть DUE, мне нужно два 8-ми битных порта(параллельных), для управления, ..светодиодной матрицей, 8х8

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

RedD, вы понимаете масштабы работ ? Дуе не мега, светодиоды ей на голые ноги нельзя вешать, нужны буффера на каждый пин. Схема в итоге безобразно разрастётся. Лучше взять специальный контроллер, типа MAX7219. 

RedD
Offline
Зарегистрирован: 29.06.2018

Да представляю, 16 ключей на кт315, 

RedD
Offline
Зарегистрирован: 29.06.2018

Ладно наверное лучше на MAX 7219 сделать, 

RedD
Offline
Зарегистрирован: 29.06.2018

Вот пример виртуального порта для AVR 

 

http://www.polesite.ru/?p=1965