Jump to content
retcom

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

Recommended Posts

Привет!

МК 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;
}
}

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

Share this post


Link to post
Share on other sites

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

Пишут вот так

if(PIND.6){

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

}

или вот так

if(!PIND.6){

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

}

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


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

Share this post


Link to post
Share on other sites

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

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

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


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

Share this post


Link to post
Share on other sites

Драйверы MOSFET/IGBT Infineon – силой нужно управлять!

Специалисты Infineon усовершенствовали традиционные кремниевые MOSFET и IGBT и выпустили компоненты на базе принципиально иных материалов – нитрида галлия и карбида кремния. Мы создали подборку полезных материалов, чтобы вы разобрались во всех тонкостях и стали экспертом по управлению силовыми приборами нового поколения CoolMOS, CoolGaN, CoolSiC!

Подробнее

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

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

Edited by Lexi

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

Share this post


Link to post
Share on other sites

Снижена цена на DC/DC и AC/DC преобразователи Mornsun в Компэл!

Компэл снизил цены на всю продукцию Mornsun. В ассортименте – как широко известные и популярные позиции, так и новинки. Доступны AC/DC, неизолированные DC/DC-преобразователи или импульсные стабилизаторы (семейство K78/R3), изолированные DC/DC, и новейшее поколение R4.

Подробнее

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

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

if(!PIND.6){

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

}

Goodefine

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


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

Share this post


Link to post
Share on other sites

Новинки гибридных конденсаторов: преимущества технологии

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

Подробнее

Goodefine

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

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


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

Share this post


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

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

if(!PIND.6){

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

}

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

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

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

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

to Goodefine

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


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

Share this post


Link to post
Share on other sites

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

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

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

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

DDRD=0x00

PORTD=0x00

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


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

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

DDRD=0x00

PORTD=0x00

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

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

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

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

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

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

Edited by Goodefine

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

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


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

Share this post


Link to post
Share on other sites
Должно быть PORTD = 0b01000000 в данном случае обязательно

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

Share this post


Link to post
Share on other sites

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

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);

}

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

Share this post


Link to post
Share on other sites
А какая разница мехду 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

Share this post


Link to post
Share on other sites

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

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


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

Share this post


Link to post
Share on other sites
...

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

DDRD=0x00

PORTD=0x00

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

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

PORTD |= (1 << PD6);

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

Share this post


Link to post
Share on other sites
Внутренним резистором обязательно подтянуть ногу с кнопкой к +Пит.

PORTD |= (1 << PD6);

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

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

Share this post


Link to post
Share on other sites

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


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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
То есть при при выполнении кода с while условие не проверяетьса, а выполнение кода с if длитьса пока условие в скобках истина.

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

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


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

ICQ: 288449055

Share this post


Link to post
Share on other sites

Немного off...

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

...

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

...

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

...

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

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

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

Share this post


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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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


Пока в груди моей бьётся мотор, надежда есть на чистый бензин...

Share this post


Link to post
Share on other sites

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

if(условие)

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

тра-тра-тра

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

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

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


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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения


  • Щупы для мультиметра со сменными насадками

  • Similar Content

    • By FOX4204712
      Нужен ключ без фиксации, БП ноутбука напряжение 19.5 Вольт 4.5 А, нужна коммутация через транзистор или тиристор, через кнопку (напольную педаль) чтобы при отпускании кнопки затвор был закрыт, в роли нагрузки ТАТУ машинка, потребляет 3.5А
      Желательно чтобы работало от одного БП. ((обычное реле и кнопка дает сильные просадки))
      Помогите пожалуйста, не могу сообразить.

    • By intercoder
      Добрый день. Есть вот такой прибор - выключатель XLR микрофона. Нажимаешь кнопку - звук идёт, ещё раз нажимаешь - перестаёт. Есть 2 проблемы.
      1. Кнопка щёлкает очень громко и этот звук попадает на запись
      2. Нажимать не очень удобно, она тугая, маленькая а переключать приходится очень часто
      Я хочу поменять кнопку на тумблер (рычажок), чтобы легко переключать, проводя ладонью над лежащим на столе прибором. Важно чтобы у него был как можно более мягкий и тихий (бесшумный) ход. Сходил в наш местный радиомагазин, поглядел тумблеры - они все тугие и щелкают достаточно громко. Подскажите, пожалуйста, модель тихого тумблера на 2 контактные группы.
       

    • By дезигнер
      Наша компания осуществляет полный комплекс услуг, связанных с подготовкой пластмассового изделия к серийному производству, начиная от эскизного проекта, разработки конструкции, изготовления прототипа, мелкосерийного литья в формообразующих вставках и заканчивая крупносерийным литьем на полноценных пресс-формах.
      Наша компания осуществляет мелкосерийное и крупносерийное литье изделий из пластмасс в формообразующих вставках, устанавливаемых в блок.Данная технология позволяет изготавливать не дорогостоящую пресс-форму целиком, а только формообразующую вставку под размер одного из наших блоков (доступные габариты изделия – до 100х200 мм), что обеспечит существенное снижение затрат времени и средств на изготовление серии деталей из пластмассы.
      Материалы: АБС, ТЭП, полистирол, полиэтилен, полиацеталь.
       
      http://blokforma.ru
      info@blokforma.ru
       

       
       
    • By mal333
      Всем привет.
      Есть задачка на 2 пина контроллера посадить 4 кнопки и распознавать их состояние, а так же состояние "ни одна не нажата". Есть схемы подключения их в матрицу R2R и последующее аналоговое измерение, но я почему-то думаю, что можно считывать и чисто цифровым методом. Пораскинув мозгами, получилась эта схема.В ней опрос будет такой- сначала читаем состояние выводов, потом переключаем пины попеременно в 1 и смотрим состояние другого вывода. Может есть схемы проще, но вот что-то не нашел.

    • Guest Сергей
      By Guest Сергей
      Добрый день. Обращаюсь с просьбой помочь определить название кнопки левой и правой кнопки компьютерной мыши Microsoft Arc Mouse. Мышка очень понравилась, уже 10 лет пользуюсь. Но есть большая проблема - через некоторое время начинает плохо срабатывать левая кнопка мыши (срабатывает через раз или нужно сильнее нажимать). Мне приходится разбирать мышь и кнопку, протирать там всё спиртом, хватает примерно на месяц. Даже уже менял с правой кнопкой. В общем решил заказать на алиэкспрессе эти кнопки, но по тем комплектам кнопок, которые там продаются, нужных мне нет. А по названию кнопки искать не могу, т.к. его я не знаю.
      На фото кнопка в собранном и разобранном виде. Может кто узнает её.



×
×
  • Create New...