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

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


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

8 часов назад, Alexeyslav сказал:

Интуитивная расшифровка PB1 это Port B bit 1, означающая регистр ответственный за выходные триггеры-защелки порта. PinB1 отвечает за ВХОДНЫЕ триггеры порта.

Хорошая у вас интуиция - две буквы расшифровать тремя словами :) 

И еще: назовите мне хотя бы одно отличие между номером бита 7 из входного регистра и номером бита 7 во входном регистре? Вы считаете, в этих регистрах РАЗНЫЕ НОМЕРА БИТОВ? Что там ваша интуиция говорит на счет того, что НОМЕР - это штука абстрактная, и номер квартиры 37 ничем от номера дома 37 не отличается, записывается теми же цифрами и несет тот же смысл - какой-то там от начала? Мы даже говорим "квартира имеет тот же номер, что и дом". С какого перепугу атмел решил дать уникальные названия одинаковым номерам - это как раз поперек интуиции и логики, имхо.

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

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

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

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

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

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

Вообще там три символа. "1" это тоже символ и в данном случае он означает больше чем цифра 1.

Конечно номер это абстракция, если бы это было НЕ важно, не было бы никаких дефайнов, обозначали бы просто ЦИФРОЙ номер бита. Но нет... зачем-то имеем дефайны. ЗАЧЕМ? Попробуйте ответить на этот вопрос, а не на какие-то там абстрактные. Это всё имеет сугубо практическое применение. И да, это не атмел давал названия, а программисты.

Учение - изучение правил. Опыт - изучение исключений.

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

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

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

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

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

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

4 часа назад, Alexeyslav сказал:

ЗАЧЕМ?

Вопрос задан неверно. Правильный вопрос: зачем разные дефайны для одинаковых сущностей?

Разные порты - разне идентификаторы. Разные биты - разные идентификаторы. Разное назначение чисел - разные идентификаторы. Разный смысл - разные идентификаторыю Продолжите ряд самостоятельно: одинаковый смысл - ... идентификаторы.

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

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

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

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

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

8 часов назад, Alexeyslav сказал:

зачем-то имеем дефайны. ЗАЧЕМ? Попробуйте ответить на этот вопрос

Вот меня этот вопрос тоже интересует. Зачем вообще использовать макроопределения для битов, когда есть числа, не вносящие путаницу, делающие то же самое и более быстрые в написании?

Мало того, можно ведь прописать макроопределение для конкретного назначения бита, например, #define LED B,1,0 а дальше оперировать макроопределением целого порта, что гораздо удобнее.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

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

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

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

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

Особенно не понятно, для чего вводить какой-нибудь условный алиас WDEN равный номеру бита 5 вместо куда более поезного и разумного числа (1<<5), которое реально и требуется в программах? 100% всех программ используют именно эту запись 1<<WDEN, так нафига вообще?! Тяжелое похмелье от ассемблера с его командами SBR и SBI, которым нужен НОМЕР бита?! Но у нас ведь Си!

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

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

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

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

На маленьких программах это прокатывает, а в больших проектах ты быстро потонешь в этих магических числах. Тут простой случай, просто другая ревизия того же самого контроллера и бит WDEN уже не 5-й а 4-й становится. И давай, шуруй по всем исходникам ищи где прописывал этот бит. И попробуй только забыть.

А копипасты? Сколько они породили ошибок, когда после вставки не все константы исправил. Для этого и нужны человекочитаемые идентификаторы битов отдельных регистров, удь они хоть 10 раз равны. Это позволяет отработать статическому анализу и указать на вероятную ошибку. Только совсем недавно выловил в программе корпоративной подобный баг, одна переменная копируется два раза, хотя второй раз должен быть с другой переменной отличающейся на один символ. Но проблема была в том что чаще всего они содержат одно и то же число, найти баг набюдая результат очень трудно. Избыточная информация помогает обнаруживать ошибки и не совершать их. Это актуально в больших проектах, где в одном мозгу невозможно держать всю программу со всеми её константами.

Учение - изучение правил. Опыт - изучение исключений.

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

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

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

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

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

@Alexeyslav , вы меня не поняли.

Производитель предлагает заголовочные файлы для своих МК, в которых прописывает константы, нужные для тех или иных битов. Программист же пользуется только WDEN, и не важно, какая именно константа за ним спрятана - производитель может менять её, как угодно, лишь бы обеспечивал соответствующими заголовками.

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

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

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

5 часов назад, COKPOWEHEU сказал:

когда есть числа, не вносящие путаницу, делающие то же самое и более быстрые в написании?

Прочитайте что такое магические числа в программах и чем они плохи. Быстро пишется, а потом АДИЩЕ в отладке и поиске ошибки. Когда проект маленький и помещается в пределах одной головы проблема не такая страшная, ну проведёшь два дня в поисках опечатки, делов-то.
Магических чисел в программах быть не должно, все константы должны иметь смысл и быть поименоваными.
Не важно что 5 бит для регистра PORTA и PINA адресуется числом 5, но эти биты ИМЕЮТ РАЗНЫЙ СМЫСЛ. А поэтому они должны быть поименованы по разному. Просто чистая случайность что они совпадают по значению.
Для маленьких программ, это не так актуально и кажется лишней сложностью... Но даже на них надо прививать хорошие и полезные привычки. С номера бита начинается, а заканчивается просиранием государства.

Учение - изучение правил. Опыт - изучение исключений.

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

12 часа назад, Alexeyslav сказал:

Тут простой случай, просто другая ревизия того же самого контроллера и бит WDEN уже не 5-й а 4-й становится

Он имеет в виду, что Atmel неудачно запихали в константу номер бита, а могли - битовую маску, как сделано в других МК. Сравните

#define DWEN 4
#define DWEN 0x10

 

12 часа назад, Alexeyslav сказал:

А копипасты? Сколько они породили ошибок, когда после вставки не все константы исправил. Для этого и нужны человекочитаемые идентификаторы

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

class SoftUart{
private:
  int rx, tx;
public:
  SoftUart(int _rx, int _tx);
  void write(char ch){
    DigitalWrite(tx, LOW);
    ...
  }
};

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

#define SOFT_USRT_TX B,1
#define SOFT_UART_RX C,3

void SoftUartWrite(char ch){
  PORT_0( SOFT_UART_TX );
...
}

Не так много задач, где нужна работа именно с номером порта, а не с устройством, которое на нем висит.

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

8 часов назад, Alexeyslav сказал:

С номера бита начинается, а заканчивается просиранием государства.

Не драматизируйте. Замена номера_бита на PINB_номер_бита не делает код лучше. Это как было магическое число, так и остается, только завуалированное. Если хотите избежать ошибок, надо самостоятельно назначать макроконстанты в соответствии с назначением.

#define BTN_PORT PORTB
#define BTN_PIN PINB
#define BTN_DDR DDRB
#define BTN_BIT (1<<4)
...
BTN_DDR &=~ BTN_BIT;
BTN_PORT |= BTN_BIT;
if( BTN_PIN & BTN_BIT ){...}

 

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Думаю эти дефайны ввели для начинающих таких как я например. Чтобы было ясно что означает та или иная букавка. В ардуино сделали по сути тоже самое, потому как там выходы пронумеровали просто по порядку, и тот же PB1 встал просто выход 14, а PC2 15тым.

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

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

 

Учение - изучение правил. Опыт - изучение исключений.

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

1 час назад, Alexeyslav сказал:

Константа становится поименованой и обретает смысл, перестаёт быть магческой.

Ничего подобного. Поименованной она станет когда ее поименовать осмысленно, в соответствии с назначением. А то можно и

#define ONE 1
#define TWO 2

назвать именованными константами и утверждать что это дает какую-то безопасность.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

7 часов назад, Alexeyslav сказал:

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

Наделение ложным смыслом тоже к добру не приводит. Например, PINB1 и DDRB1 намекает, что это не только разные константы, но и разные по смыслу константы, хотя на самом деле это абсолютно одинаковые константы и смысл у них одинаковый - НОМЕР БИТА 1. Номер бита не несет никакой дополнительной нагрузки, и привязывать его к конкретному регистру - это какой-то нонсенс. Более того, "ошибочное" указание PINB = 1<< DDRB1; на самом деле ошибкой не будет, что дополнительно вызывает когнитивный диссонанс.

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

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

Нет, значение у них одинаковое, а смысл совершенно разный! Компилятору пофиг что хавать, а вот людям - нет. Эти константы не только указывают номер бита, а ещё и принадлежность его конкретному регистру.

Всё это делается для того чтобы в больших проектах не допускать элементарных ошибокпо недосмотру. Ещё раз повторюсь - компилятору пофиг, но с исходниками работают ЛЮДИ.

Учение - изучение правил. Опыт - изучение исключений.

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

5 часов назад, Alexeyslav сказал:

Нет, значение у них одинаковое, а смысл совершенно разный!

Ну так откройте тайну, в чем разница? 

Когда бит 5 обозначает включение WDT, если писать его в регистр MCUCR, и тот же самый бит 5 обозначает включение режима СТС таймера - я могу понять, что смысл разный. Однако, при этом не используется запись MCUCR_WDT или TCCRA_CTC, что как бы обозначало ПРИНАДЛЕЖНОСТЬ регистру и НАЗНАЧЕНИЕ бита, ограничиваются только НАЗНАЧЕНИЕМ бита. Почему в случае с битами портовых регистров не так? В чем разница между вторым битом регистра PIN и вторым битом регистра DDR? В обоих случаях это всего лишь номер бита, не несущий никакого дополнителного смысла, и никак не связанный с функцией регистра.

Просто номер.

Или вы на самом деле допускаете мысль, что в каком-то удивительном будущем в регистре PINB нумерация с привычной 765432310 производителем вдруг будет изменена на 64207531, а в регистре PORTB сохранена прежней, и тогда в самом деле в программном коде, использующем PINB = 1<<PINB1; PORTB = 1<<PORTB1, нормальный функционал сохранится, а в коде PINB = 1<<PB1; PORTB = 1<<PB1 будет шиворот-навыворот? Вы действительно считаете, что такое может быть?!

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

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

Какая то херня. Вернулся к проекту он собирается ошибок нет, но дисплей ничего не отображает в протеусе. Хотя последний раз когда собирал все работало. Прошагал отладчиком тоже все ок.

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

Парни, чего это вы "рубитесь" из-за дефайнов. Они создавались согласно даташитов на МК и при их создании никто не заморачивался с вопросом, как пользователь будет ими жонглировать. Никто не запрещает вам именовать линии портов ввода-вывода самостоятельно, согласно их функциональным назначениям или подключенным к ним узлам схемы (именно схемы, т.к. МК в одиночестве не используется). Вот тогда ваши именования можно применять и к PORTx, и к DDRx и к PINx без потери смысла. И даже наоборот, осмысленно. А дефайны... оставьте лентяям, которым лень придать смысл листингу программы.

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

Только что, Геннадий сказал:

Вот тогда ваши именования можно применять и к PORTx, и к DDRx и к PINx без потери смысла

Именно так и поступаю. Для своих проектов я определил давно макросы типа PORT(x), DDR(x) и PIN(x) чтобы писать в таком духе:

#define LED_IO	B
#define LED_RED	_BV(1)
  
...
PORT(LED_IO) |= LED_RED;

 

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

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

15 часов назад, ARV сказал:

В чем разница между вторым битом регистра PIN и вторым битом регистра DDR?

Так ведь очевидно, раазница в том что первый бит представляет собой значение на ножке контроллера, а второй управляет направлением порта. Назначение у них совершенно разное, а значение совпадает. Ещё раз, перестаньте думать за компилятор - дефайны они для человека а не для машины. Продолжайте и дальше пользоваться вашими магическими константами, раз не видите разницы. У вас как раз происходит магия когда PINB2 = DDRB2 = PB2 и компилятор не может различить их применение, которое возможно было сделано по ошибке и в порт DDRA обратились по биту PB5 а не DDRA5. Компилятору будет всеравно, а человек(статический анализатор кода) заметит ошибку и исправит по ситуации - или регистр указан не так, или бит.

Учение - изучение правил. Опыт - изучение исключений.

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

11 минуту назад, Alexeyslav сказал:

Назначение у них совершенно разное

Назначение у них совершенно одинаковое - обращение ко 2-й ножке порта. А уж что с ней делать - вопрос к программисту. Более того, глупо разбивать одну и ту же ножку по разным дефайнам, это добавляет путаницу и увеличивает шанс забыть где-то переименовать. А вот когда номер ножки назван по смыслу и используется один на все регистры, ошибиться сложнее. В этом плане, кстати, неплох подход Ардуины, где за вывод отвечает номер и больше ничего. Конечно, реализация у них подкачала, но ведь никто не мешает сделать то же самое на макросах с нулевыми накладными расходами.

 

15 минут назад, Alexeyslav сказал:

Продолжайте и дальше пользоваться вашими магическими константами

Нет уж, магические константы это к вам.

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

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Наличие PINB1 отдельно для регистра PINB и DDR1B отдельно для регистра DDRB уподоблю необходимости применять отдельный рубль для покупки хлеба и совсем другой рубль для покупки молока :)

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

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

12 часа назад, Alexeyslav сказал:

Компилятору будет всеравно, а человек(статический анализатор кода) заметит ошибку и исправит по ситуации - или регистр указан не так, или бит.

Вы, извиняюсь, лепите что то абстрактное! Вы попробуйте рассмотреть какую то реальную ситуацию, например ЛЕД на ноге висит, или enable-чего-то, вы как будете этой ногой управлять:

pinZx, portZx, ddrZx

или

ЛЕДх для pinZ, portZ, ddrZ

enable-чего-то для pinZ, portZ, ddrZ

???

Чего у вас тут компилятор может исправить??? Откуда компилятор узнает какая функция у вас на конкретной ноге конкретного порта висит, и зачем эту функцию различать для pinZ, portZ, ddrZ регистров управления этим портом???

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

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

Что главное в написании программы? Как можно раньше обнаружить ошибки!

Рубль все так же остаётся рублём, только одни рубли мы может потратить ТОЛЬКО на молоко, а другие только на хлеб. Хотя и те  идругие остаются рублями. Таким образом осуществляется контроль. И когда пытаешься расплатится молочными рублями за хлеб, тебя переспросят что именно ты хочешь и не ошибся ли. Ой да, конечно.... я же хлеб хотел.

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

Откуда компилятор узнает какая функция у вас на конкретной ноге конкретного порта висит

Конечно не узнает. Это уже ошибки совершенно другого уровня. А вот ошибку записи с регистр DDR вместо того что надо было записать в PORT отловит на ура.
Я ещё раз скажу что это не актуально для маленьких программ, где назначение выводов очевидно и обращение к портам происходит максимум из 1-2 инклудов, которые реально просмотреть глазами. А попробуйте найти такую ошибку в проекте на сотню инклудов и сотню тысяч строк кода. А в проекте такого размера такие ошибки ТОЧНО будут и ещё сотня других. А тем временем такого рода ошибки ловятся ещё до компиляции, предотвращая многочасовую отладку в поисках забытого регистра.

Учение - изучение правил. Опыт - изучение исключений.

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

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

Что главное в написании программы? Как можно раньше обнаружить ошибки!

НЕТ!!!

Программа должна делать то что задумано!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Если вы не знаете зачем пишете программу, вам никто и ничто не поможет избавить ее от ошибок!

Если вы обращаетесь к ноге порта только чтобы к ней обратиться, не вникая какая внешняя функция висит на этой ноге...

вам никто и ничто не поможет...

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

Это уже ошибки совершенно другого уровня

Тоже смешно! Если они другого уровня то от них не надо избавляться что ли??? Так вы делите ошибки на те от которых надо избавляться, и те от которых избавляться не надо???

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

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

1 час назад, Alexeyslav сказал:

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

Интересно, каким образом? Вот я сейчас привду пример кода, а вы мне скажите, есть ли там ошибка и в какой строке (т.е. выполните роль компилятора)

int var = DDRB;
int bvar = PORTB;
DDRB = bvar ^ var;
PORTB = DDRC;
DDRA = PORTB;

 

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

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

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

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

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

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

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

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

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

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

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

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

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