skilful 0 16 декабря, 2020 Опубликовано 16 декабря, 2020 · Жалоба убрал функции ардуино. Переписал сейчас вот так для теста: if ((PIND & (1 << PD0))) PORTD |= (1 << PD2); else PORTD &= ~(1 << PD2); if ((PIND & (1 << PD3))) PORTD |= (1 << PD1); else PORTD &= ~(1 << PD1); Быстрее этого еще можно анализировать состояние ножки и копировать на другую? На ассемблере вставка может будет еще быстрее? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 16 декабря, 2020 Опубликовано 16 декабря, 2020 · Жалоба Какой МК? Если AVR, то думаю в сЭмь-восЭмь тактов можно и уложиться. А если бы были одинаковые биты в разных портах, то можно и быстрее наверное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 17 декабря, 2020 Опубликовано 17 декабря, 2020 · Жалоба 4 часа назад, skilful сказал: На ассемблере вставка может будет еще быстрее? Поглядите листинг после компилятора. Тогда можно будет говорить про быстрее или медленнее. А том, может быть, у вас оптимизация выключена и компилятор там циклы навставлял)))))))))))))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skilful 0 17 декабря, 2020 Опубликовано 17 декабря, 2020 · Жалоба 7 hours ago, zombi said: Какой МК? Если AVR, то думаю в сЭмь-восЭмь тактов можно и уложиться. А если бы были одинаковые биты в разных портах, то можно и быстрее наверное. как это одинаковые биты в разных портах и быстрее? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 35 17 декабря, 2020 Опубликовано 17 декабря, 2020 · Жалоба 16 часов назад, Сергей Борщ сказал: Если очень хочется оставить ардуину - можно поставить две ардуины УАППами наружу А что, нет ардуин с 2мя уартами? На основе 128меги или меги324-1284?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 17 декабря, 2020 Опубликовано 17 декабря, 2020 · Жалоба 7 минут назад, mantech сказал: А что, нет ардуин с 2мя уартами? Есть. Автор темы упоминал о них в первом сообщении. Перечитайте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 17 декабря, 2020 Опубликовано 17 декабря, 2020 · Жалоба 4 hours ago, skilful said: как это одинаковые биты в разных портах и быстрее? Прочитать в регистр состояние одного порта и выдать его в другой как-то вроде быстрее можно сделать чем переставлять биты в этом-же регистре перед выдачей. Вам же надо вроде 0-й бит порта транслировать на 2-й, а 3-й на 1-й. МК секретный? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 17 декабря, 2020 Опубликовано 17 декабря, 2020 · Жалоба 5 minutes ago, zombi said: Прочитать в регистр состояние одного порта и выдать его в другой как-то вроде быстрее можно сделать чем переставлять биты в этом-же регистре перед выдачей. Вам же надо вроде 0-й бит порта транслировать на 2-й, а 3-й на 1-й. Не должно быть там перестановки. Обычно компиляторы для AVR на конструкцию PORTD |= (1 << PD1); Вставляют инструкцию SBI - Set bit in I/O register. А также if ((PIND & (1 << PD0))) Должна замениться на SBIS - Skip if Bit in register is Set Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 17 декабря, 2020 Опубликовано 17 декабря, 2020 · Жалоба Если бы ТС выложил как компилятор реализовал на асме вот это if ((PIND & (1 << PD0))) PORTD |= (1 << PD2); else PORTD &= ~(1 << PD2); if ((PIND & (1 << PD3))) PORTD |= (1 << PD1); else PORTD &= ~(1 << PD1); тогда и думать можно ли ускорить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 17 декабря, 2020 Опубликовано 17 декабря, 2020 · Жалоба А вообще, если входа подключить на один порт, а выхода на другой порт на те же соответствующие биты. И, хотя бы, на выходном порту другие ножки вообще ни для чего не использовать, то можно еще быстрее сделать. while(1) { PORTD = PINB; } Но ведь все равно эта Ардуина зачем-то нужна между этими двумя устройствами, которые между собой по UART общаются, значит появятся какие-то еще другие действия, которые будут тормозить процесс трансляции с одного порта на другой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 17 декабря, 2020 Опубликовано 17 декабря, 2020 · Жалоба Если я правильно понял, автору нужно в начале проинитить оба подключенных к дурине устройства независимо а затем типа соединить их уарты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 17 декабря, 2020 Опубликовано 17 декабря, 2020 · Жалоба 22 минуты назад, dimka76 сказал: И, хотя бы, на выходном порту другие ножки вообще ни для чего не использовать, то можно еще быстрее сделать. while(1) { PORTD = PINB; } А еще тогда лучше продублировать строки PORTD = PINB в цикле до талого: пока память программ не закончится Этим разгрузится штраф на команду перехода и семплирование будет более плавным с точки зрения постоянства. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 17 декабря, 2020 Опубликовано 17 декабря, 2020 · Жалоба А чем ТС не устраивают платы уровня STM32L100C-DISCO? Два UART и программатор в одном. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 17 декабря, 2020 Опубликовано 17 декабря, 2020 · Жалоба 7 минут назад, mdmitry сказал: А чем ТС не устраивают платы уровня STM32L100C-DISCO? Два UART и программатор в одном. Очевидно тем, что ТС об этом сказал еще в первом топике Цитата Я некоторое время назад поднимал уже похожую тему, мне рекомендовали Arduino с двумя uart. Но пока не получается его поменять. Ситуации бывают разные, но хотелось бы верить, что под "не получается его поменять" скрывается весомая причина, а не банальная лень Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skilful 0 17 декабря, 2020 Опубликовано 17 декабря, 2020 · Жалоба МК, конечно, не секретный: для этой Arduino он Mega328P Перегнал код в Студию получилось вот так: 47: if ((PIND & (1 << PD0))) 00000052 48.9b SBIS 0x09,0 Skip if bit in I/O register set 00000053 04.c0 RJMP PC+0x0005 Relative jump 48: PORTD |= (1 << PD2); 00000054 8b.b1 IN R24,0x0B In from I/O location 00000055 84.60 ORI R24,0x04 Logical OR with immediate 00000056 8b.b9 OUT 0x0B,R24 Out to I/O location 00000057 03.c0 RJMP PC+0x0004 Relative jump 50: PORTD &= ~(1 << PD2); 00000058 8b.b1 IN R24,0x0B In from I/O location 00000059 8b.7f ANDI R24,0xFB Logical AND with immediate 0000005A 8b.b9 OUT 0x0B,R24 Out to I/O location 51: if ((PIND & (1 << PD3))) 0000005B 4b.9b SBIS 0x09,3 Skip if bit in I/O register set 0000005C 04.c0 RJMP PC+0x0005 Relative jump --- c:\users\sa\Documents\Atmel Studio\7.0\avr_test1\avr_test1\Debug/.././main.c 52: PORTD |= (1 << PD1); 0000005D 8b.b1 IN R24,0x0B In from I/O location 0000005E 82.60 ORI R24,0x02 Logical OR with immediate 0000005F 8b.b9 OUT 0x0B,R24 Out to I/O location 00000060 f1.cf RJMP PC-0x000E Relative jump 54: PORTD &= ~(1 << PD1); 00000061 8b.b1 IN R24,0x0B In from I/O location 00000062 8d.7f ANDI R24,0xFD Logical AND with immediate 00000063 8b.b9 OUT 0x0B,R24 Out to I/O location 00000064 ed.cf RJMP PC-0x0012 Relative jump 1 hour ago, zombi said: Если я правильно понял, автору нужно в начале проинитить оба подключенных к дурине устройства независимо а затем типа соединить их уарты. Да,вы все правильно поняли 1 hour ago, Arlleex said: А еще тогда лучше продублировать строки PORTD = PINB в цикле до талого: пока память программ не закончится Этим разгрузится штраф на команду перехода и семплирование будет более плавным с точки зрения постоянства. Думал и про такую реализацию для каждого бита, а затем переброс на начало цикла ) 39 minutes ago, mdmitry said: А чем ТС не устраивают платы уровня STM32L100C-DISCO? Два UART и программатор в одном. Устраивают. Даже плата с STM32 лежит, но боюсь, что я "утону" в этом. И так все мои знания устарели и и их надо освежать/наполнять. Так еще и STM32 изучать придется )) Наверное, если с коммутацией через ноги МК не получится, то полевички поставить что ли придется дополнительно. 1 hour ago, dimka76 said: А вообще, если входа подключить на один порт, а выхода на другой порт на те же соответствующие биты. И, хотя бы, на выходном порту другие ножки вообще ни для чего не использовать, то можно еще быстрее сделать. while(1) { PORTD = PINB; } Но ведь все равно эта Ардуина зачем-то нужна между этими двумя устройствами, которые между собой по UART общаются, значит появятся какие-то еще другие действия, которые будут тормозить процесс трансляции с одного порта на другой. Никаких других действий -- просто Arduino в роли транзита uartов после инициализации. Если, конечно, так можно вообще сделать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться