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

Подключение Кнопок И Переключателей К Мк


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

Привет!

МК ATmega16.

К PIND.6 присоединена кнопка, выводом на ‘-’.

В программе хочу, в зависимости от численного значения счетчика ‘n’, выводить то или иное сообщение на ЖК:

int n = 0x30;

//---------------------------------------------------------
Пропускаю конфигурацию портов и таймеров
//---------------------------------------------------------

DDRD=0x00;
PORTD=0x00;

//---------------------------------------------------------
Пропускаю конфигурацию портов и таймеров
//---------------------------------------------------------

while(1)
{
if(PIND.6==0)
n=n+1;
switch(n)
{
Case 1:
		lcd_clear();
		lcd_gotoxy(1,0);
 lcd_putsf("Hello");
Break;

Case 2:
 lcd_clear();
 lcd_gotoxy(1,1);
 lcd_putsf("avr123.nm.r");
Break;

Case 3:
		 lcd_clear();
		 lcd_gotoxy(2,1);
 lcd_putsf("u");
Break;
}
}

Почему-то не работает. Не подскажите, что я не правильно делаю?

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

  • Ответов 89
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

Так if(PIND.6==0) никто не пишет, потомучто в этом регистре может быть либо 1 либо 0 !

Пишут вот так

if(PIND.6){

если PIND.6 еденица то выполнить этот код

}

или вот так

if(!PIND.6){

если PIND.6 нуль то выполнить этот код

}

Дай полный код в текстовом файле, мож поможем :)

Я был механик, я есть механик, я буду механик

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

ну если знание си посредственное то зачем утверждать ? :)

оба варианта возможны.. тем более нужно если пинд.6 равно нулю то выполнить код .. то ваш вариан некатит ))

проблема автора в том что у него счетчик может инкрементироваться сколько угодно раз за одно нажатие ... лучше такие вещи делать прерываниями... или савить задержки.. чтобы короткое нажатие воспринималось как одно нажатие а не как серия... а так с первого взгляда все в норме... смптомы какие? может оно у вас и работает ..

«Как сердцу выразить себя? … Мысль изреченная есть ложь!»

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

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

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

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

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

Я бы сделал так:

...
DDRD=0x00;
PORTD = 0x40; // Вход PIND.6 с подтяжкой (если не перепутал))
...
if (!PIND.6) {
// Код
...
Case3:
...
n=0;
....
 while (!PIND.6) {};
delay_ms (50);
			  };

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

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

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

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

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

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

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

Duhas Во всех кодах, которые я только видел такой записи я не видел :) Я не говорю, что так нельзя, так просто никто не делает :)

А мой код катит потомучто в своём посте я привёл два возможных случая, в данном случае уместен второй, вот этот

if(!PIND.6){

если PIND.6 нуль то выполнить этот код

}

Goodefine

А какая разница мехду if и while ?

Я был механик, я есть механик, я буду механик

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

Goodefine

А какая разница мехду if и while ?

В смысле? While (1) {...} остается, я его просто не стал рисовать. А while (!PIND.6) {} не дает инкрементироваться переменной, пока нажата кнопка. В чем вопрос-то?..

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

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

Duhas Во всех кодах, которые я только видел такой записи я не видел :) Я не говорю, что так нельзя, так просто никто не делает :)

А мой код катит потомучто в своём посте я привёл два возможных случая, в данном случае уместен второй, вот этот

if(!PIND.6){

если PIND.6 нуль то выполнить этот код

}

немешало бы почитать про си ))

хорошо а как организуете такой вариант сделать что либо есть переменная равна 5-ти ?

в си некоторые вещи упрощают жизнь, но применять их нужно тогжа когда суть жизни уже понята

сорри за офф...

to Goodefine

хе красивый ход ждать пока кнопка не отпустицо )

«Как сердцу выразить себя? … Мысль изреченная есть ложь!»

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

Ребят, я извиняюсь, конечно, но когда мне нужно услышать звук, я бью кулаком в стену и слышу его. Четко и понятно. В данном случае, пользы от стены больше, чем от ваших ответов.

Вопрос очень простой. Я это говорю как программист С++. Но нужно сделать привязку к контроллеру. Чтоб срабатывало только когда нажимаешь на кнопку. У меня же срабатывает само по себе (бежит перебор) либо только первая строка. Мне нужно: нажал один раз - одна надпись, нажал второй - вторая надпись, ... .

У меня же такое ощущение, что о контроллерах вы первый раз услышали и приводите предположение, как это должно быть.

Одна кнопка к PIND.6 припаяна к '-' - это правильно?

DDRD=0x00

PORTD=0x00

Должно так быть?

Плюс код: что нужно? сторожевой таймер сбросить или что конкретно?

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

припаяно к минусу - правильно.

То что тебе писали выше, в принципе, все правильно только много.

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

Исправляется это примерно след образом:

1. заводишь переменную для хранения времени задержки (t)

2. настраиваешь таймер на работу с прерыванием через 1мкс

3. по изменению сигнала на входе, куда подключена кнопка запускаешь таймер, запрещаешь повторное нажатие

4. обрабатываешь свои события от нажатия

5. по прерыванию таймера проверяешь t=0?

5а. если равно, разрешаешь повторное нажатие

5б. если нет, t=t-1

Лучше всего обрабатывать нажатие кнопки через прерывание, либо по спаду, либо по значению 0.

Ну и варьировать в зависимости от этого алгоритм

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

Можно вот так:

if(!PIND.6 && KeyPress){
KeyPress=0;
n++;
//-----------------------------
switch(...){
...
}
//-----------------------------
}
if(PIND.6){
KeyPress=1;
}

Таким образом получаем вход в условие PIND.6==0 всего один раз за всё время пока кнопка притянута к земле. После того как кнопку отпустили, т.е. PIND.6==1 можно повторно её нажимать.

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

...Но нужно сделать привязку к контроллеру. Чтоб срабатывало только когда нажимаешь на кнопку. У меня же срабатывает само по себе (бежит перебор) либо только первая строка. Мне нужно: нажал один раз - одна надпись, нажал второй - вторая надпись, ... .

Одна кнопка к PIND.6 припаяна к '-' - это правильно?

DDRD=0x00

PORTD=0x00

Должно так быть?

Плюс код: что нужно? сторожевой таймер сбросить или что конкретно?

Должно быть PORTD = 0b01000000 в данном случае обязательно, поскольку когда кнопка будет отпущена, состояние входа будет неопределено и получите то что получаете...Задержка delay то-же обязательна - антидребезг...while (!PIND.6) {}; предотвращает перебор при удержании...Это азы, так сказать...

...У меня же такое ощущение, что о контроллерах вы первый раз услышали и приводите предположение, как это должно быть.

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

В посте N6 (и не только...) приведен абсолютно рабочий и предельно простой код, причем тут предположения? Задача простейшая и решение опробывалась много раз...Что не устраивает?

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

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

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

Duhas То что я писал выше, я писал про конкретный случай, а именно про PIND.6 а это как вы сами наверное понимаете не переменная а РЕГИСТР. И ваш пример:

хорошо а как организуете такой вариант сделать что либо есть переменная равна 5-ти ?

Здесь совершенно не уместен!

retcom Вот вы тут нас критикуете :

У меня же такое ощущение, что о контроллерах вы первый раз услышали и приводите предположение, как это должно быть.

А сами то допускаете такие некрасивые оплошности...

Вот например запись n=n+1; правильная, но было бы красивее, если бы вы написали n++;

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

if(!PIND.6){
delay_ms(50);
if(!PIND.6){
n++;
}
}

Я был механик, я есть механик, я буду механик

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

Должно быть PORTD = 0b01000000 в данном случае обязательно

Можно и оставить PORTD=0x00, но тогда надо припаять "подтяжку", т.е. резистор 1к...10к от вывода МК на шину +5

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

Получилось у меня! Спасибо большое! Я урвал из каждого примера-предложения кусочек и скроил вот такую менюшку:

if(PIND.6==0)
{
delay_ms(50);
if(PIND.6==0)
{
delay_ms(50);
n++;
if(n==4)
n=1;
}
else
n=0;
if(n==1)
{
lcd_clear();
delay_ms(300);
lcd_gotoxy(1,0);
lcd_putsf("Clock");
}
else if (n==2)
{
lcd_clear();
delay_ms(300);
lcd_gotoxy(1,0);
lcd_putsf("Temperatura");
}
else if(n==3)
{
lcd_clear();
delay_ms(300);
lcd_gotoxy(1,0);
lcd_putsf("Radiation");
}
delay_ms(50);

}

Одна голова хорошо, а много лучше, не только у дракона, но и у людей.

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

А какая разница мехду if и while ?

Для пояснения приведем нейкий код

это для PIC

.........
for(;;)   //бесконечный цикл
{
  if(input(pin_d6)) //опрос пина д6
  { // выполняем если на пине "1"
  output_bit(pin_a1,1);  //выводим пин1 порта А 
  delay_ms(500); // ждемс 500 мс 
  output_bit(pin_a1,0) // выводим "0" на тот же порт
  delay_ms(500); //ждем полсекунды
 }
output_bit(pin_a2,1); выодим "1" на пин А2 
delay_ms(500); ждем полсекунды
output_bit(pin_a2,0) "гасим" пин А2
delay_ms(500); ждем еще полсекунды
} // вохвращаеся обратно в начало цикла
.........

Итак отличие while от if в том, что данной проге если на пине Д6 есть "1", то будут моргать

как пин А1 так и А2. Если бы в место if поставить while, то в моргал бы только пин А1 (пока на Д6 "1" то то что в схобочках превращаеться в бесконечный цикл, с условие что на Д6 "1")


:huh:

Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz.

ICQ: 288449055

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

То есть при при выполнении кода с while условие не проверяетьса, а выполнение кода с if длитьса пока условие в скобках истина.

Я правильно понял ?

Я был механик, я есть механик, я буду механик

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

...

Одна кнопка к PIND.6 припаяна к '-' - это правильно?

DDRD=0x00

PORTD=0x00

Должно так быть?

Внутренним резистором обязательно подтянуть ногу с кнопкой к +Пит.

PORTD |= (1 << PD6);

Иначе, нога в неопределённом состоянии болтается...

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

Внутренним резистором обязательно подтянуть ногу с кнопкой к +Пит.

PORTD |= (1 << PD6);

Иначе, нога в неопределённом состоянии болтается...

Только этот внутренний резистор (там на самом деле не резистор, а чуть сложнее, но это не важно) довольно большого сопротивления, где-то в районе 100к. Так что в условиях ЭМ помех и если от кнопок до МК длинная дорожка/провод, то лучше подстраховаться и подтянуть внешним резистором.

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

говоря "внутренний резистор" вы имеете в виду подтяжку чтоли ? Сопротивление подтяжки на сколько я помню 4 кОм

Я был механик, я есть механик, я буду механик

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

Ой, не верю! Если честно, то не могу вспомнить видел-ли где в даташитах открытым текстом конкретное сопротивление пул-ап резистора.. Но чисто из практики этой подтяжки иногда не хватает даже при быстром опросе матричной клавиатуры, а уж если рядом что-нить силовое симисторное, то вообще сплошные глюки. Собственно, можно померять, зацепив за ногу переменник на ноль и найти положение 1/2 Vcc. Только под рукой нету сейчас ничего..... Кстати, может вы о PICах говорите?.. - я об AVR.

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

То есть при при выполнении кода с while условие не проверяетьса, а выполнение кода с if длитьса пока условие в скобках истина.

Я правильно понял ?

Если применишь while то условие обязательно будет проверяться, но программа зациклиться на выпонении того что в while(условие){бла-бла-бла} покуда условие равно истине, и не даст выполниению всего что в низу за while(условие){бла-бла-бла}. А если применить if(условие) {бла-бла-бла}, то будет выполняться и "бла-бла-бла" при истином значении условия и то что ниже.

Пишу на Си CCS PICC для PIC, CVAVR для AVR, и иногда IAR для NEC. Особенно привык к SIM300dz.

ICQ: 288449055

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

Немного off...

Только этот внутренний резистор (там на самом деле не резистор, а чуть сложнее, но это не важно) довольно большого сопротивления, где-то в районе 100к.

...

Ничего не сложнее :) Обычный резистор 30...80кОм подключаемый внутрисхемно к шине питания через простейший mosfet транзистор.

...

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

...

Матричную клавиатуру быстро не опрашивают. Нормальный период опроса 15-50ms. С такой скоростью можно интегрирующую цепь на вход клавы вешать. Будет успевать. Так можно и дребезг подавить.

А силовое управление рядом с цифровыми, тем более входными, сигналами не разводят. :)

вывод: внутреннего резистора в конроллерах ATmega (за другие не ручаюсь, надо ДШ смотреть) вполне достаточно для опроса кнопок.

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

Матричную клавиатуру быстро не опрашивают. Нормальный период опроса 15-50ms.

Я имею в виду период между сменой столбца матрицы. Или вы за каждый опрос клавиатуры читаете только один столбец??

Так можно и дребезг подавить.

Ну это само-сабой. Именно так и борюсь с дребезгом.

А силовое управление рядом с цифровыми, тем более входными, сигналами не разводят. :)

Ну я не настолько глуп ;) Пример из практики: Простенький диммерный блок (12 шт. симисторных регуляторов, нагрузка 2...4кВт на канал). Мозги на AT90S2313. От кнопок до МК дорожки около 8см + шлейф 5см. На плате никаких силовых проводников, естессственннно. В домашних условиях все было ОК. Принесли на место, подключили нагрузку - пошли глюки. Поставил внешнюю подтяжку, все заработало как надо.

вывод: внутреннего резистора в конроллерах ATmega (за другие не ручаюсь, надо ДШ смотреть) вполне достаточно для опроса кнопок.

Ну дык я и говорил, что желательно ПОДСТРАХОВАТЬСЯ, хотя в большинстве случаев не обязательно. И просто иметь в виду, когда что-то не так с кнопками...

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

Lexi Спасибо теперь всё ясно. Вот ток ещё один вопрос. Если у нас такой случай

if(условие)

{бла-бла-бла}

тра-тра-тра

Если у нас условие истина, то выполнитьса и бла-бла-бла, и тра-тра-тра правильно ?

А если условие ложь то выполнитьса только тра-тра-тра

Я правильно понял ?

Я был механик, я есть механик, я буду механик

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

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

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

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

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

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

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

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

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

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

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

×
×
  • Создать...