С чего начать программировать микроконтроллеры?
- megasvintus
- Вымогатель припоя
- Сообщения: 568
- Зарегистрирован: Вт мар 04, 2008 20:03:03
- Откуда: Нижний Новгород
//i=10; так нельзя, вы закомментировали строку, и она работать не будет
Хех, я обломался. Не хочет он воспринимать переменную в качестве параметров именно этой функции
Попробую разобраться
delay_us не хочет видеть в параметрах переменную, а вот delay_ms прекрасно работает. СТРАННО
Хех, я обломался. Не хочет он воспринимать переменную в качестве параметров именно этой функции
delay_us не хочет видеть в параметрах переменную, а вот delay_ms прекрасно работает. СТРАННО
Трудно быть деревянным, совсем трудно....
Советую поситать "Язык Си для микроконтроллеров" - там все разъяснено подробно и с примерами:
Если хелп не читать - то ДА.
megasvintus писал(а): СТРАННО
Если хелп не читать - то ДА.
Последний раз редактировалось ikarab Сб апр 11, 2009 12:03:34, всего редактировалось 1 раз.
- megasvintus
- Вымогатель припоя
- Сообщения: 568
- Зарегистрирован: Вт мар 04, 2008 20:03:03
- Откуда: Нижний Новгород
А если конкретно? Это слишком туманный ответ... Смотрите хелп... все так могут.
Раз вы знаете ответ на этот вопрос - объясните почему функция для задержки в МИКРОсеундах не воспринимает передачу значения через переменную? и вываливает ошибку must be constant expression
Раз вы знаете ответ на этот вопрос - объясните почему функция для задержки в МИКРОсеундах не воспринимает передачу значения через переменную? и вываливает ошибку must be constant expression
Трудно быть деревянным, совсем трудно....
megasvintus писал(а):А если конкретно? Это слишком туманный ответ...
И что, на картинке тоже туманно написано ?
megasvintus писал(а):Смотрите хелп... все так могут.
И посмотреть все могут - но не смотрят почему то ???
megasvintus писал(а): объясните почему функция для задержки в МИКРОсеундах не воспринимает передачу значения через переменную?
Потому что она так сделана в компиляторе CVAVR и это указано в его документации.
Но можно ведь написать свою процедуру-функцию коротких пауз с переменным числом.
SeregaT писал(а):Error: must declare first in block?
Что там надо еще объявить?
А это значит, что нефиг объявлять переменную где-то внутри цикла while... Надо было объявить её до того.
Я уже где-то раньше писал для Вас, что не надо объявлять массив внутри цикла. Это те же грабли. А вот эта порнография внутри цикла:
void delay_us(unsigned int i);
Это есть объявление функции, а не её вызов. Поймите разницу. Объявление функции это способ сообщить компилятору, какую фигню он должен вставлять в программу, когда в программе видит вызов этой функции. Чтобы компилятор знал, что вставлять, достаточно объявить функцию всего один раз где-то в начале текста программы.
Короче, в присоединённом файле рабочая в железе программа для ATtiny13 (Извеняйте, меги у меня нема, проверить не на чем)
- Вложения
-
- delay.c
- (674 байт) 388 скачиваний
- megasvintus
- Вымогатель припоя
- Сообщения: 568
- Зарегистрирован: Вт мар 04, 2008 20:03:03
- Откуда: Нижний Новгород
- SeregaT
- Генеральный секретарь МЯУ
- Сообщения: 18852
- Зарегистрирован: Пн сен 03, 2007 18:24:27
- Откуда: Россия. Омск.
- Контактная информация:
Барсик
Про тот кусок кода (про который пишете Вы) можно уже забыть, его проехали. Это уже была просто бесполезная попытка, когда ничего не помогает
И до него и после я писал так, как и должно быть.
Нет, чтобы просто ответить на вопрос... Хелп - он на английском, а в книге ответ именно на этот вопрос еще отыскать надо.
Найдите 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) то нормально работает. А почему микросекунды не канают?
Когда пытаюсь сделать микросекунды, то пишет:
Про такое я в хелпе не нашёл...
Про тот кусок кода (про который пишете Вы) можно уже забыть, его проехали. Это уже была просто бесполезная попытка, когда ничего не помогает
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
Про такое я в хелпе не нашёл...
SeregaT писал(а):В чём разница?
В том что на картинке из "Язык Си для микроконтроллеров" для микросекунд delay_us(N) написано N - "ЧИСЛО" а у вас ПЕРЕМЕННАЯ
Что такое переменная написано там же !!! в "Язык Си для микроконтроллеров".
А для "мили" написано - может быть и число и переменная.
==========
SeregaT писал(а):пишет:Error: constant integral expression required
Про такое я в хелпе не нашёл...
А в переводчик http://www.translate.ru зайти НИКАК ?????
===========
в ХЕЛПе CVAVR вы могли САМИ вот это посмотреть ?
И если не ясно спросить, что эта СТРОКА означает ?

Последний раз редактировалось ikarab Сб апр 11, 2009 12:05:02, всего редактировалось 1 раз.
- Пухич
- Модератор
- Сообщения: 4673
- Зарегистрирован: Вс июн 01, 2008 00:17:35
- Откуда: Я всего лишь плод вашего воображения...
Щас всех поругаю!
Всем: в данном случае Тыч верно заметил - надо было хелп смотреть. Вот у меня хелпа нет. Но у вас-то он есть.
Тычу: снизьте градус ваших поучений, а то может последовать наказание, а вы потом будете возмущаться несправедливостью. Сказали один раз "читайте хелп" и все. Дальше либо помогайте, либо не помогайте.
Всем: в данном случае Тыч верно заметил - надо было хелп смотреть. Вот у меня хелпа нет. Но у вас-то он есть.
Тычу: снизьте градус ваших поучений, а то может последовать наказание, а вы потом будете возмущаться несправедливостью. Сказали один раз "читайте хелп" и все. Дальше либо помогайте, либо не помогайте.
Знание - сила!
- SeregaT
- Генеральный секретарь МЯУ
- Сообщения: 18852
- Зарегистрирован: Пн сен 03, 2007 18:24:27
- Откуда: Россия. Омск.
- Контактная информация:
Пухич писал(а):Всем: в данном случае Тыч верно заметил - надо было хелп смотреть.
Да, верно. Признаю, я сам виноват. Вот такой вот я невнимательный
ikarab
Спасибо, что наглядно показали, где и как искать. Попытаюсь разобраться.
Просто я так настойчиво спрашивал потому, что это мне нужно было не для обучения, а для конкретного устройства...
(А прикол в том, что там мне и нужны были миллисекунды. Просто я для проверки взял одну из своих тестовых прог и малость подправил. А в той проге задержка была в микросекундах, которые я исправлять не стал
- Пухич
- Модератор
- Сообщения: 4673
- Зарегистрирован: Вс июн 01, 2008 00:17:35
- Откуда: Я всего лишь плод вашего воображения...
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
Знание - сила!
- Пухич
- Модератор
- Сообщения: 4673
- Зарегистрирован: Вс июн 01, 2008 00:17:35
- Откуда: Я всего лишь плод вашего воображения...
можешь пример привести?
Вы читали мое сообщение?
Я ж там привел код из своего РАБОТАЮЩЕГО проекта. По-моему там все понятно.
if (PINA.0) // есди на PINA.0 установлен бит, то...
{
delay_us(10); //
delay_ms(100); // антидребезг
PORTD.0=1; .... //
}
В приведенном вами примере можно спокойно убрать оба делэя и все будет нормально работать. Тут отсутствует дребезгоподавление.
ЗЫ: вы бы сначала разобрались, что такое дребезг контактов, и чем он опасен конкретно для вашей программы, и опасен ли вообще.
Знание - сила!