С чего начать программировать микроконтроллеры?

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Аватара пользователя
SeregaT
Генеральный секретарь МЯУ
Сообщения: 18852
Зарегистрирован: Пн сен 03, 2007 18:24:27
Откуда: Россия. Омск.
Контактная информация:

Сообщение SeregaT »

void main(void)
{
unsigned int i=10;
//i=10;
while(1)
{
PORTD.0=1;
delay_us(i);
PORTD.0=0;
};
}

Так?
Аватара пользователя
megasvintus
Вымогатель припоя
Сообщения: 568
Зарегистрирован: Вт мар 04, 2008 20:03:03
Откуда: Нижний Новгород

Сообщение megasvintus »

//i=10; так нельзя, вы закомментировали строку, и она работать не будет


Хех, я обломался. Не хочет он воспринимать переменную в качестве параметров именно этой функции :o Попробую разобраться

delay_us не хочет видеть в параметрах переменную, а вот delay_ms прекрасно работает. СТРАННО
Трудно быть деревянным, совсем трудно....
Аватара пользователя
Pippeytz
Потрогал лапой паяльник
Сообщения: 396
Зарегистрирован: Ср май 28, 2008 19:30:31
Откуда: Донецк
Контактная информация:

Сообщение Pippeytz »

Ы
Не знал что в функцию деали можно вставлять вместо числового значения переменные. Оно конечно одно и тоже, компилятору то пофиг , но я как то так не делал раньше)
Полный пипеутз.
Аватара пользователя
ikarab
Опытный кот
Сообщения: 828
Зарегистрирован: Пн мар 16, 2009 21:40:57
Контактная информация:

Сообщение ikarab »

Советую поситать "Язык Си для микроконтроллеров" - там все разъяснено подробно и с примерами:

Изображение

megasvintus писал(а): СТРАННО

Если хелп не читать - то ДА.
Последний раз редактировалось ikarab Сб апр 11, 2009 12:03:34, всего редактировалось 1 раз.
Аватара пользователя
megasvintus
Вымогатель припоя
Сообщения: 568
Зарегистрирован: Вт мар 04, 2008 20:03:03
Откуда: Нижний Новгород

Сообщение megasvintus »

А если конкретно? Это слишком туманный ответ... Смотрите хелп... все так могут.

Раз вы знаете ответ на этот вопрос - объясните почему функция для задержки в МИКРОсеундах не воспринимает передачу значения через переменную? и вываливает ошибку must be constant expression
Трудно быть деревянным, совсем трудно....
Аватара пользователя
ikarab
Опытный кот
Сообщения: 828
Зарегистрирован: Пн мар 16, 2009 21:40:57
Контактная информация:

Сообщение ikarab »

megasvintus писал(а):А если конкретно? Это слишком туманный ответ...

И что, на картинке тоже туманно написано ?

megasvintus писал(а):Смотрите хелп... все так могут.

И посмотреть все могут - но не смотрят почему то ???

megasvintus писал(а): объясните почему функция для задержки в МИКРОсеундах не воспринимает передачу значения через переменную?

Потому что она так сделана в компиляторе CVAVR и это указано в его документации.

Но можно ведь написать свою процедуру-функцию коротких пауз с переменным числом.
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Сообщение Барсик »

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
Откуда: Нижний Новгород

Сообщение megasvintus »

Точно, проглядел :oops:
Трудно быть деревянным, совсем трудно....
Аватара пользователя
SeregaT
Генеральный секретарь МЯУ
Сообщения: 18852
Зарегистрирован: Пн сен 03, 2007 18:24:27
Откуда: Россия. Омск.
Контактная информация:

Сообщение 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;
};
}


В чём разница?

:shock: Вот блин, что за .....
Если вместо delay_us (i) пишу delay_ms (i) то нормально работает. А почему микросекунды не канают?
Когда пытаюсь сделать микросекунды, то пишет:
Error: constant integral expression required

Про такое я в хелпе не нашёл...
Аватара пользователя
ikarab
Опытный кот
Сообщения: 828
Зарегистрирован: Пн мар 16, 2009 21:40:57
Контактная информация:

Сообщение ikarab »

SeregaT писал(а):В чём разница?

В том что на картинке из "Язык Си для микроконтроллеров" для микросекунд delay_us(N) написано N - "ЧИСЛО" а у вас ПЕРЕМЕННАЯ

Что такое переменная написано там же !!! в "Язык Си для микроконтроллеров".

А для "мили" написано - может быть и число и переменная.

==========
SeregaT писал(а):пишет:
Error: constant integral expression required

Про такое я в хелпе не нашёл...


А в переводчик http://www.translate.ru зайти НИКАК ?????
Изображение

===========
в ХЕЛПе CVAVR вы могли САМИ вот это посмотреть ?

Изображение

И если не ясно спросить, что эта СТРОКА означает ?

Изображение
Последний раз редактировалось ikarab Сб апр 11, 2009 12:05:02, всего редактировалось 1 раз.
Аватара пользователя
SeregaT
Генеральный секретарь МЯУ
Сообщения: 18852
Зарегистрирован: Пн сен 03, 2007 18:24:27
Откуда: Россия. Омск.
Контактная информация:

Сообщение SeregaT »

А что, нельзя было просто указать на ошибку? Зачем надо было разводить флуд на пару страниц?
Аватара пользователя
Pippeytz
Потрогал лапой паяльник
Сообщения: 396
Зарегистрирован: Ср май 28, 2008 19:30:31
Откуда: Донецк
Контактная информация:

Сообщение Pippeytz »

Да просто стиль написаний потсов уже больно знакомый. Очень похож на одного известного спеца по АВРам
Полный пипеутз.
Аватара пользователя
Пухич
Модератор
Сообщения: 4673
Зарегистрирован: Вс июн 01, 2008 00:17:35
Откуда: Я всего лишь плод вашего воображения...

Сообщение Пухич »

Щас всех поругаю! :evil:

Всем: в данном случае Тыч верно заметил - надо было хелп смотреть. Вот у меня хелпа нет. Но у вас-то он есть.

Тычу: снизьте градус ваших поучений, а то может последовать наказание, а вы потом будете возмущаться несправедливостью. Сказали один раз "читайте хелп" и все. Дальше либо помогайте, либо не помогайте.
Знание - сила!
Аватара пользователя
SeregaT
Генеральный секретарь МЯУ
Сообщения: 18852
Зарегистрирован: Пн сен 03, 2007 18:24:27
Откуда: Россия. Омск.
Контактная информация:

Сообщение SeregaT »

Пухич писал(а):Всем: в данном случае Тыч верно заметил - надо было хелп смотреть.

Да, верно. Признаю, я сам виноват. Вот такой вот я невнимательный :oops:
ikarab
Спасибо, что наглядно показали, где и как искать. Попытаюсь разобраться.
Просто я так настойчиво спрашивал потому, что это мне нужно было не для обучения, а для конкретного устройства...
(А прикол в том, что там мне и нужны были миллисекунды. Просто я для проверки взял одну из своих тестовых прог и малость подправил. А в той проге задержка была в микросекундах, которые я исправлять не стал :))) )
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

народ, как грамотно и правильно сделать антидребезг кнопок?
и как с ним работать? в каком месте программы вставлять?
Не умеешь - не берись, но не взявшись не научишься...
Аватара пользователя
SeregaT
Генеральный секретарь МЯУ
Сообщения: 18852
Зарегистрирован: Пн сен 03, 2007 18:24:27
Откуда: Россия. Омск.
Контактная информация:

Сообщение SeregaT »

Я просто задержку ставил несколько миллисекунд (после команды, регистрирующей нажатие кнопки). Вроде помогало.
Может конечно это и не грамотно.
Аватара пользователя
Пухич
Модератор
Сообщения: 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
Знание - сила!
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

можешь пример привести?

так например, что ли?

if (PINA.0) // есди на PINA.0 установлен бит, то...
{
delay_us(10); //
delay_ms(100); // антидребезг
PORTD.0=1; .... //
}
Не умеешь - не берись, но не взявшись не научишься...
Аватара пользователя
SeregaT
Генеральный секретарь МЯУ
Сообщения: 18852
Зарегистрирован: Пн сен 03, 2007 18:24:27
Откуда: Россия. Омск.
Контактная информация:

Сообщение SeregaT »

Я примерно так делал:
if (PINB.1)
{
delay_ms (50);
i=i+10;
while (PINB.1);
};
Аватара пользователя
Пухич
Модератор
Сообщения: 4673
Зарегистрирован: Вс июн 01, 2008 00:17:35
Откуда: Я всего лишь плод вашего воображения...

Сообщение Пухич »

можешь пример привести?


Вы читали мое сообщение?

Я ж там привел код из своего РАБОТАЮЩЕГО проекта. По-моему там все понятно.

if (PINA.0) // есди на PINA.0 установлен бит, то...
{
delay_us(10); //
delay_ms(100); // антидребезг
PORTD.0=1; .... //
}


В приведенном вами примере можно спокойно убрать оба делэя и все будет нормально работать. Тут отсутствует дребезгоподавление.

ЗЫ: вы бы сначала разобрались, что такое дребезг контактов, и чем он опасен конкретно для вашей программы, и опасен ли вообще.
Знание - сила!
Ответить

Вернуться в «Теория»