Перейти к содержанию

Отследить Нажатие И Увеличить


cargo29

Рекомендуемые сообщения

#include <avr/io.h>
#include <util/delay.h>
int x = 300;
void delay_us(unsigned int us)
{
for(unsigned int i=0;i<us;i++)
 {
 _delay_us(1);
}
}
int main(void)
{
DDRB = 0b00000011;

while(1==1)
{
if (PINB == 0b00000100){
x = x+100;
}
 PORTB = 0b00000001;
 delay_us(x);
 PORTB = 0b00000000;
 delay_us(x);

}
}

есть светодиод и 2 кнопки, базовая задержка 200 одна кнопка увеличивает на 100 другая уменьшает. , но только что бы увеличило один раз на одно нажатие а не так что бы в цикле захватило

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Когда кнопка зажалась, изменить переменную, и затем ожидать отжатия - как только отжали - выходить в основной цикл.

if (PINB == 0b00000100){
x = x+100;
_delay_ms(10);
while (PINB==0b00000100);
}

Вот как то так - только пока держишь кнопку - программа не будет выполняться, т.к. идёт ожидание отпускания. И работать будет, если другие выводы не задействованы. Иначе уже нужно по другому делать.

**со второй кнопкой такой же блок кода поставить следом за первым, только операцию с X заменить на соответствующую и код на проверке PINB заменить. Только при этом они одновременно не будут работать. Вообще такой подход общения с кнопками немного корявый, но для этой задачи пойдёт.

Изменено пользователем tcoder
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Используй переменную (пусть будет oldstate), дальше в основном цикле программы делай два условия: 1. Если кнопка не нажата, oldstate=0; 2. Если oldstate=0 и кнопка нажата, то { бла-бла-бла (твои действия); oldstate=1}

Извиняюсь за кривость объяснения: код написать не на чем, среды нет на компе.

Изменено пользователем КЭС
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

а какой по лучше вариант работы с кнопками? 0b00000100 на тот порт я подаю напряжение, а на 0b00000001 этом порту весит светодиод

Вопрос еще не по теме такой, собираю систему 5.1 и хочу сделать регулировку ВЧ НЧ и звука на контролере и еще сделать на контролере это отключать каналы допустим у меня есть 5 кнопок (5 каналов) нажимаю на кнопку канал отключается нажимаю еще раз на кнопку включается возможно ли такое осуществить?

Ссылка на комментарий
Поделиться на другие сайты

отключение и включение я буду делать через транзистор, дело все встанет как понять когда выключено а когда включено. а на счет регулировки вообще даже не предполагаю, вот еще вопрос читал что на ATtiny13A есть ШИМ Как его запустить и использовать для ИБП?

Ссылка на комментарий
Поделиться на другие сайты

Используй переменную (пусть будет oldstate), дальше в основном цикле программы делай два условия: 1. Если кнопка не нажата, oldstate=0; 2. Если oldstate=0 и кнопка нажата, то { бла-бла-бла (твои действия); oldstate=1}

Далее: Иначе если кнопка отжата и oldstate=1 присваиваем oldstate=0. Проверка условия в if.

Все можно наладить, если вертеть в руках достаточно долго!

Если ничто другое не помогает, прочтите, наконец, инструкцию!

Ссылка на комментарий
Поделиться на другие сайты

Далее: Иначе если кнопка отжата и oldstate=1 присваиваем oldstate=0. Проверка условия в if.

Это уже лишнее, достаточно того что я предложил: oldstate станет равным нулю в следующем витке цикла после отпускания кнопки.

Ссылка на комментарий
Поделиться на другие сайты

хехе

какраз пару недель назад делал такую фигню на tiny26L.

Там есть такая фишка, что группа выводов может быть сконфигурирована для работы с прерываниями. Характер прерываний настраивается: по фронту, по уровню, по наклону фронта. Так что никакий ухищрений - хоть на нажатие, хоть на отпускание

Дребезг подавлял задержкой (100мс) на триггере Шмидта (1564ТЛ2)

Всё работает чётко. Там можно хоть все ноги под кнопки задействовать.

Изменено пользователем 8244

в репу каждому, кто отсылает в гугл !!

Ссылка на комментарий
Поделиться на другие сайты

#include <avr/io.h>
#include <util/delay.h>
unsigned int x = 300;
void delay_us(unsigned int us)
{
for(unsigned int i=0;i<us;i++)
 {
 _delay_us(1);
}
}

int main(void)
{
DDRB = 0b00000001;

while(1==1)
{

if (PINB == 0b00000100){
x = x+100;
_delay_ms(10);
while (PINB==0b00000100);
}
 PORTB = 0b00000001;
 delay_us(x);
 PORTB = 0b00000000;
 delay_us(x);

}
}

на первом висит светодиод на 3 я пода напряжение но почему то не хочет изменяться

Ссылка на комментарий
Поделиться на другие сайты

в смысле как?

У тебя вообще какой контроллер?

Я говорю, что в Tiny26 в регистре управления прописываешь по какому фронту будет прерывание, в регистре маски разрешаешь прерывание для данной группы ног (там их две группы кажется). Потом когда у тебя, скажем, на одной из ног PINB[4..7] положительный фронт, событие обрабатывается как внешнее прерывание. А, скажем, отрицательный фронт прерывание не порождает.

В обработчике потом проверяешь, какая из ног нажата (PIN[n] =0,1).

Надо весь раздел Interrupts в даташите прочитать, там много тонкостей. Например, в Tiny26, если на одни и те же ноги выведено несколько устройств, то прерывание PinChange может не возникнуть.

Только про дребезг не забудь, а то у тебя одно нажатие будет десяток раз обработчик вызывать.

------------------------------

А ты кнопку на питание замыкаешь что ли? Схему надо было нарисовать. У тебя в разомкнутом состоянии 3-й вывод какой потенциал имеет? Может всё время высокий?

Изменено пользователем 8244

в репу каждому, кто отсылает в гугл !!

Ссылка на комментарий
Поделиться на другие сайты

Нафига здесь прерывания юзать? Про кнопку поддерживаю 8244, нарисуй. Не знаю, на чем кодишь, проверь, можно использовать такую запись: if PINB.2{ вместо if (PINB == 0b00000100){ ? Если нет, надо маску использовать для обработки как входных состояний портов, так и для вывода.

Ссылка на комментарий
Поделиться на другие сайты

Вообщем можно 2 варианта, либо постоянно подавать + на вывод или же подать его при нажатии, дело в том что он так и так его не видит а контролер tiny13

я прописывал так if (PINB2 == 1){ без точки

регистре управления прописываешь по какому фронту будет прерывание, в регистре маски разрешаешь прерывание для данной группы ног (там их две группы кажется). Потом когда у тебя, скажем, на одной из ног PINB[4..7] положительный фронт, событие обрабатывается как внешнее прерывание. А, скажем, отрицательный фронт прерывание не порождает.

вот это не понимаю как сделать
Ссылка на комментарий
Поделиться на другие сайты

cargo29:"вот это не понимаю как сделать"

cargo29, для Tiny13 PCINT (Pin Change Interrupt) по фронту настроить нельзя. Для него такие условия можно задать только для INT0 (одна нога). Конфигурационные биты MCUCR[1,0] (смотри datasheet).

Не забудь по твоей ноге в регистре маски единицу прописать (PCMSK) и разрешить прерывания (GIMSK, PCIE)

Хотя, согласен с КЭС, если просто делать циклический опрос кнопок, это даже проще: скажем, раз в 0.1с опрашиваешь клавиатуру и запоминаешь состояние. Тут и дребезг сразу устраняется: эта же 0.1с будет задержкой.

А ты вообще нафиг накую малявку взял с 8 ногами? Неудобно ведь.

в репу каждому, кто отсылает в гугл !!

Ссылка на комментарий
Поделиться на другие сайты

Все что ты сказал для меня такие дебри, а малявку взял, больше и не надо для таких примеров, не брать же mega16 там я знаю как осуществить такое, а вот когда порт один и с него распределять ноги на вход выход и отследить это дебри для меня

Ссылка на комментарий
Поделиться на другие сайты

То есть сделать на прием порт?

я тут нашел кое что

#include <avr/io.h>
#include <util/delay.h>
void delay_us(unsigned int us)
{
for(unsigned int i=0;i<us;i++)
{
 _delay_us(1);
}
}
int main(void)
{
DDRB = 0x01;

   while(1)
   {
 int Sleep = 300;
 if (PINB & _BV(PB2))
 {
  Sleep = Sleep*2;
 }  
  PORTB |= _BV(PB0);
  delay_us(Sleep);
  PORTB  &=~_BV(PB0);
  delay_us(Sleep);  
   }
return 0;
}

но когда делаешь переменную тут

#include <avr/io.h>
#include <util/delay.h>
int Sleep = 300;
void delay_us(unsigned int us)

то он ее не видит как сделать что бы было ее видно глобально

Ссылка на комментарий
Поделиться на другие сайты

слушай, а зачем ты такую сложную программу сразу пишешь?

Начинай с классического примера: мигающий светодиод.

Потом сделай прогу, скажем, на одной ноге кнопка, на другой - светодиод. Нажимаешь кнопку - загорается светодиод. Отпускаешь - гаснет.

Зато ты хорошо разберёшься с регистрами PORT[N], DDR[N], PIN[N].

Это уже немало.

Лучше ASM, в С работа с железом не так прозрачна.

(ну не знаю конечено, я просто сам люблю до конца разбираться, а это небыстро выходит)

Изменено пользователем 8244

в репу каждому, кто отсылает в гугл !!

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

Обозначить ее значение после main. И потом она будет крутиться в основном цикле. Или записать в Еепром и оттуда брать значение. Где то придется организовать перезапись при изменении этого значения.

Изменено пользователем chip-chip

Все можно наладить, если вертеть в руках достаточно долго!

Если ничто другое не помогает, прочтите, наконец, инструкцию!

Ссылка на комментарий
Поделиться на другие сайты

#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRB = 0b00000001; 
while(1)
   { 
PORTB = 0b00000001
if (PINB & _BV(PB1))
{
PORTB = 0b00000000;
while (PINB & _BV(PB1));
}}}

Весь код со светодиодом и кнопкой светофор еще легче, дело в другом, я понять не могу, переменную создаешь вне функции и цикла ее не видит, делфи проще

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...