Hej. Implementuje DS18B20 na Atmega32 (na nóżce PD3)
Oto funkcja resetująca linię one wire :
unsigned char ow_reset(void) // reset lini one wire
{
unsigned char presence;
sbi(DDRD,3); //DQ = 0; //pull DQ line
delay(767); // leave it low // wystawienie na czas 480us "0" na linię 1w przez uC
cbi(DDRD,3);//DQ = 1; // allow line to //powrót lini 1w do trybu wejścia
delay(111); // wait for presence pulse(pochodzący od DS-a) //czekamy na ustabilizowanie lini
if(bit_is_clear(PIND,3)) presence=0; //odczytujemy co wystawił na linię DS
if(bit_is_set(PIND,3)) presence=1; //get presence
delay(661); // wait for end
return(presence); // presence signal
} // 0=presence, 1 = no part
fragment main() :
DDRD=0x00; //port D - we
PORTD=0; //bez podciągania
kwarc - 8 MHz
funkcja opóźniająca:
void delay(unsigned char tau) //czeka ok (5+5*tau)*T, gdzie T to cykl zegara
{ //u nas T=1/8*10^6=125ns
unsigned char tau2=tau;
do
asm("nop"); //wstawka asemblerowa
while(--tau2!=0);
}
wywołanie funkcji resetujacej daje w odpowiedzi 1.
Sprawdziłem napięcia na lini PD3. Jeśli DDRD=0 to napięcie wynosi 4,96, a jesli ustawię post w tryb wyjściowy (DDRD=1) to 0,03 V. (sprawdziłem to pisząc krótkie programiki przełączające tryb we na wy). Czyżby walnięty czujnik ?
Dodano po 2 [godziny] 6 [minuty]:
Hmmm. Wymieniłem czujnik i nadal to samo... Czyli coś nie tak w programie ... Pomóżcie !
Oto funkcja resetująca linię one wire :
unsigned char ow_reset(void) // reset lini one wire
{
unsigned char presence;
sbi(DDRD,3); //DQ = 0; //pull DQ line
delay(767); // leave it low // wystawienie na czas 480us "0" na linię 1w przez uC
cbi(DDRD,3);//DQ = 1; // allow line to //powrót lini 1w do trybu wejścia
delay(111); // wait for presence pulse(pochodzący od DS-a) //czekamy na ustabilizowanie lini
if(bit_is_clear(PIND,3)) presence=0; //odczytujemy co wystawił na linię DS
if(bit_is_set(PIND,3)) presence=1; //get presence
delay(661); // wait for end
return(presence); // presence signal
} // 0=presence, 1 = no part
fragment main() :
DDRD=0x00; //port D - we
PORTD=0; //bez podciągania
kwarc - 8 MHz
funkcja opóźniająca:
void delay(unsigned char tau) //czeka ok (5+5*tau)*T, gdzie T to cykl zegara
{ //u nas T=1/8*10^6=125ns
unsigned char tau2=tau;
do
asm("nop"); //wstawka asemblerowa
while(--tau2!=0);
}
wywołanie funkcji resetujacej daje w odpowiedzi 1.
Sprawdziłem napięcia na lini PD3. Jeśli DDRD=0 to napięcie wynosi 4,96, a jesli ustawię post w tryb wyjściowy (DDRD=1) to 0,03 V. (sprawdziłem to pisząc krótkie programiki przełączające tryb we na wy). Czyżby walnięty czujnik ?
Dodano po 2 [godziny] 6 [minuty]:
Hmmm. Wymieniłem czujnik i nadal to samo... Czyli coś nie tak w programie ... Pomóżcie !