Witam.
Siedzę już nad tym 3-ci dzień, czytam różne przykłady, różne dokumentacje, kupiłem nowy czujnik ds18b20 i nadal ten sam problem - brak odpowiedzi slave na reset pulse. Już pomału zaczynam wariować i tracić chęci skoro nie potrafię poprawnie zaimplementować podstawowej funkcji interfejsu 1wire
DQ podłączone pod PB0 i opornik 4.7k (opornik do zasilania układu).
VCC i GND zmostkowane i podłączone pod GND układu.
PORTD to magistrala do której przyłączone są diody (PD0-PD5) do wyświetlania wartości zmiennych.
Całość działa na zasilaniu z programatora USBASP.
Program:
Po uruchomieniu następuje zapalenie diody (PORTD = pres1;), po 2 sec. zapalenie wszystkich diód na 10ms i zgaszenie diody.
Czyli pres1=1, pres2=0
Z tego co wyczytałem obie powinny mieć wartość 1 jeśli ds prawidłowo odpowiada na zapytania.
Próbowałem używać innych funkcji delayus znalezionych w internecie, jednak efekt ten sam.
avrdude: safemode: lfuse reads as E1
avrdude: safemode: hfuse reads as D9
Czyli pracuje na 1MHz. Kompiluję z opcją -O3
Bardzo proszę o ukrócenie męk i z góry przepraszam za głupotę.
Siedzę już nad tym 3-ci dzień, czytam różne przykłady, różne dokumentacje, kupiłem nowy czujnik ds18b20 i nadal ten sam problem - brak odpowiedzi slave na reset pulse. Już pomału zaczynam wariować i tracić chęci skoro nie potrafię poprawnie zaimplementować podstawowej funkcji interfejsu 1wire
DQ podłączone pod PB0 i opornik 4.7k (opornik do zasilania układu).
VCC i GND zmostkowane i podłączone pod GND układu.
PORTD to magistrala do której przyłączone są diody (PD0-PD5) do wyświetlania wartości zmiennych.
Całość działa na zasilaniu z programatora USBASP.
Program:
#define F_CPU 10000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <inttypes.h>
#define PIN_1WIRE 0
#define PORT_1WIRE PORTB
#define DDR_1WIRE DDRB
#define PIN_READ_1WIRE PINB
#define DDR_1WIRE_IN DDR_1WIRE |= _BV(PIN_1WIRE) // Stan niski
#define DDR_1WIRE_OUT DDR_1WIRE &= ~_BV(PIN_1WIRE) // Stan wysoki
#define WIRE_HIGH PORT_1WIRE |= _BV(PIN_1WIRE)
#define WIRE_LOW PORT_1WIRE &= ~_BV(PIN_1WIRE)
#define PIN_1WIRE_READ PIN_READ_1WIRE & 1<<PIN_1WIRE
unsigned char pres1=0, pres2=0;
unsigned char WIRE_RESET()
{
unsigned char PRESENCE=0;
DDR_1WIRE_IN;
_delay_us(500);
DDR_1WIRE_OUT;
_delay_us(50);
if (bit_is_clear(PORT_1WIRE, PIN_1WIRE))
pres1 = 1;
else
pres1 = 0;
_delay_us(470);
if (bit_is_set(PORT_1WIRE, PIN_1WIRE))
pres2 = 1;
else
pres2 = 0;
return PRESENCE;
}
int main()
{
unsigned char pres;
DDRD = 0b00011111;
PORTD = 0x0;
WIRE_RESET();
PORTD = pres1; // Wyswietlenie na diodach wartosci pres1
_delay_ms(200);
PORTD = 31; // Zaswiecenie wszystkich diod przed nastepna wartoscia
_delay_ms(10);
PORTD = pres2; // Wyswietlenie na diodach wartosci pres2
_delay_ms(200);
PORTD=0;
_delay_ms(200);
return 0;
}
Po uruchomieniu następuje zapalenie diody (PORTD = pres1;), po 2 sec. zapalenie wszystkich diód na 10ms i zgaszenie diody.
Czyli pres1=1, pres2=0
Z tego co wyczytałem obie powinny mieć wartość 1 jeśli ds prawidłowo odpowiada na zapytania.
Próbowałem używać innych funkcji delayus znalezionych w internecie, jednak efekt ten sam.
avrdude: safemode: lfuse reads as E1
avrdude: safemode: hfuse reads as D9
Czyli pracuje na 1MHz. Kompiluję z opcją -O3
Bardzo proszę o ukrócenie męk i z góry przepraszam za głupotę.