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

Обсуждаем контроллеры компании Atmel.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Martian, Я сейчас увидел много слов, мало действий. Я показал пример, показал, что такой способ хорош при разбросанных по портам кнопках. От вас же много непонятной жеванины, бездоказательная критика. Где ваша альтернатива?

Код: Выделить всё

#define check_key_1()   (!(check_bit (KEY_1_PIN, KEY_1))) // Low level.
Что вам не так в моём примере?
Реклама
Аватара пользователя
electroget
Друг Кота
Сообщения: 4651
Зарегистрирован: Ср сен 30, 2020 16:51:47
Откуда: РФ

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

Сообщение electroget »

[uquote="Demiurg",url="/forum/viewtopic.php?p=4315761#p4315761"]Я сейчас увидел много слов, мало действий.[/uquote]
А я недавно видел целую тему про автоматизацию станка. Где проект?
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="electroget",url="/forum/viewtopic.php?p=4315763#p4315763"]Где проект?[/uquote]"Красота кода" его погубила :)
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

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

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

Ответ тебе electroget. Это коммерческий проект.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
electroget
Друг Кота
Сообщения: 4651
Зарегистрирован: Ср сен 30, 2020 16:51:47
Откуда: РФ

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

Сообщение electroget »

Строго говоря, это вопрос принципиальный. Мы не должны позволять, чтоб всё делалось кому как вздумается. Пусть Demiurg выполнит и представит форуму проект как следует. :)))
Реклама
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

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

И вы, совершенно случайный человек поставили во главу угла свои какие то непонятные принципы? Товарищ. Вы кто есть в теме AVR?! Предоставьте нам ваши примеры. Светодиодами помигать. Часики, приборчики. Хоть что нибудь на мк AVR.
Реклама
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

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

Сообщение Martian »

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

Добавлено after 1 minute 24 seconds:
Плохо ТС закрыл тему. Совершенно ненадежно :)))
Аватара пользователя
MLX90640
Опытный кот
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

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

Сообщение MLX90640 »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4315745#p4315745"]XOR - это побитная инверсия. Единица разряда маски инвертирует (ноль не инвертирует) этот разряд во втором операнде. Ну или наоборот. Такшта наш ТС тупо инвертирует три младших разряда, не маскируя в ноль ничего.[/uquote]
Даже сложно сказать, на что рассчитывал автор :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 раз.
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

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

Сообщение Martian »

MLX90640, Вы оспариваете мнение программиста (я имею ввиду ТС), как оно работает? ;)
Аватара пользователя
MLX90640
Опытный кот
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

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

Сообщение MLX90640 »

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

Я не ставлю под сомнение степень матёрости топикстартера Land-а . Я лишь пытался понять, почему оно вообще работает :)))
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

[uquote="Martian",url="/forum/viewtopic.php?p=4315776#p4315776"]Demiurg
1) не люблю воду в коде. if (a == true) b = 1
2) Ваш пример всего лишь частный случай, а не догма.[/uquote]
На будущее. Смотрите. Если что-то сделано так, то, наверное, почему-то, есть причина. В моем случае, это никоим образом не молоко! Краткость не всегда полезна. Я открываю свои проекты спустя месяц, год, считай 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 с разбросанными пинами хоть по всем ее портам.

Так что ваше замечание излишнее и из числа вредных. Желаете искать свои ошибки разбросанные по всему проекту или только в определениях, это ваше сугубо ваше личное дело и время.
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

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

Сообщение Martian »

с чего Вы взяли, что у меня есть ошибки? Да еще по всему проекту разбросанные?
А для того, чтобы спустя 10 лет понять, что написано, существуют комментарии. Мои занимают в разы места больше, чем собственно код.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

:facepalm: опять спор ни о чем.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

[uquote="Martian",url="/forum/viewtopic.php?p=4315792#p4315792"]с чего Вы взяли, что у меня есть ошибки? Да еще по всему проекту разбросанные?
А для того, чтобы спустя 10 лет понять, что написано, существую комментарии. Мои занимают в разы места больше, чем собственно код.[/uquote]
Давайте не будем щеки надувать? Ошибок не бывает. НЕ ВЕРЮ!
А у меня в большинстве случаев нет комментариев. Только в случаях замудренных алгоритмов. По коду все понятно. Пример опроса матричной клавиатуры выше. Комментарии нужны?
И я не говорю, что не нужно писать комментарии. Но, давайте почитаем правила написания комментариев.

Код: Выделить всё

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);
}
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

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

Сообщение Martian »

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

Добавлено after 55 seconds:
[uquote="Demiurg",url="/forum/viewtopic.php?p=4315802#p4315802"]А у меня в большинстве случаев нет комментариев.[/uquote]
ну и глупо.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4315799#p4315799"]:facepalm: опять спор ни о чем.[/uquote]
И не говори. Сам в шоке. Тарищи, как с цепи сорвались...

Добавлено after 3 minutes 12 seconds:
Martian. Facepalm. Это не я вас якобы убеждаю. Это вы сначала без доводов покритиковали. Я свою точку зрения высказал, вы тоже. Выдохнули, живем дальше. Взрослые же люди? Кому нам что то доказывать? Не тот случай...
veso74
Поставщик валерьянки для Кота
Сообщения: 1916
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

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

Код: Выделить всё

void out_1_on (void)
{
   __out_1_on ();
}
Используем функцию, когда: если многократно повторяем набор операций и/или изменяем вх. аргумент/ты над много аналогичным данным.
А только одна функция внутри другой функции не вижу никакого смысла в строках.
(Пф, языковой барьер - это доп. трудность, не могу макс. выразить мысли. Надеюсь, меня понимаете).
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Показываю еще раз. Поясняю и показываю еще раз. Пусть нам нужно:
Вариант. Символьный дисплей 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 местах, в разных файлах.
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

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

Сообщение Martian »

такой сложный проект со светодиодом лучше не делать ))
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

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

Вернуться в «AVR»