Всем привет. Мучаюсь с программой термометра, в чем проблема не понимаю. На индикаторах какие беспорядочные цифры. Схема на 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]
ds18b20 проблема с кодом
- Реклама
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: ds18b20 проблема с кодом
... Вы же сами написали - проблема с кодом.spaik писал(а):Мучаюсь с программой термометра, в чем проблема не понимаю....
Код: Выделить всё
_delay_ms(0.475);Код: Выделить всё
if((data&(1<<i))==1<<i);... С ,конечно, многое вытерпит, но кажется он обиделся .......if((temp&(1<<0))==1<<0) l+=1;
