Изобретаем велосипед: замена "digitalWrite"
-
- Лейтенант
- Сообщения: 391
- Зарегистрирован: 09 апр 2016, 12:17
- Откуда: Кременчуг
- Имя: Сергей
Изобретаем велосипед: замена "digitalWrite"
Собственно, для начала вопрос: кто знает замену digitalWrite, причём с возможностью использования без необходимости переделывать полностью проекты? Свои эксперименты пока не привожу, так как не увенчались успехом, хотя некоторые подвижки есть. Изначально затеял для того, чтоб уменьшить размер занимаемой памяти контроллера (есть проекты под 100%), там много сэкономить не удалось. Попробовал проверить на скорость, там тоже не очень, хотя предполагалось многократное увеличение.
Изобретаем велосипед: замена "digitalWrite"
это как вы себе представляете?seri0shka писал(а): 12 мар 2019, 14:39причём с возможностью использования без необходимости переделывать полностью проекты
-
- Лейтенант
- Сообщения: 391
- Зарегистрирован: 09 апр 2016, 12:17
- Откуда: Кременчуг
- Имя: Сергей
Изобретаем велосипед: замена "digitalWrite"
Не только представяю, но и пробовал. В готовом скетче (в Ардуино ИДЕ) с помощью инструмента "Правка" переименовываем абсолютно все "digitalWrite" в "digitWrite" (например), а в конец скетча добавляем функцию void digitWrite(uint8_t pin, uint8_t val). Если вставить[spoiler][/spoiler]
то получим стандартную реализацию. Но стандартную можно заменить на свою. При этом любой готовый проект не нуждается в переделке.
Отправлено спустя 2 минуты 31 секунду:
Вероятно, можно и не переименовывать. Но тогда не знаю, сработает: как стандартная ИДЕшная, или как своя.
Код: Выделить всё
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 секунду:
Вероятно, можно и не переименовывать. Но тогда не знаю, сработает: как стандартная ИДЕшная, или как своя.
Изобретаем велосипед: замена "digitalWrite"
на какую свою? есть уже готовая отлаженная реализация. быстрее только использовать другую библиотеку
или сразу в коде обращаться к пинам на прямую. но к занимаемой памяти это практически не относится.
нужно править сам код. убирать лишние переменные которые используются для "соединения" блоков,
а еще в флпрог практически все переменные глобальные. это не есть хорошо.
или сразу в коде обращаться к пинам на прямую. но к занимаемой памяти это практически не относится.
нужно править сам код. убирать лишние переменные которые используются для "соединения" блоков,
а еще в флпрог практически все переменные глобальные. это не есть хорошо.
-
- Лейтенант
- Сообщения: 391
- Зарегистрирован: 09 апр 2016, 12:17
- Откуда: Кременчуг
- Имя: Сергей
Изобретаем велосипед: замена "digitalWrite"
[ref=#ff8000]Sancho[/ref], Вы вроде где-то измеряли скорость работы digitalWrite и быстрых выходов на основе CyberLib, не могу найти. Могли бы Вы по той же методике проверить мой способ viewtopic.php?p=66778#p66778?
В готовом скетче (в Ардуино ИДЕ) с помощью инструмента "Правка" переименовываем абсолютно все "digitalWrite" в "digit__Write" (например), а в конец скетча добавляем функцию void digit__Write(uint8_t pin, uint8_t val):
[spoiler][/spoiler]
Вообще, интересует Ваше мнение по теме. К сожалению, для пользования библиотекой CyberLib нужно переписывать все блоки, в том числе и НЕпользовательские. Мой способ позволит ускорить (?) любой готовый скетч.
Хотел в личном сообщении отправить, не получается почему-то.
Может ещё кто-нибудь сравнить реальную скорость?
В готовом скетче (в Ардуино ИДЕ) с помощью инструмента "Правка" переименовываем абсолютно все "digitalWrite" в "digit__Write" (например), а в конец скетча добавляем функцию void digit__Write(uint8_t pin, uint8_t val):
[spoiler]
Код: Выделить всё
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
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Изобретаем велосипед: замена "digitalWrite"
Проверю сегодня.
Отправлено спустя 3 часа 18 минут 49 секунд:
[ref]seri0shka[/ref], Как то так.
Код
D9_High;
D9_Low;
D9_High;
D9_Low;
[spoiler=Speed_pin] [/spoiler]
digit__Write(9, 1);
digit__Write(9, 0);
digit__Write(9, 1);
digit__Write(9, 0);
[spoiler=Test digit__Write] [/spoiler]
digitalWrite(9, 1);
digitalWrite(9, 0);
digitalWrite(9, 1);
digitalWrite(9, 0);
[spoiler=Стандарт] [/spoiler]
Отправлено спустя 16 минут 23 секунды:
На частоту на экране не обращать внимание - для разграничения были разные delay.
Отправлено спустя 3 часа 18 минут 49 секунд:
[ref]seri0shka[/ref], Как то так.
Код
D9_High;
D9_Low;
D9_High;
D9_Low;
[spoiler=Speed_pin] [/spoiler]
digit__Write(9, 1);
digit__Write(9, 0);
digit__Write(9, 1);
digit__Write(9, 0);
[spoiler=Test digit__Write] [/spoiler]
digitalWrite(9, 1);
digitalWrite(9, 0);
digitalWrite(9, 1);
digitalWrite(9, 0);
[spoiler=Стандарт] [/spoiler]
Отправлено спустя 16 минут 23 секунды:
На частоту на экране не обращать внимание - для разграничения были разные delay.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
-
- Лейтенант
- Сообщения: 391
- Зарегистрирован: 09 апр 2016, 12:17
- Откуда: Кременчуг
- Имя: Сергей
Изобретаем велосипед: замена "digitalWrite"
Спасибо! Хороший приборчик. Эксперимент показал, что особого эффекта нет (хотя в некоторых случаях может пригодиться- длительность импульса 2,5 мкс против обычных 4,0 мкс).
А вот CyberLib вне конкуренции- 0,1 мкс. Вот только пользоваться ей довольно неудобно, к сожалению. Например, в коде [spoiler][/spoiler]
каждую строку нужно заменить минимум тремя.
А вот CyberLib вне конкуренции- 0,1 мкс. Вот только пользоваться ей довольно неудобно, к сожалению. Например, в коде [spoiler]
Код: Выделить всё
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
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Изобретаем велосипед: замена "digitalWrite"
Почти тремя

if ( OUT_PLK_01) D19_High;
else D19_Low;
Отправлено спустя 1 минуту 42 секунды:
Но для само-писанины - самое то!
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
-
- Лейтенант
- Сообщения: 391
- Зарегистрирован: 09 апр 2016, 12:17
- Откуда: Кременчуг
- Имя: Сергей
Изобретаем велосипед: замена "digitalWrite"
[ref=#ff8000]Sancho[/ref], может для полноты картины померяете это:?
Код: Выделить всё
// для 9 пина
PORTB |= _BV(PB1); // HIGH
PORTB &= ~ _BV(PB1); // LOW
PORTB |= _BV(PB1); // HIGH
PORTB &= ~ _BV(PB1); // LOW
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Изобретаем велосипед: замена "digitalWrite"
[ref]seri0shka[/ref], Это копия первого из поста 6
Отправлено спустя 6 минут 20 секунд:
[spoiler] [/spoiler]
Отправлено спустя 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;
У вас нет необходимых прав для просмотра вложений в этом сообщении.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
-
- Лейтенант
- Сообщения: 391
- Зарегистрирован: 09 апр 2016, 12:17
- Откуда: Кременчуг
- Имя: Сергей
Изобретаем велосипед: замена "digitalWrite"
[ref=#ff8000]Sancho[/ref], спасибо! Что за прибор у Вас? Вывод на комп? Входных сигналов сколько можно?
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Изобретаем велосипед: замена "digitalWrite"
[ref]seri0shka[/ref], Это фото осцила.
Не могу, или лень
, разобраться, как на флэшку скрины писать.
ADS-2072M
Отправлено спустя 23 минуты 4 секунды:
Разобрался
Одна кнопочка ))))
[spoiler] [/spoiler]
Не могу, или лень

ADS-2072M
Отправлено спустя 23 минуты 4 секунды:
Разобрался

[spoiler] [/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
-
- Лейтенант
- Сообщения: 391
- Зарегистрирован: 09 апр 2016, 12:17
- Откуда: Кременчуг
- Имя: Сергей
Изобретаем велосипед: замена "digitalWrite"
Всего одна кнопка, а сколько лишней работы проделано! Сфотографировать, скинуть на комп... Я думал, что на фото вид с монитора компьютера.
С таким прибором можно работать.
:smile завидую:
С таким прибором можно работать.

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