почти со 100% уверенностью можно утверждать, что если вы выполните требование объявлять volatile все переменные, используемые и в прерываниях и в остальных местах программы одновременно - проблема исчезнет.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Заголовок сообщения: Re: WinAvr в вопросах и ответах
Добавлено: Пн окт 19, 2015 20:21:03
Первый раз сказал Мяу!
Зарегистрирован: Сб май 16, 2015 22:42:01 Сообщений: 26
Рейтинг сообщения:0
ARV писал(а):
присвоили значения - и что? как вы выяснили, что в других местах нет проблем?
Без функции проверки программа работает, но иногда на дисплей выводятся неверные значения команд, особенно когда пульт находится близко от фотоприемника
а вот я вижу, что в вашем коде совершенно все равно, срабатывает ваша проверка или нет - в главном цикле вывод никогда не будет осуществлен, т.к. ir_decode_ok у вас всегда равна нулю.
Код:
if((ir_code[0] == ~ir_code[1]) && (ir_code[2] == ~ir_code[3])){ ir_decode_ok = 1; // Устанавливаем флаг окончания декодирования сигнала ir_ok = 0; // Сбрасываем флаг окончания приема сигнала } ir_decode_ok = 0; // Сбрасываем флаг окончания декодирования сигнала
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
А не лучше ли сравнение с инверсией заменить на функцию XOR? если команда будет равна её инверсии, XOR выдаст все единички. Потом применить логическую функцию AND с такой же конструкцией проверки совпадения адреса. Если все нормально, результат будет равен 0xFF.
Если после таких "замен" придётся поддерживать код кому-то другому, то другой будет сильно ругаться, с упоминаниями членов семьи первого программиста. Это логически неверно. Я такие конструкции могу допускать лишь в случаях, когда нужна некоторая оптимизация скорости или размера кода. В данном случае нет необходимости
С переменной value алгоритм обходится несколько странно. Как минимум, она неинициализирована на первом проходе цикла "for(unsigned char i = 0; i < 4; i++)":
Цитата:
... unsigned char signal_length,value;
....for(unsigned char i = 0; i < 4; i++) // Обработка байтов адреса или команды ....{ ........... ........value = 0; // Обнуляем значение адреса или команды ....}
А кроме того, неясно, правильно ли устроен алгоритм на втором и последущих проходах этого цикла - ведь "value >>= 1;" будет давать 0 до тех пор, пока не сработает "value |= 0x80;" при "ir_signal[++k] > 4" - так и должно быть?
Во всяком случае, ir_code[0] содержит некую случайную величину, что вполне может обратить все условие в false.
самое занятное, что почему он это пишет - я понимаю а вот как сделать, чтобы не писал - не понимаю.
и вообще, avr-gcc ведет себя странновато. по идее, оптимизатор должен лишнее выбрасывать, а он это делает только в свежей версии avr-gcc, а версия WinAVR порождает код с тупым сравнением...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения