Перейти к содержанию
    

Вечный вопрос AVR vs DS1821

http://easymcu.ru/articles/avr/avr_lib/16-...ntrollerov.html

вот там в архиве лежит пример для ds18b20 для winavr

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что бы не захламлять форум решил спросить здесь. В найденном переводе даташита есть такое предложение.

 

Примечание: обратите особое внимание на формирование импульса восстановления DOUT_HIGH, это так называемый «Активный» импульс восстановления, когда на стандартное заданное время в линию для восстановления уровня закачивается ток с порта контроллера. Этот эффект позволяет значительно улучшить фронт сигнала. Формирование фронтов таким образом - это гарантия работы на удаленные датчики!!!

 

Стоит ли так делать и формировать импульсы ножкой переведенной на вывод, а Z состояние включать только при операциях чтения? При этом последовательно с линией поставить 100 Ом для защиты вывода.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В найденном переводе даташита есть такое предложение ....

О каком DS идёт речь 1820 или 1821?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Давно не посещал эту тему, уже порядком сошёл с ума от этих датчиков,

добыл 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

тобиш НЕА нет девайсов от даласа

1f53678cd7c3.jpg

 

 

 

 

ПОЧЕМУ!!!!!!! ставил другой мк, в плате ошибки НЕТ полярность соблюдаю, левая нога GND правая +5v.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем Вы ищите сразу все датчики , если в системе он один.

Сформируйте сигнал Сброс/присутсвие и посмотрите ответит Вам датчик , заодно и проверите временные интервалы.

Для начала получите от датчика 85. Алгоритм написан в DS , надо слегка модифицировать.

Затем уж делайте поиск нескольких

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Слушайте! МЕНЯ ОСИНИЛО!!!!!!

А может это индивидуальная непереносимость Mega32 16PU xxxсерии датчиков даллас???

У меня ещё мега 48 есть, только её паять страшно, какая она маленькая, может стоит попробовать?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

МЕНЯ ОСИНИЛО!!!!!!
В "синем" состоянии, в пятницу, лучше на форум не ходить :)

В исходнике 8 МГц, задержки для 1-wire будут исходя из неё. Тактовая частота МК какая в железе-то, фьюзы, и т.п.?..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8мгц частота,

фьюзы те, что с завода (данные из понипрога):

35c32da6eb4c.png

Тактируется от своего кварца

 

на ножке ничего кроме IO порта нет, те нет всяких мисо моси итд

 

Уже ни знаю просто что придумать в кач-ве причины

Изменено пользователем shev377

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну ежели:

Тактируется от своего кварца

то вот такого никак не должно быть:

фьюзы те, что с завода
т.к. с завода оно настроено на работу от внутреннего генератора, на частоту 1 МГц.

 

Все задержки для работы с 1-wire у вас в итоге в 8 раз длиннее (компилятор их создал для 8МГц, а вы работаете на 1МГц), и работать оно, ессно, не будет.

 

Вариантов действий у вас два:

1) правильный: читаете раздел "System Clock and Clock Options" даташита на ATMega32, установливаете правильно фьюзы. МК подключит кварц, будет тактироваться от него, и, вероятно, 1-wire заведётся.

2) неправильный или временный: фьюзы не трогаем; в опциях проекта установите частоту 1МГц, перекомпилируйте проект, прошейте, проверьте работу 1-wire...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

post-58006-1277738734_thumb.png

post-58006-1277738916_thumb.png

post-58006-1277738923_thumb.png

 

 

Изучив вышеизложенную информацию из дш я понял что мне нужно выставить CKSEL 0100 и SUT 00 (вот тут я не уверен)

Как это выставить в понипроге?

CKSEL3=0 галочка

CKSEL2=1 пусто

CKSEL1=0 галочка

CKSEL0=0 галочка

 

 

а с SUT подскажите, я немного не понял что это за временные задержки и что мне нужно ставить

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

прошил фузы

post-58006-1277746176_thumb.png

 

 

код

#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;

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

таже фигня, а я уж было обрадовался

Изменено пользователем shev377

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...