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

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 19:10:58

Martian, Я сейчас увидел много слов, мало действий. Я показал пример, показал, что такой способ хорош при разбросанных по портам кнопках. От вас же много непонятной жеванины, бездоказательная критика. Где ваша альтернатива?
Код:
#define check_key_1()   (!(check_bit (KEY_1_PIN, KEY_1))) // Low level.

Что вам не так в моём примере?

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 19:14:52

Я сейчас увидел много слов, мало действий.

А я недавно видел целую тему про автоматизацию станка. Где проект?

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 19:18:11

Где проект?
"Красота кода" его погубила :)

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 19:23:13

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

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

Ответ тебе electroget. Это коммерческий проект.

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 19:24:40

Строго говоря, это вопрос принципиальный. Мы не должны позволять, чтоб всё делалось кому как вздумается. Пусть Demiurg выполнит и представит форуму проект как следует. :)))

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 19:30:03

Хм. Мои проекты, точнее результаты оценивают мои клиенты.
А вы, товарищ, вообще не в теме. Смысл мне как либо реагировать на твои сообщения?

И вы, совершенно случайный человек поставили во главу угла свои какие то непонятные принципы? Товарищ. Вы кто есть в теме AVR?! Предоставьте нам ваши примеры. Светодиодами помигать. Часики, приборчики. Хоть что нибудь на мк AVR.

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 19:38:35

Demiurg, мне лень писать какую-то альтернативу, непонятно какую, зачем, кому и почему.
Раз Вы не поняли моих слов ранее, скажу проще:
1) не люблю воду в коде. if (a == true) b = 1
2) Ваш пример всего лишь частный случай, а не догма.

Добавлено after 1 minute 24 seconds:
Плохо ТС закрыл тему. Совершенно ненадежно :)))

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 19:39:20

XOR - это побитная инверсия. Единица разряда маски инвертирует (ноль не инвертирует) этот разряд во втором операнде. Ну или наоборот. Такшта наш ТС тупо инвертирует три младших разряда, не маскируя в ноль ничего.

Даже сложно сказать, на что рассчитывал автор :shock: Вероятно, у него входы при отпущенных кнопках выдают 1:
Код:
0 0 0 0 0 1 0 1  --- это состояние входов в порту, на втором нажата кнопа и он =0
0 0 0 0 0 1 1 1  --- это маска 0x07
0 0 0 0 0 0 1 0  --- это результат XOR, переданный в switch

А вот это получится, если на одном из входов, не принадлежащем кнопкам, появится 1:
Код:
0 0 1 0 0 1 1 1  --- на порту появился лишний 1 при отп.кнопах
0 0 0 0 0 1 1 1  --- это маска 0x07
0 0 1 0 0 0 0 0  --- это результат XOR, переданный в switch, и он ВНЕ диапазона case

Вариант решения - например после этого XOR нужно добавить ту же маску по AND:
Код:
0 0 1 0 0 1 0 1  --- на портупоявился лишний 1 и нажата кнопа 2
0 0 0 0 0 1 1 1  --- это маска XOR  0x07
0 0 0 0 0 1 1 1  --- это маска AND  0x07
0 0 0 0 0 0 1 0  --- это финальный результат в допустимом диапазоне case
Последний раз редактировалось MLX90640 Вс ноя 06, 2022 19:42:12, всего редактировалось 1 раз.

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 19:40:52

MLX90640, Вы оспариваете мнение программиста (я имею ввиду ТС), как оно работает? ;)

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 19:43:45

Ага, я даже сам не с первого раза понял то, что топикстартер, как матёрый погромист, написал за раз с XOR-ом :))) И ведь главное, что у топикстартера после перенесения переменной в глобальную - заработало жеж! :))
Правда, оно работает до тех пор, пока он не поднесет палец ко входам.

Я не ставлю под сомнение степень матёрости топикстартера Land-а . Я лишь пытался понять, почему оно вообще работает :)))

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 20:09:44

Demiurg
1) не люблю воду в коде. if (a == true) b = 1
2) Ваш пример всего лишь частный случай, а не догма.

На будущее. Смотрите. Если что-то сделано так, то, наверное, почему-то, есть причина. В моем случае, это никоим образом не молоко! Краткость не всегда полезна. Я открываю свои проекты спустя месяц, год, считай 10 лет, как недавно мне пришлось открывать проект. И я сразу понимаю, что происходит. Эту привычку я себе ввел еще на стадии ассемблера. И я заметил, в большинстве случаев тут щеки надувают те, которые в AVR случайно залезли. Это не упрек. А статистика. На профильных формах не особо обращают внимание на ПРАВИЛА. А смотрят, что человек сделал в данном примере и как. И я видел примеры, где очень длинные имена. Зато понятно. Это не минус. А плюс. Не нравится, "попестофали" на профильные форумы и там пальцы гните, как вы очешуенно знаете правила программирования.

Идем дальше. Определения. Пишем в одном месте. Зато в будущем, тебе не придется шариться по всему проекту и удивляться, где же накосячил. Пример. Опрос пина. Логика отрицательная, я прописал в определениях и забыл напрочь лезть еще в проект и исправлять логику. То же касается выходов.

Раскрываю на примере куска кода, опрос матричной клавиатуры.
Спойлер
Код:




//========== Inputs ==================
#define Check_Col_1() (!(check_bit (COL_1_PIN, COL_1)))
#define Check_Col_2() (!(check_bit (COL_2_PIN, COL_2)))
#define Check_Col_3() (!(check_bit (COL_3_PIN, COL_3)))
#define Check_Col_4() (!(check_bit (COL_4_PIN, COL_4)))

#define Check_Row_1() (!(check_bit (ROW_1_PIN, ROW_1)))
#define Check_Row_2() (!(check_bit (ROW_2_PIN, ROW_2)))
#define Check_Row_3() (!(check_bit (ROW_3_PIN, ROW_3)))
#define Check_Row_4() (!(check_bit (ROW_4_PIN, ROW_4)))
//==================

//========= Outputs ==================
#define __Col_1_Low() set_bit (COL_1_DDR, COL_1)
#define __Col_2_Low() set_bit (COL_2_DDR, COL_2)
#define __Col_3_Low() set_bit (COL_3_DDR, COL_3)
#define __Col_4_Low() set_bit (COL_4_DDR, COL_4)

#define __Col_1_Z() clr_bit (COL_1_DDR, COL_1)
#define __Col_2_Z() clr_bit (COL_2_DDR, COL_2)
#define __Col_3_Z() clr_bit (COL_3_DDR, COL_3)
#define __Col_4_Z() clr_bit (COL_4_DDR, COL_4)
//----------
#define __Row_1_Low() set_bit (ROW_1_DDR, ROW_1)
#define __Row_2_Low() set_bit (ROW_2_DDR, ROW_2)
#define __Row_3_Low() set_bit (ROW_3_DDR, ROW_3)
#define __Row_4_Low() set_bit (ROW_4_DDR, ROW_4)

#define __Row_1_Z() clr_bit (ROW_1_DDR, ROW_1)
#define __Row_2_Z() clr_bit (ROW_2_DDR, ROW_2)
#define __Row_3_Z() clr_bit (ROW_3_DDR, ROW_3)
#define __Row_4_Z() clr_bit (ROW_4_DDR, ROW_4)
//==================

// Плата управления.
//----------
#define COL_1_DDR          DDRC
#define COL_1_PIN          PINC
#define COL_1              4

#define COL_1_DDR          DDRC
#define COL_1_PIN          PINC
#define COL_2              5

#define COL_1_DDR          DDRC
#define COL_1_PIN          PINC
#define COL_3              6

#define COL_1_DDR          DDRC
#define COL_1_PIN          PINC
#define COL_4              7
//----------
#define ROW_1_DDR          DDRC
#define ROW_1_PIN          PINC
#define ROW_1              0

#define ROW_1_DDR          DDRC
#define ROW_1_PIN          PINC
#define ROW_2              1

#define ROW_1_DDR          DDRC
#define ROW_1_PIN          PINC
#define ROW_3              2

#define ROW_1_DDR          DDRC
#define ROW_1_PIN          PINC
#define ROW_4              3
//----------


Спойлер
Код:
//==================
void scan_keys (void)
{
   if (_kbd_drv != KBD_DRV_INIT)
   {
      u08 a = 0;

      Colon_On ();

      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");

      if (Check_Row_1 ())
         set_bit (a, 7);
      if (Check_Row_2 ())
         set_bit (a, 6);
      if (Check_Row_3 ())
         set_bit (a, 5);
      if (Check_Row_4 ())
         set_bit (a, 4);

      Row_On ();

      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");
      asm("nop");

      if (Check_Col_1 ())
         set_bit (a, 3);
      if (Check_Col_2 ())
         set_bit (a, 2);
      if (Check_Col_3 ())
         set_bit (a, 1);
      if (Check_Col_4 ())
         set_bit (a, 0);

      keys_curr = a;
   }
}
//----------


Теперь. Я написал этот кусок, и больше к нему в дальнейшем не прикасаюсь. Потому что, все нужные определения в одном месте. Нужную логику я правлю уже не в куске кода а в определениях. И теперь я могу матричную клавиатуру подключить хоть к меге256 с разбросанными пинами хоть по всем ее портам.

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

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 20:22:12

с чего Вы взяли, что у меня есть ошибки? Да еще по всему проекту разбросанные?
А для того, чтобы спустя 10 лет понять, что написано, существуют комментарии. Мои занимают в разы места больше, чем собственно код.

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 20:27:59

:facepalm: опять спор ни о чем.

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 20:35:37

с чего Вы взяли, что у меня есть ошибки? Да еще по всему проекту разбросанные?
А для того, чтобы спустя 10 лет понять, что написано, существую комментарии. Мои занимают в разы места больше, чем собственно код.

Давайте не будем щеки надувать? Ошибок не бывает. НЕ ВЕРЮ!
А у меня в большинстве случаев нет комментариев. Только в случаях замудренных алгоритмов. По коду все понятно. Пример опроса матричной клавиатуры выше. Комментарии нужны?
И я не говорю, что не нужно писать комментарии. Но, давайте почитаем правила написания комментариев.

Код:
DDRC |= (1<<0); // Ну здесь наверное надо... Что здесь, скажем, у нас включается красный светодиод (в случае, если у светодиода отрицательная логика включения и мы рулим нижним ключом пина). Или мы напишем, DDRC пин на выход?!


Или мы напишем так:
Код:
#define __out_1_on() clr_bit(OUT_1_PORT, OUT_1) // |
#define __out_2_on() clr_bit(OUT_2_PORT, OUT_2) // |- Low level
#define __out_3_on() clr_bit(OUT_3_PORT, OUT_3) // |

или так:
Код:
void out_1_on (void)
{
   __out_1_on ();
}


или так
Код:
void out_1_on (void)
{
   OUT_1_PORT |= (1<<OUT_1);
}

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 20:37:39

Я в самом начале сказал - субъективно. То есть, Вам Ваш код нравится. И хорошо. Мне такой метод не нравится и я объяснил, почему. Но Вы хотите убедить меня, что он мне должен нравиться и иной метод неверен? Зачем?

Добавлено after 55 seconds:
А у меня в большинстве случаев нет комментариев.

ну и глупо.

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 20:41:53

:facepalm: опять спор ни о чем.

И не говори. Сам в шоке. Тарищи, как с цепи сорвались...

Добавлено after 3 minutes 12 seconds:
Martian. Facepalm. Это не я вас якобы убеждаю. Это вы сначала без доводов покритиковали. Я свою точку зрения высказал, вы тоже. Выдохнули, живем дальше. Взрослые же люди? Кому нам что то доказывать? Не тот случай...

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 20:46:19

маска: конечное_состояние к порт: porh_x и все. С одним рядом: измените все состояния порта вместе.
А в условие: будете изменять маску с логическими операциями над битами и входами. Это 5 строк.
----------
Ето смущает рецензента кода (или будущего редактора кода). Без смисл:
Код:
void out_1_on (void)
{
   __out_1_on ();
}

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

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 21:09:19

Показываю еще раз. Поясняю и показываю еще раз. Пусть нам нужно:
Вариант. Символьный дисплей 20х4. Пины: 4 битная шина. Пин EN, пин RS. По минимуму.
Вариант. Семисегментные индикаторы.
Шина I2C - 2 пина
SPI - MOSI, MISO, SCK, _SC (если нужно), _OE (если нужно).

Что мы забыли. Порты теперь неполные. Что у нас остались остатки пинов. А нам еще матричную клавиатуру подключить.
Забыл, входы, выходы. Кнопки, датчики. Светодиоды, реле и так далее.

*.h
Код:
//==================
#define OUT_1_DDR  DDRD
#define OUT_1_PORT PORTD
#define OUT_1 0

#define __out_1_on() clr_bit (OUT_1_PORT, OUT_1) // |- Low level // Здесь мы пишем логику включения. Общий плюс или минус.
#define __out_1_off() set_bit (OUT_1_PORT, OUT_1)

//#define __out_1_on() set_bit (OUT_1_PORT, OUT_1) // |- High level
//#define __out_1_off() clr_bit (OUT_1_PORT, OUT_1)
void out_1_on (void);


Код:
void out_1_on (void)
{
   __out_1_on ();
}


При таком подходе я управляю каждым пином в отдельности. Не трогая остальных пинов порта.
Мы можем сразу включать светодиод, реле, что другое так, макросом.
__out_1_on ();

а можем так, функция.
out_1_on ();

А также, теперь я эту функцию могу воткнуть в таблицы. out_1_on ()

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

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 21:23:11

такой сложный проект со светодиодом лучше не делать ))

Re: Компилятор "убивает" локальную переменную. ЗАКРЫТО.

Вс ноя 06, 2022 21:35:46

Предметно. Вот ссылка на Термодат. Это не моя разработка. Сейчас нет фото моих плат. Не делал. Не было надобности. Когда мне кое что потребовалось, я взял этот прибор как донор. Пины разбросаны. Вдобавок ещё сдвиговые регистры. Посмотрите внимательно на фото плат. Когда вы будете создавать подобный прибор, приходите, поговорим...
Пример не совсем корректен. Но суть такая же. Картинка прибора, с которым я работал.
Изображение
Последний раз редактировалось Demiurg Вс ноя 06, 2022 21:42:09, всего редактировалось 1 раз.
Ответить