Witam.
Proszę nie mówcie żebym nie szukał na forum bo tego jest miliony i tu się zgodzę bo jest pełno ale dla kogoś kto średnio się zna to jest mało przydatne.
Mam układ ds18b20 podłączony do portu D pin 0 avr'ka tiny2313 rezystor podciągający 4,7k. Cały port B wykorzystany do sterowani podwójnym wyświetlaczem siedmio segmentowym przy pomocy CD4511. Część sprzętowa jest sprawna, wyświetlacz działa tak jak działać powinien. Nie mam zewnętrznego kwarcu. Poniżej zamieszczę program do obsługi tego ds'a który oczywiście nie działa tzn ciągle wyświetla 70 albo 07 w zależności od zmiennych w1 i w2.
Pozdrawiam i mam nadzieje że mój problem nie odejdzie w cień i ktoś pomoże.
Proszę nie mówcie żebym nie szukał na forum bo tego jest miliony i tu się zgodzę bo jest pełno ale dla kogoś kto średnio się zna to jest mało przydatne.
Mam układ ds18b20 podłączony do portu D pin 0 avr'ka tiny2313 rezystor podciągający 4,7k. Cały port B wykorzystany do sterowani podwójnym wyświetlaczem siedmio segmentowym przy pomocy CD4511. Część sprzętowa jest sprawna, wyświetlacz działa tak jak działać powinien. Nie mam zewnętrznego kwarcu. Poniżej zamieszczę program do obsługi tego ds'a który oczywiście nie działa tzn ciągle wyświetla 70 albo 07 w zależności od zmiennych w1 i w2.
Pozdrawiam i mam nadzieje że mój problem nie odejdzie w cień i ktoś pomoże.
#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>
#define WE 0
#define PORT_1wire PIND
#define SET_1wire DDRD&=~_BV(WE)
#define CLEAR_1wire DDRD|=_BV(WE)
int d1,d2,w1,w2;
//reset magistrali oczekiwanie na impuls
unsigned char RESET_PULSE(void)
{
unsigned char PRESENCE;
CLEAR_1wire; // ustawienie na poziom niski
_delay_us(500);
SET_1wire; //ustawienie na poziom wysoki
_delay_us(30); //oczekiwanie na ustaweinie linii w poziom niski przez ds'a
//sprawdzenie poziomu na linii ds'a czy w stanie niskim
if (bit_is_clear(PORT_1wire, WE)) {PRESENCE=1;} else {PRESENCE=0;}
//1-odebrano bit presence, 0 stan nieaktywnosci
_delay_us(470);// oczekiwanie przez mastera ok 470 mikro sekund i spr czy ds podciagnal magistrale
//sprawdzamy czy poziom linni ustawiony
if (bit_is_set(PORT_1wire, WE)) {PRESENCE=1;} else {PRESENCE=0;}
return PRESENCE; // zwracamy wartosc do funkcji
}
//wysyla do ukladu pojedynczy bit
void send(char bit)
{
CLEAR_1wire;// ustawienie w stan niski magistrali
_delay_us(5);
if(bit==1)
SET_1wire; //zwolnienie magistrali - wyslanie jedynki
_delay_us(80);//przetrzymanie - wyslanie zera
SET_1wire;
}
//odczytuje bit z magistrali
unsigned char read(void)
{
unsigned char PRESENCE=0;
CLEAR_1wire; //ustawienie w stan niski
_delay_us(2);
SET_1wire;
_delay_us(15);
if (bit_is_set(PORT_1wire, WE)) PRESENCE=1; else PRESENCE=0;
return(PRESENCE);
}
//wysyla caly bajt do ukladu
void send_byte(char wartosc)
{
unsigned char i;//zmienna licznikowa
unsigned char pom; //zmienna pomocnicza
for(i=0;i<8;i++)
{
pom = wartosc>>i;//przesuniecie bitowe w prawo
pom &=0x01; //skopiowanie bitu do zmiennej pomocniczej
send(pom); //wyslanie bitu na magistrale
}
_delay_us(100);
}
//zczytuje caly bajt z ukladu
unsigned char read_byte(void)
{
unsigned char i;// zmienna licznikowa
unsigned char wartosc=0; //zczytywana wartosc
for (i=0;i<8;i++)
{
if (read()) wartosc|=0x01<<i; //zczytywanie po jednym bicie
_delay_us(15);
}
return(wartosc);
}
int main (void)
{
//deklaracja zmiennych lokalnych
DDRB = 0xFF; // Ustawiamy port B jako wyjścia
unsigned char sprawdz;
char temp1=0, temp2=0;
//
for(;;)
{
if(sprawdz==1)
{
send_byte(0xCC); //skip rom
send_byte(0x44);//convert t
_delay_ms(750);
sprawdz=RESET_PULSE();
send_byte(0xCC);
send_byte(0xBE);
temp1=read_byte();//odczytanie lsb
temp2=read_byte();//odczytanie msb
sprawdz=RESET_PULSE(); //zowlnienie magistrali
w2 = temp1/10;
w1 = temp2%10;
switch(w2){
case 0:
d2=(0x00);
break;
case 1:
d2=(0x01);
break;
case 2:
d2=(0x08);
break;
case 3:
d2=(0x09);
break;
case 4:
d2=(0x04);
break;
case 5:
d2=(0x05);
break;
case 6:
d2=(0x0C);
break;
case 7:
d2=(0x0D);
break;
case 8:
d2=(0x02);
break;
case 9:
d2=(0x03);
break;
default:
d2=(0x00);
break;
}
switch(w1){
case 0:
d1=(0x00);
break;
case 1:
d1=(0x01);
break;
case 2:
d1=(0x08);
break;
case 3:
d1=(0x09);
break;
case 4:
d1=(0x04);
break;
case 5:
d1=(0x05);
break;
case 6:
d1=(0x0C);
break;
case 7:
d1=(0x0D);
break;
case 8:
d1=(0x02);
break;
case 9:
d1=(0x03);
break;
default:
d1=(0x00);
break;
}
PORTB=(d1 <<4 | d2);
_delay_ms(200);
}
}
}
