Изобретаем велосипед: замена "digitalWrite"

Ответить
seri0shka
Лейтенант
Сообщения: 334
Зарегистрирован: 09.04.2016{, 12:17}
Репутация: 15
Откуда: Кременчуг

Изобретаем велосипед: замена "digitalWrite"

#1

Сообщение seri0shka » 12.03.2019{, 14:39}

Собственно, для начала вопрос: кто знает замену digitalWrite, причём с возможностью использования без необходимости переделывать полностью проекты? Свои эксперименты пока не привожу, так как не увенчались успехом, хотя некоторые подвижки есть. Изначально затеял для того, чтоб уменьшить размер занимаемой памяти контроллера (есть проекты под 100%), там много сэкономить не удалось. Попробовал проверить на скорость, там тоже не очень, хотя предполагалось многократное увеличение.

Аватара пользователя
pan
Полковник
Сообщения: 2725
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 171
Откуда: Воронеж
Имя: Алексей
Контактная информация:

Изобретаем велосипед: замена "digitalWrite"

#2

Сообщение pan » 12.03.2019{, 14:56}

seri0shka писал(а):
12.03.2019{, 14:39}
причём с возможностью использования без необходимости переделывать полностью проекты
это как вы себе представляете?
Если вам здесь помогли, можете отблагодарить . "Сказать" спасибо проекту!

seri0shka
Лейтенант
Сообщения: 334
Зарегистрирован: 09.04.2016{, 12:17}
Репутация: 15
Откуда: Кременчуг

Изобретаем велосипед: замена "digitalWrite"

#3

Сообщение seri0shka » 12.03.2019{, 15:09}

Не только представяю, но и пробовал. В готовом скетче (в Ардуино ИДЕ) с помощью инструмента "Правка" переименовываем абсолютно все "digitalWrite" в "digitWrite" (например), а в конец скетча добавляем функцию void digitWrite(uint8_t pin, uint8_t val). Если вставить
СпойлерПоказать

Код: Выделить всё

void digitWrite(uint8_t pin, uint8_t val)
{
	uint8_t timer = digitalPinToTimer(pin); // Вычисляется таймер пина - это необходимо для некоторых пинов, поддерживающих ШИМ
	uint8_t bit = digitalPinToBitMask(pin); // Вычисляется битовая маска для соответствующего пина
	uint8_t port = digitalPinToPort(pin); // Вычисляется порт, которому принадлежит пин
	volatile uint8_t *out;

	if (port == NOT_A_PIN) return; // Если задан некорректный пин - выходим

	// If the pin that support PWM output, we need to turn it off
	// before doing a digital write.
	if (timer != NOT_ON_TIMER) turnOffPWM(timer); // Если пин поддерживает ШИМ, то перед установкой значения нужно отключить таймер, генерирующий ШИМ

	out = portOutputRegister(port); // Конвертируем полученный порт в адрес

	uint8_t oldSREG = SREG; // SREG - регистр хранящий флаг прерываний, запоминаем его
	cli(); // Запрещаем прерывания

	if (val == LOW) { // Устанавливаем значения
		*out &= ~bit; 
	} else {
		*out |= bit;
	}

	SREG = oldSREG; // Возвращаем регистру прерываний состояние до запрета прерываний
}
то получим стандартную реализацию. Но стандартную можно заменить на свою. При этом любой готовый проект не нуждается в переделке.

Отправлено спустя 2 минуты 31 секунду:
Вероятно, можно и не переименовывать. Но тогда не знаю, сработает: как стандартная ИДЕшная, или как своя.

Аватара пользователя
pan
Полковник
Сообщения: 2725
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 171
Откуда: Воронеж
Имя: Алексей
Контактная информация:

Изобретаем велосипед: замена "digitalWrite"

#4

Сообщение pan » 12.03.2019{, 15:22}

на какую свою? есть уже готовая отлаженная реализация. быстрее только использовать другую библиотеку
или сразу в коде обращаться к пинам на прямую. но к занимаемой памяти это практически не относится.
нужно править сам код. убирать лишние переменные которые используются для "соединения" блоков,
а еще в флпрог практически все переменные глобальные. это не есть хорошо.
Если вам здесь помогли, можете отблагодарить . "Сказать" спасибо проекту!

