Перейти к содержанию

Переменная не пишется (программирование МК на СИ)


Рекомендуемые сообщения

Всем привет, устал биться головой об стену, прошу помощи.

Программирую контроллер PIC16F887, нужно создать переменную с признаком регулируемого параметра (задал глобальную переменную bool PR_param = 0;), который менялся бы по нажатию кнопки присоединенной к пину RB2.

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

if (PR_switch && (PR_switch_pr == 0) && (PR_mode == 0))

 

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

Проблема в том, что значение PR_switch_pr никак не меняется при нажатии кнопки, в чем тут может быть дело?

Кусок программы:


    while(1) // основной цикл
    {
        // контроль нажатия кнопки 1
        PR_plus = ~RB0;
        // контроль нажатия кнопки 2
        PR_minus = ~RB1;
        // контроль нажатия кнопки 3
        PR_switch = ~RB2;
        // контроль нажатия кнопки 3
        PR_start = ~RB6;
        // контроль нажатия кнопки 3
        PR_pause = ~RB7;
            
        
        // смена регулируемого параметра
        if (PR_switch && (PR_switch_pr == 0) && (PR_mode == 0)) {
            if (PR_param) {
                PR_param = 0;
            }
            else PR_param = 1;
            
        }
        
        // запись текущих значений в память
        PR_plus_pr = PR_plus;
        PR_minus_pr = PR_minus;
        PR_switch_pr = PR_switch;
        PR_start_pr = PR_start;
        PR_pause_pr = PR_pause;
        
        // вывод - тест
        RC4 = PR_switch_pr == 0;
        RC5 = PR_switch;
        RC6 = PR_mode == 0;
        RC7 = PR_param == 0;
        
        
    };

 

Снимок0004.jpg

Снимок0005.jpg

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

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

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

1 час назад, Виктор Юманов сказал:

PR_plus = ~RB0; // контроль нажатия кнопки 2

...

PR_plus_pr = PR_plus;

Проверьте, читаются ли пины вообще.

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

15 минут назад, BARS_ сказал:

Если на другой пин повесить кнопку, что-то меняется?

нет

 

15 минут назад, BARS_ сказал:

Как минимум нет борьбы с дребезгом кнопок, значения в переменных будут непредсказуемы

то есть питание, подключенное через резистор, это не оно?

 

17 минут назад, BARS_ сказал:

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

 

1 час назад, Виктор Юманов сказал:

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

 

6 минут назад, солар сказал:

Проверьте, читаются ли пины вообще.

пины читаются, уже моргал диодами по нажатиям кнопок

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

6 минут назад, Виктор Юманов сказал:

то есть питание, подключенное через резистор, это не оно?

Вообще не оно, к дребезгу подтяжка не относится никак.

6 минут назад, Виктор Юманов сказал:

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

И снова, ЗАЧЕМ? Что мешает использовать переменные из которых переписываешь? Они ровно точно так же хранят значения.

Да, кстати, что значит вот эта хитрая запись?

RC4 = PR_switch_pr == 0;
RC5 = PR_switch;
RC6 = PR_mode == 0;
RC7 = PR_param == 0;
Изменено пользователем BARS_
Ссылка на комментарий
Поделиться на другие сайты

Чтобы подавить дребезг, а заодним и определить состояние кнопки, могу предложить использовать конструкцию:

delay_10ms; // задержка 10 мсек
	oldPin= Pin;
	Pin= текущее состояние пина;
	....
	if(oldPin && !Pin) {момент нажатия}
	if(!oldPin && Pin) {момент отпускания}
	if(oldPin && Pin) {кнопка не нажата}
	if(!oldPin && !Pin) {кнопка удерживается нажатой}

7 минут назад, BARS_ сказал:

RC4 = PR_switch_pr == 0;

Интересно, во что она компилируется.

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

3 минуты назад, BARS_ сказал:

И снова, ЗАЧЕМ? Что мешает использовать переменные из которых переписываешь? Они ровно точно так же хранят значения.

так понятнее, при оптимизации подумаю над этим, спасибо

 

2 минуты назад, BARS_ сказал:

Да, кстати, что значит вот эта хитрая запись?


RC4 = PR_switch_pr == 0;
RC5 = PR_switch;
RC6 = PR_mode == 0;
RC7 = PR_param == 0;

вывожу на светодиоды значения анализируемые в условии

1 час назад, Виктор Юманов сказал:

if (PR_switch && (PR_switch_pr == 0) && (PR_mode == 0))

 

Ссылка на комментарий
Поделиться на другие сайты

Только что, Виктор Юманов сказал:

вывожу на светодиоды значения анализируемые в условии

Ну так вот == 0 применимо только внутри условий, а никак не в тексте программы. Ты хочешь вывести переменные, а не приравнять их к нулю.

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, солар сказал:

Чтобы подавить дребезг, а заодним и определить состояние кнопки, могу предложить использовать конструкцию:

 


delay_10ms; // задержка 10 мсек
	oldPin= Pin;
	Pin= текущее состояние пина;
	....
	if(oldPin && !Pin) {момент нажатия}
	if(!oldPin && Pin) {момент отпускания}
	if(oldPin && Pin) {кнопка не нажата}
	if(!oldPin && !Pin) {кнопка удерживается нажатой}

да, я такой логикой и пользуюсь, строка с задержкой тут случайно оказалась?

Ссылка на комментарий
Поделиться на другие сайты

Только что, BARS_ сказал:

Ну так вот == 0 применимо только внутри условий, а никак не в тексте программы. Ты хочешь вывести переменные, а не приравнять их к нулю.

тем не менее с PR_mode (который задан типом char) это работает нормально

Только что, BARS_ сказал:

Нет, без задержки дребезг не подавить

а в каких библиотеках можно найти подобные функции?

Ссылка на комментарий
Поделиться на другие сайты

Только что, Виктор Юманов сказал:

тем не менее с PR_mode (который задан типом char) это работает нормально

Тем не менее это неверная запись. И да, смысл в bool, если это переопределение того же самого char?

Ссылка на комментарий
Поделиться на другие сайты

5 минут назад, Виктор Юманов сказал:

в каких библиотеках можно найти подобные функции

Интереснее делать это в прерывании. Каждые 10 мсек.

1 час назад, Виктор Юманов сказал:

RC4 = PR_switch_pr == 0;

Откройте ассемблерный файл, который формируется компилятором, и посмотрите, насколько "нормально" такая строка работает.

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

25 минут назад, солар сказал:
1 час назад, Виктор Юманов сказал:

RC4 = PR_switch_pr == 0;

Откройте ассемблерный файл, который формируется компилятором, и посмотрите, насколько "нормально" такая строка работает.


    while(1) // основной цикл
    {
        // признаки нажатия кнопок на предыдущем такте
        PR_plus_pr = PR_plus; // кнопка 1
        PR_minus_pr = PR_minus; // кнопка 2
        PR_switch_pr = PR_switch; // кнопка 3
        PR_start_pr = PR_start; // кнопка 7
        PR_pause_pr = PR_pause; // кнопка 8
        
        // признаки нажатия кнопок
        PR_plus = ~RB0; // кнопка 1
        PR_minus = ~RB1; // кнопка 2
        PR_switch = ~RB2; // кнопка 3
        PR_start = ~RB6; // кнопка 7
        PR_pause = ~RB7; // кнопка 8
        
        // вывод - тест
        RC3 = PR_switch_pr;
        RC4 = ~PR_switch_pr;
        RC5 = PR_switch;
        RC6 = PR_mode == 0;
        RC7 = PR_param;
        
        
        // смена регулируемого параметра
        if (PR_switch && !PR_switch_pr) {
            if (PR_mode == 0) {
                PR_param = !PR_param;
            }
        }
        
        
        
    };

От этого уже избавился, но до сих пор не работает: условие для смены значения PR_param выполняется. На все пины RB всю дорогу поступают единицы. Начальные значения признаков нажатия кнопок - нули.

При моделировании в Proteus горят диоды, подключенные к RC4, RC6 и RC7...

Изменено пользователем Виктор Юманов
Ссылка на комментарий
Поделиться на другие сайты

Все убрать из цикла, кроме

PR_plus = ~RB0; // кнопка 1 
PR_minus = ~RB1; // кнопка 2 
PR_switch = ~RB2; // кнопка 3 
PR_start = ~RB6; // кнопка 7 
PR_pause = ~RB7; // кнопка 8
    
PR_switch_pr = PR_switch; 

RC3 = PR_switch; 
RC4 = PR_switch_pr; 
RC5 = PR_minus; 
RC6 = PR_start; 
RC7 = PR_pause;
    
_delay_ms(100);
	
Изменено пользователем BARS_
Ссылка на комментарий
Поделиться на другие сайты

Чтобы увидеть, работают ли переменные вообще.И мигать не должны, должны светиться пока нажата кнопка. А задержка в 100мс предотвратит влияние дребезга.

Ссылка на комментарий
Поделиться на другие сайты

 

7 минут назад, BARS_ сказал:

 

Чтобы увидеть, работают ли переменные вообще.И мигать не должны, должны светиться пока нажата кнопка. А задержка в 100мс предотвратит влияние дребезга.

 

Переменные работают.

Ссылка на комментарий
Поделиться на другие сайты

В первом сообщении темы написано ОБРАТНОЕ. Протеус, кстати, тоже добавляет дребезг при нажатии, при этом если в железе хватает 50-100мс задержки, то в протеусе бывает мало и 200. А при наличии дребезга увидеть работу вашего кода невозможно.

Ссылка на комментарий
Поделиться на другие сайты

Проблема оказалась в операторе "~", использованном для инверсии показаний с пинов RBx, переменные типа bool при этом принимали значение 11111110, видимо соответствующие пинам переменные RBx имеют 8 разрядов. После замены на "!" все заработало.

Ссылка на комментарий
Поделиться на другие сайты

Только что, Виктор Юманов сказал:

переменные типа bool при этом принимали значение 11111110

Для чего и предлагалось проверить работу ПЕРЕМЕННЫХ.

1 минуту назад, Виктор Юманов сказал:

переменные RBx имеют 8 разрядов

Открою страшную тайну. Переменные НЕ умеют иметь меньше 8 разрядов. Минимальный размер переменной - 8 бит. И если пройти и посмотреть, что такое bool, то можно увидеть что это обычный int или char, названный по другому. Поэтому в Си тип bool не несет никакой смысловой нагрузки, кроме красоты оформления кода.

 

Ссылка на комментарий
Поделиться на другие сайты

19 минут назад, BARS_ сказал:

 

20 минут назад, Виктор Юманов сказал:

тем не менее с PR_mode (который задан типом char) это работает нормально

Тем не менее это неверная запись. И да, смысл в bool, если это переопределение того же самого char?

 

С чего бы этой записи быть неверной? Отличная, правильная запись...

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Только что, ARV сказал:

Отличная, правильная запись..

Тогда учи Си, ты его не знаешь, раз у тебя == 0 посреди кода является правильной записью.

Изменено пользователем BARS_
Ссылка на комментарий
Поделиться на другие сайты

6 минут назад, BARS_ сказал:

Открою страшную тайну. Переменные НЕ умеют иметь меньше 8 разрядов. Минимальный размер переменной - 8 бит. И если пройти и посмотреть, что такое bool, то можно увидеть что это обычный int или char, названный по другому. Поэтому в Си тип bool не несет никакой смысловой нагрузки, кроме красоты оформления кода.

"Открывать страшные тайны" когда человек уже сам во всем разобрался... Надеюсь это действительно тешит ваше самолюбие.

Ссылка на комментарий
Поделиться на другие сайты

Только что, BARS_ сказал:

Тогда учи Си, ты его не знаешь, раз у тебя == 0 посреди кода является правильной записью

Во-первых, мы на брудершафт не пили, чтобы вы меня на ТЫ называли.

Во-вторых, я говорю не о записи == 0, а о том, что было написано топикстартером, а именно:

26 минут назад, солар сказал:

RC4 = PR_switch_pr == 0;

Это абсолютно корректная запись. И смысл ее в том, что RC4 получит значение 1, если PR_switch_pr будет равно 0, или значение 0 в ином случае.

Изменено пользователем ARV
опечатался

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...