Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
17.09.2007, 22:13
|
|
Частый гость
Регистрация: 24.04.2007
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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 градус?
|
|
|
|
17.09.2007, 22:50
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Точность данной микросхемы - пол градуса, с большей точностью считать будет невозможно.
Чтобы разобраться в проблеме - выложите весь проект...
|
|
|
|
18.09.2007, 00:26
|
|
Частый гость
Регистрация: 24.04.2007
Сообщений: 29
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Код:
|
************************************************** ***
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 градуса
|
|
|
|
18.09.2007, 08:42
|
|
Прописка
Регистрация: 11.07.2006
Адрес: Ru, Nsk
Сообщений: 249
Сказал спасибо: 1
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
а в протеусе не пробовали симулировать?
|
|
|
|
18.09.2007, 09:51
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Неужели нельзя готовый уже проект прикрепить как приложение? Чтобы люди, которые хотят помочь в решении проблемы, не делали лишнюю работу.
С такой проблемой как минимум надо прикреплять проект компилятора, и проект в протеусе, а потом уже и разбираться...
|
|
|
|
18.09.2007, 10:31
|
|
Вид на жительство
Регистрация: 30.12.2006
Адрес: Junktown
Сообщений: 300
Сказал спасибо: 164
Сказали Спасибо 171 раз(а) в 59 сообщении(ях)
|
А может проблема в том что :
"мега работает на 12Mhz внешний кварц."
а ниже по тексту:
"Chip type : ATmega16
Program type : Application
Clock frequency : 16,000000 MHz"?
то есть хекс генерится для одной частоты, а контролер работает на другой?
|
|
|
|
19.09.2007, 11:14
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Сообщение от 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??? Кто что может сказать по этому поводу? Вопрос интересен...
|
|
|
|
19.09.2007, 11:21
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Я когда - то делал. Значения - дробные и меняются от измерения к измерению так, что среднее арифметическое получается - где-то 0,4 градуса, так что с точностью не соврали. В смысле повышается на немного, но не до 0,1, ест-нно. В ds18b20 этой формулы нет, кстати.
|
|
|
|
19.09.2007, 14:29
|
|
Прописка
Регистрация: 07.08.2005
Сообщений: 178
Сказал спасибо: 16
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
У DS18B20 12 бит насколько я помню. А зачем такая точность?я гдето читал что нужно весь корпус помещать в среду измерения, при этом говорили что выводы вносят погрешность измерений.
|
|
|
|
25.09.2007, 23:50
|
|
Гражданин KAZUS.RU
Регистрация: 26.09.2005
Сообщений: 569
Сказал спасибо: 58
Сказали Спасибо 509 раз(а) в 135 сообщении(ях)
|
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 байт
......
и т.д. и уж дальше разбирайтесь с точностью и выводом.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:16.
|
|