Библиотека для цифрового выхода

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Logik пишет:

Так ты же сам про комбинации кнопок заговорил! )))) А оказывается нет, небыло и не должно.

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

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

Logik пишет:

Эту хрень я не использовал, не буду и другим не рекомендую. Почему - разжевано выше.

15 байт ОЗУ на кнопку - это приговор.

снова эмоциональная оценка - кому и когда приговор?

Logik пишет:

ПС. От интересно, Клапауций, ты действительно считаеш, что я закоментирую  свой код (который короче экономней твоего по ОЗУ и работает замечательно, к тому же легко модифицировался под прием нескольких одновременных нажатий) и всуну твой "урезок" (который длинней, жрет больше ОЗУ и токошо тобой поправлен и нихрена ни  тещен и соответственно нихрена не надежен)? И токо из за того шо ты написал "костыль" да "три ноги", без каких либо аргументов. Пиши еще!!   При этом еще и автор на вопросы не отвечает и претензии игнорит . Можеш на это не отвечать, вопрос риторический..

я считаю, что ты упорот чем-то, но я никак не пойму, при чём тут мой класс?

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

единственно, что наблюдаю - это то, что класс ест больше ОЗУ, чем твой код. ок. и что с того?

приведи пример, где это может быть критично.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Logik пишет:

Эту хрень я не использовал, не буду и другим не рекомендую.

ок. приглашаю тебя наперевес с этим лозунгом в тему класс титановый велосипед для тактовой кнопки.

где ты на примерах, аргументированно и адекватно обоснуешь причины своего отрицалова класс титановый велосипед для тактовой кнопки.

Logik
Offline
Зарегистрирован: 05.08.2014

Клапауций 232 пишет:

Logik пишет:

Эту хрень я не использовал, не буду и другим не рекомендую.

ок. приглашаю тебя наперевес с этим лозунгом в тему класс титановый велосипед для тактовой кнопки.

где ты на примерах, аргументированно и адекватно обоснуешь причины своего отрицалова класс титановый велосипед для тактовой кнопки.

Пол дня думал приглашать или нет. Я те предлагал там выяснять? - Предлагал.  Ты отказася. Для меня вопрос решен и очевиден. Все изложено здесь. Тратить время на пустой срач не считаю нужным. Излагать по второму кругу - нафиг сдалось.

Если желаеш обсудить вопрос конструктивно, так пожалуста,  ответь, как автор класса на следующий вопрс.

Есть 3 (три) кнопки, комутируют землю, хочу получить информацию о их состоянии в виде битового поля, где каждый бит отражает состояние каждой кнопки. Если использовать твой класс, опубликованая в соответствующей ветке либа, какие затраты аппаратных ресурсов потребуются? Кол-во байт в ОЗУ и флеше? Такты и время оставим в покое пока. Надеюсь делеев там нет...

Варианты ответа "А нафига так?",  "А можна больше и лучше", "я вот сейчас доколупаю быстро и..", "сам дурак", "у тебя гомнокод",  и т.д. я надеюсь ты понимаеш, давать безсмысленно. 

Ты автор, ты эти цифры должен представлять.

Ну и на всяк случай как бы намекну- https://habrahabr.ru/company/amperka/blog/264041/ . Прокоментируй, если проблема тебе известна и понятна.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Logik пишет:

Пол дня думал приглашать или нет. Я те предлагал там выяснять?

ты тогда не предлагал "хрень" "выяснить". сейчас ты предложил - я согласился.

вперёд, иначе - звиздобол.

Logik пишет:

Есть 3 (три) кнопки

есть кнопок 1+n, где п - положительное целое - обсуждение в класс титановый велосипед для тактовой кнопки.

Logik
Offline
Зарегистрирован: 05.08.2014

Клапауций 232 пишет:

Logik пишет:

Пол дня думал приглашать или нет. Я те предлагал там выяснять?

ты тогда не предлагал "хрень" "выяснить". сейчас ты предложил - я согласился.

вперёд, иначе - звиздобол.

 

Клапауций 232 пишет:

Logik пишет:

ПС. Можем в веловетку переместится.

нет - там достаточно гениального бреда. 

 

;)  Кинуть сылку где ты это писал?

Logik пишет:

Есть 3 (три) кнопки

есть кнопок 1+n, где п - положительное целое - обсуждение в класс титановый велосипед для тактовой кнопки.

Ответа нет. Клапауций 232 не подтвердил желания конструктивно обсуждать. Больше тратить время на пустышку нет смысла. 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Logik пишет:

Ответа нет. Больше тратить время на пустышку нет смысла. 

так у кого претензии к класс титановый велосипед для тактовой кнопки. - у меня или у тебя?

я должен тебе доказывать, что класс - "хрень"?

теперь ты обиделся и не желаешь всем рассказать правду.

Logik
Offline
Зарегистрирован: 05.08.2014

Клапауций 232 пишет:

Logik пишет:

Ответа нет. Больше тратить время на пустышку нет смысла. 

так у кого претензии к класс титановый велосипед для тактовой кнопки. - у меня или у тебя?

я должен тебе доказывать, что класс - "хрень"?

теперь ты обиделся и не желаешь всем рассказать правду.

Доказывать не надо, просто ответ на простой вопрос http://arduino.ru/forum/programmirovanie/biblioteka-dlya-tsifrovogo-vykhoda?page=2#comment-192949. После этого можно чегото рассказывать. 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Logik пишет:

Доказывать не надо, просто ответ на простой вопрос

слушай, так не пойдёт - меня твои прыжки с одного на другое и твой частный случай реализации костыля с тремя кнопками ни в чём не убеждают.

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

будь мужиком - докажи, что ты не звиздун.

Logik
Offline
Зарегистрирован: 05.08.2014

Нихрена я те не должен. Тебе нужен код пиши сюда - http://arduino.ru/forumy/ishchu-ispolnitelya договоримся. Но с тебя будет дорого :(, потому что недостойный. Все разговоры после ответа на вопрос http://arduino.ru/forum/programmirovanie/biblioteka-dlya-tsifrovogo-vykhoda?page=2#comment-192949.  

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Logik пишет:

Нихрена я те не должен.

блин. а, я должен ответить на твой вопрос...

патовая ситуация: некто Logik мелет шопопало. некто Клапауций 232 требует аргументировать бред и вместо ответа получает очередную порцию бреда плюс требование станцевать джигу.

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Мужики, мож в другом месте похоливарите? Мы тут с ТС как бы работаем, а я уж его постов за срачем найти не могу

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

ЕвгенийП пишет:

Мужики, мож в другом месте похоливарите? Мы тут с ТС как бы работаем, а я уж его постов за срачем найти не могу

да, оно, вроде и вас касается - Логик считает, что вы тут хернёй заняты. мне как-то пофиг было, пока не начал  шопопало гнать на когопопало, в список которых и я вошёл.

*попроси модераторов - пусть не удаляют, а сбросят мой диалог с Логик в отдельную тему под названием "Классы в дуино - зло.".

Logik
Offline
Зарегистрирован: 05.08.2014

ЕвгенийП пишет:

Мужики, мож в другом месте похоливарите? Мы тут с ТС как бы работаем, а я уж его постов за срачем найти не могу

ОК. Т.к. Клапауций 232 , как автор, отказывается отвечать  о свойствах своего детища а именно о объеме используемой памяти, косвено признавая что его чистосердечный ответ сразу дискредитирует код как явное проявление лоховства и криворукости.  А я согласен обсуждать данный предмет только после получения ответа на оный вопрос (напомню сдесь - http://arduino.ru/forum/programmirovanie/biblioteka-dlya-tsifrovogo-vykhoda?page=2#comment-192949.), чего до Клапауций 232 явно недоходит.  То в сложившейся ситуации, я по Вашей просьбе перестаю здесь требовать ответ, а вдругих местах, слышеш меня Клапауций 232, любые твои попытки поднять тему будут упиратся в получение ответа на вышеуказаное. Так шо продолжай бесится сколько угодно. А я умолкаю по Вашей просьбе.  

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Logik пишет:

ОК. Т.к. Клапауций 232 , как автор, отказывается отвечать  о свойствах своего детища а именно о объеме используемой памяти

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

Logik пишет:

слышеш меня Клапауций 232, любые твои попытки поднять тему будут упиратся в получение ответа на вышеуказаное.

ок. пока Logik не прекратит требовать от меня странного, любые его попытки будут упираться. :D

упоротому Logik достаточно внимательно читать мои ответы #90 на свои вопросы и не требовать от меня повторять одно и тоже по три раза.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

ЕвенийП, эти дни работа,дети и http://www.karkas.info/forum/Истории-строительства-и-фотоотчеты/1713-banka-4kh6-dlya-vremennogo-prozhivaniya-i-poseshcheniya-kruglyj-god-poka-dom-ne-postroim.html , времени катострофически не хватает.
Изучаю заданное Вами направление. Как доберусь до компьютера буду пробовать, а пока на смартфоне...(

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

ЕвгенийП, мне несовсем понятна последняя строка в конструкторе. Это вроде как условие выбора функции в зависимости от state, я правильно понял?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

yul-i-an пишет:
ЕвгенийП, мне несовсем понятна последняя строка в конструкторе. Это вроде как условие выбора функции в зависимости от state, я правильно понял?

Вы это имеете в виду?

 (state) ? HI() : LO();

Да, я погорячился. Лучше было бы напсисать (что тоже самое, до известных пределов)

if (state) HI(); else LO();

В даннон контексте разницы никакой, поэтому лучше было писать более читабельное выражение.

А тк, на будущее, разница в том, что выражение "(state) ? HI() : LO();" в отличие от "if ..." имеет значение и его можно использовать, напримере, в выражениях или в правой части оператора присваивания. Вот несколько примеров использования этой конструкции:

// 1
a = b + ((c > 0) ? c  : 1);

// эквивалентно
if (c > 0) a= b + c; else а = 1;

// 2
return (n) ? HIGH : LOW;

// эквивалентно
if (c != 0) return HIGH; else return LOW;

ну, и так далее

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

ЕвгенийП, по #95 посту.

Проверочный пример

#include "DigOut.h"

void setup(void) {}

void loop(void) {
	static bool ledOn = false;
	static DigOut p13;
	delay(500);
	ledOn = (p13 = ! ledOn);
}

Не компилируется.

1) проверьте, работает ли наше присваивание типа bool в случае, если попытаться присвоить тип int; - (если писать р13 =10 то работает) или я не правильно понимаю?

2) попробуйте сами реализовать преобразование к типу bool. Чтобы можно было писать вместо "bool isOn = p13.state();" просто  "bool isOn = p13;" - Что то мне эти преобразования несовсем понятны (если честно толком вникнуть времени небыло, надо почитать.)

Попробовал так

	bool operator = (DigOut & original) {
		return original.state();	// вернули ссылку
	}

Но чувствуется что не правильно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

yul-i-an пишет:

Проверочный пример

#include "DigOut.h"

void setup(void) {}

void loop(void) {
	static bool ledOn = false;
	static DigOut p13;
	delay(500);
	ledOn = (p13 = ! ledOn);
}

Не компилируется.

Странно. Я когда выкладываю, всегда проверяю - оно у меня не только компилируется, но и работает. Кстати, имейте это в виду (что всё проверялось) и рассматривайте "некомпиляцию" как странное ЧП.

Вы уверены, что с этим примером Вы использовали соответсвующую ему версию класса, а не предыдущую?

А вообще, когда не компилируется, всего копипастите сообщение компилятора потому, что без него в самой фразе "не компилируется" информации негусто.

Про остальное - вечером.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

 

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

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

// Присваивание одного экземпляра другому
	DigOut & operator = (DigOut & original) {
		DW(original.state()); // присвоили состояние
		return *this;	// вернули ссылку
	}

	// Присваивание экземпляру значение типа bool
	bool operator = (const bool newState) {
		DW(newState);
		return newState;
	}

P.S. вроде нашел опечатку:

ЕвгенийП пишет:

// 1

a = b + ((c > 0) ? c  : 1);

// эквивалентно
if (c > 0) a= b + c; else а = 1;

// 2
return (n) ? HIGH : LOW;

// эквивалентно
if (c != 0) return HIGH; else return LOW;

ну, и так далее

может так правильнее

a = b + ((c > 0) ? c  : 1);

// эквивалентно
if (c > 0) a= b + c; else а = b + 1;

// 2
return (n) ? HIGH : LOW;

// эквивалентно
if (n != 0) return HIGH; else return LOW;

ну, и так далее

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

ЕвгенийП, не сомневаюсь в том что Вы проверили, но у меня следующее.

Последняя версия класса DigOut.h взята с поста #95. IDE использую 1.0.4

Ошибка следующая

sketch_may12a.ino: In function 'void loop()':
sketch_may12a:9: error: cannot convert 'DigOut' to 'bool' in assignment

Я понимаю мы вносим сейчас изменения только в DigOut.cpp

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, конечно, b пропущено.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Mr.Privet

// Присваивание одного экземпляра другому
	DigOut & operator = (DigOut & original) {
		DW(original.state()); // присвоили состояние
		return *this;	// вернули ссылку
	}

	// Присваивание экземпляру значение типа bool
	bool operator = (const bool newState) {
		DW(newState);
		return newState;
	}

Первое переназначение оператора необходимо чтобы в коде можно было писать Led1 = Led2 (присваивает состояние Led2 на Led1)

А второе я думаю для того чтобы писать Led1=HIGH/LOW или Led1=1/0 сам еще вникаю.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

yul-i-an пишет:

ЕвгенийП, не сомневаюсь в том что Вы проверили, но у меня следующее.

Последняя версия класса DigOut.h взята с поста #95. IDE использую 1.0.4

Ошибка следующая

sketch_may12a.ino: In function 'void loop()':
sketch_may12a:9: error: cannot convert 'DigOut' to 'bool' in assignment

Я понимаю мы вносим сейчас изменения только в DigOut.cpp

Ага, значит просто Вы не обновили файл .h и взяли его от более старого примера. Вот смотрите, там в потсе №95 файл .h постоянно меняется и для жтого примера нужно брать и файл класса (.h) и файл примера расположенные после фразы "Теперь определим присваивание экземпляру класса значение типа bool ...". У Вас же явно файл класса более старый.

Давайте я сейчас выложу их отдельно здесь. Убедитесь, что всй работает. чтобы нам было от чего дальше "плясать".

Файл класса

#ifndef DigOut_h
#define DigOut_h

#include <arduino.h>

class DigOut {
public:
	// Конструктор
	DigOut (const int8_t pin=13, const bool state=0) {
		pinMode(_pin = pin, OUTPUT);
		(state) ? HI() : LO();
	}

	//	установить уровень
	void DW(const bool state) const {
		digitalWrite(_pin, state);
	}

	// установить высокий уровень
	void HI(void) const {
		DW(HIGH);
	}

	// установить низкий уровень
	void LO() const {
		DW(LOW);
	}

	// инвертировать выход
	void invert(void) const {
		DW(!state());
	}

	// получить состояние
	bool state(void) const {
		return digitalRead(_pin);
	}

	// Присваивание одного экземпляра другому
	DigOut & operator = (DigOut & original) {
		DW(original.state()); // присвоили состояние
		return *this;	// вернули ссылку
	}

	// Присваивание экземпляру значение типа bool
	bool operator = (const bool newState) {
		DW(newState);
		return newState;
	}

private:
	int8_t _pin;	//выходной пин
};
 
#endif

Файл примера

#include "DigOut.h"

void setup(void) {}

void loop(void) {
	static bool ledOn = false;
	static DigOut p13;
	delay(500);
	ledOn = (p13 = ! ledOn);
}

Всё по идее работает. Если нет, давайте сообщение ещё раз.

Теперь переходим к новым вещам, о которых Вы писали. (продолжение следует).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

yul-i-an пишет:

2) попробуйте сами реализовать преобразование к типу bool. Чтобы можно было писать вместо "bool isOn = p13.state();" просто  "bool isOn = p13;" - Что то мне эти преобразования несовсем понятны (если честно толком вникнуть времени небыло, надо почитать.)

Попробовал так

	bool operator = (DigOut & original) {
		return original.state();	// вернули ссылку
	}

Но чувствуется что не правильно.

Нет, ну, не то, чтобы неправильно - это просто другое. Вот псомтрите на свою первую строку. В ней Вы пишете "bool operator =" уже отсюда следует,Вы пытаетесь определить оператор присваивания. а вовсе не оператор преобразования типа.

Объявление преобразователя типа выглядит так:

operator <тип>()

Пустые скобки означают, что это функция без параметров, поэтому более системно будет писать не пустые скобки, а (void).

Итак, мы собираемся одределить преобразование к bool. Значит наша функция должна выглядеть вот так:

operator bool(void) {
	// собственно преобразование	
}

Теперь. что мы понимаем под преобразованием? Очевидно нужно вернуть текущее состояние пина. Тогда законченный метод выглядит так:

operator bool(void) {
	return state();	
}

Вот собственно и всё с преобразованием типа. Возвращает он bool (ну, понятно, к чему преобразуем, то и возвращает).

Теперь наш класс (уже с новым методом) выглядит так:

#ifndef DigOut_h
#define DigOut_h

#include <arduino.h>

class DigOut {
public:
	// Конструктор
	DigOut (const int8_t pin=13, const bool state=0) {
		pinMode(_pin = pin, OUTPUT);
		(state) ? HI() : LO();
	}

	//	установить уровень
	void DW(const bool state) const {
		digitalWrite(_pin, state);
	}

	// установить высокий уровень
	void HI(void) const {
		DW(HIGH);
	}

	// установить низкий уровень
	void LO() const {
		DW(LOW);
	}

	// инвертировать выход
	void invert(void) const {
		DW(!state());
	}

	// получить состояние
	bool state(void) const {
		return digitalRead(_pin);
	}

	// Присваивание одного экземпляра другому
	DigOut & operator = (DigOut & original) {
		DW(original.state()); // присвоили состояние
		return *this;	// вернули ссылку
	}

	// Присваивание экземпляру значение типа bool
	bool operator = (const bool newState) {
		DW(newState);
		return newState;
	}

	operator bool(void) {
		return state();	
	}

private:
	int8_t _pin;	//выходной пин
};
 
#endif

а вот и проверочный пример. 

#include "DigOut.h"

void setup(void) {
	Serial.begin(115200);
	DigOut p13;
	
	p13 = true;	//	Устанавливаем HIGH
	bool currentState = p13; // присваиваем пин логической переменной
	Serial.print("p13="); Serial.println(currentState); // печатаем
	
	p13 = false;	//	Устанавливаем LOW
	currentState = p13; // присваиваем пин логической переменной
	Serial.print("p13="); Serial.println(currentState); // печатаем
}

void loop(void) {}

В первой строке он печатает 1 (то бишь true), а во второй 0 (false) что правильно отражает состояние пина.

Прежде, чем идти дальше, я хочу услышать, что Вы поняли всё, о чём мы говорили и готовы идти дальше.

-----------------------------

Думаю, нам пора потихоньку переходить к оптимизации, чтобы прогеры Вас живьём не ели. Цель оптимизации - добиться того, чтобы операции установки уровня (и опроса уровня) выполнялись в одну машинную команду, без обращения в digitalWrite/digitalRead, а то прогеры без этого жить не могут и готовы с говном смешать всякого, кто так не делает.

Оптимизация не такая уж и сложная, не бойтесь её. Нам даже менять почти ничего не придётся. Тут по ходу срача я как-то сказал, что это очень просто, а один из прогеров наехал, что мол моё "просто" - враньё. Ну, я готов согласиться, что это сложно и очень сложно для человека, который подобно тому прогеру, не знает языка. Если же язык знать, то там всё достаточно очевидно и тривиально. Чтобы "знать язык" поищите и почитайте по словам "шаблоны в с++" - это нам пригодится. Посмотрите как используются шаблоны и с функциями, и с классами. Скажите. как будете готовы.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

ЕвгенийП пишет:

Теперь наш класс (уже с новым методом) выглядит так:

ЕвгенийП, что то я запутался. Изначально в библиотеке было два файла .h и .cpp. Вы выложили последнюю версию h файла, а cpp куда делся? Приложенный пример для проверки у меня не скомпилировался.

Я так понимаю мне необходимо мой h

#ifndef DigOut_h
#define DigOut_h
class DigOut
{
  public:
DigOut(int pin=13, bool state=0);
	void HI();
    void LO();
	void invert();
	bool state();
  private:
    int _pin;
};
 
#endif

Заменить на последнюю версию из #125  поста, а фаил cpp удалить? что я и проделал.

Результат следующий

Blink_HI_LO.ino: In function 'void setup()':
Blink_HI_LO:7: error: cannot convert 'DigOut' to 'bool' in initialization
Blink_HI_LO:11: error: cannot convert 'DigOut' to 'bool' in assignment

С шаблонами  C++ ознакомился. Но прежде чем идти далше необходимо решить вышеизложенную проблемму.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В посте №125 я Вам дал два файла. Больше не нужно ничего. Весь класс живёт в .h файле и cpp никакой не нужен.

Т.е. Вы берёте .h файл и .ino файл из поста №125. Больше ничего не надо. setup живёт в .ino

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

ЕвгенийП пишет:

В посте №125 я Вам дал два файла. Больше не нужно ничего. Весь класс живёт в .h файле и cpp никакой не нужен.

Т.е. Вы берёте .h файл и .ino файл из поста №125. Больше ничего не надо. setup живёт в .ino

Разобрался можно продолжать.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, да. По сути дела здесь два шага.

Первый шаг никак не связан с шаблонами - надо просто написать класс для конкретного (одного) пина. Т.е. класс без параметра pin - только для одного пина и всё. Причём, класс надо сделать полностью статическим, чтобы не создавать экземпляра. Дело в том, что любой экземпляр класса обязан иметь адрес, а значит занимает хотя бы 1 байт. Так вот за этот байт безграмотные прогеры сожрут Вас с потрохами :)

Итак, первое - пишем класс для одного пина.

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

Вот собственно и всё.

В резултате в программе будет столько классов, сколько пинов используется, но поскольку они не жрут никаких ресурсов и их не надо переписывать каждый раз - выглядит это пристойно :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

yul-i-an, в целях ознакомления все-таки осмелюсь посоветовать прочитать это: http://easyelectronics.ru/rabota-s-portami-vvoda-vyvoda-mikrokontrollero... для создания класса-ногодрыгов.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Arhat109-2 с предложенной Вами статьей я уже ознакомился. Смотрел ещё тут.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Это совсем иной подход. По моей ссылке дано постепенное решение как создать тот самый класс, который вы пытаетесь отрисовать. Только окончательный вид там через макроопределение генератора классов. Как понимаю, потому что "темплейт" для этой цели не проходит "как хочется". Но тут могу и ошибиться. Вас по сути ведут к концу этой статьи, а там есть "готовое" решение. Все-таки ознакомьтесь.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

yul-i-an,

хорошо, что Вы прочитали статью, но, как я понимаю, она не помогла. Не комплексуйте, там действительно используются нетривиальные конструкции, её и на наш уважаемый коллега, который постоянно влаит, тоже не понял, хотя он поопытнее Вас.

Сложность той статьи в том, что там ставится гораздо более общая и сложная задача - а именно, чтобы было всё равно с каким пином иметь дело - с честным пином контроллера, или с пином сдвигового регистра или ещё с чем.

Мы с Вами пока такой задачи не ставим, а потому у нас всё проще. Не бойтесь.

Начните с написания статического класса. Просто переделайте свой. Если не получится, я покажу как это сделать.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

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

Да, там решена, а не "поставлена" более общая задача. Но тот путь, по которому идет автор - "тот же самый" и относительно простое решение абстрагирования класса пина в дальнейшем приведет к развитию на группы пинов и виртуализации понятия пина на те самые и "сдвиговые регистры" в том числе. С неибежностью.

У автора есть желание сделать "библиотеку", то есть инструмент для "неопределенного круга лиц" .. таковой тут УЖЕ есть. Правильнее ознакомиться с готовым решением детально прежде чем городить свой велосипед. Это та самая причина почему сам НЕ стал изобретать таковой. НЕЗАЧЕМ.

В рамках освоения С++ и его абстракций - дело совершенно другое. Надо и полезно изобрести свой лисапед.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Arhat109-2 пишет:

прошу не комментировать и не ссылаться на мой ник всуе

Аллаху Акбар!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arhat109-2 пишет:

В который раз уже прошу не комментировать и не ссылаться на мой ник 

Во второй раз поясняю, Вы первый привнесли в эту тему слово "говно", до Вас тут была нормальная беседа. Так что теперь умывайтесь своим г-ном или валите отсюда сами, если не хотите участвовать в общем разговоре.

По поводу Вашей истерики и просьб ко мне не комментировать Ваши перлы, увольте - ни одной своей темы без Ваших экскрементов я что-то не припомню. Игнорирую я на этом форуме только одного человека, ибо общаться с ним брезгливо. Но он, в отличие от Вас, бреда новичкам не втюхивает, и безапелляционной ахинеи не несёт, так что Вам до него далеко. А Ваши перлы комментируются и будут комментироваться. Не хотите комментариев - не пишите глупостей, если можете, конечно, ну, а если не можете - не пишите ничего.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ну .. до ваших глупостей мне как до Пекина пешком.. особенно впечатлило последнее "оно как-то скомпилируется" и "признание того очевидного факта что С++ ни разу не язык для программирования микроконтроллеров" .. особенно в свете ЭТОЙ темы ..

Да, упрежду: на вопрос "хде" - прибито гвоздиками вполне достаточно ваших глупостей, чтобы сделать вывод о верности утверждения "кто не умеет сам - тот учит других".

Да и ещё: Вы, ЕвгенийП - откровенное БРЕХЛО. Обоснование:

1. http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-pa... - "Считаю такие заявления в высшей степени безграмотными." -- доказательства, сестра! Доказательства. Утерлись как в той теме, на которую сослались так и в прибитой гвоздиком. БРЕХЛО.

2. http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-mr... пост #5 и ваш "уход в сторону" в #15 .. то есть признали что наврали в первом посту темы. Вам это было, конкретно, смотрим пост #27 и #30, #32. Ибо - безграмотны чуть более чем ПОЛНОСТЬЮ сами ибо опять умолчали по незнанию. Но очень легко раздаете и вешаете ярлыки на всех подряд (и не только на меня лично) и опять же смотрим пост #33, в котором вы снова безаппеляционно раздаете вердикты "кто ту грамотен, а кто нет"..

.. и продолжать тему по делу пришлось мне, а не вам, ибо вас куда больше интересует "скандальное тролление" чем дело .. чем вы и продолжили заниматься, смотрим #42.

.. и далее, чел. спросил о разнице применительно к определению пина .. что он прочитал от вас? воду с примером отличия константы от подстановки .. ибо ответ по делу вас НЕ ВОЛНОВАЛ, надо было показать РАЗНИЦУ и пофиг каким способом.. виртуозное владение определениями языка ещё не значит что владелец - программист.

.. а дальше из темы вы по-просту СВАЛИЛИ ибо пошло обсуждение реальных вопросов оптимизации, в которых вы - НОЛЬ БЕЗ ПАЛОЧКИ. И "объявились" только с очередным пиаром самого себя, смотрим #93.

.."Я, конечно, может и дурак, но пользуюсь digitalWrite как-то спокойно и абсолютно не парюсь" #108 - враньё, ибо НЕ ПОЛЬЗУЕТЕСЬ, что тут несколько раз демонстрировали примерами кода .. как оказалось и не своего даже вовсе, а написанного "по просьбе".

.. ну и конечно #120 .. к разговору о ногодрыгах в 8 МЕГАГЕРЦ .. упс 2.67 и сами не поняли чего запостили.. :)

и "вершина топика" - это пост #131 .. "Я начал с того, что есть два подхода к оптимизации. Один даёт выигрыш на проценты, другой на порядки.". Вы, господин ххороший БРЕХЛО. Ни до, ни после НЕТ НИ ОДНОГО примера выигрыша "на порядки" (ваше: "И не будет." - верно!), а от экономии байтиков - вы САМОУТРАНИЛИСЬ в той теме. ПО БЕЗГРАМОТНОСТИ и только.

"Это Ваше мнение. Оно безграмотно, но спорить я не буду." конечно. Ибо аргументов НЕТ, поскольку сказано мною было в КОНТЕКСТЕ, а не "просто так", как вы любите "теоретическую воду лить".

.. я бросаюсь в холивар только и только потому что вы ПОСТИТЕ ЧУШЬ ради САМОУТВЕРЖДЕНИЯ, а не заради обучения кого-либо.

А в целом - да. Теперь уже можно сказать однозначно: ВЫ УЧИТЕ ПЛОХОМУ. Конкртено: языковой эквилибристике программистом микроконтроллеров, и полностью СОЗНАТЕЛЬНО, поскольку сами же и признавались что С++ не подходит для программирования МК.

Ещё ваши "перлы" поанализировать или достаточно?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну и к чему это всё? По делу есть чего? Позавчера Вы влезли с очередным бредом про оптимизацию. Как всегда были посажены в лужу публикацией конкретного кода и нмедленно слились. Осталось только оценочными фразами кидаться? На них я регагировать не буду, можете радоваться. Когда увидите у меня целочисленное деление с нулевым результатом, вот тогда можете вылазить.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ты дурак? Перечитай, там сразу написано "предположу" .. ибо не вникал, не смотрел и не собирался. Сочетание действий "туда-сюда-обратно" - явный повод предположить такое. То, что там есть вычисления - так не смотрел внимательно, про что и БЫЛО НАПИСАНО.. придраться не к чему уже, так?

А вот то, что "разбор полетов" показал, что компилятор сдвиговые операции разворачивает над СЛОВАМИ, а не байтами .. есть косяк компилятора, на который обратить внимание было НЕКОМУ. С какого перепугу байтовая переменная ПЕРЕД сдвигом стала 2-я байтами?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arhat109-2 пишет:

написано "предположу" .. ибо не вникал, не смотрел и не собирался.

"не вникал, не смотрел", но не отписаться с оскорбительными пассажами в мой адрес не мог. Я понимаю.

Arhat109-2 пишет:

косяк компилятора

Когда-то Вы уже писали про "косяк компилятора" и тогда Вас посадили в лужу цитатой из стандарта языка. Нужна цитата из стандарта языка и на этот раз? Или сами почитаете и усядетесь?

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

Arhat109-2 пишет:

С какого перепугу байтовая переменная ПЕРЕД сдвигом стала 2-я байтами?

Понимаете, есть такой язык С++. Вы его не знаете, но беда Ваша не в этом, все мы чего-то не знаем. Беда Ваша в том, что Ваше незнание агрессивно. Вы и не хотите ничего  знать, считая что и так всё знаете. А если Ваше "знание" противоречит коду - то это косяки компилятора.

В том топике, я , как Вы можете видеть, написал, что впервые с таким столкнулся и тоже, как и Вы, этого не знал. Разница в том, что я тут же открыл стандарт языка, посмотрел и теперь знаю, что так и должно быть. Вы же ничего не открывали, а просто стали писать о косяках компилятора, в этом между нами разница. 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

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

http://en.cppreference.com/w/cpp/language/operator_arithmetic

Ищите, где указано что возвращаемый тип - 2 байта. Оператор определен и возвращает тип ЛЕВОГО операнда. Ничего иного НЕ сказано.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arhat109-2 пишет:

http://en.cppreference.com/w/cpp/language/operator_arithmetic

Ищите, где указано что возвращаемый тип - 2 байта. Оператор определен и возвращает тип ЛЕВОГО операнда. Ничего иного НЕ сказано.

Даже не знаю, как это комментировать ... я понимаю, что Вы прогер, но мне казалось, что разницу между стандартом языка и каким-то анонимным ресурсом на вики-движке понимаете даже Вы. Простите, ошибался.

Если Вы продолжаете упорствовать в своём невежестве, извольте:

Итак раздел стандарта 5.8 Shift operators. В нем говорится: "The operands shall be of integral or unscoped enumeration type and integral promotions are performed. The type of the result is that of the promoted left operand". Обратите внимание на подчёркнутую фразу. Там явно сказано, что "integral promotion" выполняется (а не "на усмотрение, в случае необходимости").

Кcтати, на Вашем вики-сайте собственно написано почти также: "The return type is the type of the left operand after integral promotions". Так что зря я на ребят, они всё правильно написали и вовсе не виноваты в том, что Вы читать не умеете.

Чтобы не плодить дальнейших постов, заодно поясню, что такое "integral promotion", поскольку имею основания полагать, что Вы этого не знаете (иначе не приводили бы ссылку на контент, который прямо противоречит Вашей позиции).

Итак, раздел стандарта 4.5 Integral promotions. В нём написано: "A prvalue of an integer type other than bool, char16_t, char32_t, or wchar_t whose integer conversion rank is less than the rank of int can be converted to a prvalue of type int if int can represent all the values of the source type; otherwise, the source prvalue can be converted to a prvalue of type unsigned int".

Т.е. "integral promotion" - это возможность преобразования ("can be converted") типов меньших, чем int к int или к unsigned. А описание сдвига требует, чтобы это преобразование было выполнено ("are performed").

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

Надеюсь, вопрос заркыт и у Вас нет возражений?

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

Ну и херней вы занимаетесь с библиотеками для библиотек.

Я вот столкнулся с тем, что код PORTB = PORTB & ~(1<<1);    PORTB = PORTB | 1<<1; выполняется слишком медленно.

У вас нет класса с ускоренным вариантом?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Okmor пишет:

Я вот столкнулся с тем, что код PORTB = PORTB & ~(1<<1);    PORTB = PORTB | 1<<1; выполняется слишком медленно.

У вас нет класса с ускоренным вариантом?

Есть ассемблерные вставки для ускорения, попробуйте:

asm volatile("cbi %0, 0x01" :: "I" (_SFR_IO_ADDR(PORTB))); // сбросить PB1
asm volatile("sbi %0, 0x01" :: "I" (_SFR_IO_ADDR(PORTB))); // установить PB1

Вот то же самое, но оформлено в макросы и вынесено в хедер.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Я вам кинул первую попавшуюся ссылку на текст, близкий к стандарту. Это вовсе ни разу не означает что я "его не смотрел", как вы тут всем наврали с три короба.

Да, не совсем верно перевел фразу "The operands shall be of integral or unscoped enumeration type and integral promotions are performed. The type of the result is that of the promoted left operand"

Операнды обязаны быть целыми ИЛИ (неопределенно целый) перечислимый тип будет преобразован к целому .. он в общем-то всегда преобразуется к целому, то бишь int. А то что преобразование делается ОБЯЗАТЕЛЬНО к int, извините НЕ указано в описании классов операторов там стоит "T"и одинаково у всех операторов.

То есть, в данном случае, некая "частность" реализации операций сдвига на больших машинах возведена в "стандарт" .. то бишь есть очередной "косяк языка" и только. Ещё и неочевидный.

Впрочем, данный разбор в очередной раз показывает, что копание в деталях ни разу не демонстрирует способности чего-то ДЕЛАТЬ, чтобы называть себя ПРОГРАММИСТОМ. Ещё раз: "кто учит - сам делать НЕ умеет", всё что Вы доказали.

P.S. Я возможно и достаточно часто бываю невнимателен .. но у меня есть достаточно сделанного и уже даже и тут, чтобы не пиарить себя ЗА СЧЕТ ОСТАЛЬНЫХ участников форума, как ВЫ ЭТО ДЕЛАЕТЕ ПОСТОЯННО, пытаясь заменить СДЕЛАННОЕ словесами. Были в моем прошлом такие же как4 и вы горе-преподаватели .. сами как были нолями без палочек так и остались до самой пензии.. зато кровушки студентам попили за не дай бог кому. И, совершенно честно прогуливая занятия таких "садистов", получал свои трояки .. имея позже вполне заслуженные и грамоты и изделия "на вооружении".

Ещё раз, возвращаюсь к посту выше: ВЫ УЧИТЕ ПЛОХОМУ. Потому что сами, ничего кроме теории НЕ ЗНАЕТЕ.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arhat109-2 пишет:

Да, не совсем верно перевел фразу 

...

 Я возможно и достаточно часто бываю невнимателен .. 

.

Значит, Вы признаёте, что компилятор сделал Всё правильно, и В посте про его косяк Вы были не правы. Ну, слава Богу. Не ожидал и, знаете, даже стало появляться что-то вроде уважения.

Но при этом, Вы начинаете утверждать, что это

Arhat109-2 пишет:

очередной "косяк языка"

Почему-то меня это не удивляет. Я такое от Вас уже слышал (насчёт несуразности в стандарте). Так что для меня не новость, что если в языке что-то не так, как Вы думали и Вам на это указали, то это разумется не Ваш косяк, а языка. Я об этом знаю.

А теперь по поводу всего остального. Я программирую всю жизнь и не Вам (не видевшему ни одной моей программы и пишущему целочисленные деления) судить о моей квалификации. Впрочем, если хотите - судите, мне не жалко. Да, Вы верно заметили,теорию я знаю лучше Вас (и практику тоже, но сейчас не об этом). Уже несколько раз было, когда Вы наскакивали на меня на знании языка и неминуемо усаживались в лужу, как сегодня. Рекомендую, наконец-таки понять, что язык я знаю значительно лучше Вашего и прекратить наскакивать просто из самосохранения. Иначе садиться в лужу будете регулярно и впредь. Впочем, если Вам нравится сидеть в луже, ....

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ну так в отличии от вас я легко признаю свои ошибки, если это ошибки как в данном случае. Удивительным этот процесс является только для чванливых школяров ("кто не может сам - тот учит других"), у которых собственно ЧСВ категорически занижено осознанием того факта что сам не сделал таки нифига ибо "ну не шмогла я".. простая психология и никаких "сокровенных знаний". Как только кто-то пытается выдавать свои фантазии за истину "Вы даже не читали" .. :)

И это, конечно же "очередной косяк языка", поскольку описание привязано к банальному отсутствию операции байтового сдвига на каких-нибудь "майнфреймах", для которых он создавался. В стандарты языков довольно часто пролазят такие несуразности .. предположу, что где-нибудь на полях "машинно-зависимости" наверняка найдется упоминание о возможности реализации байтового и даже кольцевого сдвигов при переносе компиляторов .. и в этом случае, реализация для 8-и разрядного МК в такой форме - есть уже полноценный косяк. Но, мне лень ковыряться и выковыривать заковыки из стандартов для того чтобы потом "терроризировать студентов", ибо обучением не занимаюсь уже давно (с 1994г) и садистскими наклонностями никогда не страдал как полноценный "школяр". Ваши демонстрации "кузявой" языковой эквилибристики выдают вас "с головой".

Ни теорию ни практику Вы не можете знать лучше не только меня, а даже любого практикующего программиста. На ваше "программирую" - ответ по Станиславскому: "Не верю!" потому как "симптомов" вашего практического программирования - тут не наблюдается НИ В ОДНОМ ПОСТУ. Их просто нет. А то что вы приводите как примеры - банальщина из учебников .. общего направления, а вовсе не "применительно к МК". Применительно к МК, и конкретно к Атмелам и Ардуинам за всё ваше тутошнее время существование НЕТ НИ ОДНОГО! А вот ваши "ой, не знал" поначалу встречались "через раз" и я это - очень хорошо помню. Но, как настоящий школяр, вы очень любите выдавать чужое за "свое собственное откровение" .. что тут видно регулярно и невооруженным взглядом. Примеров - полно, начиная от так любимового вами темплейта принта.

Так что звание "программиста" вы себе ПРИСВОИЛИ. Это мое мнение, основанное на ваших сообщениях тут за всё ваше время пребывания на этом форуме. Когда сделаете хоть что-то сами, а не руками ваших студентов ("а попросил и потом надрал задницу") .. тогда возможно, оно и изменится.

Просто, как понимаю, вам дали читать курс по МК, и вы поднабравшись цитат тут и в других местах, по привычке, начали всех поучать и тыкать носом "не читали", "не разобрались" .. видел я таких "садистов-преподавателей" (а мои сокурсники за своих девчонок им ещё и морду били).

P.S. Дополню. Оно всё бы ничего, ибо мне пофигу ваши преференции тутошней писанины, но, не разобравшись в вопросе, ВЫ УЧИТЕ ПЛОХОМУ. Пишу вам уже втретий раз. Да, в той теме у меня ещё были сомнения, поэтому не стал заострять обсуждение, но сейчас - это уже хорошо видно, что мало того, что учите плохому, но обладая опытом преподавателя - учите НАСТОЯТЕЛЬНО и главное ОСОЗНАНО. С чем вот согласится ну никак не могу и буду препятствовать и далее.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Да и характерна статистика появления решений тех или иных вопросв тут и последующего наплыва студентов с одними и теми же вопросами со стандартным лагом. Эта статистика сильно обстрилась примерно с полгода назад .. как раз после вашего появления и предварительного "ознакомления" с предметом. Предположу, что "я попросил человека" было связано с выдачей студенту задания сделать ногодрыг "лучше чем в arhat.h" .. слишком характерно изменение линамики вопросов тут с появлением школяра на форуме.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Да надоел он.