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

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


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

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

Программирую контроллер 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;

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

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

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

Hongfa для различных применений в Компэл. Большой выбор в наличии!

Компания HONGFA - это не только крупнейший в мире производитель электромеханических реле, но также производитель конденсаторов, вакуумных прерывателей, трансформаторов и низковольтного коммутационного оборудования. На складе КОМПЭЛ регулярно поддерживаются около 100 самых популярных позиций электромеханических реле. Реле Hongfa могут заместить многие изделия производства недоступных брендов. Подробнее>>

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

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

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

нет

 

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

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

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

 

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

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

 

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

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

 

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

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

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

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

Тренды и лучшие решения для разработки зарядных станций в России

К 2029 году в России прогнозируется увеличение числа зарядных станций до 40 000. При этом отечественный рынок электротранспорта имеет климатические, потребительские и географические особенности. Для успешной разработки и построения инфраструктуры станций заряда в России идеальным вариантом является использование решений и электронных компонентов китайских производителей – лидеров индустрии электротранспорта и возобновляемой энергетики, которые уже представлены в КОМПЭЛ. Подробнее>>

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

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

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

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

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

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

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

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

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

Секреты депассивации литиевых батареек FANSO EVE Energy

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

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

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

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 пользователей онлайн

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

    • Ток измерения сопротивления на этих пределах отличается в 10 раз. Вы по сути сняли ВАХ транзистора.   Я не понимаю одного. Если вам нужно тестировать солнечные панели при определенном интервале токов нагрузки, то  почему бы не сделать источник тока, управляемый напряжением (которое можно получить тем же ШИМом с выхода МК), вместо схемы, эмулирующей резистор, ток через который зависит от напряжения на нём?  
    • Троится - от слова тро...о...лль. Мумитроль Если денег хватит. Водичкой поливать периодически...
    • При взгляде на АЧХ этого динамика  должно быть понятно, почему у него перебор по СЧ. Как в прочем и то, почему +3дБ в TQWP в полосе 70...150-180Гц идут ему на пользу. Чего, кстати, в ЗЯ, получить практически не возможно.
    • Без понятия как оно со встроенным звуком уживется, утилита настройки этого сраного реалтека полный шлак современная версия.                Именно креативу дисконтную что то жаба душит пока.         Блок питания в человеческом виде для самодельного 2.1 усилка не знаю когда выйдет собрать. Вот и думаю, а не плюнуть ли на это дело. 
    • Особенно извращенный причём. Был бы с лапками, то ценник условно приемлем. 
    • @Aknod , "11 лет спустя..."(с) Самого это не смущает?  
    • А чем прямой способ не подходит? Я не был уверен что там будет какая-то адекватная зависимость но все что угодно в определенных пределах и с определенной погрешностью можно описать какой угодно функцией. Зависимость оказалась линейной - ну ок, взял формулу и пользуюсь. Ну оно будет равно произведению тока на номинал этого резистора, ток я где возьму? Измерю? А если там мизерная величина какая будет погрешность? А чтоб я знал что там стоит на цифровых выходах Arduino UNO с поддержкой PWM. Как-то преобразуется, иначе на мультиметре оно бы прыгало. Лишний конденсатор ставить туда явно не стоит - это даст значительную задержку между последовательными измерениями. У меня и так 20 секунд на измерение всего интервала от 0 до 255 уходит в основном из-за записи на карту памяти построчно, а тут еще будут паузы чтобы напряжения установились. Мне это и нужно было, резистивная нагрузка через которую проходит ток разных значений. Делитель тут действительно не получится.
×
×
  • Создать...