Сб фев 04, 2012 15:16:32
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#define W1_PORT PORTC
#define W1_DDR DDRC
#define W1_PIN PINC
#define W1_BIT 0
volatile char count = 0 ;
volatile char digit1 ;
volatile char digit2 ;
//Выводим значение температуры на 2 семисегментных индикатора
ISR(SIG_OVERFLOW0)
{
if (count==2) count=0 ;
switch(count)
{
case 0:PORTB = digit2;PORTB |= (0<<5);PORTB |= (1<<6);break;
case 1:PORTB = digit1;PORTB |= (1<<5);PORTB |= (0<<6);break;
}
count++ ;
}
//функция определяет есть ли устройство на шине
unsigned char w1_find()
{
unsigned char device;
W1_DDR |= 1<<W1_BIT;
_delay_us(485);
W1_DDR &= ~(1<<W1_BIT);
_delay_us(65);
if((W1_PIN & (1<<W1_BIT)) ==0x00)
device = 1;
else
device = 0;
_delay_us(420);
return device;
}
//функция посылает команду на устройство 1-wire
void w1_sendcmd(unsigned char cmd)
{
for(unsigned char i = 0; i < 8; i++)
{
if((cmd & (1<<i)) == 1<<i)
{
W1_DDR |= 1<<W1_BIT;
_delay_us(2);
W1_DDR &= ~(1<<W1_BIT);
_delay_us(65);
}
else
{
W1_DDR |= 1<<W1_BIT;
_delay_us(65);
W1_DDR &= ~(1<<W1_BIT);
_delay_us(5);
}
}
}
//функция читает один байт с устройства 1-wire
unsigned char w1_receive_byte()
{
unsigned char data;
for(unsigned char i = 0; i < 8; i++)
{
W1_DDR |= 1<<W1_BIT;
_delay_us(2);
W1_DDR &= ~(1<<W1_BIT) ;
_delay_us(7);
if((W1_PIN & (1<<W1_BIT)) == 0x00)
data &= ~(1<<i);
else
data |= 1<<i;
_delay_us(50);
}
return data;
}
//функция преобразует полученные с датчика 18b20 данные в температуру
int temp_18b20()
{
unsigned char data[2];
int temp = 0;
if(w1_find()==1)//если есть устройство на шине
{
w1_sendcmd(0xcc);//пропустить ROM код, мы знаем, что у нас одно устройство или передаем всем
w1_sendcmd(0x44);//преобразовать температуру
_delay_ms(750);//преобразование в 12 битном режиме занимает 750ms
w1_find();//снова посылаем Presence и Reset
w1_sendcmd(0xcc);
w1_sendcmd(0xbe);//передать байты ведущему(у 18b20 в первых двух содержится температура)
data[0] = w1_receive_byte();//читаем два байта с температурой
data[1] = w1_receive_byte();
//загоняем в двух байтную переменную
temp = data[1];
temp = temp<<8;
temp |= data[0];
//переводим в градусы
temp *= 0.625;//0.0625 градуса на единицу данных
}
//возвращаем температуру
return temp;
}
int main(void)
{
DDRB = 0xFF ;
TIMSK = 0b00000001 ;
TCCR0 = 0b00000010 ;
char temp ;
sei() ;
while(1)
{
temp = temp_18b20() ;
if(temp > 1000) //если температура <0
{
temp = 4096 - temp ;
temp = -temp ;
}
digit1 = temp/10 ;//выводим на дисплей
digit2 = temp%10 ;
}
}= ~(1
Сб фев 04, 2012 16:51:09
Dako писал(а):я так полагаю что с датчика неверные числа приходят
Сб фев 04, 2012 16:58:40
Сб фев 04, 2012 17:30:44
Сб фев 04, 2012 17:41:28
urry писал(а):давайте я погадаю на кофейной гуще - у ТС датчик не 18b20 , а 1820 или 18S20.
в этом случае при комнатной 18 градусов с учетом младшего разряда в регистре будет 36.
36 умножаем на 0.0625 = 2.25 градуса
36 умножаем на 0.625 = 22 градуса
В задаче спрашивается - какая температура дома у ТС, если показывает 32 ?
Около 25 - буржуй, однако...
У меня сейчас 16...
Сб фев 04, 2012 17:55:12
Сб фев 04, 2012 18:21:08
Сб фев 04, 2012 18:29:43
Сб фев 04, 2012 20:33:52
Вс фев 05, 2012 09:21:56
че-то как-то не верится... даже по брехливым (занижающим) интернет-прогнозам такой температуры в районе Новосибирска не было и нет сейчас... 2-го февраля было -22-24 всего-то...Dako писал(а):На момент измерения температуры, на улице было -45, спасибо ТЭЦ, г Новосибирск ))
Вс фев 05, 2012 10:18:27
Вс фев 05, 2012 17:40:16
Вс фев 05, 2012 17:47:19
#include <util/crc16.h>
uint8_t crc=0;
for (i=0;пока все байты не посчитаем;i++) {
crc=_crc_ibutton_update(crc,bytes[i]);
}
Вс фев 05, 2012 18:30:06
Вс фев 05, 2012 18:31:55
может, пора, наконец, документацию на датчики почитать? даже ведь на русском полно статей - почитайте, не тратьте зря свое время и время тех, кто тут пытается вам помочь.Dako писал(а):Скажите, а для DS1820 аналогично считается?
Чт фев 09, 2012 22:58:02
Ср фев 15, 2012 07:27:36
Ср фев 15, 2012 07:36:30
Ср фев 15, 2012 07:48:10
Ср фев 15, 2012 07:49:35