Przepraszam o pytanie z cyklu 1000 i 1 opowieści ale kombinuje na wszystkie mi znane sposoby i sposoby z forum a nawet gotowca odpaliłem i też nie działa. Problem jak oszukam sprawdzanie DS to mam 0.0 jak nie oszukam to mam brak czujnika czyli mój DS nie odpowiada na reset czy jakoś tak (w innym kodzie zwracał mi 0.8). Posprawdzałem piny ścieżki i deklaracje i ok. Oto kod gotowca jak było WE 0 a jest 7 i pod 7 jest podpięty czujnik to jest ok (wiem że tak ale każdy się myli
)
PS podpinałem już 3 DSy zasilanie z zewnątrz nie pasożyt (- DQ +)
Proszę o pomoc
#include <avr/io.h>
#include <stdlib.h>
#include "lcd.h"
//makra
#define WE 7
#define PORT_1wire PIND
#define SET_1wire DDRD&=~_BV(WE)
#define CLEAR_1wire DDRD|=_BV(WE)
char buf[8]; //zmienna do konwersji temperatury
// reset magistarali
unsigned char RESET_PULSE(void)
{
unsigned char PRESENCE;
CLEAR_1wire;
delayus(600);
SET_1wire;
delayus(50);
if (bit_is_clear(PORT_1wire, WE)){PRESENCE=1;} else {PRESENCE=0;}
delayus(470);
if (bit_is_set(PORT_1wire, WE)){PRESENCE=1;} else {PRESENCE=0;}
return (PRESENCE);
}
void send(char bit)
{
CLEAR_1wire;
delayus(5);
if(bit==1)
SET_1wire;
delayus(80);
SET_1wire;
}
unsigned char read(void)
{
unsigned char PRESENCE=0;
CLEAR_1wire;
delayus(2);
SET_1wire;
delayus(15);
if(bit_is_set(PORT_1wire, WE)) PRESENCE=1; else PRESENCE=0;
return (PRESENCE);
}
void send_byte(char wartosc)
{
unsigned char i;
unsigned char pom;
for (i=0; i<8; i++)
{
pom=wartosc>>i;
pom&=0x01;
send(pom);
}
delayus(100);
}
unsigned char read_byte(void)
{
unsigned char i;
unsigned char wartosc=0;
for (i=0; i<8; i++)
{
if(read()) wartosc|=0x01<<i;
delayus(15);
}
return(wartosc);
}
int main(void)
{
unsigned char sprawdz;
char temp1=0, temp2=0;
LCD_init();
LCD_clear();
LCD_putstr_P(PSTR("1-wire"));
LCD_xy(0,1);
LCD_putstr_P(PSTR("DS18B20"));
delayms(1000);
LCD_clear();
for(;;){
sprawdz=RESET_PULSE();
if (sprawdz==1)
{
send_byte(0xCC);
send_byte(0x44);
delayms(750);
sprawdz=RESET_PULSE();
send_byte(0xCC);
send_byte(0xBE);
temp1=read_byte();
temp2=read_byte();
sprawdz=RESET_PULSE();
float temp=0;
temp=(float)(temp1+(temp2*256))/16;
dtostrf(temp,1,1,buf);
LCD_xy(0,0);
LCD_putstr(buf);
delayms(200);
}
else
{
LCD_xy(0,0);
LCD_putstr_P(PSTR("Brak czujnika"));
LCD_xy(0,1);
LCD_putstr_P(PSTR("DS18B20"));
}
}
}
PS podpinałem już 3 DSy zasilanie z zewnątrz nie pasożyt (- DQ +)
Proszę o pomoc