• Как создать таск-менеджер на C#?

    makarenya
    @makarenya
    программист
    using System;
    using System.Collections.Generic;
    
    // Давайте договоримся, что для нас не имеет значения,
    // как именно сохранены данные. Это может быть json, xml
    // А может оказаться что это БД или бинарнас сериализация
    // Главное, что данные можно получить через вот этот интерфейс
    public interface IDataRecord {
    	// Возвращает какое-нибудь свойство запуска
    	// Это может быть путь к паке или там количество итераций
    	// С точки же зрения xml или json - это значение аттрибута 
    	// с именем name
    	string Get(string name);
    }
    
    // А вот этот интерфейс содержит те методы, которые нам надо вызывать
    public interface IProcessor
    {
    	void MakeChildrenHappy(int numberOfCandys, bool haveClown, string place);
    	void BeatAllJedis(string weapoonName, bool killThem, int timeout);
    }
    					
    public class Program
    {
    	public static void Main()
    	{
    		var taskList = LoadTasks();
    		var processor = CreateProcessor();
    		foreach(var task in taskList) 
    		{
    			var type = task.Get("type");
    			switch(type)
    			{
    				case "make_children_happy":
    					RunMakeChildrenHappy(processor, task);
    					break;
    				case "beat_all_jedis":
    					RunBeatAllJedis(processor, task);
    					break;
    			}
    		}
    	}
    	
    	public static void RunMakeChildrenHappy(IProcessor processor, IDataRecord task)
    	{
    		var numberOfCandys = int.Parse(task.Get("number_of_candys"));
    		var haveClown = bool.Parse(task.Get("have_clown"));
    		var place = task.Get("place");
    		processor.MakeChildrenHappy(numberOfCandys, haveClown, place);
    	}
    	
    	public static void RunBeatAllJedis(IProcessor processor, IDataRecord task)
    	{
    		var weapoonName = task.Get("weapoon_name");
    		var killThem = bool.Parse("kill_them");
    		var timeout = int.Parse("timeout");
    		processor.BeatAllJedis(weapoonName, killThem, timeout);
    	}
    
    	public static List<IDataRecord> LoadTasks() 
    	{
    		// TODO: на самом деле мы тут подгружает json или xml, или из БД читаем
    		// Но пример то не про форматы сохранения.
    		return null;
    	}
    	
    	public static IProcessor CreateProcessor()
    	{
    		// TODO: Ну а тут мы создаём класс, который реализует методы, которые 
    		// нам надо вызывать
    		return null;
    	}
    	
    }
    Ответ написан
    Комментировать
  • Как гидроизолировать модули датчиков?

    makarenya
    @makarenya
    программист
    воспользуйтесь лучше предложением sim3x, закатывайте модули в эпоксидную смолу вместе с небольшой частью проводов, которые будут эти модули соединять с МК. Для датчика освещённости подойдёт прозрачная эпоксидка. Все провода вводите в коробку с МК. Коробку выбирайте герметическую. Дырку, через которую будете вводить провода - нужно также залить эпоксидкой. И ещё проверить, что дырка не протекает.

    Коробки
    Выбран фильтр - с защитой ip66
    6 = Пыленепроницаемо
    6 = Защищено от сильных струй
    Ответ написан
  • Не запускается MacBook Pro 13 mid 2009?

    makarenya
    @makarenya
    программист
    Ну - есть несколько вариантов, от лучшего к худшему:
    1. Найти загрузочный CD, который шёл с вашим Маком.
    2. Обратиться в сервис, много денег у вас не отберут
    3. Если у вас есть знакомый с маком, то создать на нём загрузочный CD и установить ОС с него
    4. Найти ISO c MacOS на торрентах, записать на диск и грузиться с него.

    UP. А вообще - ноуту 9 лет, возможно что без сервиса никуда, ибо хард сыпется.
    Ответ написан
    Комментировать
  • Как сверстать анимацию заполнения шкалы?

    makarenya
    @makarenya
    программист
    Если сложность картинки совсем уж запредельная, то всегда можно взять и использовать svg. Я так и сделал тут: внизу таймлайн с годами. Но тут надо синхронизировать размер, и в вашем случае видится решение проще.

    Если ширина сайта фиксированная, то просто будет использовать 2 div-а: один над другим (то есть у второго position=absolute). Внутри верхрнего лежит ещё один с шириной сайта (А ещё у него должен быть position=absolute и right=0. В нём изображение серого таймлайна. Сам таймлайн можно сделать из обычных div-ов, расположенных слева направо во flexbox-е или с флоатами. div со скруглёнными углами - это точка, с margin сверху и меньшей высотой - линия. А в первом диве (который снизу) вы составляете тот-же таймлайн, но уже цветной. Посчитать цвета градиентов для него - задача не сложная. Ну и вся магия во втором блоке, который с absolute. У него проставлен right=0, и уменьшая его width вы будете понемного скрывать серый таймлайн, а на его месте будет появляться цветной
    Ответ написан
    5 комментариев
  • Почему возвращает null при использовании метода объекта обобщенного класса?

    makarenya
    @makarenya
    программист
    Не вижу всего кода, но из того что вижу самое вероятное - не запускается Repletion. А если она не запускается, то метод Get ничего и не вернёт, так как AllItem окажется пустым. Добавьте в тесте ещё одну проверку до получения элемента - на то что AccountBS.AllItem не пустой массив
    Ответ написан
    Комментировать
  • Почему в result Пусто?

    makarenya
    @makarenya
    программист
    Ну это совсем просто. year = 18. Оба условия не срабатывают.

    Используйте if year >= 18: и просто else:
    Ответ написан
    Комментировать
  • Как красиво подсчитать слова на сайте?

    makarenya
    @makarenya
    программист
    Есть такое, передведёт html в текст

    html2text

    А ещё люди делают так:
    for script in soup(["script", "style"]):
        script.extract()
    text = soup.get_text()
    Ответ написан
    Комментировать
  • Как управлять диодами sw2812 на базе at90usb162?

    makarenya
    @makarenya
    программист
    Если у вас уже есть рабочий arduino скетч, то вы можете упростить себе жизнь следующими способами:
    - Исползовать arduino поддержку для вашего МК: https://github.com/mattairtech/ArduinoCore-avr, в разделе "AVR Core Installation" описан список шагов, чтобы Arduino его поддерживал.
    - Взять Arduino Leonardo - у него есть USB и он поддерживается в Arduino "из коробки". Можно взять у китайцев pro micro arduino leonardo - оно ещё и очень маленьким будет.
    Ответ написан
  • Что делать с домашним сервером?

    makarenya
    @makarenya
    программист
    У меня под домашний сервер стоит mac mini, а до того был intel atom с убунтой. Основной характеристикой была не скорость а скорее бесшумность. Используется как домашний хостинг, и как медиасервер. Очень неплохо уживаются в паре торрент deluged и медиаплеер plex. Собственно можно с любого компа начать закачку любого торрента - через web-интерфейс deluge или через десктопное приложение но в клиентском варианте, подключенном к торрент-серверу (фильм или сериал или музыка), и как он скачается - тут же оказывается в зоне видимости плекса. А дальше это всё можно воспроизвести с любого девайса, куда ставиться плекс: это и ios и android и apple tv, и android tv и ещё какие-то там девайсы. Если при этом заплатить плексу немного денег, то воспроизводить так можно контент с любой точки земного шара. за бесплатно - только из домашней сети
    Ответ написан
    Комментировать
  • Начало решения задач (глазами новичка)?

    makarenya
    @makarenya
    программист
    Начинать изучение программирования с зазубривания операторов бессмысленно. Для начала нужно выбрать язык. Рекомендую взять любой из списка:

    python
    Лидер в области компьютерного обучения и всевозможной математики, робототехники. На нём в том числе делается бэкэнд сайтов
    А ещё он очень простой и удобный. Минимальная программа пишется в 1 строку. Цена за простоту - он самый медленный из рекомендуемых.

    java
    Лидер в области бэкэнда больших проектов. (И да - php для монстров как правило не годится) Очень быстрый и в то же время достаточно простой. А ещё на нём написана куча программ под различные операционные системы. Он мультиплатформенный

    c#
    Активно продвигаемый Microsoft язык - является лидером в сфере приложений для Windows. И бэкэнды для сайтов на нём тоже очень здорово делаются. И он такой-же быстрый как и java

    swift
    Основной язык для iOS и macOs. Если у вас нет мака, то не вариант, ибо под другие ОС его не использовать. Он даже более быстрый чем c#/java

    Все перечисленные языки являются на сегодняшний день популярными и востребованными. А в отличии от C/C++ у них приемлемая сложность. Языки для веба в качестве старта не рекомендую, так как что-то вменяемое в веб можно сделать, изучив сразу: яызк для бэкэнда (тот же python или php), javascript для фронтенда а также html и css. И вам будет нужно знать это ВСЁ!

    Выбрали язык - ищите ролики на youtube - это и вправду самый простой способ обучиться чему угодно с нуля.

    И сам процесс обучения должен состоять из блоков: немгого поучили, попробовали это на практике, поучили - попрактиковались. Начните с hello world и развивайте дальше
    Ответ написан
  • Лучше свой проект или полный объем необходимых знаний?

    makarenya
    @makarenya
    программист
    Никогда не думал, что существуют "классические" пути для junior-ов. Если сильно постараться, можно устроиться junior-ом и на haskell. Тут есть момент: работая в команде, вы обучаетесь намного быстрее, чем в одиночку. Так что как только появиться возможность сменить работу - дерзайте. Но как правило даже от junior-ов требуют определённый объём знаний. Есть такое наблюдение - первые 5 000 строк кода любого программиста - это шлак. Никто не наймёт человека, который пишет шлак. Поэтому вам стоит заняться своими проектами. Ждать от них коммерческого успеха я бы не стал. Вообще ни под каким соусом. Ставьте цели попроще. Получить такое приложение, которое сделает для меня всё супер: это куда как более подходящая цель. А в каком направлении развиваться - фронтенд или мобайл, или бэкэнд, а может быть пойти в BigData или ComputerVision? - тут важно что вам больше нравиться. Что именно вас привлекает - туда и идите. Потому что максимальных успехов добивается тот, кому максимально нравиться то, что он делает
    Ответ написан
    Комментировать
  • Код в парадигме ООП PHP?

    makarenya
    @makarenya
    программист
    Вы сконцентрировались на попытке сделать ваше решение БД-ориентированным, в то время как вас не просили этого делать. Из за БД-ориентированности в вашем коде происходят странные вещи, можно сказать "магия". Некоторые вещи вообще странные, вроде списка статей внутри статьи.
    Вас просили сделать описания классов, методов и свойств класса в формате PhpDoc, а вы этого не сделали.

    Попробуйте ещё раз, но со следующими ограничениями:
    • В классе User оставьте только свойство $name и свойство $articlesList = [] - который будет уже списком статей, которые написал автор. Пусть список храниться внутри объекта пользователя, в ORM типа Doctrine так и происходит. Уберите оттуда $id.
    • Не забудьте добавить методы getName() и setName($newName) для работы со свойством name. Это является правильным для ООП - не позволять клиентам класса работать со свойствами напрямую, а лишь вызывая методы, которые вы предоставляете. Причина проста - в методе вы можете указать какое-нибудь дополнительное поведение, которое требуется при изменении свойства.
    • Также придумайте методы, необходимые для работы со списком статей. Ну вот два уже напрашивается из задания: "возможность для автора создать новую статью" и "возможность получить все статьи конкретного пользователя". Но по хорошему статью ещё и удалить можно...
    • Для статьи вам понадобятся 2 поля - это ссылка на автора (то есть сам объект класса User, а не магический id). То есть $author, и ещё, раз это статья, то ей неплохо бы добавить свойство $text.
    • А теперь главное - не пишите вообще текста методов. Только открыли фигурные скобки и сразу закройте на следующей строке. От вас этого не просили. И даже явно указали этого не делать!


    Если всё ещё сомневаетесь, то советую почитать обучалку по Doctrine. Там они постепенно создают совершенно коректные с точки зрения ООП классы User и Bug. (они это делают последовательно, так что не поленитесь докрутить до самого конца обучалки)
    Ответ написан
    2 комментария
  • Зачем std::forward иметь две сигнатуры и явно указывать тип?

    makarenya
    @makarenya
    программист
    Попытка №2, в первой был бред:
    Основной проблемой является то, что внутри метода все параметры имеют тип l-value. То есть модификатор параметра && - это лишь требование, чтобы на место этого аргумента вызывающий код передал r-value (а для шаблонов даже этого не требует, благодаря склейки ссылок). И раз так, то ваш метод my_forward переделает вернёт l-value ссылки вообще для всех аргументов.

    Отсюда берётся необходимость явно указывать тип аргумента - чтобы использовался именно выведенный тип, а не l-value на этот тип. Ну и почему 2 специализации: если указать явно тип аргумента и явно специализировать функцию каким-нибудь r-value, то my_forward будет ожидать строго r-value, и являющееся l-value значение параметра туда не подойдёт.

    В объяснение моих мыслей, код
    #include <iostream>
    
    template<typename T>
    decltype(auto) my_forward(T&& arg)
    {
        return static_cast<T&&>(arg);
    }
    
    template <typename T, typename K>
    void forward(T&& t, K&& k)
    {
        std::cout << std::is_same<int&&, decltype(my_forward(t))>::value << std::endl;
        std::cout << std::is_same<int&, decltype(my_forward(k))>::value << std::endl;
        std::cout << std::is_same<int&&, decltype(std::forward<T>(t))>::value << std::endl;
        std::cout << std::is_same<int&, decltype(std::forward<K>(t))>::value << std::endl;
    }
    
    int main()
    {
        int lval = 10;
        forward(10, lval);
        return 0;
    }


    вернёт
    0
    1
    1
    1

    То есть предположение что my_forward вернуло int&& для первого параметра - не верно!
    Ответ написан
    4 комментария
  • Как сделать склонение слов в зависимости от числа?

    makarenya
    @makarenya
    программист
    С ГитХаба

    function getNoun(number, one, two, five) {
        let n = Math.abs(number);
        n %= 100;
        if (n >= 5 && n <= 20) {
          return five;
        }
        n %= 10;
        if (n === 1) {
          return one;
        }
        if (n >= 2 && n <= 4) {
          return two;
        }
        return five;
      }


    Используется так:
    alert("4 " + getNoun(4, 'слон', 'слона', 'слонов'));

    Выведет сообщение 4 слона.
    Ответ написан
    1 комментарий
  • Какую базу данных лучше всего использовать для обучения новичка?

    makarenya
    @makarenya
    программист
    Как мне кажется, учиться лучше на той БД, которая часто используется в реальных решениях, так как обучение "в стол" тоже не является самым лучшим. Кроме того, БД должна быть поближе к стандартам и к "старшим братьям" - платным СУБД. И тут на самом деле даже вариантов не видно - PostgreSQL. Она реально используется в боевых системах, как минимум является одной из используемых в Яндексе (кроме неё там используют только самописные NewSQL)! По покрытию стандарта SQL, она опережает тот же MSSQL. Порог входа в неё лишь капельку выше, чем в MySQL, но полученные знания будут куда как ценнее!
    И да - MySQL и SQLite будут немного проще, но простота эта обусловлена отходом от стандартов или урезанию тех или иных фич. То есть за большую простоту обучения вы заплатите более ограниченными знаниями куда как большей сложностью переобучения на любую другую БД.
    Ответ написан
    Комментировать
  • Как скруглить углы у элемента WPF?

    makarenya
    @makarenya
    программист
    Наиболее оптимальный способ - вручную прорисовывать шаблон элемента. Той же кнопки, к примеру.
    Первая попавшаяся ссылка с вменяемым по размеру примером:
    https://professorweb.ru/my/WPF/Template/level17/17...
    Общая суть:
    Нужно указать параметр Template у объекта, углы которого скруглять вздумали.
    Это можно сделать как в примере на странице через ссылку на StaticResource, либо по месту, указав
    <Button.Template>
    ...
    </Button.Template>

    Сам шаблон описывается элементом <ControlTemplate TargetType="Button">. Ну или не Button, а тот элемент, который вы хотите выдать.
    Внутри вы можете нарисовать кнопку так, как вам того хочется. Можно <Rectangle RadiusX="10" RadiusY="10">, можно <Border CornerRadius="10"> - на ваше усмотрение. Не забываете добавить <ContentPresenter>, чтобы отобразить содержимое кнопки (её текст или любые другие элементы, которые на ней должны размещаться). В реальности вам придётся ещё впоследствии добавить раскраску в зависимости от состояния (активная, курсор наведён, курсор не наведён), и возможно анимацию перехода между этими состояниями!

    Чтобы не делать это всё с нуля, часто бывает удобно скопировать стиль по-умолчанию с сайта майкрософт , а потом перкроить его на свой вкус.

    Blend так ни разу и не довелось использовать. Всё-таки мне показалось более удобным работать с чистым кодом. Вся идея бленда заключалась на мой взгляд в том, чтобы посадить за него дизайнера, и чтобы последний выдавал на нём готовые для использования блоки. Программеру он ни к чему.
    Ответ написан
    2 комментария
  • Абсурдное выполнение условных операторов 3 раза в Arduino nanov3, как исправить?

    makarenya
    @makarenya
    программист
    https://www.arduino.cc/en/Serial/Read
    А точнее абзац

    Returns
    the first byte of incoming serial data available (or -1 if no data is available) - int

    метод read() возвращает прочитанные данные, если таковые есть и -1 - если данных нет.

    Исправьте код на следующий

    void loop() {
      analogWrite(col, xCol);
      xBaza = Serial.read();
      if(xBaza >= 0 && xBaza != xBaza0) {
        xBaza0 = xBaza;
        analogWrite(baza, xBaza);
        writes();
      }
    }
    Ответ написан
    Комментировать
  • Я слышал, что goto использовать НЕЖЕЛАТЕЛЬНО. А что насчет while(true)? В функции есть много if'ов, в которых есть return. Моветон ли while(true)?

    makarenya
    @makarenya
    программист
    Последний раз я использовал GOTO в QBasic (можете погуглить). Это был для меня первый язык программирования, а сам я учился в школе, и даже не в старших классах. Без него можно обойтись вообще всегда, хотя иногда это и не так уж и удобно. Но я видел неоднократно его использование в серьёзных проектах. Почти всегда он один единственный на несколько десятков файлов с кодом.

    Отказ от GOTO является одним из принципов структурного программирования. А ещё один его принцип - это единая точка выхода для любой конструкции. По сути - это отказ от return за исключеним случая, когда нужно вернуть какое-то значение в самом конце функции, а ещё и отказ от continue или break в циклах. И... вот так уже не делали ни в одной компании, где мне довелось работать, ни в одном opensource проекте, код которого мне доводилось смотреть.

    Причина, почему один принцип заучивается на зубок всеми программистами, а второй представляет из себя лишь повод посмеяться - это их цена. Программа, богатая на goto, очень быстро становиться нечитаемой, непредсказуемой и неподдерживаемой. Понять - что в ней происходит, становиться невозможно уже после пары сотен строк. А вот с return из середины функции, как и с break из середины цикла - цена невысока. Ими уже так просто программу в трэш не превратить. Читаемость и поддерживаемость не падает, в том числе, и при использовании бесконечных циклов. А в некоторых случаях без них никуда. К примеру, любая программа для микроконтроллера представляет из себя бесконечный цикл и без любой возможности выйти из него.

    Так что часто бесконечный цикл является возможностью сделать программу проще, и не дублировать строки кода лишний раз - то есть упростить понимание и поддерживаемость программы, а это куда как важнее слепому следованию старым принципам. С другой стороны - если вы используете бесконечные циклы едва ли не так часто, как и все остальные - то тут уже начинает появляться вопрос - достаточно ли вы хорошо ознакомлены с циклами в том языке, на котором вы пишите. Ведь очень часто даже самые нетривиальные конструкции и фичи решаются с помощью цикла for - он в данном случае крайне мощный (если разговор о c/c++/c#/...)

    PS. Выход из кучи вложенных циклов при помощи return из функции - самый простой способ ухода от необходимости в GOTO и одновременно отказа от оверхеда на лишние и ненужные условия. Используется всеми и "на ура"
    Ответ написан
    Комментировать
  • Нужно ли программисту изобретать велосипед?

    makarenya
    @makarenya
    программист
    Есть учебные велосипеды. Вы его сделали чтобы понять, как это всё работает. Я сам пару месяцев назад написал нейросетку, просто чтобы понять метод обратного распространения ошибки... Сетка работала весьма тормознуто, но работала же. Но тут речь о том, чтобы сделать, посмотреть и выкинуть.

    А есть ещё и велосипеды промышленные. И про них нужно знать одно - их нужно регулярно смазывать. Всегда хочется его сделать - это, как правило, интересно. Да ещё и решает поставленную задачу зачастую лучше, чем имеющиеся решения. Но:
    1. Это отнимет у вас время, причём гораздо больше, чем вам кажется на первый взгляд. Восхищаюсь теми ребятами, которые умеют правильно просчитывать время до получения реально работающего продукта, а не просто прототипа. Но среди программистов я таких не видел.
    2. Сторонние тулзы и библиотеки, в параллель к которым вы завелосипеделись, будут развиваться. Они будут уметь делать лучше, быстрее, поддерживать самые новые версии ОС и тех продуктов, с которыми вы работаете. Чтобы держаться с ними на равне и не кусать потом локти, что ваше творение ничего по сравнению с ними на текущий день не умеет - придётся тратить время на этот самый велосипед и в дальнейшем. А в случае с вопросами совместимости, то это уже жизненная необходимость. Сделали вы импортёр с Excel, а формат Excel взял и изменился - обновляйте импортёр, а то не будет работать весь ваш продукт, импортёр этот использующий.

    Всем этим я хочу сказать, что велосипеды делать можно, но с пониманием того, что сделать велосипед - это как завести рыбок (или родить ребёнка, если хотите) - тут нужно понимать свою ответственность за последующую судьбу этого вашего велосипеда, и что сам по себе без вашего постоянного участия он не выживет;

    Хотя создание велосипеда для веб-проектов - это уже 3-й случай. В реалиях Российского сайтостроения - это велосипед на продажу с последующим убоем. Его сделал - и забыл. Сайт через 2-3 года умрёт сам вместе с велосипедом. Будет заменён новым сайтом, сделанным с нуля. Так что тут уже ответственность за велосипед минимальная - делайте на здоровье, вторую проблему вычёркивайте.

    Первая останется - вы потеряете время. И для сайтов это зачастую приводит к катастрофе. Среднестатистический заказчик веб-сайта готов потратить на сабж денег, достаточных лишь на 3-4 рабочих дня оплаты труда веб-разработчика. Делать всё и всюду с нуля при таком условии становиться непозволительной роскошью.

    В этом бизнесе выживают либо те, кто специализируется на очень больших и серьёзных проектах (вот только для этого нужно иметь имя и неплохой штат), либо те, кто собирают сайт как конструктор в течении пары дней.
    Ответ написан
    Комментировать
  • Как настроить мк AVR на частоту 1Мгц без кварцевого резонатора?

    makarenya
    @makarenya
    программист
    Если бы вы имели дело с ARM-ами, то могли бы настраивать частоту на лету. Какую захотел, такую и поставил прямо на месте через API CMSIS. Но тут у вас AVR, и частота задаётся через фьюзы. А ещё через фьюзы контроллер влёт превращается в кирпич, да так что без высоковольтного программатора (который та ещё редкость), МК обратно не оживить. И настройка частоты - это одна из тех вещей, неправильно значение которой может убить (почти) МК.
    Поэтому первый момент - никогда не ставьте/снимайте галочки там, где не уверены!

    Вот картинка настройки фьюзов в Atmel Studio
    0NNQy.jpg

    Когда попадёте на эту страницу, нажмите Read, чтобы удостовериться что на экране правильная инфа.

    Самый нижний носит имя SUT_CKSEL, а через один над ним CKDIV8.

    Для начала SUT_CKSEL - у вас должен стоять один из вариантов INTOSC_8MHZ. И нет значения, какой именно. Все эти KCK, CK и MS указывают на время задержки между подачей питания и стартом МК, нужны лишь для случая работы от полудохлых батареек без контроллера питания. "Ускорить загрузку" ими тоже не удасться, речь идёт о значениях, меньших 0.1 секунды.
    Если у вас и так значение SUT_CKSEL начинается с INTSOC_8MHZ, то не трогайте там ничего. Убить МК вы сумеете, а лучше для вашей задачи вы всё равно не сделаете.
    Теперь проверьте наличие галочки CKDIV8. И вот она вам и нужна. Её нужно установить. Если она стоит, то вот эти самые 8мгц с внутреннего генератора делятся на 8. Итого - 1Мгц, то что вам и нужно!
    Хотя насколько я вспоминаю, эта галка прошивается на заводе, и во фьюзы вам лезть не нужно вообще.
    Если после нажатия на Read вы увидели, что SUT_CKSEL уже показывает на INTOSC_8MHZ..., а галка CKDIV8 уже стоит, то никуда больше не жмите и просто уйдите с этой страницы. Повторять не устану - любые необдуманные манипуляции здесь убъют ваш МК. Особенно опасными являются галки:
    RSTDISBL - поставьте её и без HVPP-программатора вы ничего с МК сделать не сумеете
    SPIEN - а вот её никак нельзя снимать, а то результат будет не менее плачевен.
    Ну и выбор любого EXTXOSC_... источника тактирования приведёт к тому, что ваш МК станет кирпичом до того, как вы подключите данный источник тактирования. Выбрали керамический резонатор - бегите в ЧипДип за таковым и парочкой конденсаторов, чтобы хотябы поставить фьюзы назад!

    А теперь по поводу того, что вы уже сделали:
    прописав:
    #define F_CPU 1000000
    или
    #ifndef F_CPU 1000000UL

    в реальности - совершенно равноправные строчки, вы тем самым указали всяким библиотекам (вроде того-же delay.h), что МК будет работать на частоте в 1Мгц. Дело в том, что метод delay(...) или любые другие методы, завязанные на реальное время или реальные временные интервалы без этой строчки ничего о этом самом времени не знают. Они могут лишь посчитать количество тактов МК. И когда вы указываете, что вам нужно пауза а 1сек, то на основании записи о частоте (на основании F_CPU) библиотека delay.h высчитывает количество тактов, которые нужно провисеть внутри функции, чтобы получить задержку в 1с (в вашем случае, разумеется идёт речь о миллионе тактов).
    Если эта настройка (F_CPU) не выполнена, или если она не отражает реальную частоту МК, то все функции ожидания и прочие будут работать несколько странно - то есть ждать либо большее либо меньшее чем запрошенное время.

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

    И ещё - датчик ds18b20 работает по протоколу single wire, аппаратной реализации на AVR этого протокола банально не существует, да и не нужна она то особо, при условии крайне низкой скорости самого протокола. А программным библиотекам должно быть не так уж и важно, какая там частота у МК. Поэтому мне кажется очень странным ваше желание получить частоту ровно в 1Мгц для взаимодействия с данным датчиком.
    Ответ написан
    Комментировать