seri0shka
Лейтенант
Сообщения: 334
Зарегистрирован: 09.04.2016{, 12:17}
Репутация: 15
Откуда: Кременчуг

Изобретаем велосипед: замена "digitalWrite"

#5

Сообщение seri0shka » 13.03.2019{, 13:35}

Sancho, Вы вроде где-то измеряли скорость работы digitalWrite и быстрых выходов на основе CyberLib, не могу найти. Могли бы Вы по той же методике проверить мой способ viewtopic.php?p=66778#p66778?
В готовом скетче (в Ардуино ИДЕ) с помощью инструмента "Правка" переименовываем абсолютно все "digitalWrite" в "digit__Write" (например), а в конец скетча добавляем функцию void digit__Write(uint8_t pin, uint8_t val):
СпойлерПоказать

Код: Выделить всё

void digit__Write(uint8_t pin, uint8_t val)
{
	//uint8_t timer = digitalPinToTimer(pin); // Вычисляется таймер пина - это необходимо для некоторых пинов, поддерживающих ШИМ
	uint8_t bit = digitalPinToBitMask(pin); // Вычисляется битовая маска для соответствующего пина
	uint8_t port = digitalPinToPort(pin); // Вычисляется порт, которому принадлежит пин
	volatile uint8_t *out;

	//if (port == NOT_A_PIN) return; // Если задан некорректный пин - выходим

	// If the pin that support PWM output, we need to turn it off
	// before doing a digital write.
	//if (timer != NOT_ON_TIMER) turnOffPWM(timer); // Если пин поддерживает ШИМ, то перед установкой значения нужно отключить таймер, генерирующий ШИМ

	out = portOutputRegister(port); // Конвертируем полученный порт в адрес

	//uint8_t oldSREG = SREG; // SREG - регистр хранящий флаг прерываний, запоминаем его
	//cli(); // Запрещаем прерывания

	if (val == LOW) { // Устанавливаем значения
		*out &= ~bit; 
	} else {
		*out |= bit;
	}

	//SREG = oldSREG; // Возвращаем регистру прерываний состояние до запрета прерываний
}
Вообще, интересует Ваше мнение по теме. К сожалению, для пользования библиотекой CyberLib нужно переписывать все блоки, в том числе и НЕпользовательские. Мой способ позволит ускорить (?) любой готовый скетч.
Хотел в личном сообщении отправить, не получается почему-то.
Может ещё кто-нибудь сравнить реальную скорость?

Аватара пользователя
Sancho
Полковник
Сообщения: 2763
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 337
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Изобретаем велосипед: замена "digitalWrite"

#6

Сообщение Sancho » 13.03.2019{, 13:50}

Проверю сегодня.

Отправлено спустя 3 часа 18 минут 49 секунд:
seri0shka, Как то так.

Код
D9_High;
D9_Low;
D9_High;
D9_Low;
Speed_pinПоказать
Speed_pin.JPG

digit__Write(9, 1);
digit__Write(9, 0);
digit__Write(9, 1);
digit__Write(9, 0);
Test digit__WriteПоказать
Test digit__Write.JPG
digitalWrite(9, 1);
digitalWrite(9, 0);
digitalWrite(9, 1);
digitalWrite(9, 0);
СтандартПоказать
Стандарт.JPG
Отправлено спустя 16 минут 23 секунды:
На частоту на экране не обращать внимание - для разграничения были разные delay.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

seri0shka
Лейтенант
Сообщения: 334
Зарегистрирован: 09.04.2016{, 12:17}
Репутация: 15
Откуда: Кременчуг

Изобретаем велосипед: замена "digitalWrite"

#7

Сообщение seri0shka » 13.03.2019{, 22:45}

Спасибо! Хороший приборчик. Эксперимент показал, что особого эффекта нет (хотя в некоторых случаях может пригодиться- длительность импульса 2,5 мкс против обычных 4,0 мкс).
А вот CyberLib вне конкуренции- 0,1 мкс. Вот только пользоваться ей довольно неудобно, к сожалению. Например, в коде
СпойлерПоказать

Код: Выделить всё

