One-wire slave

Článek přináší jednoduchou implementaci jednodrátové sběrnice od Dallasu z pohledu slave. Jde o nestandardní a z pohledu výrobce originálních obvodů nechtěnou činnost, nicměně, někoho by to mohlo zajímat.

Článků na téma tvorby Mastera na jednodrátové sběrnici je mnoho. Nicméně až donedávné doby jsem nenašel jedinou vhodně napsanou knihovnu pro AVR, která by umožňovala téměř bezpracnou implementaci protokolu této sběrnice. Přesto se mi nedávno podařilo jednu takovou nalézt. Autorem této knihovny je Peter Dannegger. Původní zdroj, kde jsem knihovnu získal se mi již nepodařilo nalézt a tak jsem nezbytné soubory umístil na tomto serveru. Odkaz pro stažení naleznete na konci stránky. Více se o knihovně rozepíšu v samostatném článku později. Přibalen je i ukázkový příklad z mé produkce. Ale vraťmě se zpět k druhé straně, tedy k zařízení typu SLAVE.

Jak už jsem uvedl tvorba zařízení typu SLAVE na jendnovodičové sběrnici od Dallasu je z pohledu této firmy nežádoucí. Důvodů je mnoho. Jedním z nich je, že firma se zaručuje, že každé zařízení na této sběrnici bude mít vlastní ROM ID. To ale není možné, pokud si každý vyrobí své zařízení a bude mu ROM ID určovat dle svého uvážení. Nicméně pro testovací účely nám nic nebrání v tom toto doporučení přejít a pustit se rovnou do práce.
Z výše uvedených důvodů se články na téma one-wire slave hledají velmi nesnadno. Jedním z takových je článek ruského bastlíře jehož jméno jsem bohužel už nebyl schopen dohledat. Z jeho programu jsem vycházel a upravil jsem jej k obrazu svému. Níže uvedený projekt umí pouze základní imitaci Dalasovských klíčenek DS1990, nemá implementovány vyhledávací funkce a s mnohými MASTERy tedy nebude ini fungovat:

¨

#define F_CPU 8000000UL
#define DEMUL_DDR DDRB
#define DEMUL_ID 0
#define DEMUL_PIN PINB
#define DEMUL_PORT PORTB

unsigned
char IBKEY[] = { 0x55, 0x1, 0x0, 0x3, 0x1E, 0x7, 0x5, 0x1 };

#include <util/delay.h>
#include <avr/io.h>

void StartWork( void ){
     
unsigned char OWBITCOUNT,IOBYTE,BITMASK;
     
while( !bit_is_clear(DEMUL_PIN,DEMUL_ID));
     
PORTB^=(1<<1);
     
while( bit_is_clear(DEMUL_PIN,DEMUL_ID));
     
_delay_us( 30 );
     
DEMUL_DDR |= (1<<DEMUL_ID);
     
DEMUL_PORT&=~ (1<<DEMUL_ID);
     
_delay_us( 30 );
     
_delay_us( 30 );
     
_delay_us( 30 );
     
_delay_us( 30 );
     
DEMUL_DDR &=~ (1<<DEMUL_ID);
     
while( bit_is_clear(DEMUL_PIN,DEMUL_ID));
     
// read 8 bit's from master
      for(OWBITCOUNT=8;OWBITCOUNT>0;OWBITCOUNT--){
           
while( bit_is_set(DEMUL_PIN,DEMUL_ID));
                 
_delay_us( 30 );
                 
IOBYTE = IOBYTE>>1;
                 
if( bit_is_set(DEMUL_PIN,DEMUL_ID)){
                 
IOBYTE |= 0x80;
                 
}
           
else
                  while( bit_is_clear(DEMUL_PIN,DEMUL_ID));
     
}  
     

      // pokud není čten ROM kód
      if( IOBYTE != 0x33){
           
return; // vyskočí pryč
      }

      for(OWBITCOUNT=8;OWBITCOUNT>0;OWBITCOUNT--){
           
IOBYTE = IBKEY[OWBITCOUNT-1];
           
for(BITMASK=8;BITMASK>0;BITMASK--){
                 
while( bit_is_set(DEMUL_PIN,DEMUL_ID));
                 
if((IOBYTE & 0x01) == 0){
                       
DEMUL_DDR |= (1<<DEMUL_ID);
                       
_delay_us( 25);
                       
_delay_us( 25);
                       
DEMUL_DDR &=~ (1<<DEMUL_ID);
                 
while( bit_is_clear(DEMUL_PIN,DEMUL_ID));
                 
}
                 
IOBYTE >>= 1;
                 
_delay_us(2);
           
}   
     
}

}

int main (void)             
{
     
int cnt=0;
     
DDRB|=(1<<1);
     
PORTB&=~(1<<1);
     
_delay_ms(1);
     
while(1)
     
{
           
cnt++;
           
if (cnt==30) { cnt=0;}
           
StartWork();
     
}    

}


Onewire Master
Onewire Slave

Komentovat článek

Jméno:  
Zpráva:

Komentáře k článku

выа - 6.5.2012 13:38

как скачать??

TestX - 3.11.2011 11:00

Pěkný článek, jen mi nejdou stáhnout ty 2 soubory pod článkem ...