#include "1wire.h" #include #include #include #define SEARCHROM #undef INITST #ifdef SEARCHROM #ifdef INITST extern unsigned char initst; #endif #endif unsigned char _1WireInit(void){ unsigned char wyj=0; _1WPORT &= ~_1WL; ZERO; _delay_us(480); // cli(); JEDEN; _delay_us(70); if(!WYS) wyj++; // sei(); _delay_us(410); if(!WYS) wyj++; return wyj; // 0 - zwarcie, 1 - ok, 2 - rozwarcie } void _1WireWriteByte(unsigned char dana){ register unsigned char i; for(i=0;i<8;i++){ _1WireWriteSlot(dana&1,0); dana >>= 1; } } void _1WireWriteBytePR(unsigned char dana){ //natychmiast po poleceniu włącz zasilanie register unsigned char i; for(i=0;i<7;i++){ _1WireWriteSlot(dana&1,0); dana >>= 1; } _1WireWriteSlot(dana,1); _1WPORT |= _1WL; _1WDDR |= _1WL; // sei(); if(!WYS) _1WirePoweroff(); } void _1WireWriteSlot(unsigned char x, unsigned char pr){ // cli(); ZERO; if(x) _delay_us(6); else _delay_us(60); JEDEN; if(x) _delay_us(64); else _delay_us(10); if(!pr) sei(); _delay_us(1); } unsigned char _1WireReadByte(void){ register unsigned char i=1; unsigned char dana=0; while(i){ if(_1WireReadSlot()) dana |= i; i <<= 1; } return dana; } unsigned char _1WireReadSlot(void){ unsigned char wyj=0; // cli(); ZERO; _delay_us(6); JEDEN; _delay_us(9); if(WYS) wyj=1; // sei(); _delay_us(55); return wyj; } /* void _1WirePoweroff(void){ //wyłacz zasilanie _1WDDR &= ~_1WL; _1WPORT &= ~_1WL; }*/ #ifdef SEARCHROM unsigned char _1WireSearch(unsigned char rv, unsigned char *buf){ unsigned char i,a,b,mask=1,lz=0; #ifdef INITST if((initst = _1WireInit())!=1) return 0xff; #else if(_1WireInit()!=1) return 0xff; #endif _1WireWriteByte(0xf0); for(i=1;i<65;i++){ a = _1WireReadSlot(); b = _1WireReadSlot(); if(a && b) return 0xff; if(a==b) { if(i>rv) a = 0; else if(i==rv) a = 1; else a = !!((*buf)&mask); if(!a) lz=i; } _1WireWriteSlot(a,0); if(a) (*buf)|=mask; else (*buf)&=~mask; mask<<=1; if(!mask){ mask = 1; buf++; } } rv=lz; return rv; } void _1WireSendRom(unsigned char *rom){ register unsigned char i; for(i=0;i<8;i++){ _1WireWriteByte(rom[i]); } } #endif /* unsigned char tablica_z_adresami[MAX_NUM][8]; unsigned char rom[8]; unsigned char i=0, rv=0; do { rv = _1WireSearch(rv, rom); memcpy(tablica_z_adresami[i], rom, 8); i++; } while(rv && i