digitalWrite (19, OUT_PLK_01);
digitalWrite (18, OUT_PLK_02);
digitalWrite (17, OUT_PLK_03);
digitalWrite (16, OUT_PLK_04);
digitalWrite (15, OUT_PLK_05);
каждую строку нужно заменить минимум тремя.

Аватара пользователя
Sancho
Полковник
Сообщения: 2763
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 337
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Изобретаем велосипед: замена "digitalWrite"

#8

Сообщение Sancho » 14.03.2019{, 08:28}

seri0shka писал(а):
13.03.2019{, 22:45}
каждую строку нужно заменить минимум тремя.
Почти тремя :(
if ( OUT_PLK_01) D19_High;
else D19_Low;

Отправлено спустя 1 минуту 42 секунды:
Но для само-писанины - самое то!
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

seri0shka
Лейтенант
Сообщения: 334
Зарегистрирован: 09.04.2016{, 12:17}
Репутация: 15
Откуда: Кременчуг

Изобретаем велосипед: замена "digitalWrite"

#9

Сообщение seri0shka » 14.03.2019{, 11:03}

Sancho, может для полноты картины померяете это:?

Код: Выделить всё

      // для 9 пина
      PORTB |= _BV(PB1); // HIGH
      PORTB &= ~ _BV(PB1); // LOW
      PORTB |= _BV(PB1); // HIGH
      PORTB &= ~ _BV(PB1); // LOW

Аватара пользователя
pan
Полковник
Сообщения: 2725
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 171
Откуда: Воронеж
Имя: Алексей
Контактная информация:

Изобретаем велосипед: замена "digitalWrite"

#10

Сообщение pan » 14.03.2019{, 11:13}

seri0shka,
это и есть
pan писал(а):
12.03.2019{, 15:22}
или сразу в коде обращаться к пинам на прямую
быстрее ни чего нет
Если вам здесь помогли, можете отблагодарить . "Сказать" спасибо проекту!

Аватара пользователя
Sancho
Полковник
Сообщения: 2763
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 337
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Изобретаем велосипед: замена "digitalWrite"

#11

Сообщение Sancho » 14.03.2019{, 12:06}

seri0shka, Это копия первого из поста 6

Отправлено спустя 6 минут 20 секунд:

Код: Выделить всё

      // для 9 пина
      PORTB |= _BV(PB1); // HIGH
      PORTB &= ~ _BV(PB1); // LOW
      PORTB |= _BV(PB1); // HIGH
      PORTB &= ~ _BV(PB1); // LOW

D8_High;
D8_Low; 
D8_High;
D8_Low;
СпойлерПоказать
Два варианта.JPG
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

seri0shka
Лейтенант
Сообщения: 334
Зарегистрирован: 09.04.2016{, 12:17}
Репутация: 15
Откуда: Кременчуг

Изобретаем велосипед: замена "digitalWrite"

#12

Сообщение seri0shka » 14.03.2019{, 15:48}

Sancho, спасибо! Что за прибор у Вас? Вывод на комп? Входных сигналов сколько можно?

Аватара пользователя
Sancho
Полковник
Сообщения: 2763
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 337
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Изобретаем велосипед: замена "digitalWrite"

#13

Сообщение Sancho » 14.03.2019{, 15:53}

seri0shka, Это фото осцила.
Не могу, или лень :) , разобраться, как на флэшку скрины писать.
ADS-2072M

Отправлено спустя 23 минуты 4 секунды:
Разобрался :) Одна кнопочка ))))
СпойлерПоказать
ADS00004.jpg
ADS00004.jpg (57.51 КБ) 678 просмотров
ADS00002.jpg
ADS00002.jpg (53.81 КБ) 678 просмотров
ADS00001.jpg
ADS00001.jpg (56.5 КБ) 678 просмотров
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

seri0shka
Лейтенант
Сообщения: 334
Зарегистрирован: 09.04.2016{, 12:17}
Репутация: 15
Откуда: Кременчуг

Изобретаем велосипед: замена "digitalWrite"

#14

Сообщение seri0shka » 14.03.2019{, 21:51}

Всего одна кнопка, а сколько лишней работы проделано! Сфотографировать, скинуть на комп... Я думал, что на фото вид с монитора компьютера.
С таким прибором можно работать. :ohyes: :smile завидую:

Ответить

Вернуться в «А что так можно было, да?»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость