atmega8+ds18b20 не определяется температура
- Войдите на сайт для отправки комментариев
Здравствуйте.
Предисловие: я написал программу, которая делает то, что мне нужно на freeduino (atmega 168). Подключил несколько светодиодов для имитации выходного результата и пару датчиков температуры в качестве исходных данных. Получается нечто вроде информативного термостата для овощехранилища.
Проблематика: при переносе на более дешевую элементную базу, а именно самосборную на основе Atmega8, все замечательно работает. Кроме определения температуры. Температура всегда определяется как нулевая, ну или как одинаковая на обоих датчиках (при условие нагрева одного, и оставления в покое второго).
Доп.информация: программирую в текстовом редакторе vim, компилирую среде arduino IDE 1.0, прошиваю готовую микросхему программатором Громова на COM-порту, через прогу uniprof и разьем ISP. Фьюзы atmega8 выставленны для частоты 16 МГц, кварц подключен такой, что она работает (затрудняюсь назвать частоту, ибо марка не гуглится - "HB-2 9109"), полагаю, что на 16 МГц, иначе бы оно не работало. По даташиту atmega8 без буквы L может работать от 0 до 16 МГц. Такая частота выбрана из соображений "что бы работало так же как freeduino и легче было бы найти причины неисправностей". Позже хочу заставить работать от минимальной частоты.
При работе от встроенных в чип 1МГц температура так же не меряется. Другие частоты не пробовал, да и зачем, если freeduino на atmega 168 работает на 16 МГц'ах и прекрасно считывает температуру.
Получается вот что: freeduino работая на одной и той же частоте и на одной и той же программе (номера пинов я переписываю на нужные и выставляю "board" в IDE на нужный перед компиляцией для нужного железа.
Подскажите что я делаю не так? В чём может быть проблема? Что нужно сделать для определения температуры на atmega8 ?
некоторые ссылки вставились не рабочими
даташит на atmega8
ссылка на выставление фьюзов на atmega8 на 16МГц
ссылка на схему программатора, который я собрал (только добавил экранирование)
админу:
1) в конце ссылок добавляется обратная косая черта, в результате ссылки неработоспособны.
2) при редактировании сообщения со ссылками, они перестают быть ссылками после редактирования (и при редактировании показываются синим только при наведении).
Может быть глюк после переезда?
исправление: сегодня встало солнце и я увидел, что маркировка моей микросхемы atmega8A-PU
даташит
Вы не верные выводы делаете.
Если кварц поставить на 12 МГц, то atmega8 будет без проблем работать, НО если бы вы почитали про протокол 1-Wire, вы бы знали, что он строго привязан к времени, а значит изменение тактовой частоты МК приведет к изменению задержек, так что можно с уверенностью сказать что у вас кварц стоит не на 16 МГц.
На 1МГц не заработало от того что в библиотеке 1-Wire нет расчета задержек для частоты 1МГц, если бы запустили на внутреннем генераторе 8МГц, то все бы заработало.
а почему на 8 МГц ?
Ведь фридуина работает на 16ти, а значит - библиотека расчитана на задержки при 16 МГц'ах и на 8 МГц'ах задержки будут в два раза длиннее.
И еще: кто говорит библиотеке на какой частоте работает контроллер? Компилятор, прошивальщик или какие-то константы в программе/библиотеках?
Используемую библиотеку DallasTemperature 3.7.2 прошерстил вдоль и поперек, дифференциации по частотам и, соответственно, по длительности задержек не обнаружил. Там только есть диффенциация по битности сигнала - для каждого свои задержки, но это иное.
П.С. изменять задержки в самой библиотеке, деля их на х (где х=16/<частота в МГц>) пробовал, эффекта не было.
1. Смотреть надо не DallasTemperature, а OneWire.
2. А частоту с которой нужно работать компилятор берет отсюда: Дуина\\arduino-1.0\\hardware\\arduino\\boards.txt
Ура, получилось!!! :)
Сообщу, что я сделал, вдруг кому пригодится, да и мне что бы не забыть :) :
1) вернул оригинал библиотеки DallasTemperature 3.7.2 из бекапа.
2) изменил в файлике /usr/share/arduion/hardware/arduino/boards.txt частоту для моего кристалла atmega8 c 16 до 8 МГц
3) поставил на всякий случай в начало программы директиву "#define F_CPU 8000000UL // указываем частоту в герцах, для кварца 8 MHz", делающую, по сути то же самое. Подсмотрел где-то на просторах интернета.
4) указал в переменной (самопис.), изменяющей задержки в программе, частоту 8МГЦ (int cpu_MHz=8; float x=16/cpu_MHz; // rem: delay(1000/x);) (она нужна что бы не менять всю программу, при смене чипов и частот работы оных)
5) на просторах инета нашел англоязычный калькулятор фьюзов и прошил фьюзы в соответствии с выставленными саморучно значениями: внутренний тактовый генератор RC 8 МГц, задержка 6 чего-то и 65 милисекунд, порог питания 4 В, и.. и еще что-то, чем благополучно сделал недоступным второй в моей жизни контроллер (микросхему).
6) нашел на тех же просторах на сей раз русскоязычный "Калькулятор фьюзов AVR© 2009 Andrey Demenev". Прочел фьюзы по умолчанию новой микросхемы atmega8 и изменил только те, что отвечают за частоту 8МГц и внутреннесть тактового генератора (CKSEL 0,1,3 отметил галочками=вкл=0). Предварительно очистил память микросхемы (Erase).
7) Прошил заранее скомпилированную (прежнюю, которую делал перед убийством фьюзами прежнего чипа) hex-программу в новый чип.
8) Отключил программатор, включил питание.
Ура, работает:)
Температура одного из датчиков отлична от нуля. 15 с чем-то в условиях пола.
Хочу добавить следующее:
1) по пункту 4: переменная, изменяющая задержки, при такой настройке становится лишней. Мне пришлось потом убрать ее, а точнее выставить на 16 МГц, что бы нивелировать значение поправок.
2) когда я прошил фьюзы вышеуказанным способом, у меня к схеме был подключен кварц на 8 МГЦ, который остался от предыдущих опытов и, когда его отключил, у меня все перестало работать. Я даже подумал что сжег кристалл во время монтажа, купил несколько новых, прошил их... и.. они тоже перестали работать. После установки кварца обратно, они заработали. В таком случае, калькулятор фьюзов, которым я воспользовался работает не верно. А как читать даташит в поисках фьюзов, выходит, я совсем не понимаю. Кроме того, выходит, что то, что получилось - сделано методом тыка, т.к. выставленные фьюзы (SKSEL 0,1,4, set 0 или 1 (так и так сейчас пробовал), boden, bodlevel (true, т.е. галки в uniprof)) расчитаны на использование внутреннего тактового генератора на 8 МГц, а работают только при наличии внешнего.
из 5 прежде нерабочих чипа, после подключения кварца определились три :)