Fórum témák

» Több friss téma
Cikkek » Elektromos kulcs iButton-nal (DS1990 és ATTiny13 AVR)
Elektromos kulcs iButton-nal (DS1990 és ATTiny13 AVR)
Szerző: gtk, idő: Júl 6, 2009, Olvasva: 28277, Oldal olvasási idő: kb. 3 perc
Lapozás: OK   1 / 1
Ebben a cikkben röviden megpróbálom bemutatni azt, hogy hogyan illeszthetünk iButton-t ATTiny13 AVR-hez.

Röviden az iButton-ról

Az iButton a Dallas/Maxim fejlesztése, One Wire, vagyis egyvezetékes protokollra épül. Ebben a családban sokféle termék található. Néhányat említsünk meg: NVRAM, EEPROM, Real-Time Clock, Password Protected Memory, Temperature Sensor, ID Only. Ezt az utobbit fogjuk ATTiny13-hoz illeszteni, pontosabban a DS1990A típust.
Mint ahogy a nevében is benne van (ID Only), nem több az egész ,mint egy 64 bites egyedi azonosítóval ellátott csak olvasható ROM. A 64 bit, a képen látható formában, 8 darab 1 byte-os hexaként olvasható le, hexának megfelően jobbról balra haladva. Az első byte a család azonosítója, vagyis 01h. Aztán következik a 6 byte-os egyedi azonosító kód, a legutolsó byte pedig a CRC.

 

Illesztés mikrovezérlőhöz

A képen látható, hogy milyen követelmények vannak az illesztéssel kapcsolatosan.
Kell egy nyitott drain-es I/O 0.6-5k ohm értékű felhúzó-ellenállással. Az ellenállás értéke a vezeték hosszától függ. A hagyományos DS1990A -hoz levő aljzatok, mint pl. a DS9092+/PL vezetékhossza 15-25 cm, (attól is függ, hogy éppen ki hamisította, mint pl. a képen látható bádogot) Az alkalmazások többségében 2.2 K ohm értékű ellenállás megfelelő. Az alábbi kapcsolásban 3.3k ellenállást, korábbi iButton projektemben 4.7k ellenállást használtam. Az aljzatokról még annyit érdemes említeni, hogy jó drága, és létezik belőle LED-del szerelt típus is, mint pl. a DS9092LED. (Egy kis kreativitással hobbi célra otthon is elkészíthető az aljzat.)

 

Illesztés ATTiny13 AVR -hez 


 

Az ATTiny13 nem rendelkezik nyitott drain-es porttal, ezért standard I/O -ra fogjuk kapcsolni az iButton-t. Megtehetjük, ugyanis csak beolvasásnál fontos, hogy a BUS-on levő H szintet le tudja húzni az iButton. Amikor bemenetre váltunk az AVR PORT-ján, az AVR belső felhúzó-ellenállása adja a H szintet - ha be van kapcsolva. Tehát az AVR rendelkezik belső felhúzó-ellenállással, de ennek értéke legalább egy nagyságrenddel nagyobb, mint a BUS-ra ajánlott felhúzó-ellenállás értéke, ezért alkalmazunk külsőt, a belsőt meg kikapcsoljuk. (Ez utóbbi nem annyira lényeges, csak a teljesség kedvéért )

Az MCUCR regiszterben a PUD bit 1-be vagy 0-ba való állításával ki- és bekapcsolható a port belső felhúzó-ellenállása. Írtam két makrót rá:

  1. #define DISABLE_PULLUPS MCUCR |= (1 << PUD);
  2. #define ENABLE_PULLUPS MCUCR &= ~(1 << PUD);

Amint a forráskódban is látszik, iButton olvasás előtt kikapcsolom a belső felhúzó ellenállásokat, olvasás után meg visszakapcsolom, még szükség lehet rá.

Main:

  1. /* */
  2.  main ( )
  3.  {
  4.  DDRB |= (1 << PB3);
  5.  
  6.  for (;;)
  7.  {    
  8.   _delay_ms (10);
  9.  
  10.  //cli (); //Kell, ha INTeket hasznalunk
  11.   DISABLE_PULLUPS;   // belso felhuzo ellenallasok kikapcsolva
  12.  
  13.   if (!OWTouchReset ())
  14.    {
  15.     if (ReadSN_Dallas ())    //ha sikerult kiolvasni
  16.      {
  17.       if (IDstring[0] == 0x01)    //ibutton family code
  18.        {
  19.          eeprom_read ((void *) buf_sn, (const void *) 0x00,(size_t) 6);
  20.         if (compare_SN (&IDstring[1], buf_sn))
  21.          {
  22.             read_iButton_flag = 1;
  23.            } else {
  24.              read_iButton_flag = 0;
  25.          }
  26.         } else {
  27.           read_iButton_flag = 0;
  28.        }
  29.       } else {
  30.       read_iButton_flag = 0;
  31.      }
  32.     } else {
  33.       read_iButton_flag = 0;
  34.     }
  35.   //sei ();
  36.   ENABLE_PULLUPS;
  37.  
  38.    //jelzes
  39.    if (read_iButton_flag)
  40.    {
  41.     PORTB |= (1 << PB3);
  42.     } else {
  43.      PORTB &= ~(1 << PB3);
  44.    }
  45.  
  46.  }//end loop
  47.  }//end main

 

Olvassuk be a kulcsot

A fent említett módon leolvassuk a kulcsról a 6 byteos azonosító számot, és AVRDUDE-dal terminál módban az AVR EEPROM-jába beírjuk. Az EEPROM-ba való bejegyzést szoftverből is lehetne, de akkor mindig újra kellene fordítani a kódot. Én a FUSE biteket nem módosítottam, ezért programozáskor törlődik az EEPROM tartalma is. Ezért először felprogramoztam az AVR-t, utána írtam be az ID-t az EEPROM-ba.

 

AVRDUDE terminál mód


Terminál módban az alábbi paracssoros utasítással lehet futtatni az AVRDUDE-ot:
Az AVR legyen csatlakoztatva a programozóra, majd:

  1. avrdude -p t13 -c stk200 -v -t

Ezután:

avrdude> write eeprom cím adat_C_Hexában, vagyis pl:

  1. avrdude> write eeprom 0 0x78 0x8b 0x4b 0x12 0 0


Miután elküldtük neki az adatot, vissza is ellenőrizhetjük:
  1. avrdude> read eeprom 0 6

A kimeneten valami hasonló fog megjelenni:
>>> read eeprom 0 6
0000  78 8b 4b 12 00 00                                 |x.K...          |


Ha ez is megvan, beolvastathatjuk a kulcsunkat. Ha minden jó, a program beolvassa az iButtont, elvégez a kódon egy CRC ellenőrzést, majd összehasonlítja az EEPROM-ban levő kóddal, és LED-en jelzi, hogy OK, ez az

Egy kis áramköri (FET, relé) és program kiegészítéssel akár beléptető rendszert is építhetünk, vagy akár elektromos kulcsot valamilyen eszközhöz, járműhöz.
Amint látható a képen, egész picire meg lehet építeni az egészet, főleg, ha NYÁK-ot tervezünk hozzá.

A DS1990A driver és a példakód megtalálható a ibuttonattiny13.zip-ben.

A driver tartalmazza a CRC algoritmust is.
Felhasznált irodalom: DS1990 adatlap.

Gtk, 2009.07.06

Következő: »»   1 / 1
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem