ds18b20 проблема с кодом

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
spaik
Родился
Сообщения: 3
Зарегистрирован: Пт мар 11, 2011 09:17:17

ds18b20 проблема с кодом

Сообщение spaik »

Всем привет. Мучаюсь с программой термометра, в чем проблема не понимаю. На индикаторах какие беспорядочные цифры. Схема на attiny2313, работает от внутреннего генератора 8Мгц. Вывод на led целое число без запятых.

[code#include<avr/io.h>
#include<avr/interrupt.h>
#include<util/delay.h>
int digits[10]={63,6,91,79,102,109,125,7,127,111};
unsigned char h,r,s,k,data[2];
int l,temp;

//Функция обнаружения устройства на шине PB0
unsigned char PB0_find()
{
DDRB|=1<<0;
_delay_ms(0.475);
DDRB&=~(1<<0);
_delay_ms(0.065);
_delay_ms(0.401);
}


//Функция передачи данных устройству ds18b20
void send_ds18b20(unsigned char command)
{ unsigned char i, data;
data=command;
for(i=0;i<8;i++)
{
if((data&(1<<i))==1<<i)
{
DDRB|=1<<0;
_delay_ms(0.002);
DDRB&=~(1<<0);
_delay_ms(0.065);
} else
{
DDRB|=1<<0;
_delay_ms(0.065);
DDRB&=~(1<<0);
_delay_ms(0.005);
}
}
}

//Функция чтения данных с ds18b20
unsigned char read_ds18b20()
{
unsigned char data;
for(unsigned char i=0;i<8;i++)
{
DDRB|=1<<0;
_delay_ms(0.002);
DDRB&=~(1<<0);
_delay_ms(0.007);
if((PINB&(1<<0))==1<<0) data|=1<<i;
else
data&=~(1<<i);
_delay_ms(0.050);
}
return data;
}

//Функция отображение чисел
unsigned char symbol_led()
{
PORTB|=1<<5;
PORTB|=1<<6;
PORTB|=1<<7;
PORTB&=~(1<<4);
PORTD=digits[k];
_delay_ms(1);
PORTB|=1<<4;
PORTB|=1<<6;
PORTB|=1<<7;
PORTB&=~(1<<5);
PORTD=digits[h];
_delay_ms(1);
PORTB|=1<<7;
PORTB|=1<<5;
PORTB|=1<<4;
PORTB&=~(1<<6);
PORTD=digits[l];
_delay_ms(1);
PORTB|=1<<6;
PORTB|=1<<5;
PORTB|=1<<4;
PORTB&=~(1<<7);
PORTD=99;
_delay_ms(1);
}


int main(void)
{
DDRD=255;
DDRB=255;
r=0;h=0;s=0;k=0;

while(1)
{
symbol_led();
PB0_find();
symbol_led();
send_ds18b20(0xcc);
send_ds18b20(0x44);
symbol_led();
_delay_ms(0.746);
PB0_find();
symbol_led();
send_ds18b20(0xcc);
send_ds18b20(0xbe);
data[0]=read_ds18b20();
data[1]=read_ds18b20();
temp=data[1];
temp=temp<<8;
temp|=data[0];
temp=temp>>4;
l=0;r=0;h=0;s=0;k=0;
if((temp&(1<<0))==1<<0) l+=1;
if((temp&(1<<1))==1<<1) l+=2;
if((temp&(1<<2))==1<<2) l+=4;
if((temp&(1<<3))==1<<3) l+=8;
if((temp&(1<<4))==1<<4) l+=16;
if((temp&(1<<5))==1<<5) l+=32;
if((temp&(1<<6))==1<<6) l+=64;
if((temp&(1<<7))==1<<7) l+=128;
r=0;h=0;s=0;k=0;
while(l>=100)
{
l-=100;
k++;
}
while(l>=10)
{
l-=10;
h++;
}
symbol_led();
}
}][/code]
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: ds18b20 проблема с кодом

Сообщение ChipKiller »

spaik писал(а):Мучаюсь с программой термометра, в чем проблема не понимаю....
... Вы же сами написали - проблема с кодом. :)) ... а с кодом действительно проблема

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

_delay_ms(0.475);

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

if((data&(1<<i))==1<<i);
if((temp&(1<<0))==1<<0) l+=1;
... С ,конечно, многое вытерпит, но кажется он обиделся .......
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»