Перейти к содержанию
    

Связь двух устройств с uart. Между ними arduino

 убрал функции ардуино.

 

Переписал сейчас вот так для теста:

 if ((PIND & (1 << PD0))) 
        PORTD |= (1 << PD2);
     else 
        PORTD &= ~(1 << PD2);

     if ((PIND & (1 << PD3))) 
        PORTD |= (1 << PD1);
     else 
        PORTD &= ~(1 << PD1);

 

Быстрее этого еще можно анализировать состояние ножки и копировать на другую? 

На ассемблере вставка может будет еще быстрее?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какой МК?

Если AVR, то думаю в сЭмь-восЭмь тактов можно и уложиться.

А если бы были одинаковые биты в разных портах, то можно и быстрее наверное.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, skilful сказал:

На ассемблере вставка может будет еще быстрее?

Поглядите листинг после компилятора. Тогда можно будет говорить про быстрее или медленнее.:dance3: А том, может быть, у вас оптимизация выключена и компилятор там циклы навставлял))))))))))))))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 hours ago, zombi said:

Какой МК?

Если AVR, то думаю в сЭмь-восЭмь тактов можно и уложиться.

А если бы были одинаковые биты в разных портах, то можно и быстрее наверное.

 

как это одинаковые биты в разных портах и быстрее?

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 часов назад, Сергей Борщ сказал:

Если очень хочется оставить ардуину - можно поставить две ардуины УАППами наружу

А что, нет ардуин с 2мя уартами? На основе 128меги или меги324-1284??

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, mantech сказал:

А что, нет ардуин с 2мя уартами?

Есть. Автор темы упоминал о них в первом сообщении. Перечитайте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, skilful said:

как это одинаковые биты в разных портах и быстрее?

Прочитать в регистр состояние одного порта и выдать его в другой как-то вроде быстрее можно сделать чем переставлять биты в этом-же регистре перед выдачей.

Вам же надо вроде 0-й бит порта транслировать на 2-й, а 3-й на 1-й.

МК секретный?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если бы ТС выложил как компилятор реализовал на асме вот это

if ((PIND & (1 << PD0))) 
        PORTD |= (1 << PD2);
     else 
        PORTD &= ~(1 << PD2);

     if ((PIND & (1 << PD3))) 
        PORTD |= (1 << PD1);
     else 
        PORTD &= ~(1 << PD1);

тогда и думать можно ли ускорить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вообще, если входа подключить на один порт, а выхода на другой порт на те же соответствующие биты.

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

while(1)
{
  PORTD = PINB;
}

Но ведь все равно эта Ардуина зачем-то нужна между этими двумя устройствами, которые между собой по 

UART общаются, значит появятся какие-то еще другие действия, которые будут тормозить процесс трансляции

с одного порта на другой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если я правильно понял, автору нужно в начале проинитить оба подключенных к дурине устройства независимо а затем типа соединить их уарты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 минуты назад, dimka76 сказал:

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


while(1)
{
  PORTD = PINB;
}

А еще тогда лучше продублировать строки PORTD = PINB в цикле до талого: пока память программ не закончится:biggrin:
Этим разгрузится штраф на команду перехода и семплирование будет более плавным с точки зрения постоянства.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А чем ТС не устраивают платы уровня STM32L100C-DISCO? Два UART и программатор в одном.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, mdmitry сказал:

А чем ТС не устраивают платы уровня STM32L100C-DISCO? Два UART и программатор в одном.

Очевидно тем, что ТС об этом сказал еще в первом топике

Цитата

Я некоторое время назад поднимал уже похожую тему, мне рекомендовали Arduino с двумя uart. Но пока не получается его поменять.

Ситуации бывают разные, но хотелось бы верить, что под "не получается его поменять" скрывается весомая причина, а не банальная лень:biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

МК, конечно, не секретный: для этой 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 в цикле до талого: пока память программ не закончится:biggrin:
Этим разгрузится штраф на команду перехода и семплирование будет более плавным с точки зрения постоянства.

Думал и про такую реализацию для каждого бита, а затем переброс на начало цикла )

 

39 minutes ago, mdmitry said:

А чем ТС не устраивают платы уровня STM32L100C-DISCO? Два UART и программатор в одном.

 

Устраивают. Даже плата с STM32 лежит, но боюсь, что я "утону" в этом. И так все мои знания устарели и и их надо освежать/наполнять. Так еще и STM32 изучать придется )) 

 

Наверное, если с коммутацией через ноги МК не получится, то полевички поставить что ли придется дополнительно.

1 hour ago, dimka76 said:

А вообще, если входа подключить на один порт, а выхода на другой порт на те же соответствующие биты.

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


while(1)
{
  PORTD = PINB;
}

Но ведь все равно эта Ардуина зачем-то нужна между этими двумя устройствами, которые между собой по 

UART общаются, значит появятся какие-то еще другие действия, которые будут тормозить процесс трансляции

с одного порта на другой.

Никаких других действий -- просто Arduino в роли транзита uartов после инициализации. Если, конечно, так можно вообще сделать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...