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

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

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

#1

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

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

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

Изобретаем велосипед: замена "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
Полковник
Сообщения: 2695
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 164
Откуда: Воронеж
Имя: Алексей
Контактная информация:

Изобретаем велосипед: замена "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
Полковник
Сообщения: 2678
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 330
Имя: Sancho
Контактная информация:

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

#6

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

Сообщение отредактировал автор поста
Сообщение отредактировал автор поста. Все.

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
Полковник
Сообщения: 2678
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 330
Имя: Sancho
Контактная информация:

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

#8

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

Сообщение отредактировал автор поста
Сообщение отредактировал автор поста. Все.

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
Полковник
Сообщения: 2695
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 164
Откуда: Воронеж
Имя: Алексей
Контактная информация:

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

#10

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

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

Sancho
Полковник
Сообщения: 2678
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 330
Имя: Sancho
Контактная информация:

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

#11

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

Сообщение отредактировал автор поста
Сообщение отредактировал автор поста. Все.

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

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

#12

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

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

Sancho
Полковник
Сообщения: 2678
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 330
Имя: Sancho
Контактная информация:

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

#13

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

Сообщение отредактировал автор поста
Вложения
ADS00004.jpg
ADS00004.jpg (57.51 КБ) 663 просмотра
ADS00002.jpg
ADS00002.jpg (53.81 КБ) 663 просмотра
ADS00001.jpg
ADS00001.jpg (56.5 КБ) 663 просмотра
Сообщение отредактировал автор поста. Все.

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

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

#14

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

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

Ответить

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

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

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