Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Держи на Си(+). Два DS1820 подключены к ножкам AVR.

Отправлено Вяч 11 июля 2007 г. 15:51
В ответ на: Мужики, ну помогите с исходником для DS18B20 на HT-PICC. Замучался. В Proteus смотрю осциллограмму - DS отвечает, а считать не считывается. Бьюсь весь день.... отправлено <font color=gray>Roman_V</font> 11 июля 2007 г. 15:43

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 изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 234:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru