Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
diska
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 17
1

Не выполняется условие

10.07.2018, 07:44. Просмотров 756. Ответов 11
Метки нет (Все метки)

Добрый день! Решил своему мелкому напечатать и собрать РУ машинку. При написании управляющих программ для приемника и передатчика столкнулся со следующей проблемой: не выполняется код между 3 и 8 строками при любом значении 0го бита flags[1]. Что при симуляции в протеусе, что на собранной схеме на макетке результат один и тот же.
C++
1
2
3
4
5
6
7
8
while(1){
    //зажигание
    if (!(flags[1]&(1<<0))){goto loop;}
    //колеса
    if(tcpwm<pwrML){PORTB|=(1<<cpl);}else{PORTB&=~(1<<cpl);}
    if(tcpwm<pwrMR){PORTB|=(1<<cpr);}else{PORTB&=~(1<<cpr);}
    //PORTB=flags[1];
loop:;}
Перепробовал разные варианты условия, не помогло. Я в программировании и МК слабо разбираюсь, может я что то не так делаю. Пишу в редакторе Geany, компилятор avr-gcc, прошивка через avrdude, ОС Ubuntu. Все файлы проекта в архиве.
Пожалуйста помогите разобраться.
Заранее спасибо!
0
Вложения
Тип файла: zip Приемник - передатчик.zip (25.1 Кб, 2 просмотров)
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2018, 07:44
Ответы с готовыми решениями:

Не выполняется if
Почему может не выполняться оператор if? Ни одна ветка не исполняется, ни...

Не выполняется операция в цикле
Почему-то при повторении цикла игнорируется первый оператор. Привожу...

Не выполняется код за циклом for
Здравствуйте. Вывожу код кнопок подключенных к PORTA c 4 по 7. Код выводится...

Вывести на экран "условие выполняется", если все элементы массива положительные и "условие не выполняется", если это не так.
1)Тип массива вещественный.Число элементов 11. Вывести на экран &quot;условие...

Почему выполняется условие else, если выполнилось условие if?
При вводе буквы, которое есть в переменной word, по идеи, если такой буквы...

11
ValeryS
Модератор
7314 / 5557 / 704
Регистрация: 14.02.2011
Сообщений: 18,837
10.07.2018, 08:44 2
Цитата Сообщение от diska Посмотреть сообщение
if (!(flags[1]&(1<<0))){goto loop;}
что вот этим хотел сделать?
0
diska
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 17
10.07.2018, 09:05  [ТС] 3
если 0й бит не единица то пропустить
0
tatarva87
87 / 9 / 6
Регистрация: 23.03.2018
Сообщений: 55
10.07.2018, 09:24 4
Лучший ответ Сообщение было отмечено diska как решение

Решение

Попробуй
C++
1
 volatile char flags[2];
сделать.
1
diska
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 17
10.07.2018, 09:33  [ТС] 5
tatarva87 Большое спасибо! Работает.
0
tatarva87
87 / 9 / 6
Регистрация: 23.03.2018
Сообщений: 55
10.07.2018, 09:48 6
У меня у самого а атмел студии как то условие while из за этого не работал (из за volatile). Хотя на CodeVisione все работало. тут на форуме подсказали. Удачи!!
0
ValeryS
Модератор
7314 / 5557 / 704
Регистрация: 14.02.2011
Сообщений: 18,837
10.07.2018, 10:38 7
Цитата Сообщение от diska Посмотреть сообщение
если 0й бит не единица то пропустить
если 0 бит не единица то число нечетное и goto это моветон, есть такое слово continue http://cppstudio.com/post/4271/
итого строчка
Цитата Сообщение от diska Посмотреть сообщение
C
1
if (!(flags[1]&(1<<0))){goto loop;}
должна выглядеть так
C
1
if (flags[1]%2==0)  continue ;
0
diska
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 17
10.07.2018, 11:02  [ТС] 8
continue - это если надо было уйти на следующий виток цикла, а мне нужно было лишь пропустить часть кода, поэтому goto. Программа в самом начале, там будет написано еще много строк. Совет от tatarva87 мне помог.
С такой записью в условии какую привели вы я ни разу не сталкивался, подскажите где почитать подробнее. (с бейсика ни си перебрался на днях, так что много чего непонятно)
0
ValeryS
Модератор
7314 / 5557 / 704
Регистрация: 14.02.2011
Сообщений: 18,837
10.07.2018, 11:13 9
Цитата Сообщение от diska Посмотреть сообщение
поэтому goto.
Цитата Сообщение от diska Посмотреть сообщение
с бейсика ни си перебрался на днях
понятно
уходи от гото
в данном случае можно использовать обратное условие, если что то то исполнить
твой исправленный код( не до конца, только чтобы принцип показать)
C
1
2
3
4
5
6
7
8
9
10
while(1){
    //зажигание
    if ((flags[1]&(1<<0)))
     {
    //колеса
    if(tcpwm<pwrML){PORTB|=(1<<cpl);}else{PORTB&=~(1<<cpl);}
    if(tcpwm<pwrMR){PORTB|=(1<<cpr);}else{PORTB&=~(1<<cpr);}
    //PORTB=flags[1];
     }
   }
еще есть switch и другие вкусности
Цитата Сообщение от diska Посмотреть сообщение
С такой записью в условии какую привели вы я ни разу не сталкивался, подскажите где почитать подробнее.
даже и не знаю, у меня это в крови сходи на ветку Си, С++, и почитай там темы прикрепленные есть список литературы
и есть и распространенные ошибки
0
diska
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 17
10.07.2018, 11:27  [ТС] 10
Я goto наверно первый раз использую, а так обычно как вы и сказали условиями. Меня интересовал вот этот момент в вашей записи "flags[1]%2==0"
0
ValeryS
Модератор
7314 / 5557 / 704
Регистрация: 14.02.2011
Сообщений: 18,837
10.07.2018, 12:16 11
Цитата Сообщение от diska Посмотреть сообщение
flags[1]%2==0
% остаток от деления, используется с целочисленными типами
вот например 5/3 = 1 остаток 2
%2 часто используется для проверки четности числа
все четные остаток 0 нечетные остаток 1
в двоичной системе у нечетных в младшем бите 1 у четных 0
следовательно %2 можно применить для проверки младшего бита
чаще всего %2 и &1 дадут один и тот же код
1
diska
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 17
10.07.2018, 12:28  [ТС] 12
Теперь понял. Спасибо за разъяснение.
0
10.07.2018, 12:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2018, 12:28

Если не выполняется условие в if, то не попадает в условие в else, а попадает сразу в блок catch
Всем привет) Решил выучить язык C#... наткулся на простенький пример ниже! если...

Не выполняется условие
#include &lt;std_lib_facilities.h&gt; using namespace std; int main() { ...

Условие не выполняется
Дана последовательность, содержащая от 2 до 50 слов, в каждом из которых от 1...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru