Ответы пользователя по тегу Atmel AVR
  • Как управлять диодами sw2812 на базе at90usb162?

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