Сколько DS18B20 может обслужить Atmega16

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Во-первых писать надо не в RAM а в EEPROM, иначе при сбросе/выключении вы потеряяте все данные, для расширения памяти рекомендую использовать I2C мелкосхемы памяти типа 24Lxxx
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Vov123 писал(а):При обнаружении устройства контроллер должен прописать ROM-код в RAM. А у Mega16 его как известно 1000 байт.
А что - мега16, в отличие от остальных мег, с внешней памятью работать не может? Странные ребята, эти атмеловцы, непоследовательные какие-то... :?
Впрочем, внешняя память и не понадобится, я полагаю, так как с практической точки зрения, монтировать, обслуживать будет проще небольшие кусты от 16 до 64 датчиков, расположенные на небольшом расстоянии от контроллера.
Vov123 писал(а):ROM-код у DS18B20 составляет 8 байт.
1 байт - это CRC, его хранить не нужно, еще 1 байт - код семейства, его тоже хранить незачем, так как, по условиям задачи, подключаться будут датчики одного семейства, а может даже одного типа. Это я говорю автору вопроса на заметку - чтобы учел, что тут можно сэкономить.

Кстати, длина кода одинакова у всех 1-wire устройств, если мне память ни с кем не изменяет, ссылаться на DS18B20 необязательно.
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 231
Зарегистрирован: Пн мар 30, 2009 15:58:32
Откуда: Украина Запорожье

Сообщение lkote68 »

Вы правы тигра я уже обдумывал оптимизацию. Читал их номера CRC и код семейства я откинул Это так Остальных заполненных байт у меня оказалось 4. Остальные ноль. Нафик их хранить :))
Кстати что означает в вашей последней фразе "ссылаться на DS18B20 необязательно." И еще вы мне рекомендовали дополнять посты Убей не вижу возможности Я на форумах недавно
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

lkote68 писал(а):я уже обдумывал оптимизацию. ... заполненных байт у меня оказалось 4. Остальные ноль. Нафик их хранить :))
А есть гарантия, что в будущих экземплярах два старших байта тоже будут нулевыми? Если есть договоренность с Далласом, то тогда канешна... :)
lkote68 писал(а):Кстати что означает в вашей последней фразе "ссылаться на DS18B20 необязательно."
Просто, Vov123 так высказался, что у кого-нибудь могло сложиться мнение, будто длина ROM-кода равна 8 байтам именно у DS18B20, я поправил его, на всякий случай.
lkote68 писал(а):... рекомендовали дополнять посты Убей не вижу возможности Я на форумах недавно
В своих постах есть кнопочка - Изображение
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Аватара пользователя
Сообщения: 231
Зарегистрирован: Пн мар 30, 2009 15:58:32
Откуда: Украина Запорожье

Сообщение lkote68 »

Уважаемые Коты. Благодаря Вашему тыканию меня носом в нужные источники моя прога заработала и теперь я в сети вижу 10датчиков. Все вроде тип топ. Но есть еще два вопроса меня беспокоящие. Вопрос 1. Если моя сеть будет ну довольно протяженная ну скажем метров 50. Не надо ли как нибудь саму сеть гальванически отвязывать от контроллера.
Вопрос 2. Хотелось бы все таки разнести датчики по ветвям. Генератор кода CodeVisionа устанавливает константу номер порта куда подвешена сеть .equ __w1_bit=6 Если бы писать на асме можно бы было расписать опрос на все 8 ног порта. Кто знает как можно пререопределить по ходу работы программы значение константы __w1_bit=6. Есть правда еще один выход ключи ветвления сети DS2405 и др но у меня их нет и с ними я еще не працювал и купить попробовать не могу так как в наличии их нет на самой нашей продвинутой фирме. И могут примезти под заказ только партию.
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

lkote68 писал(а):Вопрос 1. Если моя сеть будет ну довольно протяженная ну скажем метров 50. Не надо ли как нибудь саму сеть гальванически отвязывать от контроллера.
Если я правильно помню, в стандарте определена макс. емкость линии - вот от нее и плясать. И еще, если опять-таки мне память ни с кем не изменяет, была там речь о дополнительной подтяжке к питанию, если линия длинная.
lkote68 писал(а):Вопрос 2. Хотелось бы все таки разнести датчики по ветвям. Кто знает как можно пререопределить по ходу работы программы значение константы __w1_bit=6.
Я бы посоветовал модифицировать библиотеку, добавив в нее дополнительным параметром номер пина, в который "дуть" (если совсем туго будет, можно и порт на ходу менять, но это уж немного сложнее, по-моему, хотя и не бином Ньютона).
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 231
Зарегистрирован: Пн мар 30, 2009 15:58:32
Откуда: Украина Запорожье

Сообщение lkote68 »

Линия Тигра у меня подтянута 4.7k Датчики планирую запитать и табличку с номиналами в зависимости от длины я у Далласа видел. Цель преследую слегка другую чтобы сеть можно было сегментировать скажем датчиков по 15. Если отвалится сегмент то небольшой. Я же по этому про DS2405 сказал. А насчет развязки спросил а кто знает что там будет вдруг разряд какой или всунет кто то в сеть :-)
А вот насчет библиотеки и смены порта не могли бы Вы неразумного на путь истинный направить. Библиотека она на то что бы ею пользоваться а вот как ее мона редактить это уже высший пилотаж.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Ну, вовсе необязательно редактировать саму библиотеку, да и не нужно это делать - я говорил о том, чтобы взять из неё текст всех 1-w функций, перенести его в свой программный модуль и уже там модифицировать. Ты каким компилятором пользуешься? Я что-то не нашел указания на это в теме.

Кстати, если разветвление сети нужно только для исключения обрыва большого сегмента, то я думаю, что вполне можно и без DS2405 обойтись - он ведь только затем и нужен, чтобы отключать неиспользуемые сегменты, а тебе это не нужно, так как у тебя на одном м/к будет немного датчиков. Я бы не дергался вовсе - повесил бы несколько шлейфов на одну ногу и использовал бы библиотечные функции - двух заяйцев, одним выстрелом! Изображение
Прорезались зубы
Аватара пользователя
Сообщения: 231
Зарегистрирован: Пн мар 30, 2009 15:58:32
Откуда: Украина Запорожье

Сообщение lkote68 »

Yellow Tiger писал(а):Ну, вовсе необязательно редактировать саму библиотеку, да и не нужно это делать - я говорил о том, чтобы взять из неё текст всех 1-w функций, перенести его в свой программный модуль и уже там модифицировать. Ты каким компилятором пользуешься? Я что-то не нашел указания на это в теме.
Пользуюсь CodeVision по моему для быстрого старта самэ той.
Асма я для Аtmel не знаю. А С перенес с программирования для ПК. И насколько понимаю библиотека это практически бинарник. Компилятор оттуда надергивает функций которые в хэдерах. Поэтому как оттуда можна надергать функций вопрос.
Ну а насчет на одну ногу я бы и вешал. Работодатель грит а ведь можно на разные чтоб у нас если замкнуло мы особо не кипишевали. Я грю мона только сложнее и дольше будет.(на асме на много его еще изучить)
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

lkote68 писал(а):насколько понимаю библиотека это практически бинарник. ... Поэтому как оттуда можна надергать функций вопрос.
Не, там все гораздо интересней. :) Во-первых, библиотеки лежат в виде сишных текстов в каталоге "...\CVAVR\lib", но это не все - перед компиляцией CvAvr генерит один сишный исходник ({имя_проекта}__.c), в котором объединяет все Си-исходники, входящие в проект, вот оттуда можно взять все библиотечные модули никуда далеко не отходя. :)
Наконец, самое смешное, что некоторые функции хранятся в исполняемом модуле cvavr.exe (например, w1_init(), w1_read(), w1_write() и некоторые другие), я не знаю, нафига сделан такой странный ход, но и эти функции все же можно получить - из asm-листинга проекта (низовые написаны на asm'е).
lkote68 писал(а):Ну а насчет на одну ногу я бы и вешал. Работодатель грит а ведь можно на разные чтоб у нас если замкнуло мы особо не кипишевали.
Я бы посчитал, что дешевле - на каждый кластер (сколько они согласны включать в один сегмент) датчиков вешать одну тиньку (один бакс всего), но не тратиться на написание лишнего кода и не закладывать будущие грабли, либо сэкономить на самом дешевом (на тиньках) ценой дополнительного кодирования и дополнительных граблей, которые еще больше увеличат и сроки и стоимость, а потом предложил бы заказчику выбирать из этих двух сумм. В конце концов, если им очень хочется оплатить твое обучение ассемблеру, то пуркуа бы и не па? :)))

Кстати, поскольку тайминги обмена по 1-wire сети довольно жестко оговорены, может статься, что параллельная обработка нескольких сетей одним м/к окажется этому м/к не под силу... Не подсчитывал - просто догадка, которую необходимо проверить.
Прорезались зубы
Аватара пользователя
Сообщения: 231
Зарегистрирован: Пн мар 30, 2009 15:58:32
Откуда: Украина Запорожье

Сообщение lkote68 »

О это интересно. Посмотрел. Мне и в голову не пришло либы глядеть. Нашел асмовский файл. А вот __.с у меня нет. Кстати Тигра не подскажешь на твой взляд толковый мануал по таким Сям (отличается)и Асму для атмела.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

lkote68 писал(а):Мне и в голову не пришло либы глядеть.
Преимущество малого формата - можно хранить либы в исходниках. :)))
lkote68 писал(а):Нашел асмовский файл. А вот __.с у меня нет.
Хм, первый такой случай. Наверное, я что-то о CvAvr упустил. Или ты не туда смотришь. :)))
lkote68 писал(а):не подскажешь на твой взляд толковый мануал по таким Сям (отличается)и Асму для атмела.
Хм... это ж надо знать, чего те в мануале нужно, а я твоих требований не представляю. Так, навскидку:
- хэлп от CvAvr'а - обязательно. Причем, я его поначалу в текст сконвертил и читал в редакторе с использованием поиска, отрабатывая все кросс-ссылки прямо по мере их прочтения - для первого раза, процедура очень полезная, хотя башню может снести за один вечер. :))) Зато потом читается значительно эффективнее.
- апнота от Атмела "Эффективное программирование на С для м/к AVR" (AVR035: Efficient C Coding for AVR), - неплохое дополнение, хотя, в самом начале может оказаться невовремя, смотря, что за "начало".
- есть еще цельнотянутые книжки, типа Шпаковской "прогр-е для м/к Pic и AVR" и еще каких-то, но их ценность, на мой взгляд, такова, что я бы рекомендовал их читать только в том случае, если ничего другого нет.
По асму я читал только родную доку, но я на нем много и не пишу.
Прорезались зубы
Аватара пользователя
Сообщения: 231
Зарегистрирован: Пн мар 30, 2009 15:58:32
Откуда: Украина Запорожье

Сообщение lkote68 »

Уважаемые Коты. Кому интересно запитать свои датчики паразитно. Все заработало с параметрами как в даташите.
Это возможно решит проблему тех из котов которые жалуются на нагрев датчиков.
В библиотеке ds18b20.lib есть функция

float ds18b20_temperature(unsigned char *addr)
{
unsigned char resolution;
if (ds18b20_read_spd(addr)==0) return -9999;
resolution=(__ds18b20_scratch_pad.conf_register>>5) & 3;
if (ds18b20_select(addr)==0) return -9999;
w1_write(0x44);
PORTA.2 = 1;
delay_ms(conv_delay[resolution]);
PORTA.2 = 0;
if (ds18b20_read_spd(addr)==0) return -9999;
w1_init();
return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & ((int) bit_mask[resolution]))*0.0625;
}

и еще одной функции надо сделать изменение


unsigned char ds18b20_init(unsigned char *addr,signed char temp_low,signed char temp_high,
unsigned char resolution)
{
if (ds18b20_select(addr)==0) return 0;
resolution=(resolution<<5) | 0x1f;
w1_write(0x4e);
w1_write(temp_high);
w1_write(temp_low);
w1_write(resolution);
if (ds18b20_read_spd(addr)==0) return 0;
if ((__ds18b20_scratch_pad.temp_low!=temp_low) ||
(__ds18b20_scratch_pad.temp_high!=temp_high) ||
(__ds18b20_scratch_pad.conf_register!=resolution)) return 0;
if (ds18b20_select(addr)==0) return 0;
w1_write(0x48);
PORTA.2 = 1;
delay_ms(15);
PORTA.2 = 0;
return w1_init();
}

После подключить как в схеме приложения. Ну естественно номер порта выбирайте сами.
Осталась последняя проблема переработать функи чтоб разнести датчики по ногам порта. Мы не сдаемся YellowTiger :))
Вложения
1.PNG
(548 байт) 520 скачиваний
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Я тебе здесь набросок развязки 1-wire шины выкладывал, а ты не ответил; я решил, что тебе это больше не нужно, а теперь вижу - ты продолжаешь копать (но - без развязки :))).
Прорезались зубы
Аватара пользователя
Сообщения: 231
Зарегистрирован: Пн мар 30, 2009 15:58:32
Откуда: Украина Запорожье

Сообщение lkote68 »

Привет тигра. Конечно продолжаю, самому интересно довести до ума и разобраться. Я же лет много '8' паяльник не брал в руки. Вот еще думаю упростить этот соствной транзистор. Ты конечно выкусил набросок. А я не сохранил думал тут он и полежит. Просто ем слона по кускам, до ушей надрезать не охота :)) И развязку как нибудь реализую. Сегодня позакаментил функи посмотрел на init read write...
В принципе реализуемо распаралеливание.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Да я просто решил, что тебе уже не интересно, так как ты долго молчал. Нет ничего сложного в том, чтобы повторить тот пост, раз он-таки еще интересен. Вот только перерисовывать влом, так что на ляпы не смотри, торопился я. :)))
Итак: Пн Май 04, 2009 21:17:04 я написал:
Мысль относительно развязки 1-wire вертелась приблизительно такая:
Изображение
Обычных обозначений здесь нет, потому поясню - в начале и в конце - м/к, на концах двух подтянутых пуллапами (PU1, PU2) линий - оптопары, между оптопарами и м/к - буферы с третьим состоянием. В данном варианте состояние обоих концевых буферов управляется только ведущим контроллером (тем, что слева), но при необходимости можно второму м/к (там может быть и 1-w датчик) разрешить рулить своим звеном. По-моему, это ничего не даст, но как вариант держать в уме надо - вдруг в этом решении есть что-то полезное?
За фазировкой нулей/единиц не следил (это уже дело техники) - время экономлю, извини. Хотя, похоже, что всего и делов-то - добавить пуллапы и ко вторым оптронам, как они добавлены к первым.
Сомнение вызывает способность оптронов передавать частотки, необходимые для 1-wire, там счет на мегагерцы. Может быть, шинные формирователи спасут.

Вот такой вот эскиз.

P.S. В спешке ошибся в направлении передачи оптронов нижней линии - там стрелки справа-налево!
Последний раз редактировалось Yellow Tiger Ср июн 03, 2009 21:12:57, всего редактировалось 1 раз.
Прорезались зубы
Аватара пользователя
Сообщения: 231
Зарегистрирован: Пн мар 30, 2009 15:58:32
Откуда: Украина Запорожье

Сообщение lkote68 »

Уважаемые коты Извините ошибочку допустил - в схемке вложения не дорисовал подтягивающий резистор. Вот здесь уже все то.
Тигра пасиба
Вложения
1.PNG
(546 байт) 466 скачиваний
Прорезались зубы
Аватара пользователя
Сообщения: 231
Зарегистрирован: Пн мар 30, 2009 15:58:32
Откуда: Украина Запорожье

Сообщение lkote68 »

Всем привет. ТигроКотик Ау. Я тута распаралелил на 5,6 вывод тенденция понятна. Паралелил так. Создал глобальную переменную которая будет содержать номер пина. И изменил 3 функи в асемблере

_w1_init:
ldi r16,5
cpse r13,r16
jmp _init_pin6

clr r30
cbi __w1_port,__w1_bit_5
sbi __w1_port-1,__w1_bit_5
__DELAY_USW 0x1E0
cbi __w1_port-1,__w1_bit_5
__DELAY_USB 0x13
sbis __w1_port-2,__w1_bit_5
ret
__DELAY_USB 0x65
sbis __w1_port-2,__w1_bit_5
inc r30
__DELAY_USW 0x186
ret
_init_pin6:
clr r30
cbi __w1_port,__w1_bit_6
sbi __w1_port-1,__w1_bit_6
__DELAY_USW 0x1E0
cbi __w1_port-1,__w1_bit_6
__DELAY_USB 0x13
sbis __w1_port-2,__w1_bit_6
ret
__DELAY_USB 0x65
sbis __w1_port-2,__w1_bit_6
inc r30
__DELAY_USW 0x186
ret

__w1_read_bit:
ldi r16,5
cpse r13,r16
jmp _read_bit_6

sbi __w1_port-1,__w1_bit_5
__DELAY_USB 0x3
cbi __w1_port-1,__w1_bit_5
__DELAY_USB 0xF
clc
sbic __w1_port-2,__w1_bit_5
sec
ror r30
__DELAY_USB 0x6B
ret
_read_bit_6:
sbi __w1_port-1,__w1_bit_6
__DELAY_USB 0x3
cbi __w1_port-1,__w1_bit_6
__DELAY_USB 0xF
clc
sbic __w1_port-2,__w1_bit_6
sec
ror r30
__DELAY_USB 0x6B
ret

__w1_write_bit:
ldi r16,5
cpse r13,r16
jmp _write_bit_6

clt
sbi __w1_port-1,__w1_bit_5
__DELAY_USB 0x3
sbrc r23,0
cbi __w1_port-1,__w1_bit_5
__DELAY_USB 0x11
sbic __w1_port-2,__w1_bit_5
rjmp __w1_write_bit0
sbrs r23,0
rjmp __w1_write_bit1
ret
_write_bit_6:
clt
sbi __w1_port-1,__w1_bit_6
__DELAY_USB 0x3
sbrc r23,0
cbi __w1_port-1,__w1_bit_6
__DELAY_USB 0x11
sbic __w1_port-2,__w1_bit_6
rjmp __w1_write_bit0
sbrs r23,0
rjmp __w1_write_bit1
ret
__w1_write_bit0:
sbrs r23,0
ret

__w1_write_bit1:
ldi r16,5
cpse r13,r16
jmp _write_bit1_6

__DELAY_USB 0x64
cbi __w1_port-1,__w1_bit_5
__DELAY_USB 0x7
set
ret
_write_bit1_6:
__DELAY_USB 0x64
cbi __w1_port-1,__w1_bit_6
__DELAY_USB 0x7
set
ret


И не поверишь даже работает Ну правда пока только search но думаю
все остальные тоже будут. Тока сварил сразу ж кричу :))
Вот мне не хватает твоих знаний
1. как это красиво упаковать
2. Были версии моих изменений тоже вроде нормальные но вот CodeVision по моим подозрениям писал в чип старую версию из буфера. А сейчас грит буфер пуст давайте зальем туда новую и все ж поехало. Вот только я не уследил как его заставить буфер очищать.[/b]
Последний раз редактировалось lkote68 Чт май 21, 2009 10:14:39, всего редактировалось 3 раза.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

lkote68 писал(а):1. как это красиво упаковать
Я посмотрю, но уже не сегодня, плотная неделька выдалась. :)
Прорезались зубы
Аватара пользователя
Сообщения: 231
Зарегистрирован: Пн мар 30, 2009 15:58:32
Откуда: Украина Запорожье

Сообщение lkote68 »

Насчет упаковать. Я сейчас делаю как. Задаю номер пина в глобальную преременную и вызываю стандартную функции
w1_search().....
Компилю и лезу а асм файл Потом заменяю те функи в асм файле на мои с теми же именами, асемблю прошиваю и готово. Но хотелось бы без таких заверченных телодвижений. Чтобы записать их а они подставлялись сами.
Кстати проверил работает и ds18b20_temperature(unsigned char *addr)
Сегодня купят мне разъемчики чтоб ДСок насовать и ключи Соберу сообщу.
Во вложении полный текст функции.
Внимание кто скачал функа была с ошибкой Эта проверена и работает.
Работать будет если глобальная переменная хранится в R5. Иначе пока не придумал Если у кого есть мысли высказывайте. Функции конечно переделаны не оптимально просто не особо времени в алгоритмах разбираться Просто куски накопированы и кое что поменяно.
В результате сеть будет разбита на 8 кустов. :)) :))
Вложения
zaplatka.c
более поздняя версия тоже все на асме не смотрите на расширение. Проверено в полевых условиях :-))
(9.54 КБ) 259 скачиваний
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»