Nagits's Blog

programming, fizfak science, etc…

AVR: 1-wire

iButton Dallas1990A с брелокомРеализовываем 1-wire интерфейс на примере чтения серийного кода с iButton Dallas1990A (ключ от домофона).

 

 

Все гениальное — просто? Мда, проще и удобнее, чем 1-wire, придумать — еще надо постараться. Если сказать, что 1-wire применяется широко в сфере автоматизации, значит не сказать ничего. Применение этого интерфейса поистине огромно. Интерфейс для двунаправленной передачи данных всего-лишь с одним проводом (+ GND конечно) оказывается как нельзя кстати для датчиков малых размеров. Однако спектр оборудования с 1-wire куда шире, к примеру, фирмой Dallas выпускаются ЖК-индикаторы с 1-Wire-интерфейсом, а также однопроводные силовые переключатели и регуляторы различных электроцепей.
Наиболее распространенными 1-wire девайсами являются датчики температуры и системы идентификации (RFID считыватели, ключи iButton).
Ключ iButton известен ВСЕМ, даже тем, кто не знает что он знает о нем %). Это самый обычный ключ от домофона. Когда-то я думал, что в этой металлической таблетке содержится что-то наподобие магнита. В действительности — внутри постоянное запоминающее устройство; в него, в ходе изготовления, записывается уникальный регистрационный номер. Т.е. ваш ключ от домофона в этом смысле уникален, поэтому его можно успешно использовать например, в сигнализациях. И это обойдется гораздо дешевле, чем в случае с устройствами RFID (другой вопрос — возможность создания дубликата).
Если вы только что узнали что-то новое, то вам наверное, будет и не в новинку посмотреть на лицевую сторону ключа:
Сверху красуется надпись фирмы изготовителя (DALLAS или сайт iButton.com). Ниже идет строка с двумя числами (шестнадцатеричные).
То, которое слева — это контрольная сумма (1 байт, например D8), также зашитая в память ключа. Поскольку на надежность передачи данных надеяться не приходится (дрожащими руками подносим ключик к домофону, который пережил не одну русскую зиму…), то ее нужно будет вычислять по считанному серийному номеру и сравнивать с той, которая в памяти. Совпадение контрольных сумм будет означать что серийный номер мы считали верно.
Число справа — это семейство, к которому принадлежит ключ (1 байт). В нашем случае это 01 («DS1990A has a family code of 01 Hex and the DS1991 has a family code of 02 Hex…..»).
Строкой ниже располагается серийный номер (тоже hex), например 00000CE672DA (6 байт).
Все эти 3 числа мы будем считывать с помощью контроллера AVR: напишем программу и просимулируем ее в Proteus-е.
1-wire простой, и библиотеку для работы с этим интерфейсом можно написать самому, главное — не ошибиться с временными интервалами (см. даташит на Dallas 1990A), поскольку они играют первостепенную роль, ведь по одному проводу данные передаются в обе стороны. Но в наши времена редко кто изобретает велосипед — библиотек и примеров для 1-wire в гугле достаточно, и отыскать качественную реализацию этого интерфейса не составит большого труда.
Для разнообразия информацию я решил выводить на LCD, а не через RS232.
Подключаем к проекту на AVR Studio 1wire.c и 1wire.h, а также библиотеки для работы с LCD-дисплеем.
В 1wire.h нужно задать I/O-пин контроллера, которому будем сувать наш ключ:
</p>
<p>//Location 1 Wire Net in PORT B pin 0.</p>
<p>#define OW_DQ   PB0</p>
<p>#define OW_PIN  PINB</p>
<p>#define OW_DDR  DDRB</p>
<p>#define OW_PORT PORTB</p>
<p>
Ну и непосредственно код:
</p>
<p>#define F_CPU 4000000UL</p>
<p>...............................</p>
<p>char buff[100];</p>
<p>BYTE ser[8];</p>
<p>uint8_t var_crc = 0;</p>
<p>int main(void)</p>
<p>{</p>
<p>  lcd_init(LCD_DISP_ON);</p>
<p>  lcd_puts("Dallas1990A iButton\nreading demo...");</p>
<p>  _delay_ms(1000);</p>
<p>  lcd_clrscr();</p>
<p>  /***Working with iButton***/</p>
<p>  //DS1990A Tx Presence pulse</p>
<p>  while(OW_reset())</p>
<p>  {</p>
<p>    lcd_puts("Hold the key to the reader...");</p>
<p>    _delay_ms(100);</p>
<p>    lcd_gotoxy(0,0);</p>
<p>  }</p>
<p>  //send (33h) ReadRom command</p>
<p>  OW_write_byte(0x33);</p>
<p>  for(int i=0;i&lt;=7;i++)</p>
<p>    ser[i] = OW_read_byte();</p>
<p>  /**************/</p>
<p>  /***Print info***/</p>
<p>  lcd_clrscr();</p>
<p>  sprintf(buff,"Family %X\n",ser[0]);</p>
<p>  lcd_puts(buff);</p>
<p>  lcd_puts("Key ");</p>
<p>  for(int i=6;i&gt;=1;i--)</p>
<p>  {</p>
<p>    sprintf(buff,"%.2X",ser[i]);</p>
<p>    lcd_puts(buff);</p>
<p>    _delay_ms(10);</p>
<p>  }</p>
<p>  lcd_puts("\n");</p>
<p>  sprintf(buff,"CRC %x",ser[7]);</p>
<p>  lcd_puts(buff);</p>
<p>  /**************/</p>
<p>  /***validate CRC***/</p>
<p>  for(int i = 0; i &lt; 7; i++)</p>
<p>  {</p>
<p>    var_crc =  OW_ComputeCRC8(ser[i], var_crc);</p>
<p>  }</p>
<p>  sprintf(buff,"(%x)",var_crc);</p>
<p>  lcd_puts(buff);</p>
<p>  if(ser[7]==var_crc)</p>
<p>    lcd_puts("-success!");</p>
<p>  else</p>
<p>    lcd_puts("-error.");</p>
<p>  /**************/</p>
<p>}</p>
<p>
После построения решения переходим в Proteus..
Я добавил ATMega16, экран LM044 (4-хстрочный), сам ключ iButton 1990A. В настройках ключа измените серийный номер по своему усмотрению (любой 6-байтовый). Ключ подсоединяется к порту контроллера, который вы указали в заголовочном файле 1wire.h. На линию вешается резистор на + питания номиналом ~5kOm.
Все, остается только запустить симуляцию:
Работаем с iButton Dallas1990A

Кстати не забывайте, что Proteus соединяет земли устройств автоматически, поэтому GND на iButton1990 не отображен.

Файлы к статье (библиотеку для работы с 1-wire, файл Proteus с прошивкой), можете найти в Моих документах в разделе AVR\1-wire

Advertisements

Written by nagits

Октябрь 11, 2010 в 11:38

Опубликовано в 1-wire, AVR

Tagged with , , , ,

комментариев 6

Subscribe to comments with RSS.

  1. Можешь показать ссылки на библиотеку 1wire, которой пользовался

    или выложи их где-то плз

    Vlad

    Май 14, 2011 at 15:41

  2. AVR-GCC (WinAVR) из под AVR Studio

    nagits

    Май 5, 2011 at 21:41

  3. а каким компилятором пользовался?
    я просто курсовой делаю,и думал использовать кусок этой программы,но она не хочет компилироваться…
    я использую IAR Embedded Workbench

    muskat507

    Май 5, 2011 at 18:20

  4. Скоро сессия :(, поэтому в ближайшее время статьи не будет точно. Потом, когда отмучаюсь, посмотрю, если она будет актуальна (если в гугле нет хороших статей на эту тему), то обязательно напишу

    nagits

    Декабрь 19, 2010 at 16:48

  5. А можно статью про работу с датчиками DS18B20.

    foxit

    Декабрь 19, 2010 at 03:10


Обсуждение закрыто.

%d такие блоггеры, как: