Witam,
Napisałem sobie podprogram odczytu sygnatur z dwóch DS18B20. Pierwszy z DS'ów jest identyfikowany bezbłędnie, natomiast mam problem z odczytem sygnatury drugiego DS'a. Gdy próbuje odczytać sygnaturę drugiego to ponownie odczytuje mi się sygnatura pierwszego z nich. Poniżej zamieszczam kod owire.c
Nie wiem gdzie jest błąd. Zastanawiam się czy poprawnie wpisuje odczytane wartości z pierwszego DS'a i czy poprawnie odczytuję miejsce w którym natrafiam na różnicę w bitach sygnatury DS'ów.
Napisałem sobie podprogram odczytu sygnatur z dwóch DS18B20. Pierwszy z DS'ów jest identyfikowany bezbłędnie, natomiast mam problem z odczytem sygnatury drugiego DS'a. Gdy próbuje odczytać sygnaturę drugiego to ponownie odczytuje mi się sygnatura pierwszego z nich. Poniżej zamieszczam kod owire.c
#include <avr/io.h>
#include <util/delay.h>
#include "owire.h"
// set pin mask
#define wmask 0x01
// set 1-wire pin for output
#define wOut DDRD |= wmask
// set 1-wire pin for input (bus released)
#define wIn DDRD &= ~wmask; PORTD |= wmask
// set 1-wire bus high
#define wH PORTD |= wmask
// set 1-wire bus low
#define wL PORTD &= ~wmask
// get 1-wire bus input (bus released)
#define wR PIND & wmask
//SEARCH_ROM 0xF0
//READ_ROM 0x33
//MATCH_ROM 0x55
//SKIP_ROM 0xCC
//ALARM_SEARCH 0xEC
//CONVERT_T 0x44
//WRITE_SCRATCHPAD 0x4E
//READ_SCRATCHPAD 0xBE
//COPY_SCRATCHPAD 0x48
//RECALL_E2 0xB8
//READ_POWER_SUPPLY 0xB4
int i = 0;
int id1[64];
int id2[64];
void uDelay(char x)
{
for( ; x > 0; --x) // ta pętla zostanie wykonana x-razy
__asm("nop"); // dodatkowa instrukcja opóźniająca o 1 cykl
// funkcja opoznia o x * 4us
}
// procedura reset
unsigned char Reset1Wire(void)
{
// cli(); //globalne zablokowanie przerwań
unsigned char present;
wOut;
wL;
_delay_us(488);
wIn;
_delay_us(20);
present=wR;
_delay_us(400);
// sei(); //globalne odblokowanie przerwań
return present;
}
// transmisja 1 bitu
void wTxbit(unsigned char bit)
{
wOut;wL;
if (bit)
{
_delay_us(12); // 12us
wIn;
_delay_us(60); // 60us
}
else
{
_delay_us(60); // 60us
wIn; // better releash the bus
_delay_us(12); // 12us
}
}
// odebranie 1 bitu
unsigned char wRxbit(void)
{
unsigned char data;
wOut;wL;
_delay_us(4); // 4us
wIn;
_delay_us(12); // 12us
data=wR;
_delay_us(48); // 48us
return data;
}
// transmisja 1 bajtu
void wTxbyte(unsigned char data)
{
// cli(); //globalne zablokowanie przerwań
unsigned char i;
for (i=0; i<8; i++)
{
wTxbit(data & 0x01);
data>>=1;
}
// sei(); //globalne odblokowanie przerwań
}
// odebranie 1 bajtu
unsigned char wRxbyte(void)
{
// cli(); //globalne zablokowanie przerwań
unsigned char i, bit, data;
data=0;
for (i=0; i<8; i++)
{
bit=wRxbit();
data|=bit<<i;
}
// sei(); //globalne odblokowanie przerwań
return data;
}
//
unsigned char CountAddrCRC(unsigned char Input[7])
{
unsigned char CRC[8] = {0, 0, 0, 0, 0, 0, 0, 0};
/*Input[7] = {0x28, 0x48, 0xFB, 0xFA, 0x01, 0x00, 0x00};
Input[0] = 0x28;
Input[1] = 0x48;
Input[2] = 0xFB;
Input[3] = 0xFA;
Input[4] = 0x01;
Input[5] = 0;
Input[6] = 0;*/
unsigned char i = 0, x = 0;
while(i<56)
{
if (i==0) {x = Input[0];}
if (i==8) {x = Input[1];}
if (i==16) {x = Input[2];}
if (i==24) {x = Input[3];}
if (i==32) {x = Input[4];}
if (i==40) {x = Input[5];}
if (i==48) {x = Input[6];}
Input[0] = (CRC[0])^(x&0x01);
CRC[0] = CRC[1];
CRC[1] = CRC[2];
CRC[2] = (CRC[3])^(Input[0]&0x01);
CRC[3] = (CRC[4])^(Input[0]&0x01);
CRC[4] = CRC[5];
CRC[5] = CRC[6];
CRC[6] = CRC[7];
CRC[7] = Input[0]&0x01;
x = x>>1;
i++;
}
//CRC = CRC[0] | CRC[1]<<1 | CRC[2]<<2 | CRC[3]<<3 | CRC[4]<<4 | CRC[5]<<5 | CRC[6]<<6 | CRC[7]<<7;
return CRC[0] | CRC[1]<<1 | CRC[2]<<2 | CRC[3]<<3 | CRC[4]<<4 | CRC[5]<<5 | CRC[6]<<6 | CRC[7]<<7;
}
//
unsigned char CountCRC(unsigned char Input[8])
{
unsigned char CRC[8] = {0, 0, 0, 0, 0, 0, 0, 0};
//Input[8] = {0x96, 0x01, 0x4B, 0x46, 0x7F, 0xFF, 0x0A, 0x10};
/*Input[0] = 0x96;
Input[1] = 0x01;
Input[2] = 0x4B;
Input[3] = 0x46;
Input[4] = 0x7F;
Input[5] = 0xFF;
Input[6] = 0x0A;
Input[7] = 0x10;*/
unsigned char i = 0, x = 0;
while(i<64)//64
{
if (i==0) {x = Input[0];}
if (i==8) {x = Input[1];}
if (i==16) {x = Input[2];}
if (i==24) {x = Input[3];}
if (i==32) {x = Input[4];}
if (i==40) {x = Input[5];}
if (i==48) {x = Input[6];}
if (i==56) {x = Input[7];}
Input[0] = (CRC[0])^(x&0x01);
CRC[0] = CRC[1];
CRC[1] = CRC[2];
CRC[2] = (CRC[3])^(Input[0]&0x01);
CRC[3] = (CRC[4])^(Input[0]&0x01);
CRC[4] = CRC[5];
CRC[5] = CRC[6];
CRC[6] = CRC[7];
CRC[7] = Input[0]&0x01;
x = x>>1;
i++;
}
//CRC = CRC[0] | CRC[1]<<1 | CRC[2]<<2 | CRC[3]<<3 | CRC[4]<<4 | CRC[5]<<5 | CRC[6]<<6 | CRC[7]<<7;
return CRC[0] | CRC[1]<<1 | CRC[2]<<2 | CRC[3]<<3 | CRC[4]<<4 | CRC[5]<<5 | CRC[6]<<6 | CRC[7]<<7;
}
void search_rom(void)
{
int a = 0;
int b = 0;
int c = 1;
volatile int d = 0;
volatile int e = 0;
int f = 0;
if(Reset1Wire()==1)
{
wTxbyte(0xF0);
c = 1;
for(int x = 0; x<64;x++)
{
a = wRxbit();
b = wRxbit();
b = ~b;
if(!(a==b)) //brak konfliktu
{
id1[i] = a;
i++;
wTxbit(a);
}
if(a==b) //konflikt
{
id1[i] = a;
i++;
wTxbit(a);
if(c==1)
{
d = i;
e = x;
c = 0;
}
}
}
}
if(Reset1Wire()==1)
{
i = 0;
wTxbyte(0xF0);
for(e;e<64;e++)
{
for(d;d>0;d--)
{
a = wRxbit();
b = wRxbit();
wTxbit(id1[f]);
f++;
id2[i] = a;
i++;
}
a = wRxbit();
b = wRxbit();
wTxbit(a);
id2[i] = a;
i++;
}
}
}
Nie wiem gdzie jest błąd. Zastanawiam się czy poprawnie wpisuje odczytane wartości z pierwszego DS'a i czy poprawnie odczytuję miejsce w którym natrafiam na różnicę w bitach sygnatury DS'ów.
