Перейти к содержанию

Вопросы от начинающих по МК


Рекомендуемые сообщения

  • Ответов 8,9т
  • Создана
  • Последний ответ

Топ авторов темы

6 часов назад, yaroslav.s сказал:

while(OCR1A=0) OCR1A=OCR1A-5

Работать не будет, поскольку присваивание OCR1A нулевого значения не позволит циклу выполниться ни разу. 

Я вообще фигею: прерывание по таймеру - это уже аналог цикла с задержкой! Какие там еще задержки и циклы внутри обработчика?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

59 минут назад, Дмитрий Вас сказал:

а если бы я

логические операторы  не могут ничего присваивать.

==   <=  >=  >   <   ||  &&

они возвращают логическое значение (true/false)  для условий.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

@my504 только что об этом прочитал, ахах всегда так, задаю вопрос и тут же нахожу ответ. а вот это

59 минут назад, Дмитрий Вас сказал:

а если бы я написал так OCR1A<200 то это присваение значения? какое тогда значение? все что меньше 200?

так и не нашел разьяснения

Ссылка на комментарий
Поделиться на другие сайты

Выражение вида 

OCR1A<200;

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

Выражение вида

OCR1A = OCR1A<200;

присвоит результат логической операции переменной OCR1A.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

12 минут назад, Дмитрий Вас сказал:

так и не нашел разьяснения

Объясняю: язык Си позволяет присваивать значения переменным в самых неожиданных местах, и для него все это полностью корректно. Например, можно (можно - не значит нужно) написать так:

int a,aa,aaa;

aaa = (a = 2) * (aa=12) + (aaa = 32);

и это будет правиьно воспринято компилятором: он присвоит начальные значения переменным и вычислит результат выражения над ними одновременно. Поэтому вполне корректной будет запись цикла, как у вас:

while(aaa = 24){
  // если здесь aaa никогда не обнуляется, цикл будет вечным
}

while(aaa = 0){
  // а этот цикл никогда ни одного раза не отработает, зато присвоит aaa нулевое значение
}

Условие продолжения любого цикла - ненулевое значение выражения, а само выражение может быть любым, с любыми знаками: оно будет вычислено, и, если значение будет ненулевым - цикл продолжит работу, в противном случае остановится.

Так понятно? Это азы Си, прописанные в любой книжке по языку.

Вы совершили классическую ошибку начинающего, перепутав оператор = с оператором ==

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

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, ARV сказал:

Так понятно?

я это и так понимал, но не пойму почему 

 

12 минут назад, my504 сказал:

OCR1A<200;

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

когда 

 

цикд.jpg

Ссылка на комментарий
Поделиться на другие сайты

Только что, Дмитрий Вас сказал:

когда 

А где в вашем коде есть обсуждаемое выражение?

Условие под if не изменяет тестируемую переменную.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Выражение OCR1A < 200 абсолютно корректно и ничего не вызовет. Если будет написано так:

OCR1A < 200;

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

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

стоп

5 минут назад, my504 сказал:

Условие под if не изменяет тестируемую переменную.

if(button==1)
    {
    if(f_button==0)
        {
        f_button=1;
        while(OCR1A<=200)OCR1A=OCR1A+5//ка не меняет разве эта сторка не увеличивает OCR1A???
      if(f_button==1)
          {
          f_button=0;
          while(OCR1A=0) OCR1A=OCR1A-5
          }
    }

коментарий в коде

Изменено пользователем Дмитрий Вас
Ссылка на комментарий
Поделиться на другие сайты

5 минут назад, Дмитрий Вас сказал:

комментарий в коде

while(OCR1A<=200)   OCR1A=OCR1A+5;

OCR1A<=200 ничего не меняет, а возвращает логическое значение для while. Значение меняется в выражении OCR1A=OCR1A+5;

Может вам будет понятнее писать в две строки или вообще с фигурными скобками?

while(OCR1A<=200)   {OCR1A=OCR1A+5;}

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Нет, такая запись вызовет ошибку из за отсутствия точки с запятой после выражения.

ЗЫ. Если оставить в покое точку с запятой, данное выражение означает, что  выражение OCR1A=OCR1A-5 будет выполняться пока OCR1A равно нулю. Проверяется условие -> принимается решение о выполнении выражения.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Только что, my504 сказал:

точки с запятой

эт ясное дело... 

while(OCR1A) {OCR1A=OCR1A-5;}// получается так можно записать?

 

цикл.jpg

Например, while (i) – более краткий вариант while (i != 0):

Ссылка на комментарий
Поделиться на другие сайты

Стесняюсь спросить - а мы про Си сейчас говорим?

Что это за let? Или у вас такой тип определен?

1 минуту назад, Дмитрий Вас сказал:

while(OCR1A) {OCR1A=OCR1A-5;}// получается так можно записать?

 

Естественно можно. Но цикл может стать бесконечным из за некратности начального значения пятерке.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

@ARV  в таком случае если я напишу такой код в ISR?

if(button==1) { if(f_button==0) { f_button=1; while(OCR1A<=200)OCR1A=OCR1A+5//ка не меняет разве эта сторка не увеличивает OCR1A??? if(f_button==1) { f_button=0; while(OCR1A=0) OCR1A=OCR1A-5 } }

if(button==1)
    {
    if(f_button==0)
        {
        f_button=1;
        while(OCR1A<200) 
        {OCR1A=OCR1A+5;}
      if(f_button==1)
          {
          f_button=0;
          while(OCR1A) 
          {OCR1A=OCR1A-5;}
          }
    }

 

скрин.jpg

2 минуты назад, my504 сказал:

Что это за let?

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

14 минут назад, my504 сказал:

OCR1A<=200 ничего не меняет, а возвращает логическое значение для while

вот этому обьяснения я не находил, выходит логическое <= ВОЗВРАЩАЕТ значение? а  <   задает? 

Ссылка на комментарий
Поделиться на другие сайты

Только что, Дмитрий Вас сказал:

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

let будет иметь смысл только если ранее есть:

typedef   char   let;

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

10 минут назад, Дмитрий Вас сказал:
25 минут назад, my504 сказал:

OCR1A<=200 ничего не меняет, а возвращает логическое значение для while

вот этому обьяснения я не находил, выходит логическое <= ВОЗВРАЩАЕТ значение? а  <   задает? 

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

4 минуты назад, my504 сказал:

let будет иметь смысл

до этого мне далеко еще

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, Дмитрий Вас сказал:

в таком случае если я напишу такой код в ISR?

Я догадываюсь, что вы хотите по нажатию кнопки плавно уменьшить значение OCR1A, чтобы что-то там у вас плавно изменило яркость или нечто подобное - так?

Теперь смотрите, каков должен быть алгоритм. "Плавно изменять" означает буквально "каждые N миллисекунд уменшать OCR1A на величину X, пока OCR1A не станет равно нулю". Нельзя уменьшать OCR1A в цикле while(OCR1A) OCR1A--; потому что цикл этот не завершится, пока не обнулится OCR1А, а произойдет это очень быстро, буквально за несколько милисекунд - вы не заметите никакой "плавности".

Поэтому ваш алгоритм (код) не будет выполнять нужую функцию, куда бы вы его не поместили.

Прерывание по таймеру, возникающее каждые N миллисекунд - это уже аналог цикла с нужной скоростью! Поэтому достаточно сделать так: в главном цикле проверить нажатие кнопки, и, если она нажата, установить флаг. В обработчике прерывания смотреть на этот флаг, и, если он установлен, проверять OCR1А на равенство нулю, после чего, если оно нулю не равно, уменьшать его. То есть как-то так:

volatile uint8_t flag; // это будет флаг плавного уменьшения

ISR(TIMER1_OVF_vect){ // это обработчик прерывания по переполнению таймера, вызываемый, допустим, каждые 10 мс, т.е. 100 раз в секунду
  if(flag){ // когда стоит флаг
    if(OCR1A) OCR1A--; // если OCR1A не нулевое, то уменьшаем его
  	else flag = 0; // а если уже обнулилось - снимаем флаг
  }
}

// где-то в главном цикле вы проверяете кнопку и устанавливаете флаг:
if((PIND & (1<<BD5)) == 0) flag = 1;

Я исходил из предпосылки, кто кнопка при нажатии замыкает пин МК на общий.

3 часа назад, Дмитрий Вас сказал:

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

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

Кстати, если вам понадобится по значению другой кнопки плавно увеличивать яркость, то можно в качестве флага использовать новое значение OCR1A. То есть в побработчике прерыания проверять, равно ли текущее значение OCR1A заданному новому, и, если не равно, изменять OCR1A так, чтобы оно приближалось к заданному. Т.е примерно так:

volatile uint16_t new_ocr;

ISR(TIMER1_OVF_vect){
  int8_t delta = 0;
  if(OCR1A < new_ocr) delta = 1;
  if(OCR1A > new_ocr) delta = -1;
  OCR1A += delta;
}

// контроль кнопки делаем макросом
#define pressed_button(x) ((PIND & (1<<(x))) == 0)

// где-то в главном цикле анализируете кнопки
if(pressed_button(PD5)) new_ocr = 0x01FF; // максимум яркости
else if(pressed_button(PD4)) new_ocr = 0; // минимум яркости

 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

23 минуты назад, ARV сказал:

Задает значение левому операнду только оператор =, остальные операторы только возвращают значение

Это похоже на издевательство над совершенно дезориентированным человеком @Дмитрий Вас, он даже не понимает различий между языками программирования, а вы ему советы по азам одного из языков даете, как будто чтобы понаблюдать как он вывернет это новое ЗНАНИЕ себе вовред.

Надо ему посоветовать консольное приложение на С с циклами и вычислениями-сравнениями на компьютере написать сначала, а потом в микроконтроллеры лезть, если желание не пропадет.

Изменено пользователем ruhi
дополнил

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

16 минут назад, ruhi сказал:

Это похоже на издевательство над совершенно дезориентированным человеком

Не пойму, в чем вы видите издевательство: я предельно просто (насколько могу) объясняю эти самые азы. Вот рекомендации на счет написания консольных приложений с неясными целями, это больше похоже на издевательство, имхо.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...