Valer5, пока нормально писать не будете - не получится ничего! Не можешь писать, не можешь изъясняться... А это азы ведь. Не ваше всё это. Займитесь чем попроще.
пока (кнопка_нажата) если (кнопка_не_нажата) если (кнопка_нажата)
Ну как бы что-то тут не то в логике. Вам же вроде как показывали же ранее. Логика должна работать так:
Код:
если (кнопка_нажата) если (перед_этим_она_была_отпущена) выполнить_действие и установить состояние Кнопка_нажата выйти из проверки иначе установить состояние Кнопка_отпущена
То есть, ключевое слово "перед этим", предыдущее состояние кнопки. Предудущее состояние должно сохраняться в отдельной переменной статического типа. В исходном состоянии в момент запуска эта переменная должна содержать состояние "не нажата". И тогда при срабатывании условия проверки текущего состояния кнопки, в случае, если она сейчас нажата, проверяется уже предыдущее состояние "а до этого она была нажата?". То есть, нужно получить именно изменение состояния.
По моим понятиям,обрабатывая функцию
Код:
if(!(PINA.0&(1<<0)) {TCCR1B=0x05;} )
, пока кнопка нажата, выполняется эта строка и никуда не переходит. При нарушении условия выполняется следующая функция, приводящая к вычислению результата и далее переходит к началу цикла "whaile(1)". Я здесь не прав? По поводу того, что симуляция процесса в Протеусе не даёт уверенности в работе устройства в железе я с Вами согласен, но уверенность в том, что не работающая программа в симуляции не будет работать и в железе, я думаю, полная.
... что не работающая программа в симуляции не будет работать и в железе, я думаю, полная.
Не убеждайтесь и в этом. Могу назвать 10 примеров, которые в реальном устройстве работают, в симуляции либо не работают, либо имеют непредсказуемые выходные состояния.
Поэтому: и на симуляторе, и на реальном устройстве нужно знать, что поставили как задачи и выполнения и чего ожидать. В противном случае выводы неверны. Но в симуляторе легко просмотр регистров, память или с использованием другого испытательного устройства часто помогает свести к минимуму неясности. Правда, в MK тоже есть отладка/debug, но к этому стоит быть готовым.
Симулятор достаточно неплохо выполняет написанную логику, однако, не следует забывать, что реальные процессы замыкания/размыкания "железной" кнопки он не симулирует. Я показал ранее на скринах осциллограммы, снятые с реальной кнопки. Переходные процессы от десятков микросекунд при нажатии и замыкании кнопки до пары десятков миллисекунд при отпускании кнопки и размыкании контактов.
Слово while() { } организует циклически выполняемые инструкции внутри фигурных скобок { } до тех пор, пока условие внутри круглых скобок истинно, то есть переменная или результат вычислений внутри ( ) не равен нулю.
PINA.0 & (1<<0) - довольно странное выражение. Насколько помню, PINA.0 - это обращение к битовому полю 0 переменной PINA. То есть, этим уже отсекаются все остальные биты методом скрытой логической AND. Следовательно, & (1<<0) можно убрать, это лишние операции.
Условие if() { } будет однократно без цикла выполнять код, записанный в фигурных скобках { } только в том случае, когда переменная или выражение в круглых скобках () будет истинно, то есть не равно 0. В противном случае код в { } пропустится без исполнения. Знак ! перед выражением инвертирует его смысл, меняет "истинно" на "не истинно". То есть, "выражение равно 0".
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
MLX90640, спасибо. И всем спасибо. Задача решилась заменой условия if((!PINA.0&(1<<0)) на цикл while((!PINA.0&(1<<0)). Тогда в пошаговом режиме убедился в правильном порядке выполнения этой части программы. к стати в CVAvr работает и сокращенный вариант while(!PINA.0). А в Студио 5 такой вариант не принимается. Писал для унификации. Так что, всем спасибо. Тему можно считать закрытой.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Тебе же написали. Что PINA.0 в твоём компиляторе это макрос. Я не знаю как реализовано в твоём случае, но это может сработать случайно. Потому что 0. Пиши if (PINx & (1<<0)). Либо ищи в папках компилятора макросы опроса пинов. В интернете ищи, как опрашивать пины.
Тебе же написали. Что PINA.0 в твоём компиляторе это макрос. Я не знаю как реализовано в твоём случае, но это может сработать случайно. Потому что 0. Пиши if (PINx & (1<<0)). Либо ищи в папках компилятора макросы опроса пинов. В интернете ищи, как опрашивать пины.
функция
Код:
if(PIN.0)
работает правильно и при нулевом значении определяет как "0". А вот форма if (PINx & (1<<0)) не работает. Решил перейти на studio4, что бы проверить CVAVR. В результата обнаружил, что и студия не определяет значение нулевого бита. И об этом сказано в каком то разъяснении Атмель. Теперь хочу заменить протеус на более позднюю версию. Скачал версии 8.10, 8.13 но все без ключей. Можно но ли в интернете найти ключи?
Ужос! Валера, у тебя офигенная каша в голове. Начни с нуля. И потихоньку двигайся, а то все у тебя виноваты - кодевижены, атмелы... Все, кроме тебя самого. ППЦ.
Зачем что-то воровать? Под аврки, к счастью, есть порт gcc, так что не нужно мучиться с sdcc, как для пиков, STM8 и т.п. А уж IDE этих - мильëн! Можно вообще в mcedit ковыряться или в vim. А запись вида PIN.0 невалидна, это - какое-то внутреннее изобретательство некоего компилятора. Нельзя так писать. Либо (pin & 1), либо структуру определить с битовыми полями, и будет pin.bit0.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
и наконец, кто как привыкнет: Правил нет. Важно компилятору понять вас. А можно создать свой макрос с одного варианта на другой (по крайней мере - в начале). Затем замена будете делать, не задумываясь. (Ну, пока не обмениваетесь пр. кодами с коллегами и друзьями - кто-то будет жаловаться на код, кто-то будет ругать на "стиль" писания кода ..., но ничего.).
Пишу это, потому что я также на "той же кривой": Arduino -> PIC, AVR (и частично: другие МК). У каждого МК/комилятор/IDE свой способ "выражения", но через некоторое время все кажется одинаковым. Важна только логика в алгоритмах. А как будете писать - дело предпочтений. (частично пользуюсь переводчиком БГ -> РУ).
Valer5, для начала PINA - это байт, а PINA.0 - это 0й бит этого байта (работает только в кодевижене и то не на всех портах) поэтому конструкция вида PINA.0&(1<<0) не заработает, т.к. там не байт, а уже бит... правильно написать PINA&(1<<0) - так заработает везде.
Теперь про ограничения в первом случае (командой PINA.0) операцию предписывается выполнить именно при помощи битового доступа, а он у АВР возможен только в пределах первых 32 регистров. Во втором (командой PINA&(1<<0)) вычитывается весь регистр и оттуда забирается нужный бит, но тут оптимизатор в праве выбрать наилучший способ достижения результата). Кроме того вычитав весь байт, можно на него наложить произвольную маску PINA&((1<<0)|(1<<1)) и тем проверить состояние сразу ресколько бит. Вывод: команда PINA&(1<<0) всегда предпочтительней чем PINA.0
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения