Страница 11 из 59

Re: Всё по DS18(B/S)20.

Добавлено: Ср июл 18, 2012 22:34:26
shads
Леонид Иванович писал(а):А зачем прерывания запрещать на 600 мкс? Длительность импульса сброса сверху ничем не ограничена. От прерываний нужно защищать только интервал, где мы читаем presence, а это порядка 60 мкс.
О-о. Пасибочки. Я чет не догадался так зделать. А действительно 500 мкс сброса то, пусть хоть 1000 мкс длятся, т.е. тут прерывания можно не запрещать..... А вот перед тем как отпустить линию, да дождаться пресенс, можно запретить прерывания, но это уже сравнительно не много 15-60 мкс.

Re: Всё по DS18(B/S)20.

Добавлено: Вс июл 22, 2012 20:32:25
zebrox
Всем добрый день!
Вопрос по поводу функции

Код: Выделить всё

unsigned char w1_search(unsigned char cmd,void *p)
в CVAVR.
В параметре р ей передается указатель на заранее выделенный массив в раме для кодов устройств.
this function returns the number of devices connected to the 1 Wire bus.
If no devices were detected then it returns 0.
The byte cmd represents the Search ROM (F0h), Alarm Search (ECh) for the DS1820, DS18S20, or other similar commands, sent to the 1 Wire device.
The pointer p points to an area of SRAM where are stored the 8 bytes ROM codes returned by the device.
Такой вопрос, что будет, если массив будет на 2 устройства, а физически будет подключено три устройства?
Я так понимаю, в таком случае произойдет переполнение выделенного массива и эта функция "перепишет" данные в раме, которые не были выделены для массива кодов, а это очень плохо, т.к. может полностью "поломать" устройство :( А в хелпе об этом ни слова...

Есть ли какие-нибудь альтернативные проверенные библиотеки, где этот вопрос учтен?

Re: Всё по DS18(B/S)20.

Добавлено: Ср авг 01, 2012 13:27:21
levaclaus
такая беда. подключаю 18б20 к контроллеру, температура -999. Т.е. контроллер не видит датчик. Поставил кварц на 12мгц. без результатов. Датчик подключал к другому устройству - там все работает - датчик исправен. Както нагреваю этот датчик паяльником и опа- показал контроллер температуру 104 градуса. Перестал греть, температура начала падать и примерно на 50 градусах датчик опять пропал (-999).
подтяжка 4.7к, полярность верна, кварц внешний на 12мгц, фузы 1111 (атмега8)

Re: Всё по DS18(B/S)20.

Добавлено: Ср авг 01, 2012 13:30:00
Леонид Иванович
Глюк в программе?

Re: Всё по DS18(B/S)20.

Добавлено: Ср авг 01, 2012 16:46:31
levaclaus
так в этом проблема
Есть термометр на 2313. Я взял из него прогу для термометра, это 3 или 4 строки, вывод на индикатор (немножко побольше). На индикатор всё исправно выводит, в смысле подставляю в tepm число - число на индикаторе.

Потом я проставил метки в программе, программа всё делает что ей положенно, но дойдя до опроса датчика, датчик не находится. deviсe=0

Была похожая проблема, там оказалось косяк с подтяжкой был.

Re: Всё по DS18(B/S)20.

Добавлено: Ср авг 01, 2012 22:28:49
Аlex
Проблема в 458-ой строке программы.

Re: Всё по DS18(B/S)20.

Добавлено: Чт авг 23, 2012 19:13:34
Prosperous
Друзья, есть у меня библиотека для Winavr по работе с датчиком ds18b20. прикладываю ее и описание по настройке. Много где видел ее использование, все говорят, что работает идеально, а у меня датчик при опросе температуры выдает 0xFF. Такой вопрос у меня датчик глючит или я балбес :)
Процесс интеграции 1-Wire библиотеки с проектом заключается в следующем:

- переписываем файлы библиотеки в папку проекта

- подключаем сишные файлы к проекту
OWIHighFunction.c
OWISWBitFunction.c
OWIUARTBitFunction.c
OWIcrc.c

- добавляем заголовочные файлы в main.c
#include "OWIPolled.h"
#include "OWIHighLevelFunctions.h"
#include "OWIBitFunctions.h"
#include "common_files\OWIcrc.h"

- настраиваем файл OWIPolled.h

- выбираем реализацию OneWire интерфейса – программную
#define OWI_SOFTWARE_DRIVER
//#define OWI_UART_DRIVER

- задаем тактовую частоту микроконтроллера
#define CPU_FREQUENCY 16.000

- задаем порт, к которому подключена OneWire шина
#define OWI_PORT PORTD //!< 1-Wire PORT Data register.
#define OWI_PIN PIND //!< 1-Wire Input pin register.
#define OWI_DDR DDRD //!< 1-Wire Data direction register.

- в main.c задаем вывод, к которому подключена OneWire шина
#define BUS OWI_PIN_7

Для GCC проектов в makefile нужно будет добавить все сишные файлы.
Например, так:

SRC = $(TARGET).c bcd.c lcd_lib.c OWISWBitFunctions.c OWIHighLevelFunctions.c OWIUARTBitFunctions.c common_files/OWIcrc.c?

Re: Всё по DS18(B/S)20.

Добавлено: Пн авг 27, 2012 11:24:23
TheTERMINATOR
День добрый.

Уважаемые писатели, поделитесь программой простого термометра на DS18B20 для процессора STM8S103. Заранее благодарен.

Re: Всё по DS18(B/S)20.

Добавлено: Вт авг 28, 2012 20:21:01
Prosperous
Prosperous писал(а):Друзья, есть у меня библиотека для Winavr по работе с датчиком ds18b20.
В общем все беды от незнания. Отличная библиотека, все работает на ура. Надо было учесть, что отладку необходимо проводить в режиме оптимизации по времени, при другой временные задержки не обрабатываются и датчик врет.

Re: Всё по DS18(B/S)20.

Добавлено: Вт окт 02, 2012 11:34:46
ILYAUL
Что-то не могу найти в DS какой у неё Family code? Или слона не приметил.

Re: Всё по DS18(B/S)20.

Добавлено: Вт окт 02, 2012 11:36:58
Gudd-Head
28h

Re: Всё по DS18(B/S)20.

Добавлено: Вт окт 02, 2012 17:56:42
ILYAUL
:beer:

Re: Всё по DS18(B/S)20.

Добавлено: Вт окт 02, 2012 22:58:34
elf
Добрый вечер уважаемые коты.
Пытаюсь собрать термометр на DS18b20, написал программку под LCD- все нормально работает.
Но возникла необходимость выводить температуру на семисигментник и тут началось.........
Вообщем ничего не показывает.
Ребята гляньте пожалуйста код и тыкните меня носом куда надо :)) .
я думаю ошибка где-то здесь
sot=(temp/100);
des =(temp%100)/10;
edi=(temp %100)%10;

заранее благодарен.

Код: Выделить всё

#include <mega8.h>               //áèáëèîòåêà ââîäà\âûâîäà
#include <delay.h>               //áèáëèîòåêà çàäåðæêè
#asm                             //ñîîáùàåì êóäà ïîäêëþ÷åí äàò÷èê
        .equ __w1_port=0x18; PORTC
        .equ __w1_bit=7
#endasm                  
/* #asm                             //ñîîáùàåì êóäà ïîäêëþ÷¸í ýêðàí
    .equ __lcd_port=0x12
#endasm
#include <lcd.h>                 //áèáëèîòåêà äëÿ LCD*/  
#include <1wire.h>               //áèáëèîòåêà ðàáîòû ñ 1Wire
#include <ds18b20.h>             //áèáëèîòåêà äëÿ ðàáîòû ñ äàò÷èêîì ds18b20
#include <stdio.h>               
char lcd_buffer[33];             //ìàñèâ ñ äàííûìè äëÿ ýêðàíà 
int temp; //ïåðåìåííàÿ äëÿ õðàíåíèÿ òåìïåðàòóðû 
unsigned char devices;         //ïåðåìåííàÿ â êîòîðîé êîëè÷åñòâî ïðèñîåäåí¸ííûõ äàò÷èêîâ 
unsigned char cifra [] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7d,0x07,0x7F,0x6F};// Ìàññèâ êîäîâ äëÿ ôîðìèðîâàíèÿ 
int sot;//ïåðåìåííàÿ ñîòåí ...
int des;//ïåðåìåííàÿ äåñÿòêîâ...................
int edi;//ïåðåìåííàÿ åäèíèö....................  



              
////////////////ÈÍÄÈÊÀÖÈß////////////////////////////////
int q;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
 
q++;//óâåëè÷èâàåì ñ÷¸ò÷èê äèíàìè÷åñêîé èíäèêàöèè  
 switch(q) //Ïåðåáîð îòîáðàæàåìîãî ñåé÷àñ ðàçðÿäà
       {case 1:PORTB=0b11101111;PORTD &= 0x80; PORTD|=cifra [edi];//âûâîä ïåðâîé öèôðû
break;
       case 2:PORTB=0b11011111;PORTD &= 0x80;PORTD|=cifra [des]; //âûâîä âòîðîé öèôðû 
break;
       case 3:PORTB=0b10111111;PORTD &= 0x80;PORTD|=cifra [sot];//âûâîä òðåòüåé öèôðû
q=0; 

break;} 

if (q>=4)q=0;
}		
///////////////////////////////////////////////////////////////////
   



///////////////////ÌÅÐßÅÌ ÒÅÌÏÅÐÀÒÓÐÓ//////////////////////////////
void temperature() 
{
if(devices>0)                 //áåñêîíå÷íûé öèêë, åñëè äàò÷èê ïîäêëþ÷îí
      {
          temp=ds18b20_temperature(0);  //÷èòàåì òåìïåðàòóðó  
          if (temp>1000){               //åñëè äàò÷èê âûäà¸ò áîëüøå 1000
             temp=4096-temp;            //îòíèìàåì îò äàííûõ 4096
             temp=-temp;                //è ñòàâèì çíàê "ìèíóñ"
          }
 sot=(temp/100);  
 des =(temp%100)/10;
 edi=(temp %100)%10;
        delay_ms(500);  
          }
       }
////////////////////////////////////////////////////////////////////////       
       
       
       
void main(void)                  
{
PORTB=0b00000000;
DDRB =0b01110000; 
PORTC=0x00;
DDRC=0x00;
PORTD=0xff;
DDRD=0xff;
TCCR0=0x03;// Clock value: 125,000 kHz
TCNT0=0x00;
TIMSK=0x01; // Timer(s)/Counter(s) Interrupt(s) initialization                 
/* lcd_init(16);                    //èíèöèèëèçàöèÿ LCD*/  
devices=w1_init();               //èùèì äàò÷èêè

// Global enable interrupts
#asm("sei")        
      
    
    
    
      
    while(1)
    { temperature();
     
        /*    sprintf(lcd_buffer,"%u - %u - %u",edi,des,sot);    //çàïèñóåìâ ìàñèâ äëÿ ýêðàíà òåìïåðàòóðó è âñ¸ òàêîå
          lcd_clear();                //÷èñòèì äèñïëåé ïåðåä âûâîäîì
          lcd_puts(lcd_buffer);        //âûâîäèì ìàñèâ íà LCD
          delay_ms(500);*/ 
  
    }
    
      
  }

Re: Всё по DS18(B/S)20.

Добавлено: Вт окт 02, 2012 23:02:41
Аlex
Вообщем ничего не показывает.
А питание подали ? :))

Re: Всё по DS18(B/S)20.

Добавлено: Вт окт 02, 2012 23:05:47
elf
:)) подал,я же говорю с ЛСД все нормально показывает

Re: Всё по DS18(B/S)20.

Добавлено: Вт окт 02, 2012 23:08:37
Аlex
подал
А пыль с сегментников протёрли ? :))

Re: Всё по DS18(B/S)20.

Добавлено: Вт окт 02, 2012 23:09:39
elf
а разве надо :shock:

Re: Всё по DS18(B/S)20.

Добавлено: Вт окт 02, 2012 23:10:27
Аlex
Надо бы конечно. Может из-за неё не показывает. :))

Re: Всё по DS18(B/S)20.

Добавлено: Вт окт 02, 2012 23:12:10
elf
Аlex че-то мне не до шуток.

Re: Всё по DS18(B/S)20.

Добавлено: Вт окт 02, 2012 23:15:08
elf
elf писал(а):Аlex че-то мне не до шуток.
Лутше оказали -бы дружескую помощь-неопытному :)) ,Вам свежим взглядов легче найти ошибку-а то я уже все глаза проглядел :))