avr-gcc ds18b20 не находит
avr-gcc ds18b20 не находит
Здравствуйте.
Решил я собрать свою первую железку. Выбрал термометр:http://radiokot.ru/lab/controller/18/
Индикацию повесил на резисторах, без транзисторов...как в статье про динамическую индикацию.
Резисторы на 4.7кОм. Индикация пашет на ура.
В приложении код программы.
Никак не могу заставить определится датчик ds18b20.
Подключил по схеме с обычным питанием...что бы уж наверняка найти его...пробовал и паразитное.
Линия данных датчика подтянута на питание резистором 4.7кОм. Пробовал и 220Ом...как в статье.
МК новый, рабочий, частота 1МГц с завода...я фйюзы посмотрел.
Перепробовал кучу библиотек и вообще все, что смог придумать.
Подскажите, может в коде ошибка где?
Заранее спасибо.
Решил я собрать свою первую железку. Выбрал термометр:http://radiokot.ru/lab/controller/18/
Индикацию повесил на резисторах, без транзисторов...как в статье про динамическую индикацию.
Резисторы на 4.7кОм. Индикация пашет на ура.
В приложении код программы.
Никак не могу заставить определится датчик ds18b20.
Подключил по схеме с обычным питанием...что бы уж наверняка найти его...пробовал и паразитное.
Линия данных датчика подтянута на питание резистором 4.7кОм. Пробовал и 220Ом...как в статье.
МК новый, рабочий, частота 1МГц с завода...я фйюзы посмотрел.
Перепробовал кучу библиотек и вообще все, что смог придумать.
Подскажите, может в коде ошибка где?
Заранее спасибо.
- Вложения
-
- main.c
- (4.79 КБ) 625 скачиваний
- Реклама
Re: avr-gcc ds18b20 не находит
— Не говорите мне что делать и я не скажу куда Вам идти...
Re: avr-gcc ds18b20 не находит
Даже нашел пример для gcc...ничерта не работает.
Программатор не отрубаю во время включения устройства...от него питается все.
Теперь выдает все время присутствие датчика...даже если его нет.
Программатор не отрубаю во время включения устройства...от него питается все.
Теперь выдает все время присутствие датчика...даже если его нет.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: avr-gcc ds18b20 не находит
Не увидел в main.c подключения библиотеки ds1820.h
В выше приведенной ссылке все вроде расписано
В выше приведенной ссылке все вроде расписано
Re: avr-gcc ds18b20 не находит
Я либы не использую.
Вот код сброса и проверки присутствия датчика
Далее уже выводим результат на индикатор, включая прерывания и пр.
Считываю присутствие датчика до всего этого для чистоты эксперимента.
Есть датчик или нет, все равно показывает 0. Что происходит с потенциалом на ноге когда мы ставим его на вход, после выхода и просаживания линии в 0? Там остается ноль или появляется 1...вроде как резистор на 4.7кОм должен поднять потенцил на линии в 1...а потом датчик его сбросит, так?
Севетчикам по поиску могу сказать, что я прочел с десяток статей и тьму тредов о датчике...испробовал буквально все. Потому привожу фото и код очень упростил.
Вот код сброса и проверки присутствия датчика
Код: Выделить всё
DDRB = 0xFF;//Ставим на выход
PORTB = 0x00;//Просаживаем линию (лог. 0)
_delay_us(500); (ждем 500 микросекунд)
DDRB = 0x00; (ставим на вход)
_delay_us(10); (ждем еще 10 микросекунд - пробовал и 60 и 70)
if (PINB == 0) (если на линии низкий потенциал, датчик есть)
str[1] = '0';
else
str[1] = '1';Считываю присутствие датчика до всего этого для чистоты эксперимента.
Есть датчик или нет, все равно показывает 0. Что происходит с потенциалом на ноге когда мы ставим его на вход, после выхода и просаживания линии в 0? Там остается ноль или появляется 1...вроде как резистор на 4.7кОм должен поднять потенцил на линии в 1...а потом датчик его сбросит, так?
Севетчикам по поиску могу сказать, что я прочел с десяток статей и тьму тредов о датчике...испробовал буквально все. Потому привожу фото и код очень упростил.
- Реклама
Re: avr-gcc ds18b20 не находит
Желание разобраться - оно похвально.3DRaven писал(а):Я либы не использую.
посмотрите в этом сообщении
Там ссылки на исходник под avr-gcc. В коментариях старался подробно описал что, зачем и почему.
— Не говорите мне что делать и я не скажу куда Вам идти...
Re: avr-gcc ds18b20 не находит
Попробовал ваш код...хорошая мысль циклами читать, пытаясь много раз...пробовать 10 50 60 70 микросекунд ждать...ручками долго 
Файл hardware.h убрал. Перенес enum с SUCCESS внутрь ds1820.h
Поставил определять датчик. На два порта...что бы сравнивать...датчик один, второй порт пустой.
Выдает, что датчик на порту есть, где он есть.
Но температуру не читает все равно...да и определяется датчик через два раза...не понимаю почему.
Частота МК стоит 8МГц от внутреннего кварца. Инициализация порта не делается совсем.
Код чтения температуры
ошибок 50 стоит просто на всякий случай.
Файл hardware.h убрал. Перенес enum с SUCCESS внутрь ds1820.h
Поставил определять датчик. На два порта...что бы сравнивать...датчик один, второй порт пустой.
Выдает, что датчик на порту есть, где он есть.
Но температуру не читает все равно...да и определяется датчик через два раза...не понимаю почему.
Частота МК стоит 8МГц от внутреннего кварца. Инициализация порта не делается совсем.
Код чтения температуры
Код: Выделить всё
int errors = 50;
int16_t temperature = 0;
while (((ds1820_get_temp(DS1820_1, &temperature))!=SUCCESS)&&(errors>0)) {
errors--;
}
char buffer[16] = "";
sprintf(buffer, "t=%i.%i", temperature, temperature%1);
str[3]=buffer[2];- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: avr-gcc ds18b20 не находит
if (PINB == 0) (если на линии низкий потенциал, датчик есть)
Вы читаете весь порт В - а на остальных пинах подтяжки есть? Или может что-то еще на пинах болтается. Без поттяжки возможны наводки. Лучше читать конкретный пин, подтянутый 4,7К.
Вы читаете весь порт В - а на остальных пинах подтяжки есть? Или может что-то еще на пинах болтается. Без поттяжки возможны наводки. Лучше читать конкретный пин, подтянутый 4,7К.
Re: avr-gcc ds18b20 не находит
Перечитайте внимательней исходник.3DRaven писал(а):Но температуру не читает все равно...да и определяется датчик через два раза...не понимаю почему.
Частота МК стоит 8МГц от внутреннего кварца. Инициализация порта не делается совсем.
Отдельной экспортируемой функции определения наличия датчика нет.
функция start проверяет наличие датчика и если он есть, то сразу дает команду на измерение температуры. Естественно 750 милисек датчик ни на какие раздражители отвечать не будет.
Инициализация порта и не нужна, главное что-бы остальная программа не трогала настройки этого пина.
— Не говорите мне что делать и я не скажу куда Вам идти...
Re: avr-gcc ds18b20 не находит
Да. Исходник я перечитал...кстати, отлично написано...люблю хороший код.
Только не работает ничего. Я не думаю, что дело в исходнике...он полностью верен...я уже насмотрелся столько, что могу судить об этом. Думаю дело в том как я собрал схему. Само подключение датчика...или еще что. Например программатор подрублен к схеме прошивочным проводом, по ISP...от него схема питается. Далее может наводки, погода на марсе и полнолуние опять же. В общем я уже просто не знаю. Может кондером подтянуть шину 1виры к питанию...поставить 0.01 мкф что бы наводки гасил?
В приложении весь код программы в текущем виде...что только я не попробовал...может инициализация какая то особая нужна?
Может как то можно проверить мультиметром...может датчик дохлый?
Взгляните на фото макетной платы...может я неверно собрал что то.
Прям руки опускаются
Только не работает ничего. Я не думаю, что дело в исходнике...он полностью верен...я уже насмотрелся столько, что могу судить об этом. Думаю дело в том как я собрал схему. Само подключение датчика...или еще что. Например программатор подрублен к схеме прошивочным проводом, по ISP...от него схема питается. Далее может наводки, погода на марсе и полнолуние опять же. В общем я уже просто не знаю. Может кондером подтянуть шину 1виры к питанию...поставить 0.01 мкф что бы наводки гасил?
В приложении весь код программы в текущем виде...что только я не попробовал...может инициализация какая то особая нужна?
Может как то можно проверить мультиметром...может датчик дохлый?
Взгляните на фото макетной платы...может я неверно собрал что то.
Прям руки опускаются
- Вложения
-
- main.c
- (5.15 КБ) 568 скачиваний
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: avr-gcc ds18b20 не находит
самая типичная ошибка начинающих - это скомпилировать код для работы с 1-wire под одну тактовую частоту микроконтроллера, а потом прошить его в МК, настроенный на совсем иную частоту. для смеху попробуйте в свой код добавить небольшой цикл мигания светодиодом 1 раз в секунду и посмотрите в реальности, с какой частотой оно мигает 
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: avr-gcc ds18b20 не находит
Индикация у меня на прерывании висит. Когда с температурой работаю, я их запрещаю.
В обработке температуры я использую либовые функции задержки _delay_us...хотя с готовой
предложенной мне либой это вообще не требуется теперь. Частота 4МГц выставлена. В коде
это прописано, фьюзы поставлены по редактору фьюзов.
Но. Проверил. Поставил задержку моргания 5с. Раз в 5с моргает.
То есть я поставил запрет прерывания и ожидание 5с. В результате динамическая индикация
стала переключать разряды раз в пять секунд. Так что тут все норм.
В первом посте были фоты макетки...может все же собрал неверно?
Например подтягивающий резистор на датчике так можно ставить на питание?
В обработке температуры я использую либовые функции задержки _delay_us...хотя с готовой
предложенной мне либой это вообще не требуется теперь. Частота 4МГц выставлена. В коде
это прописано, фьюзы поставлены по редактору фьюзов.
Но. Проверил. Поставил задержку моргания 5с. Раз в 5с моргает.
То есть я поставил запрет прерывания и ожидание 5с. В результате динамическая индикация
стала переключать разряды раз в пять секунд. Так что тут все норм.
В первом посте были фоты макетки...может все же собрал неверно?
Например подтягивающий резистор на датчике так можно ставить на питание?
Последний раз редактировалось 3DRaven Вс янв 15, 2012 16:40:58, всего редактировалось 1 раз.
Re: avr-gcc ds18b20 не находит
Например тут:
Хотя я вроде указал между ds1820_start и ds1820_get_temp необходимо занять чем-нить микроконтроллер!
хоть _delay_ms(800); поставьте.
В отличие от большинства библиотек тут нет задержки на время измерения!
Контроллер может выполнять другие задачи и только раз в 750 милисек (или реже) опрашивать датчик.
Примерно так:
Код: Выделить всё
if (ds1820_start(DS1820_1) == SUCCESS) {
int errors = 5;
while (((ds1820_get_temp(DS1820_1, &temperature))!=SUCCESS)&&(errors>0)) {
errors--;
}
хоть _delay_ms(800); поставьте.
В отличие от большинства библиотек тут нет задержки на время измерения!
Контроллер может выполнять другие задачи и только раз в 750 милисек (или реже) опрашивать датчик.
Примерно так:
Код: Выделить всё
int main() {
//только включили - инициализация
if (ds1820_start(DS1820_1) != SUCCESS) {
// пометили для себя, что с датчиком проблемы
}
... много чего инициализирует, в том числе и таймер или счетчик...
for (;;) { // а вот и основной цикл
if (после старта прошло 750мсек) {
ds1820_get_temp(DS1820_1, &temperature); //получили измеренное
// и сразу запускаем новое измерение
if (ds1820_start(DS1820_1) != SUCCESS) {
// пометили для себя, что с датчиком проблемы
}
//TODO сбросить счетчик/таймер 750милисек
}
...
// Другие задачи и изменение счетчика времени
...
}
}
— Не говорите мне что делать и я не скажу куда Вам идти...
Re: avr-gcc ds18b20 не находит
Запрещать не надо3DRaven писал(а):Индикация у меня на прерывании висит. Когда с температурой работаю, я их запрещаю.
Критичные участки выполняются в блоке ATOMIC. Компилятор сам запретит прерывания и восстановит по окончании блока.
— Не говорите мне что делать и я не скажу куда Вам идти...
Re: avr-gcc ds18b20 не находит
Сделал так:
Датчик то он вроде показывает...то есть в цикле он работает с sprintf и выводом на индикатор...там выводится 0-0. То есть температуру он считывать никак не хотит...конечно где то что то я делаю не так...но...я уже столько перепробовал, что замылен глаз наверное...и знаний маловато.
Что касается запретов прерываний...пока критично опросить датчик, разберусь с ним, разберусь с остальным...но за совет спасибо.
Код: Выделить всё
while (1) {
cli();
int16_t temperature = 0;
if (ds1820_start(DS1820_1) == SUCCESS) {
_delay_ms(400);
_delay_ms(400);
int errors = 5;
while (((ds1820_get_temp(DS1820_1, &temperature))!=SUCCESS)&&(errors>0)) {
errors--;
}
char buffer[16] = "";
sprintf(buffer, "%i-%i", temperature, temperature%1);
str[0] = ' ';
str[1] = buffer[0];
str[2] = buffer[1];
str[3] = buffer[2];
}
sei();
}Датчик то он вроде показывает...то есть в цикле он работает с sprintf и выводом на индикатор...там выводится 0-0. То есть температуру он считывать никак не хотит...конечно где то что то я делаю не так...но...я уже столько перепробовал, что замылен глаз наверное...и знаний маловато.
Что касается запретов прерываний...пока критично опросить датчик, разберусь с ним, разберусь с остальным...но за совет спасибо.
Re: avr-gcc ds18b20 не находит
Еще, Вы учли, что температура возвращается "как есть"?
Т.е. для DS12b20 при температуре 25 град вернется 200.
sprintf(buffer, "%i-%i", temperature/8, (temperature/8)%1);
Может так?
Т.е. для DS12b20 при температуре 25 град вернется 200.
sprintf(buffer, "%i-%i", temperature/8, (temperature/8)%1);
Может так?
— Не говорите мне что делать и я не скажу куда Вам идти...
Re: avr-gcc ds18b20 не находит
Да он бы хоть что то показал...так там ведь 0...он переменную не меняет.
Поставишь начальное значение 1, будет 1.
Он ведь температуру только 5 раз пытается прочесть...и всегда неудачно.
Буду пробовать что то еще. Завтра куплю стабилизатор напряжения на питание
и буду пробовать питать от блока питания...может дело в подключенном программаторе.
Поставишь начальное значение 1, будет 1.
Он ведь температуру только 5 раз пытается прочесть...и всегда неудачно.
Буду пробовать что то еще. Завтра куплю стабилизатор напряжения на питание
и буду пробовать питать от блока питания...может дело в подключенном программаторе.
Re: avr-gcc ds18b20 не находит
Вот это уже интереснее...3DRaven писал(а):Да он бы хоть что то показал...так там ведь 0...он переменную не меняет.
Поставишь начальное значение 1, будет 1.
Вместо
Код: Выделить всё
int errors = 5;
while (((ds1820_get_temp(DS1820_1, &temperature))!=SUCCESS)&&(errors>0)) {
errors--;
}
...
sprintf(buffer, "%i-%i", temperature, temperature%1);
Код: Выделить всё
int errors = 5;
errors=ds1820_get_temp(DS1820_1, &temperature);
...
sprintf(buffer, "%i", errors);
— Не говорите мне что делать и я не скажу куда Вам идти...
Re: avr-gcc ds18b20 не находит
Выводит 3.
Насколько я понимаю это SHORT
Вот код оттуда:
Это с читалки температуры.
Я вот подумал, может быть это еще связано еще и с тем, что у меня один сегмент на индикаторе пробит...но индикатор подключен к портам С D.
Завтра куплю датчик, стабилизатор, индикатор новые.
Насколько я понимаю это SHORT
Вот код оттуда:
Код: Выделить всё
int err=1000;
_DDRx&=~_MASK; //Порт на чтение
#if USE_Watchdog==1
wdt_reset(); //Сброс собаки
#endif
/*Пока на линии 0 - ждем,но не более 10 милисек.*/
while ( (_PINx&_MASK)==0 ) {
if (err==0) return SHORT;
err--;
_delay_us(10);
}Я вот подумал, может быть это еще связано еще и с тем, что у меня один сегмент на индикаторе пробит...но индикатор подключен к портам С D.
Завтра куплю датчик, стабилизатор, индикатор новые.
Re: avr-gcc ds18b20 не находит
А подтягивающий резистор стоит? Какой?
— Не говорите мне что делать и я не скажу куда Вам идти...


