[an error occurred while processing this directive]
Могу предложить на Си под IAR V3.20 для AVR8515. Два датчика, каждый подключен на свой пин.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Вяч 01 августа 2006 г. 09:35
В ответ на: Люди, а DS1820 вообще работают или это фантастика ? Покажите код на С плиз отправлено ($)($) 31 июля 2006 г. 22:51

void get_temp(const char chanel,union temper *ret_temper) {
char count;

if(reset_DS(chanel)==false) {
ret_temper->word=0xf0f0; //DS not answered
return;
}
read_write_DS(chanel,0xcc); //DS1820 Skip ROM command
read_write_DS(chanel,0x44); //DS1820 Convert T command
if(chanel==1) {
CHAN1_HIGH; //Pull I/O pin high
CHAN1_OUTPUT; //Make I/O pin an output
} else {
CHAN2_HIGH; //Pull I/O pin high
CHAN2_OUTPUT; //Make I/O pin an output
}
for(count=120;count;count--) //Check for DS1820 conversion complete
delay(0xffff); //Delay = 120 * 65535 * 0,1 mcs = 786,4 ms
if(reset_DS(chanel)==false) {
ret_temper->word=0xf0f0; //DS not answered
return;
}
read_write_DS(chanel,0xcc); //DS1820 Skip ROM command
read_write_DS(chanel,0xbe); //DS1820 Read scratchpad command
count=read_write_DS(chanel,0xff); //Read DS1820 temperature LSB
ret_temper->byte[0]=count;
count=read_write_DS(chanel,0xff); //Read DS1820 temperature MSB
ret_temper->byte[1]=count;
reset_DS(chanel);
}

char reset_DS(const char chanel) {
char result;

if(chanel==1) {
CHAN1_OUTPUT; //Make I/O pin an output
CHAN1_LOW; //Pull I/O pin low
delay(-2400); //Delay = 480 mcs (2400 * 0,2mcs)
CHAN1_HIGH; //Pull I/O pin high
CHAN1_INPUT; //Make I/O pin an input
delay(-450); //Delay = 90 mcs (450 * 0,2mcs)
if(PIND & 0x04) result=false; //If zero - OK? else - DS is fault
else result=true;
delay(-2400); //Delay = 480 mcs (2400 * 0,2mcs)
} else {
CHAN2_OUTPUT; //Make I/O pin an output
CHAN2_LOW; //Pull I/O pin low
delay(-2400); //Delay = 480 mcs (2400 * 0,2mcs)
CHAN2_HIGH; //Pull I/O pin high
CHAN2_INPUT; //Make I/O pin an input
delay(-450); //Delay = 90 mcs (450 * 0,2mcs)
if(PIND & 0x08) result=false; //If zero - OK? else - DS is fault
else result=true;
delay(-2400); //Delay = 480 mcs (2400 * 0,2mcs)
}
return(result);
}

void delay(int time) {
TCNT1=time; //Load Timer1
TCCR1B=0x01; //Set Timer1 clock=0.2uS & start Timer1
while(!flag.timeout_end);
flag.timeout_end=false;
TCCR1B=0; //Stop Timer1 clock
}

char read_write_DS(const char chanel,const char code) {
char reg,count;

reg=code;
if(chanel==1) {
for(count=8;count;count--) {
CHAN1_OUTPUT; //Make I/O pin an output
CHAN1_LOW; //Pull I/O pin low
delay(-10); //Delay = 2 mcs (10 * 0,2mcs)
if(reg & 0x01) CHAN1_INPUT; //If low bit=0, then leave line low, otherwise let pull up go high
reg >>= 1; //Right shift
delay(-48); //Delay = 9,6 mcs (48 * 0,2mcs)
if(PIND & 0x04) reg|=0x80; //If one - MSB reg = 1
delay(-244); //Delay = 48,8 mcs (244 * 0,2mcs)
CHAN1_OUTPUT //Let line go back high
delay(-10); //Delay = 2 mcs (10 * 0,2mcs)
}
} else {
for(count=8;count;count--) {
CHAN2_OUTPUT; //Make I/O pin an output
CHAN2_LOW; //Pull I/O pin low
delay(-10); //Delay = 2 mcs (10 * 0,2mcs)
if(reg & 0x01) CHAN1_INPUT; //If low bit=0, then leave line low, otherwise let pull up go high
reg >>= 1; //Right shift
delay(-48); //Delay = 9,6 mcs (48 * 0,2mcs)
if(PIND & 0x08) reg|=0x80; //If one - MSB reg = 1
delay(-244); //Delay = 48,8 mcs (244 * 0,2mcs)
CHAN2_OUTPUT //Let line go back high
delay(-10); //Delay = 2 mcs (10 * 0,2mcs)
}
}
return(reg);
}


Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание