Страница 41 из 115
Добавлено: Пт апр 10, 2009 20:52:07
SeregaT
void main(void)
{
unsigned int i=10;
//i=10;
while(1)
{
PORTD.0=1;
delay_us(i);
PORTD.0=0;
};
}
Так?
Добавлено: Пт апр 10, 2009 20:56:10
megasvintus
//i=10; так нельзя, вы закомментировали строку, и она работать не будет
Хех, я обломался. Не хочет он воспринимать переменную в качестве параметров именно этой функции

Попробую разобраться
delay_us не хочет видеть в параметрах переменную, а вот delay_ms прекрасно работает. СТРАННО
Добавлено: Пт апр 10, 2009 21:08:24
Pippeytz
Ы
Не знал что в функцию деали можно вставлять вместо числового значения переменные. Оно конечно одно и тоже, компилятору то пофиг , но я как то так не делал раньше)
Добавлено: Пт апр 10, 2009 21:11:47
ikarab
Советую поситать "Язык Си для микроконтроллеров" - там все разъяснено подробно и с примерами:
megasvintus писал(а): СТРАННО
Если хелп не читать - то ДА.
Добавлено: Пт апр 10, 2009 22:14:48
megasvintus
А если конкретно? Это слишком туманный ответ... Смотрите хелп... все так могут.
Раз вы знаете ответ на этот вопрос - объясните почему функция для задержки в МИКРОсеундах не воспринимает передачу значения через переменную? и вываливает ошибку must be constant expression
Добавлено: Пт апр 10, 2009 22:41:45
ikarab
megasvintus писал(а):А если конкретно? Это слишком туманный ответ...
И что, на картинке тоже туманно написано ?
megasvintus писал(а):Смотрите хелп... все так могут.
И посмотреть все могут - но не смотрят почему то ???
megasvintus писал(а): объясните почему функция для задержки в МИКРОсеундах не воспринимает передачу значения через переменную?
Потому что она так сделана в компиляторе CVAVR и это указано в его документации.
Но можно ведь написать свою процедуру-функцию коротких пауз с переменным числом.
Добавлено: Пт апр 10, 2009 22:44:50
Барсик
SeregaT писал(а):Error: must declare first in block?
Что там надо еще объявить?
А это значит, что нефиг объявлять переменную где-то внутри цикла while... Надо было объявить её до того.
Я уже где-то раньше писал для Вас, что не надо объявлять массив внутри цикла. Это те же грабли. А вот эта порнография внутри цикла:
void delay_us(unsigned int i);
Это есть объявление функции, а не её вызов. Поймите разницу. Объявление функции это способ сообщить компилятору, какую фигню он должен вставлять в программу, когда в программе видит вызов этой функции. Чтобы компилятор знал, что вставлять, достаточно объявить функцию всего один раз где-то в начале текста программы.
Короче, в присоединённом файле рабочая в железе программа для ATtiny13 (Извеняйте, меги у меня нема, проверить не на чем)
Добавлено: Пт апр 10, 2009 22:54:01
megasvintus
Точно, проглядел

Добавлено: Сб апр 11, 2009 07:41:31
SeregaT
Барсик
Про тот кусок кода (про который пишете Вы) можно уже забыть, его проехали. Это уже была просто бесполезная попытка, когда ничего не помогает

И до него и после я писал так, как и должно быть.
ikarab писал(а):Нет чтоб "Язык Си для микроконтроллеров" почитать ...
Нет, чтобы просто ответить на вопрос... Хелп - он на английском, а в книге ответ именно на этот вопрос еще отыскать надо.
ikarab писал(а):И что, на картинке тоже туманно написано ?
Найдите 10 отличий между тем, что написал я и тем, что на картинке.
На картинке:
delay_us (n); // Сделать паузу N (чисто) микросекунд
delay_ms (x); /* Сделать паузу X милисекунд
x - может быть переменная или число
от 0 до 65535 (тип unsigned int)
Например: delay_ms (peremennaya); */
А вот писал я:
void main(void)
{
unsigned int i;
i=10;
while(1)
{
PORTD.0=1;
delay_us(i);
PORTD.0=0;
};
}
В чём разница?

Вот блин, что за .....
Если вместо
delay_us (i) пишу
delay_ms (i) то нормально работает. А почему микросекунды не канают?
Когда пытаюсь сделать микросекунды, то пишет:
Error: constant integral expression required
Про такое я в хелпе не нашёл...
Добавлено: Сб апр 11, 2009 08:44:18
ikarab
SeregaT писал(а):В чём разница?
В том что на картинке из "Язык Си для микроконтроллеров" для микросекунд delay_us(N) написано N - "ЧИСЛО" а у вас ПЕРЕМЕННАЯ
Что такое переменная написано там же !!! в "Язык Си для микроконтроллеров".
А для "мили" написано - может быть
и число и переменная.
==========
SeregaT писал(а):пишет:
Error: constant integral expression required
Про такое я в хелпе не нашёл...
А в переводчик
http://www.translate.ru зайти НИКАК ?????
===========
в ХЕЛПе CVAVR вы могли САМИ вот это посмотреть ?
И если не ясно спросить, что эта СТРОКА означает ?

Добавлено: Сб апр 11, 2009 09:24:37
SeregaT
А что, нельзя было просто указать на ошибку? Зачем надо было разводить флуд на пару страниц?
Добавлено: Сб апр 11, 2009 10:20:18
Pippeytz
Да просто стиль написаний потсов уже больно знакомый. Очень похож на одного известного спеца по АВРам
Добавлено: Сб апр 11, 2009 10:59:06
Пухич
Щас всех поругаю!
Всем: в данном случае Тыч верно заметил - надо было хелп смотреть. Вот у меня хелпа нет. Но у вас-то он есть.
Тычу: снизьте градус ваших поучений, а то может последовать наказание, а вы потом будете возмущаться несправедливостью. Сказали один раз "читайте хелп" и все. Дальше либо помогайте, либо не помогайте.
Добавлено: Сб апр 11, 2009 11:51:26
SeregaT
Пухич писал(а):
Всем: в данном случае Тыч верно заметил - надо было хелп смотреть.
Да, верно. Признаю, я сам виноват. Вот такой вот я невнимательный
ikarab
Спасибо, что наглядно показали, где и как искать. Попытаюсь разобраться.
Просто я так настойчиво спрашивал потому, что это мне нужно было не для обучения, а для конкретного устройства...
(А прикол в том, что там мне и нужны были миллисекунды. Просто я для проверки взял одну из своих тестовых прог и малость подправил. А в той проге задержка была в микросекундах, которые я исправлять не стал

)
Добавлено: Сб апр 11, 2009 19:50:22
Arlleex
народ, как грамотно и правильно сделать антидребезг кнопок?
и как с ним работать? в каком месте программы вставлять?
Добавлено: Сб апр 11, 2009 19:58:43
SeregaT
Я просто задержку ставил несколько миллисекунд (после команды, регистрирующей нажатие кнопки). Вроде помогало.
Может конечно это и не грамотно.
Добавлено: Сб апр 11, 2009 20:04:43
Пухич
Stalker46 писал(а):народ, как грамотно и правильно сделать антидребезг кнопок?
и как с ним работать? в каком месте программы вставлять?
Вставлять его надо там, где вы проверяете нажатость кнопки.
Сделать его можно так - проверяете нажатие кнопки, например, по приходу нуля на контакт (если кнопень промеж нуля и земли). Как только он пришел, ставите задержку, например, на 50 мс. Если через 50 мс там уже не ноль, то снова переходите на ожидание нуля. Если же там и через 50 мс ноль, то ждете теперь единицы (т.е. отжатия кнопки). Отжатие ждете по той же схеме. Задержки могут быть и иные, не 50 мс.
Вот из рабочего проекта:
red: wdr
sbic PINC,PINC_filter_confirm
rjmp red
rcall delay_50ms
sbic PINC,PINC_filter_confirm
rjmp red
red_1: wdr
sbis PINC,PINC_filter_confirm
rjmp red_1
rcall delay_50ms
sbis PINC,PINC_filter_confirm
rjmp red_1
Добавлено: Сб апр 11, 2009 20:07:52
Arlleex
можешь пример привести?
так например, что ли?
if (PINA.0) // есди на PINA.0 установлен бит, то...
{
delay_us(10); //
delay_ms(100); // антидребезг
PORTD.0=1; .... //
}
Добавлено: Сб апр 11, 2009 20:42:07
SeregaT
Я примерно так делал:
if (PINB.1)
{
delay_ms (50);
i=i+10;
while (PINB.1);
};
Добавлено: Сб апр 11, 2009 20:47:21
Пухич
можешь пример привести?
Вы читали мое сообщение?
Я ж там привел код из своего РАБОТАЮЩЕГО проекта. По-моему там все понятно.
if (PINA.0) // есди на PINA.0 установлен бит, то...
{
delay_us(10); //
delay_ms(100); // антидребезг
PORTD.0=1; .... //
}
В приведенном вами примере можно спокойно убрать оба делэя и все будет нормально работать. Тут отсутствует дребезгоподавление.
ЗЫ: вы бы сначала разобрались, что такое дребезг контактов, и чем он опасен конкретно для вашей программы, и опасен ли вообще.