atmega8+ds18b20 не определяется температура

usr-bin
Offline
Зарегистрирован: 04.09.2012

Здравствуйте.

Предисловие: я написал программу, которая делает то, что мне нужно на 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 ?

usr-bin
Offline
Зарегистрирован: 04.09.2012
usr-bin
Offline
Зарегистрирован: 04.09.2012

админу:

1) в конце ссылок добавляется обратная косая черта, в результате ссылки неработоспособны.

2) при редактировании сообщения со ссылками, они перестают быть ссылками после редактирования (и при редактировании показываются синим только при наведении).

Может быть глюк после переезда?

usr-bin
Offline
Зарегистрирован: 04.09.2012

исправление: сегодня встало солнце и я увидел, что маркировка моей микросхемы atmega8A-PU

даташит

maksim
Offline
Зарегистрирован: 12.02.2012

Вы не верные выводы делаете.

usr-bin пишет:
кварц подключен такой, что она работает (затрудняюсь назвать частоту, ибо марка не гуглится - "HB-2 9109"), полагаю, что на 16 МГц, иначе бы оно не работало.  По даташиту atmega8 без буквы L  может работать от 0 до 16 МГц.

Если кварц поставить на 12 МГц, то atmega8 будет без проблем работать, НО если бы вы почитали про протокол  1-Wire, вы бы знали, что он строго привязан к времени, а значит изменение тактовой частоты МК приведет к изменению задержек, так что можно с уверенностью сказать что у вас кварц стоит не на 16 МГц.

usr-bin пишет:
При работе от встроенных в чип 1МГц температура так же не меряется. Другие частоты не пробовал, да и зачем, если freeduino на atmega 168 работает на 16 МГц'ах и прекрасно считывает температуру.

На 1МГц не заработало от того что в библиотеке 1-Wire нет расчета задержек для частоты 1МГц, если бы запустили на внутреннем генераторе 8МГц, то все бы заработало.

 

 

 

usr-bin
Offline
Зарегистрирован: 04.09.2012

а почему на 8 МГц ?

Ведь фридуина работает на 16ти, а значит - библиотека расчитана на задержки при 16 МГц'ах и на 8 МГц'ах задержки будут в два раза длиннее.

И еще: кто говорит библиотеке на какой частоте работает контроллер? Компилятор, прошивальщик или какие-то константы в программе/библиотеках?

Используемую библиотеку DallasTemperature 3.7.2 прошерстил вдоль и поперек, дифференциации по частотам и, соответственно, по длительности задержек не обнаружил. Там только есть диффенциация по битности сигнала - для каждого свои задержки, но это иное.

 

П.С. изменять задержки в самой библиотеке, деля их на х (где х=16/<частота в МГц>) пробовал, эффекта не было.

maksim
Offline
Зарегистрирован: 12.02.2012

1. Смотреть надо не DallasTemperature, а OneWire.
2. А частоту с которой нужно работать компилятор берет отсюда: Дуина\\arduino-1.0\\hardware\\arduino\\boards.txt 

usr-bin
Offline
Зарегистрирован: 04.09.2012

Ура, получилось!!! :)

Сообщу, что я сделал, вдруг кому пригодится, да и мне что бы не забыть :) :

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 с чем-то в условиях пола.

usr-bin
Offline
Зарегистрирован: 04.09.2012

Хочу добавить следующее:

1)  по пункту 4: переменная, изменяющая задержки, при такой настройке становится лишней. Мне пришлось потом убрать ее, а точнее выставить на 16 МГц, что бы нивелировать значение поправок.

2) когда я прошил фьюзы вышеуказанным способом, у меня к схеме был подключен кварц на 8 МГЦ, который остался от предыдущих опытов и, когда его отключил, у меня все перестало работать. Я даже подумал что сжег кристалл во время монтажа, купил несколько новых, прошил их... и.. они тоже перестали работать. После установки кварца обратно, они заработали. В таком случае, калькулятор фьюзов, которым я воспользовался работает не верно. А как читать даташит в поисках фьюзов, выходит, я совсем не понимаю. Кроме того, выходит, что то, что получилось - сделано методом тыка, т.к. выставленные фьюзы (SKSEL 0,1,4, set 0 или 1 (так и так сейчас пробовал), boden, bodlevel (true, т.е. галки в uniprof)) расчитаны на использование внутреннего тактового генератора на 8 МГц, а работают только при наличии внешнего.

из 5 прежде нерабочих чипа, после подключения кварца определились три :)