Помогите Подружиться С 1Wire

26-07-2013, 11:26 От: admin Посмотрели: 759
Доброго всем времени суток! Разбираюсь с работой 1wire, а именно нужно подключить 3 датчика ds1820 к одному порту ну и собсно получать с них температуру. Начал с одного датчика упрощенного алгоритма получения температуры. Вот тестовая схема:

1.jpg




Вот тестовый код:




#include <pic.h>
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 4000000
__CONFIG(0x03F78);
#define Skip_ROM 0xCC
#define Convert_T 0x44
#define Read_scratchpad 0xBE
#define Port_18B20 RA0
#define Tx_18B20 TRISA0 = 0
#define Rx_18B20 TRISA0 = 1
char Reset_18B20() {
Tx_18B20; // Tris = 0 (output)
Port_18B20 = 0; // set pin# to low (0)
__delay_us(480); // 1 wire require time delay
Rx_18B20; // Tris = 1 (input)
__delay_us(60); // 1 wire require time delay
if (Port_18B20 == 0) { // if there is a presence pluse
__delay_us(480);
return 0; // return 0 ( 1-wire is presence)
} else {
__delay_us(480);
return 1; // return 1 ( 1-wire is NOT presence)
}
}
void Write_18B20 (char Cmd){
char i;
Rx_18B20; // set pin# to input (1)
for(i = 0; i < 8; i++){
if((Cmd & (1<<i))!= 0) {
// write 1
Tx_18B20; // set pin# to output (0)
Port_18B20 = 0; // set pin# to low (0)
__delay_us(1); // 1 wire require time delay
Rx_18B20; // set pin# to input (release the bus)
__delay_us(60); // 1 wire require time delay
} else {
//write 0
Tx_18B20; // set pin# to output (0)
Port_18B20 = 0; // set pin# to low (0)
__delay_us(60); // 1 wire require time delay
Rx_18B20; // set pin# to input (release the bus)
}
}
}
char Read_18B20 (){
char i,result = 0;
Rx_18B20; // TRIS is input(1)
for(i = 0; i < 8; i++){
Tx_18B20; // TRIS is output(0)
Port_18B20 = 0; // genarate low pluse for 2us
__delay_us(2);
Rx_18B20; // TRIS is input(1) release the bus
if(Port_18B20 != 0) result |= 1<<i;
__delay_us(60); // wait for recovery time
}
return result;
}
int main(int argc, char** argv) {
INTCON=0;
CMCON=0x07;
TRISA=0b10000000;
PORTA=255;
unsigned int temp;
unsigned short int tempL, tempH, fraction;

while(1)
{
if(!Reset_18B20()){
Write_18B20(Skip_ROM);
Write_18B20(Convert_T);
__delay_ms(750);
Reset_18B20();
Write_18B20(Skip_ROM);
Write_18B20(Read_scratchpad);
tempL = Read_18B20();
tempH = Read_18B20();
//if(tempL.F3) fraction = 1;
//else fraction = 0;
tempL >>= 4;
tempH <<= 4;
tempH += tempL;
}
__delay_ms(750);
printf("Temp=%dn", tempH);

}
}



Запускаю трассировку MPLABX+PROTEUS, доходит до строчки  Write_18B20(Read_scratchpad); получаю варнинг в протеусе: [DS1822] RAM COMMAND UNSUPPORTED



Подскажите люди добрые, в чём может быть проблема?



Вот проект MPLAB и схемка протеуса:

Прикрепленный файл
 usart_tst.X.zip   171,81 Кб
  4 раз скачано



Заранее благодарен!
Раздел: PIC

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться, либо войти на сайт под своим именем.

Обсудить на форуме


На момент добавления Помогите Подружиться С 1Wire все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Популярные новости
Календарь новостей
«    Апрель 2024    »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
2930