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

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

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

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

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

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

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

Ответ
Опции темы

ds18b20 и atmega8 вывод температуры с десятичным знаком

Непрочитано 23.05.2011, 15:58   #21
dadigor
Прописка
 
Аватар для dadigor
 
Регистрация: 10.09.2010
Сообщений: 113
Сказал спасибо: 31
Сказали Спасибо 27 раз(а) в 27 сообщении(ях)
dadigor на пути к лучшему
По умолчанию Re: ds18b20 и atmega8 вывод температуры с десятичным знаком

добавь еще две скобочки и в них умножить на 10.0, как я и писАл выше.

while(1) //бесконечный цикл, если датчик подключен
{
temper=(int)(ds18b20_temperature(0) * 10.0);

real_digital(temper,0);

delay_ms(500);
}
Реклама:
dadigor вне форума   Ответить с цитированием
Непрочитано 23.05.2011, 16:09   #22
yuta_86
Частый гость
 
Регистрация: 12.01.2011
Сообщений: 36
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
yuta_86 на пути к лучшему
По умолчанию Re: ds18b20 и atmega8 вывод температуры с десятичным знаком

выводит число 1082

if (!w1_init())
{

real_digital(666,0);
while(1){}

}


while(1) //бесконечный цикл, если датчик подключен
{
temper=(int)(ds18b20_temperature(0) * 10.0);
real_digital(temper,0);
delay_ms(500);
}

}
yuta_86 вне форума   Ответить с цитированием
Непрочитано 23.05.2011, 16:13   #23
sergx1300
Прописка
 
Аватар для sergx1300
 
Регистрация: 18.03.2010
Адрес: Украина, Тернополь
Сообщений: 225
Сказал спасибо: 14
Сказали Спасибо 44 раз(а) в 34 сообщении(ях)
sergx1300 на пути к лучшему
По умолчанию Re: ds18b20 и atmega8 вывод температуры с десятичным знаком

Мой код похоже никто и не смотрел. Ну нет так нет.
sergx1300 вне форума   Ответить с цитированием
Непрочитано 23.05.2011, 16:17   #24
yuta_86
Частый гость
 
Регистрация: 12.01.2011
Сообщений: 36
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
yuta_86 на пути к лучшему
По умолчанию Re: ds18b20 и atmega8 вывод температуры с десятичным знаком

sergx1300, ваш код я посмотрю обязательно(сегодня вечером), просто интересно почему не работает то что выше. в вашем коде сделан вывод не через прерывания таймера ведь?
yuta_86 вне форума   Ответить с цитированием
Непрочитано 23.05.2011, 16:29   #25
sergx1300
Прописка
 
Аватар для sergx1300
 
Регистрация: 18.03.2010
Адрес: Украина, Тернополь
Сообщений: 225
Сказал спасибо: 14
Сказали Спасибо 44 раз(а) в 34 сообщении(ях)
sergx1300 на пути к лучшему
По умолчанию Re: ds18b20 и atmega8 вывод температуры с десятичным знаком

Сообщение от yuta_86 Посмотреть сообщение
в вашем коде сделан вывод не через прерывания таймера ведь?
Да. Но разницы я не вижу. В моем коде все работает. Просто перепишите его под себя и не партесь.
sergx1300 вне форума   Ответить с цитированием
Непрочитано 23.05.2011, 17:53   #26
dadigor
Прописка
 
Аватар для dadigor
 
Регистрация: 10.09.2010
Сообщений: 113
Сказал спасибо: 31
Сказали Спасибо 27 раз(а) в 27 сообщении(ях)
dadigor на пути к лучшему
По умолчанию Re: ds18b20 и atmega8 вывод температуры с десятичным знаком

// по идее надо измеренное float (например 2.4625E+1 )
// умножить на 10.0 (получится 2.4625E+2)
// и привести к целому новое число (получится 246)
// что и вывести. Попробовал бы еще так, что он выведет?

if (!w1_init())
{

real_digital(666,0);
while(1){}

}
// добавить
float temp_f;

while(1) //бесконечный цикл, если датчик подключен
{
// и здесь
temp_f = ds18b20_temperature(0);
temp_f *= 10.0;
temper = (int)temp_f;
real_digital(temper,0);
delay_ms(500);
}

Последний раз редактировалось dadigor; 23.05.2011 в 19:47.
dadigor вне форума   Ответить с цитированием
Непрочитано 24.05.2011, 10:31   #27
yuta_86
Частый гость
 
Регистрация: 12.01.2011
Сообщений: 36
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
yuta_86 на пути к лучшему
По умолчанию Re: ds18b20 и atmega8 вывод температуры с десятичным знаком

dadigor, ничего не изменилось выводится 1082 не знаю что и делать

#include ‹mega8.h›
#include ‹delay.h›

// 1 Wire Bus functions
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=6
#endasm
#include ‹1wire.h›

// DS1820 Temperature Sensor functions
#include ‹ds18b20.h›

// Declare your global variables here
int digits[4], cur_digit;
int n_tochka;
enum { MINUS = 10, PROBEL = 11 };
void show_digital(int dig, int tochka,int raz)
{
switch(dig)
{
case 0:{PORTD = 0b11001010; PORTC = 0b11000000; break;}
case 1:{PORTD = 0b11111010; PORTC = 0b11011000; break;}
case 2:{PORTD = 0b11001100; PORTC = 0b11001000; break;}
case 3:{PORTD = 0b11101000; PORTC = 0b11001000; break;}
case 4:{PORTD = 0b11111000; PORTC = 0b11010000; break;}
case 5:{PORTD = 0b11101000; PORTC = 0b11000001; break;}
case 6:{PORTD = 0b11001000; PORTC = 0b11000001; break;}
case 7:{PORTD = 0b11111010; PORTC = 0b11001000; break;}
case 8:{PORTD = 0b11001000; PORTC = 0b11000000; break;}
case 9:{PORTD = 0b11101000; PORTC = 0b11000000; break;}
case MINUS:{PORTD = 0b11111100; PORTC = 0b11011001; break;} // минус
case PROBEL:{PORTD = 0b11111110; PORTC = 0b11011001; break;} //пробел
}
switch(raz)
{
case 4:{PORTC.5 =1; break;} //1
case 3:{PORTC.2 =1; break;} //2
case 2:{PORTC.1 =1; break;} //3
case 1:{PORTD.0 =1; break;} //4
}
if (tochka==1) PORTD.3=0;
}

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if(cur_digit == 4)
cur_digit = 0;
show_digital(digits[cur_digit],n_tochka != 0 && cur_digit==n_tochka,cur_digit+1);
cur_digit++;
}

void set_digit(int dig,int raz)
{
digits[raz-1]=dig;
}

void set_tochka(int num)
{
n_tochka=num;
}

void real_digital(int dig,int fract)
{
int i;
for (i=0;i‹4;i++){
set_digit(dig % 10,i+1);

if(dig==0 && i › fract)
break;
dig /= 10;
}
for(;i‹4;i++)
set_digit(PROBEL,i+1);
set_tochka(fract);
}

void main(void)
{
int i;
int temper;
float temp_f;

// Declare your local variables here

// Input/Output Ports initialization
// 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=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0xFF;

// 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=0xFF;


// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
TCCR0=0x02;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

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

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
#asm("sei");


if (!w1_init()){

real_digital(666,0);
while(1){}

}

while (1)
{
temp_f = ds18b20_temperature(0);
temp_f *= 10.0;
temper = (int)temp_f;
real_digital(temper,0);
delay_ms(500);
}
}
yuta_86 вне форума   Ответить с цитированием
Непрочитано 24.05.2011, 10:34   #28
yuta_86
Частый гость
 
Регистрация: 12.01.2011
Сообщений: 36
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
yuta_86 на пути к лучшему
По умолчанию Re: ds18b20 и atmega8 вывод температуры с десятичным знаком

ммм кстати только что заметил..... если подождать секунд 20 то на экране появляется 266 и 270 300 но всё с паузой 1082 порядка 10 сек
yuta_86 вне форума   Ответить с цитированием
Непрочитано 24.05.2011, 10:46   #29
yuta_86
Частый гость
 
Регистрация: 12.01.2011
Сообщений: 36
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
yuta_86 на пути к лучшему
По умолчанию Re: ds18b20 и atmega8 вывод температуры с десятичным знаком

держал датчик в руке порядка 5 мин и в конечном результате он показал 352. я что такой холоднокровный? или точность оставляет желать лучшего?
yuta_86 вне форума   Ответить с цитированием
Непрочитано 24.05.2011, 10:55   #30
yuta_86
Частый гость
 
Регистрация: 12.01.2011
Сообщений: 36
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
yuta_86 на пути к лучшему
По умолчанию Re: ds18b20 и atmega8 вывод температуры с десятичным знаком

sergx1300,
при таком коде результат 666. ошибка инициализации.... что я делаю не так?

#include ‹mega8.h›
#include ‹delay.h›

// 1 Wire Bus functions
#asm
.equ __w1_port=0x18 ;PORTB
.equ __w1_bit=6
#endasm
#include ‹1wire.h›

// DS1820 Temperature Sensor functions
#include ‹ds18b20.h›

// Declare your global variables here
int digits[4], cur_digit;
int n_tochka;
enum { MINUS = 10, PROBEL = 11 };
void show_digital(int dig, int tochka,int raz)
{
switch(dig)
{
case 0:{PORTD = 0b11001010; PORTC = 0b11000000; break;}
case 1:{PORTD = 0b11111010; PORTC = 0b11011000; break;}
case 2:{PORTD = 0b11001100; PORTC = 0b11001000; break;}
case 3:{PORTD = 0b11101000; PORTC = 0b11001000; break;}
case 4:{PORTD = 0b11111000; PORTC = 0b11010000; break;}
case 5:{PORTD = 0b11101000; PORTC = 0b11000001; break;}
case 6:{PORTD = 0b11001000; PORTC = 0b11000001; break;}
case 7:{PORTD = 0b11111010; PORTC = 0b11001000; break;}
case 8:{PORTD = 0b11001000; PORTC = 0b11000000; break;}
case 9:{PORTD = 0b11101000; PORTC = 0b11000000; break;}
case MINUS:{PORTD = 0b11111100; PORTC = 0b11011001; break;} // минус
case PROBEL:{PORTD = 0b11111110; PORTC = 0b11011001; break;} //пробел
}
switch(raz)
{
case 4:{PORTC.5 =1; break;} //1
case 3:{PORTC.2 =1; break;} //2
case 2:{PORTC.1 =1; break;} //3
case 1:{PORTD.0 =1; break;} //4
}
if (tochka==1) PORTD.3=0;
}

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if(cur_digit == 4)
cur_digit = 0;
show_digital(digits[cur_digit],n_tochka != 0 && cur_digit==n_tochka,cur_digit+1);
cur_digit++;
}

void set_digit(int dig,int raz)
{
digits[raz-1]=dig;
}

void set_tochka(int num)
{
n_tochka=num;
}

void real_digital(int dig,int fract)
{
int i;
for (i=0;i‹4;i++){
set_digit(dig % 10,i+1);

if(dig==0 && i › fract)
break;
dig /= 10;
}
for(;i‹4;i++)
set_digit(PROBEL,i+1);
set_tochka(fract);
}

void main(void)
{
int i;
int temper;
signed int temp;

// Declare your local variables here

// Input/Output Ports initialization
// 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=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0xFF;

// 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=0xFF;


// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
TCCR0=0x02;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

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

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
#asm("sei");

if (!ds18b20_init(0,20,30,DS18B20_12BIT_RES)){

real_digital(666,0);
while(1){}

}

while (1)
{
temp=(ds18b20_temperature(0))*10;
if (temp›=0) {real_digital(temp,0);}
delay_ms(500);
}
}
yuta_86 вне форума   Ответить с цитированием
Ответ


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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подключение DS18B20 к ATMega8 rocky7 Микроконтроллеры, АЦП, память и т.д 1 28.06.2010 20:30
ATmega8 + DS18B20: включаешь - не работает ilyasivkov Микроконтроллеры, АЦП, память и т.д 11 05.06.2009 12:27
ATmega8 и DS18B20, не определяется датчик butman Микроконтроллеры, АЦП, память и т.д 21 09.06.2007 22:05


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.