Задать вопрос
@Vadimm1001

Как настроить мк AVR на частоту 1Мгц без кварцевого резонатора?

Строчку
#define F_CPU 1000000
в код добавил, строчку
#ifndef F_CPU 1000000UL
в файл delay.h добавил(компилировал в Amel studio 7).
К мк подключен датчик ds18b20, в протеусе все работает а вот в реальном мк на дисплей просто выводиться 0. Судя по мерцаниям дисплея в реальном мк частота на нем совсем не 1Мгц а куда больше
  • Вопрос задан
  • 3432 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 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Мгц для взаимодействия с данным датчиком.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@n12eq3
у atmel источник тактирования или его скорость при работе от встроенного генератора не задаётся ни дефайнами ни прошивкой вообще.
нужно менять и прошивать fuse bits. atmel studio имеет соответствующую вкладку в окне программирования.
Ответ написан
Комментировать
@BadElectrician
C++ это хобби
У мк atmega8 например тактовая частота внутреннего осцилятора 1 Мгц настроенна по умолчанию, а вообще то при прошивке задается при помощи специальных фьюзеров. Смотря каким устройством прошивать...
Ответ написан
Комментировать
@AlexanderKomarchouk
программист PHP, embedded atmega/stm32
Про fuse биты вам сказали верно. Воспользуйтесь fuse калькулятором.
Вот посмотрите, несколько ссылок на ваш выбор:
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы