Обсуждаем контроллеры компании Atmel.
Ответить

Re: Как организовать задержку в ожидании нажатия кнопок

Вс дек 04, 2022 09:04:34

Valer5, пока нормально писать не будете - не получится ничего! Не можешь писать, не можешь изъясняться... А это азы ведь. Не ваше всё это. Займитесь чем попроще.

Re: Как организовать задержку в ожидании нажатия кнопок

Вс дек 04, 2022 11:20:34

В псевдо-коде, что получилось у вас в условиях:
Код:
пока (кнопка_нажата)
    если (кнопка_не_нажата)
          если (кнопка_нажата)

Ну как бы что-то тут не то в логике. Вам же вроде как показывали же ранее. Логика должна работать так:
Код:
если (кнопка_нажата)
    если (перед_этим_она_была_отпущена)
          выполнить_действие и установить состояние Кнопка_нажата
     выйти из проверки
иначе
    установить состояние Кнопка_отпущена

То есть, ключевое слово "перед этим", предыдущее состояние кнопки. Предудущее состояние должно сохраняться в отдельной переменной статического типа. В исходном состоянии в момент запуска эта переменная должна содержать состояние "не нажата". И тогда при срабатывании условия проверки текущего состояния кнопки, в случае, если она сейчас нажата, проверяется уже предыдущее состояние "а до этого она была нажата?". То есть, нужно получить именно изменение состояния.

По моим понятиям,обрабатывая функцию
Код:
 if(!(PINA.0&(1<<0))   
         {TCCR1B=0x05;}  )
, пока кнопка нажата, выполняется эта строка и никуда не переходит. При нарушении условия выполняется следующая функция, приводящая к вычислению результата и далее переходит к началу цикла "whaile(1)". Я здесь не прав? По поводу того, что симуляция процесса в Протеусе не даёт уверенности в работе устройства в железе я с Вами согласен, но уверенность в том, что не работающая программа в симуляции не будет работать и в железе, я думаю, полная.

Re: Как организовать задержку в ожидании нажатия кнопок

Вс дек 04, 2022 11:29:17

... что не работающая программа в симуляции не будет работать и в железе, я думаю, полная.

Не убеждайтесь и в этом. Могу назвать 10 примеров, которые в реальном устройстве работают, в симуляции либо не работают, либо имеют непредсказуемые выходные состояния.

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

Re: Как организовать задержку в ожидании нажатия кнопок

Вс дек 04, 2022 12:20:49

Симулятор достаточно неплохо выполняет написанную логику, однако, не следует забывать, что реальные процессы замыкания/размыкания "железной" кнопки он не симулирует. Я показал ранее на скринах осциллограммы, снятые с реальной кнопки. Переходные процессы от десятков микросекунд при нажатии и замыкании кнопки до пары десятков миллисекунд при отпускании кнопки и размыкании контактов.

Слово while() { } организует циклически выполняемые инструкции внутри фигурных скобок { } до тех пор, пока условие внутри круглых скобок истинно, то есть переменная или результат вычислений внутри ( ) не равен нулю.

PINA.0 & (1<<0) - довольно странное выражение. Насколько помню, PINA.0 - это обращение к битовому полю 0 переменной PINA. То есть, этим уже отсекаются все остальные биты методом скрытой логической AND. Следовательно, & (1<<0) можно убрать, это лишние операции.

Условие if() { } будет однократно без цикла выполнять код, записанный в фигурных скобках { } только в том случае, когда переменная или выражение в круглых скобках () будет истинно, то есть не равно 0. В противном случае код в { } пропустится без исполнения.
Знак ! перед выражением инвертирует его смысл, меняет "истинно" на "не истинно". То есть, "выражение равно 0".

Re: Как организовать задержку в ожидании нажатия кнопок

Пн дек 05, 2022 19:50:20

