Страница 1 из 1
Изобретаем велосипед: замена "digitalWrite"
Добавлено: 12.03.2019{, 14:39}
seri0shka
Собственно, для начала вопрос: кто знает замену digitalWrite, причём с возможностью использования без необходимости переделывать полностью проекты? Свои эксперименты пока не привожу, так как не увенчались успехом, хотя некоторые подвижки есть. Изначально затеял для того, чтоб уменьшить размер занимаемой памяти контроллера (есть проекты под 100%), там много сэкономить не удалось. Попробовал проверить на скорость, там тоже не очень, хотя предполагалось многократное увеличение.
Изобретаем велосипед: замена "digitalWrite"
Добавлено: 12.03.2019{, 14:56}
pan
seri0shka писал(а): ↑12.03.2019{, 14:39}
причём с возможностью использования без необходимости переделывать полностью проекты
это как вы себе представляете?
Изобретаем велосипед: замена "digitalWrite"
Добавлено: 12.03.2019{, 15:09}
seri0shka
Не только представяю, но и пробовал. В готовом скетче (в Ардуино ИДЕ) с помощью инструмента "Правка" переименовываем
абсолютно все "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 секунду:
Вероятно, можно и не переименовывать. Но тогда не знаю, сработает: как стандартная ИДЕшная, или как своя.
Изобретаем велосипед: замена "digitalWrite"
Добавлено: 12.03.2019{, 15:22}
pan
на какую свою? есть уже готовая отлаженная реализация. быстрее только использовать другую библиотеку
или сразу в коде обращаться к пинам на прямую. но к занимаемой памяти это практически не относится.
нужно править сам код. убирать лишние переменные которые используются для "соединения" блоков,
а еще в флпрог практически все переменные глобальные. это не есть хорошо.
Изобретаем велосипед: замена "digitalWrite"
Добавлено: 13.03.2019{, 13:35}
seri0shka
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 нужно переписывать все блоки, в том числе и НЕпользовательские. Мой способ позволит ускорить (?) любой готовый скетч.
Хотел в личном сообщении отправить, не получается почему-то.
Может ещё кто-нибудь сравнить реальную скорость?
Изобретаем велосипед: замена "digitalWrite"
Добавлено: 13.03.2019{, 13:50}
Sancho
Проверю сегодня.
Отправлено спустя 3 часа 18 минут 49 секунд:
seri0shka, Как то так.
Код
D9_High;
D9_Low;
D9_High;
D9_Low;
digit__Write(9, 1);
digit__Write(9, 0);
digit__Write(9, 1);
digit__Write(9, 0);
digitalWrite(9, 1);
digitalWrite(9, 0);
digitalWrite(9, 1);
digitalWrite(9, 0);
Отправлено спустя 16 минут 23 секунды:
На частоту на экране не обращать внимание - для разграничения были разные delay.
Изобретаем велосипед: замена "digitalWrite"
Добавлено: 13.03.2019{, 22:45}
seri0shka
Спасибо! Хороший приборчик. Эксперимент показал, что особого эффекта нет (хотя в некоторых случаях может пригодиться- длительность импульса 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);
каждую строку нужно заменить минимум тремя.
Изобретаем велосипед: замена "digitalWrite"
Добавлено: 14.03.2019{, 08:28}
Sancho
seri0shka писал(а): ↑13.03.2019{, 22:45}
каждую строку нужно заменить минимум тремя.
Почти тремя
if ( OUT_PLK_01) D19_High;
else D19_Low;
Отправлено спустя 1 минуту 42 секунды:
Но для само-писанины - самое то!
Изобретаем велосипед: замена "digitalWrite"
Добавлено: 14.03.2019{, 11:03}
seri0shka
Sancho, может для полноты картины померяете это:?
Код: Выделить всё
// для 9 пина
PORTB |= _BV(PB1); // HIGH
PORTB &= ~ _BV(PB1); // LOW
PORTB |= _BV(PB1); // HIGH
PORTB &= ~ _BV(PB1); // LOW
Изобретаем велосипед: замена "digitalWrite"
Добавлено: 14.03.2019{, 11:13}
pan
seri0shka,
это и есть
pan писал(а): ↑12.03.2019{, 15:22}
или сразу в коде обращаться к пинам на прямую
быстрее ни чего нет
Изобретаем велосипед: замена "digitalWrite"
Добавлено: 14.03.2019{, 12:06}
Sancho
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;
Изобретаем велосипед: замена "digitalWrite"
Добавлено: 14.03.2019{, 15:48}
seri0shka
Sancho, спасибо! Что за прибор у Вас? Вывод на комп? Входных сигналов сколько можно?
Изобретаем велосипед: замена "digitalWrite"
Добавлено: 14.03.2019{, 15:53}
Sancho
seri0shka, Это фото осцила.
Не могу, или лень
, разобраться, как на флэшку скрины писать.
ADS-2072M
Отправлено спустя 23 минуты 4 секунды:
Разобрался
Одна кнопочка ))))
- ADS00004.jpg (57.51 КБ) 2247 просмотров
- ADS00002.jpg (53.81 КБ) 2247 просмотров
- ADS00001.jpg (56.5 КБ) 2247 просмотров
Изобретаем велосипед: замена "digitalWrite"
Добавлено: 14.03.2019{, 21:51}
seri0shka
Всего одна кнопка, а сколько лишней работы проделано! Сфотографировать, скинуть на комп... Я думал, что на фото вид с монитора компьютера.
С таким прибором можно работать.
:smile завидую: