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

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


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

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

Вот мне интересно как вы будете объяснять как подключить библиотеку человеку который с дополнительным кодом не знаком!

Вот мне интересно, как вы станете объяснять дополнительный код человеку, который с функцией abs (модулем числа) знаком со школьной скамьи, а про дополнительный код и не слыхал? 

Для тех, кто не умеет подключать библиотеки, можно слепить макрос

#define abs(x)  ((x) >= 0 ? (x) : -(x))

 

Кстати, упомянутый макрос будет работать и с float, в то время как "вручную оптимизированное получение модуля в дополнительном коде" приятно удивит...

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

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

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

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

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

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

можно слепить макрос

ну и бог с ним

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

if(var > 0) ...

и

if(var > (unsigned short)0) ...

вот где разница, а вас некоторые товарищи могут понять так, что то что в скобках перед нулем НИКОГДА не нужно!

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

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

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

1 hour ago, Дмитрий Вас said:

Command > (S16)(0)

OmegaTe = (~Command) + 1

Я думаю, что писавший это неуверенно обращается со знаковыми переменными.

Действительно, Command - знаковое целое, например, если переменная Command = -1, то она будет представлена как 0xffff. Автор текста сомневался, как в данном случае сработает сравнение 0xffff > 0, поэтому на всякий случай подсказывает компилятору (S16) 0, мол, не забудь, что сравнение со знаком. Ничего лучше придумать не смог. Вроде работает нормально.

О том же говорит вторая строка. Хочется поменять знак, из отрицательной величины сделать положительную. Но вместо OmegaTe = -Command,  а что такое -0xffff представить трудно, автору пришлось выкручиваться: сначала 0xffff побитно проинвертировать и получить 0x0000, затем добавить 1.

Я так думаю.

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

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

вот где разница

Разжуйте для тупого: в чем разница-то? Вот как для шестилетнего - не сочтите за труд. Надо разобраться в вопросе окончательно.

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

Command=100 тогда чему будет равен OmegaTe?

В вашем коде, если command==100, сработает другая ветка if, и OmegaTe будет равно 100.

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

Я так думаю.

Когда-то я прочитал в какой-то книжке, что правильно написанная программа не должна иметь явных приведений типов. Даже вроде как в стандарте MISRA это явно оговорено (могу ошибаться). 

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

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

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

Разжуйте для тупого: в чем разница-то?

только если поможете:

по какой ветке пойдет

if(var > (unsigned short)0) ...

при var = 0xFFFE?

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

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

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

сработает другая ветка if,

мдаа, в общем разобраться мне мешает моя невнимательность. а вам громадное очередной раз

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

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

только если поможете

Я понимаю так:

1. При вычислении значения выражения в Си оба операнда приводятся либо к типу int, если они "меньше", чем int, либо к типу "большего" операнда. Под размером я понимаю битовую разрядность.

2. Значит, даже если допустить, что ноль будет к чему-то там "короткому беззнаковому" приведен (я уверен, что НОЛЬ не приводится к типу), то после этого он снова будет приведен к типу второго операнда, после чего будет произведено сравнение.

Что и подтверждается:

screenshot-ideone.com-2020_09.01-15_40_56.png.f52cf0b63cf6195162029f7b088a2902.png

screenshot-ideone.com-2020_09.01-15_43_17.png.87daeb8a26a5af8f44d443f0f02692cc.png

Да, забыл сказать: приводятся типы операндов, если они не равны между собой и/или меньше int

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

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

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

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

Что и подтверждается:

Я же говорил консольные приложения рулят, а про volatile я бы щас не догадался - башку бы сломал :) .

Будем считать что мы разрешили спор к взаимному удовлетворению!

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

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

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

про volatile я бы щас не догадался

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

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

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

Здравствуйте.

Недавно возился с Attiny13, и на ровном месте возникли проблемы с настройкой регистров.

Как оказалось, в использованном мною примере, который я пытал в AtmelStudio, были неверные команды обнуления битов, например (0<<ADPS1).

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

Но тут пришлось столкнуться с Atmega8 с примером в IAR. Так в нём та же (0<<ADPS1) идет на ура.

В чем причина этой разницы у Atmel в командах работы с битами?

В МК? В IDE? Или в компиляторе, который использует IDE?

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

Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта.

 

 

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

От Attiny13 остался только исправленный пример.

Вот фрагмент из него:

ADCSRA |= (1 << ADEN); // включение АЦП
ADCSRA &= ~(1 << ADSC)|(1 << ADATE)|(1 << ADIF)|(1 << ADIE)|(1 << ADPS2)|(1 << ADPS1)|(1 << ADPS0);// предделитель отсутствует

То есть 

ADCSRA |= (0 << ADSC)|(0 << ADATE)|(0 << ADIF)|(0 << ADIE)|(0 << ADPS2)|(0 << ADPS1)|(0 << ADPS0);

точно не работает.

---------------------------------

А с IAR вот типичная строчка:

ADCSRA = (1<<ADEN)|(1<<ADSC)|(0<<ADFR)|(1<<ADIE)|(1<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);

она работает. 

Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта.

 

 

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

2 hours ago, ART_ME said:

В чем причина этой разницы у Atmel в командах работы с битами?

Разницы нет. Просто вы используете разные команды. Думаю по невнимательности.

ADCSRA |= ADCSRA | Х;

ADCSRA = Х;

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

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

Разницы нет. Просто вы используете разные команды. Думаю по невнимательности.

Вы серьезно полагаете, я не пытался использовать ADCSRA =  вместо ADCSRA |= ?

Фиг там, не работает!

Мало того, я обнаружил, что не один я такой, в инете нередки жалобы от новичков на этот фокус.

Что и привело к получению подсказки правильного  ADCSRA &= ~(1 << ADSC)

Даже табличку удобную на этот счет обнаружил, может кому пригодится.

Установка битов.JPG

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

Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта.

 

 

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

1 hour ago, ART_ME said:

То есть 


ADCSRA |= (0 << ADSC)|(0 << ADATE)|(0 << ADIF)|(0 << ADIE)|(0 << ADPS2)|(0 << ADPS1)|(0 << ADPS0);

точно не работает.

Командой ИЛИ биты не обнуляются, посмотрите таблицу. Данная команда ничего не делает.

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

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

Командой ИЛИ биты не обнуляются

Еще раз:  что  |=  , что   = -   результат одинаковый, в AtmelStudio для Attiny13 бит в ноль не сбрасывается.

А вот c помощью &=~ сбрасывается.

 

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

Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта.

 

 

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

6 минут назад, snn_krs сказал:

У вас в примере нет команды типа

ADCSRA = 0; // не обнуляет

Для смеха:  у NEC команда типа ADCSRA = 0 отлично даже работает. Как и команда ADCS = 0 тоже. И пофиг в каком регистре этот бит и что именно в него записывается. :D

Я потому и спрашиваю: кто для Atmel рулит этим приколом - тип МК, IDE или компилятор?

Потому как раз два раза уже atmel в руки попал, надо бы с IDE определиться.

------------------------

6 минут назад, snn_krs сказал:

Если это так, то это конечно ошибка. 

Ошибки IDE по идее должен бы показывать.

А тут индикации ошибки никакой,   просто команда не выполняется.

Собственно именно по этой причине я с регистрами attiny13 и промаялся.

К примеру, АЦП останавливаю, а он гад продолжает работать.  :wub:

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

Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта.

 

 

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

скорей всего дело в компиляторе, и может быть библиотеках io. атмега 8 в атмел студио7 и те и другие команды понимает

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

а вот скажите, если обработки кнопки if ((!(PIND&(1<<5))) можно ли  писать так if(!PIND5)

ISR(TIMER1_COMPA_vect)
{
	//---------------------обработка кнопки энкодера-----------------------------
	if((!(PIND&(1<<5)))&&(direction==0)) 
	{
		OmegaTe = 64;
		direction = 1;
		//PCTL2 = (1 << PRUN2);
		flag=0;
		lcd_gotoxy(0,0);
		lcd_putstring("forv");
		step++;
	}

и еще. из обработчика прерываний не пишет, пишет из main. как быть?

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

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

можно ли  писать так if(!PIND5)

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

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

как быть?

Писать из main

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

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

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

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

Писать из main

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

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

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

но мне нужно писать в теле прерывания

Вам только кажется, что это нужно. На самом деле это не нужно. Более того, это неприемлемо в большинстве случаев! 

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

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

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

@ARV как тогда бороться с дребезгом?

uint8_t step;
	ISR(TIMER1_COMPA_vect)
{
	//---------------------обработка кнопки энкодера-----------------------------
	if((!(PIND&(1<<5)))&&(direction==0)) 
	{
		OmegaTe = 64;
		direction = 1;
		//PCTL2 = (1 << PRUN2);
		lcd_gotoxy(0,0);
		lcd_putstring("forv");
		step++;
	}
	if ((!(PIND&(1<<5)))&&(direction==1))//реверс rev
	{
		OmegaTe = (~speed) + 1;
		direction = 0;//сбрасываем в ноль чтобы при повторном нажатии сработал 
		//реверс и начало крутиться в "прямом, forv" направлении
		lcd_clear();
		lcd_gotoxy(0,0);
		lcd_putstring("rev");
		step++;
	} 
	if ((!(PIND&(1<<5)))&&step==100)
	{
		lcd_clear();
		lcd_gotoxy(0,0);
		lcd_putstring("stop");
		step=0;
	}
    if (PIND&(1<<5))
    {
		step=0;
    }
	//----------------обработка энкодера-------------------------------

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

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

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

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

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

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

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

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

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

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

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

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

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