MLX90640, спасибо. И всем спасибо. Задача решилась заменой условия if((!PINA.0&(1<<0)) на цикл while((!PINA.0&(1<<0)). Тогда в пошаговом режиме убедился в правильном порядке выполнения этой части программы. к стати в CVAvr работает и сокращенный вариант while(!PINA.0). А в Студио 5 такой вариант не принимается. Писал для унификации.
Так что, всем спасибо. Тему можно считать закрытой.

Re: Как организовать задержку в ожидании нажатия кнопок

Пн дек 05, 2022 20:19:59

Тебе же написали. Что PINA.0 в твоём компиляторе это макрос.
Я не знаю как реализовано в твоём случае, но это может сработать случайно. Потому что 0.
Пиши if (PINx & (1<<0)). Либо ищи в папках компилятора макросы опроса пинов. В интернете ищи, как опрашивать пины.

Re: Как организовать задержку в ожидании нажатия кнопок

Ср дек 14, 2022 11:53:55

Тебе же написали. Что PINA.0 в твоём компиляторе это макрос.
Я не знаю как реализовано в твоём случае, но это может сработать случайно. Потому что 0.
Пиши if (PINx & (1<<0)). Либо ищи в папках компилятора макросы опроса пинов. В интернете ищи, как опрашивать пины.


функция
Код:
if(PIN.0)
работает правильно и при нулевом значении определяет как "0". А вот форма if (PINx & (1<<0)) не работает.
Решил перейти на studio4, что бы проверить CVAVR. В результата обнаружил, что и студия не определяет значение нулевого бита. И об этом сказано в каком то разъяснении Атмель. Теперь хочу заменить протеус на более позднюю версию. Скачал версии 8.10, 8.13 но все без ключей. Можно но ли в интернете найти ключи?

Re: Как организовать задержку в ожидании нажатия кнопок

Ср дек 14, 2022 12:29:42

Ужос! Валера, у тебя офигенная каша в голове. Начни с нуля. И потихоньку двигайся, а то все у тебя виноваты - кодевижены, атмелы... Все, кроме тебя самого. ППЦ.

Re: Как организовать задержку в ожидании нажатия кнопок

Ср дек 14, 2022 13:34:33

Рекомендую avr studio 4.19. самая стабильная версия. Либо IAR. Не знаю за cvavr. Не пользовался никогда.

Re: Как организовать задержку в ожидании нажатия кнопок

Ср дек 14, 2022 14:21:18

Можно но ли в интернете найти ключи?

Зачем что-то воровать? Под аврки, к счастью, есть порт gcc, так что не нужно мучиться с sdcc, как для пиков, STM8 и т.п. А уж IDE этих - мильëн! Можно вообще в mcedit ковыряться или в vim.
А запись вида PIN.0 невалидна, это - какое-то внутреннее изобретательство некоего компилятора. Нельзя так писать. Либо (pin & 1), либо структуру определить с битовыми полями, и будет pin.bit0.

Re: Как организовать задержку в ожидании нажатия кнопок

Ср дек 14, 2022 14:51:48

Код:
PORTx.n = 1;
в
PORTx |= (1 << n);

и
Код:
PORTx.n = 0;
в
PORTx &= ~(1 << n);

и наконец, кто как привыкнет: Правил нет. Важно компилятору понять вас. А можно создать свой макрос с одного варианта на другой (по крайней мере - в начале). Затем замена будете делать, не задумываясь. (Ну, пока не обмениваетесь пр. кодами с коллегами и друзьями - кто-то будет жаловаться на код, кто-то будет ругать на "стиль" писания кода ..., но ничего.).

Пишу это, потому что я также на "той же кривой": Arduino -> PIC, AVR (и частично: другие МК). У каждого МК/комилятор/IDE свой способ "выражения", но через некоторое время все кажется одинаковым. Важна только логика в алгоритмах. А как будете писать - дело предпочтений. (частично пользуюсь переводчиком БГ -> РУ).

Re: Как организовать задержку в ожидании нажатия кнопок

Сб дек 17, 2022 22:00:37

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
Ответить