Например TDA7294

Форум РадиоКот • Просмотр темы - Как организовать задержку в ожидании нажатия кнопок
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Чт мар 28, 2024 12:19:34

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 32 ]    , 2
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Как организовать задержку в ожидании нажатия кнопок
СообщениеДобавлено: Вс дек 04, 2022 09:04:34 
Держит паяльник хвостом

Карма: 10
Рейтинг сообщений: 99
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 934
Рейтинг сообщения: 0
Valer5, пока нормально писать не будете - не получится ничего! Не можешь писать, не можешь изъясняться... А это азы ведь. Не ваше всё это. Займитесь чем попроще.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как организовать задержку в ожидании нажатия кнопок
СообщениеДобавлено: Вс дек 04, 2022 11:20:34 
Первый раз сказал Мяу!

Зарегистрирован: Чт фев 21, 2013 20:31:33
Сообщений: 33
Рейтинг сообщения: 0
В псевдо-коде, что получилось у вас в условиях:
Код:
пока (кнопка_нажата)
    если (кнопка_не_нажата)
          если (кнопка_нажата)

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

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

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как организовать задержку в ожидании нажатия кнопок
СообщениеДобавлено: Вс дек 04, 2022 11:29:17 
Сверлит текстолит когтями

Карма: 20
Рейтинг сообщений: 288
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1200
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
... что не работающая программа в симуляции не будет работать и в железе, я думаю, полная.

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

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


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Как организовать задержку в ожидании нажатия кнопок
СообщениеДобавлено: Вс дек 04, 2022 12:20:49 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 160
Зарегистрирован: Ср авг 03, 2022 05:22:56
Сообщений: 848
Рейтинг сообщения: 0
Симулятор достаточно неплохо выполняет написанную логику, однако, не следует забывать, что реальные процессы замыкания/размыкания "железной" кнопки он не симулирует. Я показал ранее на скринах осциллограммы, снятые с реальной кнопки. Переходные процессы от десятков микросекунд при нажатии и замыкании кнопки до пары десятков миллисекунд при отпускании кнопки и размыкании контактов.

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

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

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


Вернуться наверх
 
Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Как организовать задержку в ожидании нажатия кнопок
СообщениеДобавлено: Пн дек 05, 2022 19:50:20 
Первый раз сказал Мяу!

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


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Как организовать задержку в ожидании нажатия кнопок
СообщениеДобавлено: Пн дек 05, 2022 20:19:59 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 141
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1382
Рейтинг сообщения: 0
Тебе же написали. Что PINA.0 в твоём компиляторе это макрос.
Я не знаю как реализовано в твоём случае, но это может сработать случайно. Потому что 0.
Пиши if (PINx & (1<<0)). Либо ищи в папках компилятора макросы опроса пинов. В интернете ищи, как опрашивать пины.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как организовать задержку в ожидании нажатия кнопок
СообщениеДобавлено: Ср дек 14, 2022 11:53:55 
Первый раз сказал Мяу!

Зарегистрирован: Чт фев 21, 2013 20:31:33
Сообщений: 33
Рейтинг сообщения: 0
Тебе же написали. Что 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 
Держит паяльник хвостом

Карма: 10
Рейтинг сообщений: 99
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 934
Рейтинг сообщения: 0
Ужос! Валера, у тебя офигенная каша в голове. Начни с нуля. И потихоньку двигайся, а то все у тебя виноваты - кодевижены, атмелы... Все, кроме тебя самого. ППЦ.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как организовать задержку в ожидании нажатия кнопок
СообщениеДобавлено: Ср дек 14, 2022 13:34:33 
Это не хвост, это антенна

Карма: 4
Рейтинг сообщений: 141
Зарегистрирован: Ср июн 25, 2008 15:19:44
Сообщений: 1382
Рейтинг сообщения: 0
Рекомендую avr studio 4.19. самая стабильная версия. Либо IAR. Не знаю за cvavr. Не пользовался никогда.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как организовать задержку в ожидании нажатия кнопок
СообщениеДобавлено: Ср дек 14, 2022 14:21:18 
Собутыльник Кота
Аватар пользователя

Карма: -12
Рейтинг сообщений: -25
Зарегистрирован: Пт июл 12, 2019 22:52:01
Сообщений: 2525
Рейтинг сообщения: 0
Можно но ли в интернете найти ключи?

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

_________________
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как организовать задержку в ожидании нажатия кнопок
СообщениеДобавлено: Ср дек 14, 2022 14:51:48 
Сверлит текстолит когтями

Карма: 20
Рейтинг сообщений: 288
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1200
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
Код:
PORTx.n = 1;
в
PORTx |= (1 << n);

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

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

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как организовать задержку в ожидании нажатия кнопок
СообщениеДобавлено: Сб дек 17, 2022 22:00:37 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 2030
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 6618
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
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

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)
Безграмотно вопрошающим про силовую или высоковольную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 32 ]    , 2

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y