DUE
- Войдите на сайт для отправки комментариев
Пт, 29/06/2018 - 05:41
Как считать ЦЕЛИКОМ порт, или записать ЦЕЛИКОМ порт ?
Или для этого нужен драйвер ?
Как считать ЦЕЛИКОМ порт, или записать ЦЕЛИКОМ порт ?
Или для этого нужен драйвер ?
Нет, для этого как раз ничего не нужно. Считывается (записывается) одной ассемблерной командой. При этом существуют варианты.
Вспомнился анекдот:
Шерлок Холмс и Ватсон летели на воздушном шаре и совершили вынужденную посадку в пустыне. Вокруг от горизонта до горизонта - один песок... Вдруг видят - проходит мимо человек. Ватсон спрашивает у него:
- Вы не могли бы сказать хотя бы приблизительно, где мы находимся?
В ответ слышат:
- Не только приблизительно, но и совершенно точно - вы находитесь в корзине воздушного шара!
Холмс:
- Этот человек - программист!
Ватсон (изумленно):
- Как Вы об этом узнали, Холмс?
Холмс:
- Элементарно, Ватсон! Только у программиста мог быть такой абсолютно точный и абсолютно бесполезный ответ.
andriano, ;-)
Дайте пример записи в порт С, числа 367 ...
В какой регистр нужно писать то хоть ???
PIOC->PIO_ODSR = 367 так будет правильно ?
И еще сеществует ли библиотека, объединяющая пины, в виртуальные порты,
Допустим мне нужно сделать три порта по 16 бит, и писать по этим портам ....
НЕ не работает, дайте пример записи в порт(целиком) числа 367 ....
И чтение порта С тоже целиком ....
Побитно работает , а целиком весь порт как
REG_PIOC_OER = 0x1 <<22; //22 пин порта С на вывод
REG_PIOC_SODR = 0x1 << 22; //22 пин порта С пишем 1
Как все тоже самое только с портом целиком ???
RedD, в выражении REG_PIOC_SODR = 0x1 << 22; вы проводите операцию именно с портом целиком. Вот если б было REG_PIOC_SODR |= 0x1 << 22; тогда с конкретным 22м битом. Изучите уже двоичные операции.
RedD, в выражении REG_PIOC_SODR = 0x1 << 22; вы проводите операцию именно с портом целиком. Вот если б было REG_PIOC_SODR |= 0x1 << 22; тогда с конкретным 22м битом. Изучите уже двоичные операции.
Щас проверю, .....
Нет именно с 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 бите порта С
Не получается целиком писать в порт С,
Мне нужно писать именно в порт, а не побитно, нужен пример допустим как в порт C записать 0x24AC
digitalWrite(8,HIGH); <-> REG_PIOC_SODR = 0x1 << 22; (8 пин DUE, 22 бит выдать 1 )
Я проверил высокий уровень только на 22 бите порта С
Естественно только на нём, все другие вы ведь сбросили в ноль. Выучите уже двоичные операции, перестанете задавать идиотские вопросы.
А это просто догическое сложение, и в данном случае толку от него нет так как мы работаем конкретно с 22 битом ,а не со всем портом
REG_PIOC_SODR |= 0x1 << 22
Я их и не выставил чтобы сбросить то, вот в чем засада то
А чтобы сбросит нужно CODR использовать , а не SODR
CODR clear
SODR set
RedD, ещё раз вам говорю -все проблемы у вас исключительно из-за того, что вы не понимаете двоичных операций. В данном случае вы не понимаете операции "битовый сдвиг". Вернее что-то понимаете, но в голове точно нет всей полноты картины. Конструкция REG_PIOC_SODR = 0x1 << 22; без сдвига это будет выглядеть как REG_PIOC_SODR=0x400000; это уже похоже на запись в "весь порт" ??
PS И писать нужно в ODSR
RedD, ещё раз вам говорю -все проблемы у вас исключительно из-за того, что вы не понимаете двоичных операций. В данном случае вы не понимаете операции "битовый сдвиг". Вернее что-то понимаете, но в голове точно нет всей полноты картины. Конструкция REG_PIOC_SODR = 0x1 << 22; без сдвига это будет выглядеть как REG_PIOC_SODR=0x400000; это уже похоже на запись в "весь порт" ??
PS И писать нужно в ODSR
Пробовал REG_PIOC_SODR=0xFFFF; (весь порт в 1) не работает, щас еще раз попробую
Понял, архитектура 32 разрядная, нужно писать 0xffffffff, заработало,
Сенк за то что помог разобраться )
PS И писать нужно в ODSR ,
Нужно попробовать, писать в ODSR, щас проверим
Все работает, да писать нужно в ODSR ....
Есть ведь знающие люди на этом форуме, .... респект )
Еще обратил внимани на PB26(22 пин ардуино) постоянно высокий уровень, и не управляется, это у меня она неисправна ?
Или я чего то не понимаю ?
RedD, странно конечно. Может сдох, либо возможно, что ардуина проинитила этот пин как ногу другого периферийного устройства, и соответссно не даёт им управлять.
RedD, странно конечно. Может сдох, либо возможно, что ардуина проинитила этот пин как ногу другого периферийного устройства, и соответссно не даёт им управлять.
А не встречал либу, чтобы из разных пинов можно было порты допустим 16 битные сделать, так скажем виртуальные, а работать с ними как с обычными портами ?
...Только у программиста мог быть такой абсолютно точный и абсолютно бесполезный ответ.
andriano, ;-)
dimax, кроме категорий полезно/бесполезно есть еще опасно/безопасно, и мне кажется, что внимание ТС следовало бы обратить именно на этот аспект.
Т.е. сначала мы читаем документацию, детально разбираемся, чего именно мы хотим добиться, и только после этого думаем, как нам воплотить задуманное.
А, судя по исходному сообщению, задача, поставленная ТС в принципе неразрешима, зато чревато непредсказуемыми последствиями. В частности, как можно записать или считать порт ЦЕЛИКОМ, есди его именнно ЦЕЛИКОМ физически не существует - в наличии лишь 31 разряд. Далее, далеко не все из этих 31 выведены с ног контроллера на гребенку контактов Due. И, наконец, один из разрядов отвечает за стирание flash-памяти. Уверены ли мы, что это именно то, что нам нужно?
А не встречал либу, чтобы из разных пинов можно было порты допустим 16 битные сделать, так скажем виртуальные, а работать с ними как с обычными портами ?
Вряд ли это технически возможно. Думаю, максимум, что можно реализовать, - это выбрать произвольные 16 разрядов одного 32-разрядного регистра. Что, в принципе, может быть полезно из-за того, что часть разрядов может быть не выведено на гребенку или использоваться по другому назначению. Но попытка собрать отдельные биты из разных регистров, думаю, неизбежно приведет к их неодновременному срабатыванию.
ok
Как сделать одного 32 разрядного порта 4-ре 8-ми разрядных ?
Писать в регистр и сдвигать нга нужное число бит ?
RedD, что вы хотите сделать? Решение всегда зависит от конкретной цели. Можно читать/писать байты со сдвигом. Но врядли на плате Due есть такой порт, где на разъём выведены все его 32 пина.
Задача такая,
Есть DUE, мне нужно два 8-ми битных порта(параллельных), для управления, ..светодиодной матрицей, 8х8
RedD, вы понимаете масштабы работ ? Дуе не мега, светодиоды ей на голые ноги нельзя вешать, нужны буффера на каждый пин. Схема в итоге безобразно разрастётся. Лучше взять специальный контроллер, типа MAX7219.
Да представляю, 16 ключей на кт315,
Ладно наверное лучше на MAX 7219 сделать,
Вот пример виртуального порта для AVR
http://www.polesite.ru/?p=1965,