Страница 42 из 115

Добавлено: Сб апр 11, 2009 20:50:43
SeregaT
Пухич писал(а):Я ж там привел код из своего РАБОТАЮЩЕГО проекта. По-моему там все понятно.

Он C учит, а не ассемблер :)

Добавлено: Сб апр 11, 2009 21:23:58
Пухич
SeregaT писал(а):
Пухич писал(а):Я ж там привел код из своего РАБОТАЮЩЕГО проекта. По-моему там все понятно.

Он C учит, а не ассемблер :)


Тогда чуть выше можно прочитать описание работы. Все станет ясно. :)

Добавлено: Сб апр 11, 2009 21:33:02
Arlleex
вот например код:

if (PINB.0)
{
delay_ms(50); //
while (PINB.0)
{некоторый код}
}

...
:oops:
мы должны нажать кнопку с быстротой в 50 или более миллисекунд, что бы сработал некоторый код?

Добавлено: Сб апр 11, 2009 22:40:49
Пухич
Этот код делает такое: как только нажали кнопку он ждет 50 мс, а затем код выполняется до тех пор, пока нажата кнопка. Вы этого хотели?

Добавлено: Сб апр 11, 2009 22:42:26
ikarab
Stalker46 писал(а):мы должны нажать кнопку с быстротой в 50 или более миллисекунд, что бы сработал некоторый код?


А вы справа от кода напишите комментари КОТОРЫЕ ОБЯЗАТЕЛЬНЫ ДЛЯ УЧЕНИКА и все прояснится наверняка.

Добавлено: Сб апр 11, 2009 22:43:16
Arlleex
net...
что то не понял я про дребезг...

Добавлено: Сб апр 11, 2009 23:00:50
Пухич
Stalker46 писал(а):net...
что то не понял я про дребезг...


А что конкретно не ясно?

Добавлено: Сб апр 11, 2009 23:02:58
Arlleex
ну я же сделал так же как и SeregaT!

Добавлено: Сб апр 11, 2009 23:05:58
Пухич
Stalker46 писал(а):ну я же сделал так же как и SeregaT!


А вот не совсем так. Найдите как минимум одно отличие. :)

Добавлено: Вс апр 12, 2009 01:10:51
Arlleex
переменная i. кстати - грамматическая ошибка: после операторов ; не ставиться...

Добавлено: Вс апр 12, 2009 07:52:49
SeregaT
Stalker46
Я думаю Вам надо так:

if (PINB.0) // Проверяем наличие лог 1. (Если нужен лог 0, пишем: if (!PINB.0);)
{
delay_ms (20); // Пауза (антидребезг)
if (PINB.0) // Проверяем, нажата ли кнопка
{
некоторый код; // Исполняемый при нажатии кнопки код
while (PINB.0); // Ждём, когда кнопка будет отпущена
}
}

Добавлено: Вс апр 12, 2009 10:05:48
ikarab
SeregaT писал(а):if (PINB.0) // Ждём лог 1.

Есть небольшая страничка на руском языке - называется "язык Си для микроконтроллеров" - советую неспеша, думая прочитать от начала и до конца.
http://radiokot.ru/forum/viewtopic.php?p=197255#197255
Многое прояснится.

Добавлено: Вс апр 12, 2009 12:11:28
ikarab
SeregaT писал(а):А что я опять не так написал?

То, что в цитате я указал.

SeregaT писал(а):я не нашёл по приведённой ссылке этой книги "язык Си для микроконтроллеров"...

Как можно найти книгу где сказано НЕБОЛЬШАЯ СТРАНИЧКА ? Вы когда нибудт начнете читать ВНИМАТЕЛЬНО и понимать написаное по-русски ???

Изображение

Добавлено: Вс апр 12, 2009 12:15:52
SeregaT
ikarab
Тот код, который я написал,работает нормально.
Я не пойму, на что Вы намекаете? Нужно было использовать еще и else ? Можно-же сказать прямо, что не так...
Или Вы пишете про то, что я написал "Ждём лог 1" вместо того, чтобы написать "Если лог 1"? Но от этого код не станет работать по другому :)

Добавлено: Вс апр 12, 2009 12:17:45
Arlleex
вот как правильно:

If (PINA.0==1) {
delay_ms(50);
If (PINA.0==1) {
// код, который должен выполняться при нажатии кнопки
}
}

Добавлено: Вс апр 12, 2009 12:21:56
SeregaT
Stalker46
А если кнопку вовремя не отпустить, то этот код выполнится еще раз (а может и не раз, зависит от длительности выполнения дальнейшего кода).

Добавлено: Вс апр 12, 2009 12:54:52
ikarab
SeregaT писал(а):Или Вы пишете про то, что я написал "Ждём лог 1" вместо того, чтобы написать "Если лог 1"?

А по цитате этого не видно ?

if - не ждет , он проверяет и идет дальше.

SeregaT писал(а): Но от этого код не станет работать по другому :)

Дак напишите другой - который будет работаь. который ЖДЕТ. там же написан в "язык Си для микроконтроллеров".

Добавлено: Вс апр 12, 2009 13:06:58
SeregaT
ikarab
Дак и не надо чтобы он ЖДАЛ. Если единицы нет, код выполняется дальше. Если единица, то выполняется тот код, что идёт после if (PINB.0);. Это просто в комментариях я имел ввиду то, что именно эта строчка ждёт лог 1, чтобы выполнить нижеследующий код.
Дак напишите другой - который будет работаь. который ЖДЕТ. там же написан в "язык Си для микроконтроллеров".

А этот код написан в конце (моего кода) :) И он работает...

Добавлено: Вс апр 12, 2009 13:22:32
ikarab
SeregaT писал(а):ikarab
Дак и не надо чтобы он ЖДАЛ. Если единицы нет, код выполняется дальше. Если единица, то выполняется тот код, что идёт после if (PINB.0);. Это просто в комментариях я имел ввиду то


дак вы не "имейте ввиду" - выж не для телепатов постите - а пишите - ПРОВЕРЯЕТ бит

Добавлено: Вс апр 12, 2009 17:26:12
megasvintus
Можно сделать так:

unsigned char flag1;
unsigned char flag2;

if ((PINB.0==0)&&(flag2==1)) { //1 если нажали кнопку и это первое срабатывание, то:
delay_us(200); //ждем 200 МКс, подавляем дребезг
if ( PINB.0==0) {flag1=1;}; если это была не случайная помеха, и все еще держат кнопку- ставим флаг срабатывания кнопки
<Как-то реагируем на нажатие кнопки>
flag2=0; //изменили значение флага, чтобы пока держим кнопку, снова не зайти в этот цикл и не выполнить повторно действие
}//1

Таким образом МК делает остальную программу раз за разом, не трятя такты на ожидание, пока вы отпустите кнопку, а лишь раз за круг проверяет не отпустили ли вы ее. Это первый шаг к "многозадачности" вашей программки

//Теперь ждем отпускания кнопки

if ((PINB.0==1)&&(flag2==0)&&(flag1==1)) {flag2=1; flag1=0;} // Если отреагировали на нажатие кнопки и ее уже отпустили, то снова ставим флаг- кнопка свободна