Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 17.09.2007, 22:13  
idmg
Частый гость
 
Регистрация: 24.04.2007
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
idmg на пути к лучшему
По умолчанию DS18S20+Mega16 12Mhz неправильно отображается температура

Собрал девайс на Mege16 с четырьмя семисегиентными индикаторами, мега работает на 12Mhz внешний кварц. Подключил DS18S20 не могу разобраться как считать температуру.
вот часть кода в CV, так я считываю значение температуры
Код:
#asm("cli")
    temp=ds1820_temperature_10(0); 
    delay_ms(1000);
    #asm("sei")
как значение temp отобразить на индикаторе?
Я делаю так:
//вычисляю отдельно каждую цифру
cifra0=temp%10; cifra1=temp%100;temp=znach/100;
//если темп отрицательная то в четвертое знакоместо пишу минус
Код:
if (znach‹0) {prta[3]= T[10];}
else {prta[3]= T[11];} 
//остальные три знакоместа для значения темп
//цифра 0 - десятые
prta[2]= T[cifra2];
prta[1]= T[cifra1];
prta[0]= T[cifra0];
На экране отображается какая-то ерунда, плюс датчик виснет? видимо неправильно выбрана пауза для корректного считывания температуры как при частоте 12MHz с одним датчиком выбрать паузы?

Следующий момент как считать температуру с точностью до +-0.1 градус?
Реклама:
idmg вне форума  
Непрочитано 17.09.2007, 22:50  
dimonbest
Гражданин KAZUS.RU
 
Аватар для dimonbest
 
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
dimonbest на пути к лучшему
По умолчанию

Точность данной микросхемы - пол градуса, с большей точностью считать будет невозможно.
Чтобы разобраться в проблеме - выложите весь проект...
dimonbest вне форума  
Непрочитано 18.09.2007, 00:26  
idmg
Частый гость
 
Регистрация: 24.04.2007
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
idmg на пути к лучшему
По умолчанию

Код:
**************************************************  ***
Chip type           : ATmega16
Program type        : Application
Clock frequency     : 16,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
**************************************************  ***/
#include ‹mega16.h›
#include ‹delay.h›
#asm
   .equ __w1_port=0x15 ;PORTC
   .equ __w1_bit=7
#endasm
#include ‹1wire.h›
#include ‹ds1820.h›  
#include ‹stdlib.h›
#include ‹ctype.h›
#include ‹string.h›
unsigned char prta[4]={0xff, 0xff, 0xff, 0xff};  
unsigned char cifra0, cifra1, cifra2;
flash unsigned char T[12]={ 
68, //0//
95, //1//
97, //2//
81, //3//
90, //4//
208,//5//
192,//6//
93, //7//
64, //8//
80, //9//
251, //-//
255}; 

flash unsigned char Tdec[10]={ 
132, //0.//
159, //1.//
161, //2.//
145, //3.//
154, //4.//
272,//5.//
256,//6.//
157, //7.//
128, //8.//
124}; //9.//
 

flash unsigned char n[4]={247,251,253,254};
   
interrupt [TIM2_OVF] void timer2_ovf_isr(void){
static unsigned char ind_number; 
TCNT2=0x00;
ind_number++;
if (ind_number==4) {ind_number=0;}
PORTB=n[ind_number];
PORTA=prta[ind_number];
}


void main(void){
 int znach;
PORTA=0xFF;
DDRA=0xFF;

PORTB=0x00;
DDRB=0x1F;

PORTC=0x64;
DDRC=0x12;

PORTD=0x84;
DDRD=0x32;

// Timer/Counter 1 initialization
TCCR1A=0xA3;
TCCR1B=0x8D;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x03;
OCR1BL=0xFF;

// Timer/Counter 2 initialization
ASSR=0x00;
TCCR2=0x04;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
GICR|=0x40;
MCUCR=0x02;
MCUCSR=0x00;
GIFR=0x40;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;

// Global enable interrupts
#asm("sei")
MCUCSR=0xF0; MCUCSR=0xF0;
   
while (1){
 
                  //  #asm("cli")
            //         #asm("nop")
                    znach=ds1820_temperature_10(0); 
        //          #asm("sei")
           //          #asm("nop")
                       cifra0=znach%10; cifra1=(znach%100); 
                      cifra2=znach/100; 
                       if (znach‹0){
                       prta[3]= T[10];}else{prta[3]= T[11];} 
                        prta[2]= T[cifra2];
                         prta[1]= Tdec[cifra1];
                        prta[0]= T[cifra0]; 
                    
                    
                      }}
проект в CV
по поводу точности 0.1 градус цитата
Для DS18S20 температура представляется в виде 9-битного значения в дополнительном коде. Поскольку это значение занимает 2 байта, все разряды старшего байта равны знаковому разряду. Дискретность представления температуры составляет 0.5°C. Зависимость выходного кода от температуры приведена в таблице:

Температура Выходной код (Binary) Выходной код(Hex)
Ст. байт Мл. байт
+125°C 0000 0000 1111 1010 00FAh
+25°C 0000 0000 0011 0010 0032h
+0.5°C 0000 0000 0000 0001 0001h
0°C 0000 0000 0000 0000 0000h
-0.5°C 1111 1111 1111 1111 FFFFh
-25°C 1111 1111 1100 1110 FFCEh
-55°C 1111 1111 1001 0010 FF92h



Более высокая разрешающая способность может быть получена, если произвести дополнительные вычисления на основе значений COUNT_REMAIN (значение, оставшееся в счетчике в конце измерения) и COUNT_PER_C (количество импульсов на один градус для данной температуры), которые доступны. Для вычислений требуется взять считанное значение температуры и отбросить младший бит. Полученное значение назовём TEMP_READ. Теперь действительное значение температуры может быть вычислено по формуле:


TEMPERATURE=TEMP_READ-0.25+(COUNT_PER_C - COUNT_REMAIN)/COUNT_PER_C


В нашем случае такой расчет позволяет получить дискретность представления температуры 0.1°C.
ссылка: http://www.spetspribor.ru/support/ar...0/ds18s20.html
Пока хочу разобраться с отображением температуры с точностью 0.5 градуса
idmg вне форума  
Непрочитано 18.09.2007, 08:42  
stri
Прописка
 
Аватар для stri
 
Регистрация: 11.07.2006
Адрес: Ru, Nsk
Сообщений: 249
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
stri на пути к лучшему
По умолчанию

а в протеусе не пробовали симулировать?
stri вне форума  
Непрочитано 18.09.2007, 09:51  
dimonbest
Гражданин KAZUS.RU
 
Аватар для dimonbest
 
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
dimonbest на пути к лучшему
По умолчанию

Неужели нельзя готовый уже проект прикрепить как приложение? Чтобы люди, которые хотят помочь в решении проблемы, не делали лишнюю работу.
С такой проблемой как минимум надо прикреплять проект компилятора, и проект в протеусе, а потом уже и разбираться...
dimonbest вне форума  
Непрочитано 18.09.2007, 10:31  
rear
Вид на жительство
 
Аватар для rear
 
Регистрация: 30.12.2006
Адрес: Junktown
Сообщений: 300
Сказал спасибо: 164
Сказали Спасибо 171 раз(а) в 59 сообщении(ях)
rear на пути к лучшему
По умолчанию

А может проблема в том что :
"мега работает на 12Mhz внешний кварц."
а ниже по тексту:
"Chip type : ATmega16
Program type : Application
Clock frequency : 16,000000 MHz"?
то есть хекс генерится для одной частоты, а контролер работает на другой?
rear вне форума  
Непрочитано 19.09.2007, 11:14  
dimonbest
Гражданин KAZUS.RU
 
Аватар для dimonbest
 
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
dimonbest на пути к лучшему
По умолчанию

Сообщение от idmg
Более высокая разрешающая способность может быть получена, если произвести дополнительные вычисления на основе значений COUNT_REMAIN (значение, оставшееся в счетчике в конце измерения) и COUNT_PER_C (количество импульсов на один градус для данной температуры), которые доступны. Для вычислений требуется взять считанное значение температуры и отбросить младший бит. Полученное значение назовём TEMP_READ. Теперь действительное значение температуры может быть вычислено по формуле:


TEMPERATURE=TEMP_READ-0.25+(COUNT_PER_C - COUNT_REMAIN)/COUNT_PER_C


В нашем случае такой расчет позволяет получить дискретность представления температуры 0.1°C.
ссылка: http://www.spetspribor.ru/support/ar...0/ds18s20.html
Пересмотрел оригинальный даташит, но в нем не нашел ни формулы такой, ни то что можно измерять с дискретностью 0.1°C! В официальном даташите на первой странице четко написано: "±0.5°C accuracy from –10°C to +85°C" . ТОЧНОСТЬ, а не дискретность. Если точность самой микросхемы пол градуса, то как можно измерять с точностью 0.1??? Кто что может сказать по этому поводу? Вопрос интересен...
dimonbest вне форума  
Непрочитано 19.09.2007, 11:21  
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Я когда - то делал. Значения - дробные и меняются от измерения к измерению так, что среднее арифметическое получается - где-то 0,4 градуса, так что с точностью не соврали. В смысле повышается на немного, но не до 0,1, ест-нно. В ds18b20 этой формулы нет, кстати.
urry вне форума  
Непрочитано 19.09.2007, 14:29  
EKuzmich
Прописка
 
Регистрация: 07.08.2005
Сообщений: 178
Сказал спасибо: 16
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
EKuzmich на пути к лучшему
По умолчанию

У DS18B20 12 бит насколько я помню. А зачем такая точность?я гдето читал что нужно весь корпус помещать в среду измерения, при этом говорили что выводы вносят погрешность измерений.
EKuzmich вне форума  
Непрочитано 25.09.2007, 23:50  
marera
Гражданин KAZUS.RU
 
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
marera на пути к лучшему
По умолчанию

ecли датчик один, то выкинте к черту #include ‹ds1820.h›. Просто читайте 1-wire шину. Например:
w1_init();
w1_write(0xCC); // если 1 датчик
w1_write(0x44); // запустить преобр.
delay_ms(200);
w1_init();
w1_write(0xCC); // если 1 датчик
w1_write(0xBE); // получить scratchpad
delay_us(200);
zu1=w1_read(); // читать 1 байт
......
и т.д. и уж дальше разбирайтесь с точностью и выводом.
marera вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не отображается половина символов на LCD eez Микроконтроллеры, АЦП, память и т.д 5 21.03.2009 02:01
Странное вычисление температуры DS18S20 nagano Микроконтроллеры, АЦП, память и т.д 0 20.08.2008 08:58
DS18S20 efim_max Информация по радиокомпонентам 4 06.01.2008 13:42
И снова температура ua_gruzin Поиск схем. Делимся схемами 0 14.02.2007 01:18
ATmega8 на запускается от кварца 12Mhz anonymouz Микроконтроллеры, АЦП, память и т.д 19 15.05.2006 04:48


Часовой пояс GMT +4, время: 09:16.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot