_Ivan_ 0 20 июня, 2010 Опубликовано 20 июня, 2010 · Жалоба http://easymcu.ru/articles/avr/avr_lib/16-...ntrollerov.html вот там в архиве лежит пример для ds18b20 для winavr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
horoc 0 20 июня, 2010 Опубликовано 20 июня, 2010 · Жалоба Что бы не захламлять форум решил спросить здесь. В найденном переводе даташита есть такое предложение. Примечание: обратите особое внимание на формирование импульса восстановления DOUT_HIGH, это так называемый «Активный» импульс восстановления, когда на стандартное заданное время в линию для восстановления уровня закачивается ток с порта контроллера. Этот эффект позволяет значительно улучшить фронт сигнала. Формирование фронтов таким образом - это гарантия работы на удаленные датчики!!! Стоит ли так делать и формировать импульсы ножкой переведенной на вывод, а Z состояние включать только при операциях чтения? При этом последовательно с линией поставить 100 Ом для защиты вывода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 20 июня, 2010 Опубликовано 20 июня, 2010 · Жалоба В найденном переводе даташита есть такое предложение .... О каком DS идёт речь 1820 или 1821? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
horoc 0 20 июня, 2010 Опубликовано 20 июня, 2010 · Жалоба О каком DS идёт речь 1820 или 1821? О 1820. Но какая разница, можно сказать о интерфейсе 1 wire. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shev377 0 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба Давно не посещал эту тему, уже порядком сошёл с ума от этих датчиков, добыл 4 датчика два Ds18b20 и два Ds18s20 И НИОДИН, НИОДИН по примерам из интернета не заработал, ставил другие микроконтроллеры, пробовал с резистором 4.7 между питаниеми данными и без него. Вот например код /***************************************************** Chip type : ATmega32 Program type : Application Clock frequency : 8,000000 MHz Memory model : Small External SRAM size : 0 Data Stack size : 512 *****************************************************/ #include <mega32.h> #asm //сообщаем куда подключен датчик .equ __w1_port=0x12;PORTD .equ __w1_bit=6 #endasm #include <1wire.h> //библиотека работы с 1Wire #include <ds18b20.h> //библиотека для работы с датчиком ds18b20 #include <delay.h> //библиотека задержки #include <stdio.h> //ненаю что за библиотека, но без неё неполучается unsigned char rom_code[8][9]; //масив с адресами найденых датчиков void main(void) { unsigned char devices, i; //переменная в которой количество присоеденённых датчиков, и номер выбранного датчика int temp; //переменная для хранения температуры // Declare your local variables here // Input/Output Ports initialization // Port A initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTA=0x00; DDRA=0xFF; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0xFF; // Port C initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0xBF; PORTC.0=1; w1_init(); devices=w1_search(0xf0,rom_code); //ищим датчики, и записуем их адреса в масив while(devices>0) //бесконечный цикл, если датчик подключон { if(!PINC.0){ //Если нажата кнопка i++; //Увиличиваем переменную "i" на 1 delay_ms(300); //Ждём 300мс для "анти-дребезга" } if(i>=devices){ //Если "i" больше или равно найденым датчикам i=0; //тогда "i" равно нулю } temp=ds18b20_temperature(&rom_code[i][0]); //читаем температуру с выбранного датчика if (temp>1000){ //если датчик выдаёт больше 1000 temp=4096-temp; //отнимаем от данных 4096 temp=-temp; //и ставим знак "минус" } PORTD=0; PORTD.3=1; PORTB=255; PORTB.6=0; PORTB.5=0; PORTB.4=0; PORTB.2=0; PORTB.1=0; delay_ms(1); PORTD=0; PORTD.2=1; PORTB=255; PORTB.7=0; PORTB.6=0; PORTB.3=0; PORTB.2=0; PORTB.1=0; delay_ms(1); PORTD=0; PORTD.1=1; PORTB=255; PORTB.7=0; PORTB.6=0; PORTB.5=0; PORTB.3=0; PORTB.2=0; PORTB.1=0; delay_ms(1); }; while(devices==0) //бесконечный цикл, если датчик не подключон { PORTD=0; PORTD.3=1; PORTB=255; PORTB.6=0; PORTB.5=0; PORTB.3=0; PORTB.2=0; PORTB.1=0; delay_ms(1); PORTD=0; PORTD.2=1; PORTB=255; PORTB.7=0; PORTB.3=0; PORTB.4=0; PORTB.2=0; PORTB.1=0; delay_ms(1); PORTD=0; PORTD.1=1; PORTB=255; PORTB.7=0; PORTB.6=0; PORTB.5=0; PORTB.3=0; PORTB.2=0; PORTB.1=0; delay_ms(1); }; } Прокручивая его я получаю результат выполнения devices=0 тобиш НЕА нет девайсов от даласа ПОЧЕМУ!!!!!!! ставил другой мк, в плате ошибки НЕТ полярность соблюдаю, левая нога GND правая +5v. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба Зачем Вы ищите сразу все датчики , если в системе он один. Сформируйте сигнал Сброс/присутсвие и посмотрите ответит Вам датчик , заодно и проверите временные интервалы. Для начала получите от датчика 85. Алгоритм написан в DS , надо слегка модифицировать. Затем уж делайте поиск нескольких Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shev377 0 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба Я и с одним пробовал, по принципу devices=w1_init() и devices был всегда=0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shev377 0 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба Слушайте! МЕНЯ ОСИНИЛО!!!!!! А может это индивидуальная непереносимость Mega32 16PU xxxсерии датчиков даллас??? У меня ещё мега 48 есть, только её паять страшно, какая она маленькая, может стоит попробовать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 25 июня, 2010 Опубликовано 25 июня, 2010 · Жалоба МЕНЯ ОСИНИЛО!!!!!!В "синем" состоянии, в пятницу, лучше на форум не ходить :) В исходнике 8 МГц, задержки для 1-wire будут исходя из неё. Тактовая частота МК какая в железе-то, фьюзы, и т.п.?.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shev377 0 26 июня, 2010 Опубликовано 26 июня, 2010 (изменено) · Жалоба 8мгц частота, фьюзы те, что с завода (данные из понипрога): Тактируется от своего кварца на ножке ничего кроме IO порта нет, те нет всяких мисо моси итд Уже ни знаю просто что придумать в кач-ве причины Изменено 26 июня, 2010 пользователем shev377 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 26 июня, 2010 Опубликовано 26 июня, 2010 · Жалоба Ну ежели: Тактируется от своего кварца то вот такого никак не должно быть: фьюзы те, что с заводат.к. с завода оно настроено на работу от внутреннего генератора, на частоту 1 МГц. Все задержки для работы с 1-wire у вас в итоге в 8 раз длиннее (компилятор их создал для 8МГц, а вы работаете на 1МГц), и работать оно, ессно, не будет. Вариантов действий у вас два: 1) правильный: читаете раздел "System Clock and Clock Options" даташита на ATMega32, установливаете правильно фьюзы. МК подключит кварц, будет тактироваться от него, и, вероятно, 1-wire заведётся. 2) неправильный или временный: фьюзы не трогаем; в опциях проекта установите частоту 1МГц, перекомпилируйте проект, прошейте, проверьте работу 1-wire... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shev377 0 28 июня, 2010 Опубликовано 28 июня, 2010 · Жалоба А ну наконец-то я понял почему! пойду искать нужные фузы в даташите Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shev377 0 28 июня, 2010 Опубликовано 28 июня, 2010 · Жалоба Изучив вышеизложенную информацию из дш я понял что мне нужно выставить CKSEL 0100 и SUT 00 (вот тут я не уверен) Как это выставить в понипроге? CKSEL3=0 галочка CKSEL2=1 пусто CKSEL1=0 галочка CKSEL0=0 галочка а с SUT подскажите, я немного не понял что это за временные задержки и что мне нужно ставить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shev377 0 28 июня, 2010 Опубликовано 28 июня, 2010 (изменено) · Жалоба прошил фузы код #include <mega32.h> //библиотека ввода\вывода #include <delay.h> //библиотека задержки #asm //сообщаем куда подключен датчик .equ __w1_port=0x12 ;PORTD .equ __w1_bit=6 #endasm #include <1wire.h> //библиотека работы с 1Wire #include <ds18b20.h> //библиотека для работы с датчиком ds18b20 void main(void) { unsigned char devices; //переменная в которой количество присоединённых датчиков int temp; DDRB=255; DDRD.3=1; DDRD.2=1; DDRD.1=1; DDRD.0=1; //переменная для хранения температуры devices=w1_init(); //ищим датчики while(devices>0) //бесконечный цикл, если датчик подключен { temp=ds18b20_temperature(0); //читаем температуру PORTD=0; PORTD.3=1; PORTB=255; PORTB.6=0; PORTB.5=0; PORTB.3=0; PORTB.2=0; PORTB.1=0; PORTD=0; PORTD.2=1; PORTB=255; PORTB.7=0; PORTB.3=0; PORTB.4=0; PORTB.2=0; PORTB.1=0; PORTD=0; PORTD.1=1; PORTB=255; PORTB.7=0; PORTB.6=0; PORTB.5=0; PORTB.3=0; PORTB.2=0; PORTB.1=0; delay_ms(500); //ждём 500мс }; while(devices==0) //бесконечный цикл, если датчик не подключен { PORTD=0; PORTB=255; PORTD.3=1; PORTB.1=0; PORTD=0; PORTD.2=1; PORTD=0; PORTD.1=1; PORTD=0; PORTD.0=1; } } таже фигня, а я уж было обрадовался Изменено 28 июня, 2010 пользователем shev377 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vasily_ 45 28 июня, 2010 Опубликовано 28 июня, 2010 · Жалоба прошил фузы А вы что собрались от встроенного RC работать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться