Форум по микроконтроллерам: pic12f629 и ds18b20 - Форум по микроконтроллерам

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

pic12f629 и ds18b20

#1 Пользователь офлайн   yeye77 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 8
  • Регистрация: 17 Май 17

Отправлено 28 Июнь 2017 - 12:59

Пытаюсь состыковать pic12f629 и ds18b20. Пример брал для pic16, адаптирую под свой камень. Не получается. Вывод показаний осуществляю через сдвиговый регистр на одноразрядный 7-ми сегментный индикатор (проверял вывод на индикатор - все нормально). При снятии показаний с датчика сначала появляется 8, затем 2 и далее только 0.


Вот код процедур:

static bit INIT(void);
void TX(unsigned char cmd);
unsigned char RX();
void get_temp();

static bit INIT(void){
static bit b;
STATE = 1;
PIN=1;
STATE = 0;
GPIO=GPIO;
//PIN=0;
__delay_us(500);
STATE = 1;
GPIO=GPIO;
__delay_us(65);
b = PIN;
__delay_us(450);

return b;
}

void TX(unsigned char cmd){
unsigned char temp = 0;
unsigned char i = 0;
temp = cmd;
for (i=0;i<8;i++) 
    {
    if (temp&0x01) {
		STATE = 0;
        GPIO=GPIO;
		__delay_us(5);
		STATE = 1;
        GPIO=GPIO;
		__delay_us(70);
	} else {
		STATE = 0;
        GPIO=GPIO;
		__delay_us(70);
		STATE = 1;
        GPIO=GPIO;
		__delay_us(5);
											
	}
	temp >>= 1;						  
    }
}

unsigned char RX() {
unsigned char d = 0;
unsigned char i = 0;
for (i=0;i<8;i++){
    STATE = 0;
    GPIO=GPIO;
	__delay_us(6);
	STATE = 1;
    GPIO=GPIO;
	__delay_us(4);
	d>>=1;
	if (PIN == 1) d |= 0x80; 
	//printf("\r\n %d", d);
	__delay_us(60);		 
}			 
return d;				 
}

void get_temp() {
static bit init;
unsigned char temp1;
unsigned char temp2;
init = INIT();
if (!init) {
TX(0xCC);
TX(0x44);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150);
__delay_ms(150); 
} 
//else printf("bug");
init = INIT();
if (!init) {
TX(0xCC);
TX(0xBE);

temp1 = RX();
temp2 = RX();

}
temp_drob = temp1 & 0b00001111;    //Записываем дробную часть в отдельную переменную
temp_drob = ((temp_drob*6)+2)/10;              //Переводим в нужное дробное число
temp1 >>= 4;
sign = temp2 & 0x80;
temp2 <<= 4;
temp2 &= 0b01110000;
temp2 |= temp1;

if (sign) { temperature = 127-temp2; 
            temp_drob = 10 - temp_drob; 
           }   else temperature = temp2;
}

-1

#2 Пользователь офлайн   MAZ 

  • Консерватор - до мозга костей и суставов
  • PipPipPipPip
  • Группа: SuperMod
  • Сообщений: 1 391
  • Регистрация: 15 Февраль 11
  • ГородРоссия

Отправлено 28 Июнь 2017 - 15:34

Смотрите здесь
Если бы Бог не был консерватором, вместо десяти заповедей мы имели бы десять предложений
0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей