محاكي بطاقة EM Marine

من المؤكد أن كل واحد منا ذهب إلى المكاتب العادية كان مهتمًا بكيفية عمل هذه التصاريح اللاتلامسية. في هذه المقالة ، سنتعامل مع مبدأ تشغيل البطاقات التي لا تلامس ونصنع محاكيًا حرفيًا من ثلاثة مكونات راديو.
تقنية RFID

ظهور علامات
RFID (تحديد هوية تردد الراديو باللغة الإنجليزية ، تحديد تردد الراديو) - له نطاق تردد واسع إلى حد ما وعدد كبير إلى حد ما من المعايير المختلفة التي تنطبق بطريقة ما على هذه التقنية. كمرجع: الترددات المستخدمة هي: 125-135 كيلو هرتز ، 400 كيلو هرتز ، 6.78 ميجا هرتز ، 13.56 ميجا هرتز (بطاقات المترو والبطاقات المصرفية) ، 27.125 ميجا هرتز ، 40.68 ميجا هرتز ، 433.29 ميجا هرتز ، 869 ميجا هرتز ، 915 ميجا هرتز ، 2.45 جيجا هرتز ، 5.8 جيجا هرتز ، 24.125 جيجا هرتز. كما ترى ، نطاق التردد واسع جدًا.
سنتحدث عن البطاقات الأكثر انتشارًا والأقل حماية من نطاق التردد 125 كيلو هرتز. سأقوم بتحليل معيار EM Marine 4102 ، لأن هذا هو أكثر ما أعرفه. ومع ذلك ، يسمح لك رمز المحاكي بالعمل مع معايير أخرى تعمل عند 125 كيلو هرتز.
حتى نتمكن من الخوض أكثر في النظرية ، ينبغي قول بضع كلمات حول كيفية عمل RFID. علاوة على ذلك في النص ، سيتم تقديم المعلومات المتعلقة بمعيار EM Marine 125 كيلو هرتز ، ويتم ترتيب حلول RFID الأخرى بطريقة مماثلة.

القارئ ، بالإضافة إلى تبادل المعلومات ، يوفر الطاقة. العلامة عبارة عن ذاكرة قراءة فقط ROM يتم تشغيلها بواسطة مجال كهرومغناطيسي ، وبعد تطبيق الطاقة ، فإنها تعطي ببساطة المعلومات المسجلة.

يوضح هذا الرسم البياني بوضوح كيف يتم ترتيب المرسل والمستقبل. يتم ضبط كلتا الدائرتين المتذبذبتين على الرنين وتستخدم لنقل البيانات ونقل الطاقة ، لتشغيل علامة سلبية ، وهي بطاقتنا.
يمكن العثور على مزيد من التفاصيل حول مبدأ العملية في [1]

الأجزاء الداخلية من البطاقة المفككة
إذا قمت بتفكيك البطاقة ، يمكنك رؤية هوائي على شكل ملف ورقاقة مملوءة بمركب يحتوي على ROM ومكثف 75 pF.
وصف بروتوكول EM4102
قبل أن نذهب إلى أبعد من ذلك ، دعونا نفهم معيار EM4102 الذي سنقوم بمحاكاته. تحتوي علامة RFID المتوافقة مع EM4102 على 64 بت من ذاكرة القراءة فقط. في الواقع ، هذا هو ROM ، أي أنه يمكن قراءة المعلومات منه ، ولكن لا يمكن تغييرها أو كتابتها ، بمعنى آخر ، هذه الشريحة مخيطة مرة واحدة في المصنع. يمكن رؤية بنية ذاكرة العلامة في الشكل أدناه.

عندما تدخل العلامة مجالًا كهرومغناطيسيًا ينبعث من قارئ RFID ، فإنها تتلقى الطاقة من الحقل (الطاقة) وتبدأ في نقل البيانات. أول 9 بتات منطقية. يتم استخدام هذه البتات كسلسلة من الرموز المميزة للإشارة إلى بدء الإرسال. نظرًا لأن جميع البيانات الأخرى تستخدم التكافؤ ، فلن يحدث هذا التسلسل المكون من تسعة بتات في أي مكان آخر. ثم هناك 10 مجموعات من 4 بتات بيانات وبت تعادل واحد لكل مجموعة. أخيرًا ، هناك 4 بتات من المجموع الاختباري وبت التوقف الأخير ، وهو دائمًا صفر.
تكرر العلامة دورة نقل البيانات حتى تستقبل الطاقة. لذلك ، نلاحظ القراءة المستمرة للعلامة على القارئ.
سأقدم مثالاً للبيانات المرسلة بواسطة الملصق بالرقم: 0x06هو رقم الإصدار ، و 0x001259E3 هي البيانات.

بالمناسبة ، يمكن ترجمة الرقم المطبوع على البطاقة إلى رقم ست عشري سيحصل عليه القارئ. على سبيل المثال ، الرقم مكتوب على البطاقة: 11623152
- 116 عشري هو 0x74 ست عشري ؛
- 23152 في النظام العشري هو 0x5A70 في النظام الست عشري ؛
من خلال الجمع بينهما ، نحصل على الرقم التسلسلي للبطاقة ، والذي سيعطينا القارئ: 0x00745A70 .
تعديل الإشارة
يتم نقل البيانات من العلامة إلى القارئ عن طريق تعديل الإشارة الحاملة للقارئ (في حالتنا ، تردد الموجة الحاملة هو 125 كيلو هرتز). يرجى ملاحظة أنه يتم توفير الطاقة من تردد الناقل هذا ويتم تعديل الإشارة بواسطته. بادئ ذي بدء ، دعنا نفكر في مخطط مبسط للتفاعل بين القارئ والعلامة. تذكر هذه الصورة ، وسوف نشير إليها لاحقًا.

كما ترى ، تحتوي العلامة على دائرة تذبذبية LC ، وديود يعمل على تصحيح التيار المتردد ، ومكثف لتنعيم التموج (هذا جزء من مصدر طاقة العلامة) ، وترانزستور ، عن طريق التحكم في إمكانية تعديل الإشارة. على القارئ ، سينعكس ذلك في تغيير التيار المتدفق في الملف. ببساطة ، عندما تدخل في مجال القارئ ، تستهلك العلامة تيارًا كهربائيًا (بشكل مستمر تقريبًا) ، عند نقل المعلومات ، فإنها تغير قيمة التيار الذي يستهلكه الترانزستور ، وبالتالي يمكن للقارئ استقبال إشارة عن طريق قياس استهلاك الطاقة.
يولد القارئ مجالًا مغناطيسيًا باستخدام معدل وملف ويلتقط الإشارة المعدلة ، ثم يفك تشفيرها.

مثال على تعديل إشارة الناقل
إذا لم أكن قد أربكتك تمامًا ، فلنذهب أبعد من ذلك. من أجل نقل البيانات ، نحتاج إلى تعديل الإشارة. أي أنه سيتم تركيب بتات المعلومات المرسلة على تردد الموجة الحاملة.
هناك ثلاثة مخططات تعديل شائعة وفقًا لمعيار RFID:
- كود مانشستر
- مرحلتين رمز مانشستر
- ترميز تحول المرحلة
نظرًا لأن معيار EM4102 يستخدم مخطط ترميز مانشستر ، فسننظر فيه. عند تعديل بروتوكول EM4102 ، يمكن أن يكون وقت الإرسال بتة واحدة 64 أو 32 أو 16 فترة من تردد الموجة الحاملة (125 كيلو هرتز).

باستخدام هذا التشفير ، تغير العلامة مستوى إرسال الإشارة بالضبط في منتصف فترة الإرسال بتة واحدة. الانتقال من المستوى المنخفض إلى المستوى العالي في هذه اللحظات يعني الحالة المنطقية "1" ، والانتقال من المستوى العالي إلى المستوى المنخفض ، يمثل حالة "0" المنطقية.

إشارة حقيقية معدلة تم التقاطها على ملف القارئ.
صنع محاكي RFID
حسنًا ، إذا كنت لا تزال هنا ولم يكن رأسك منتفخًا من مثل هذه الحسابات ، فقد حان الوقت لإنشاء محاكي RFID ، من جزأين فقط. في هذه البساطة تكمن العبقرية. قمت بتجميع الجهاز ، واستعارت الفكرة والرمز من ميكا داوتي ، الصور لي.

إليك صرصور مصغر قد يحاكي علامة
موقع المشروع . الكود ممتع للغاية ، قد يقول المرء أنه لامع ومختصر (يستخدم المجمع). دعونا نتناولها بالتفصيل. سنقوم بتحليلها. يمكنك رؤية الرمز هنا .
بادئ ذي بدء ، دعنا نتعرف على كيفية عمل هذا الشيء بشكل عام ، على الرغم من أنه لا ينبغي أن يعمل بحكم التعريف ، لأنه يتعارض مع مخطط الأسلاك المعتاد للمتحكم الدقيق. الرسم البياني للجهاز مأخوذ من الكود المصدري.

ملف الحث حوالي 1 ميكرومتر ومتحكم دقيق ATtiny85
هذا ، أيها السيدات والسادة ، هو قرصنة حقيقية ، عندما يسمح لك مستوى فهم ميزات تشغيل الجهاز بإنشاء حلول تقنية تتجاوز الحدود التي حددتها الشركة المصنعة! وهو يعمل ، تم التحقق منه شخصيًا. هذا هو المعنى الحقيقي لكلمة "هاكر" ، الأمر لا يتعلق بالقرصنة والسرقة.
بالنظر إلى المستقبل ، سأقول إن هذا الملف لا يكفي للتشغيل العادي ، ومع ذلك كان علي صنع هوائي عادي ، وتعليق مكثفات الإمداد بالطاقة ، ومكثف طنين. لكن لإثبات مبادئ العمل ، فهو مناسب تمامًا.
كيف يعمل:
قبل أن نذهب إلى تحليل كود هذا المحاكي ، دعونا نجعله هوائيًا عاديًا. كشفت تجاربي مع الدوائر الحالية عدم استقرار شديد في تشغيلها. إنه يعمل فقط بالقرب من القارئ ، وحتى في هذه الحالة ليس دائمًا. لذلك ، في البداية قمت بلحام مكثف 0.1 uF بأرجل طاقة وحدة التحكم ، ثم قررت إنشاء دائرة تذبذبية كبيرة حقيقية ، كما هو الحال في الملصق الحقيقي.
- AVR /. /, . , . , . , . , . , .
- AVR. , , , ( 0,1 ). AVR. , , 125!
- . ATtiny85 2,5 . 1,8 . AVR , ...
- , ! , , . Clock ! 125 , RFID. , !
- ? -, . . EM4102 32 . HID FSK 4 . RFID- . « » , RFID -.

التعديل الأول هو مكثف 0.1 فائق التوهج لإمداد الطاقة
إنشاء الهوائي
لا توجد حيل في إنشاء هوائي ملفي ، لكنك لا تزال بحاجة إلى التعرف على التوثيق وفهم فيزياء العملية ... إنه ليس بالأمر الصعب ، وحتى تلميذ يمكنه التعامل معها ، فقط القليل من الصبر والمثابرة مطلوب.
من السهل جدًا تجميع الهوائي وتكوينه ، تمامًا كما في الصورة من [1] .

لحساب الهوائي ، عليك أن تتذكر القليل من النظرية. نحن بحاجة إلى عمل دائرة متذبذبة يتم ضبطها على تردد 125 كيلو هرتز. لنفتح دورة الأسس النظرية للهندسة الكهربائية ونقرأ ما هي الدائرة التذبذبية:
دائرة متذبذبة ، دائرة كهربائية تحتوي على محث ومكثف حيث يمكن إثارة التذبذبات الكهربائية.

دائرة تذبذبية متوازية
إذا تركنا جميع الرياضيات وانتقلنا إلى النقطة ، فإن الدائرة التذبذبية لها معلمة مثل تردد الطنين ، والتي تحددها الصيغة.
حيث f هو تردد التذبذب ، L هو محاثة الملف ، C هي سعة المكثف.
في هذه الحالة ، لدينا معلمة ثابتة - التردد ، ويمكننا اللعب بالسعة والحث. من أجل حساب الملف ، سنستخدم المستند [2] . يجب على كل شخص يقوم بطريقة ما بصنع هوائيات لعلامات RFID (من أي تردد) أن يتعرف عليها!
العديد من الحرفيين ، للقراء والمحاكيات (الجوهر ليس مهمًا) ، يصنعون ملفات مستديرة. من السهل عدها وتصنيعها ، لكن لها عيبًا كبيرًا - أبعادها الخطية أكبر من البطاقة. أريد أن أصنع محثًا على شكل مستطيل ، بأبعاد خطية أصغر من أبعاد البطاقة القياسية ، وبالتالي يكون الجهاز الناتج بحجم بطاقة RFID القياسية. نتيجة لذلك ، اخترت حجم مغو المستقبل عمليا كما هو الحال في العلامة الحالية ، أي حوالي 70 × 40 ملم... إذا تم اختيار المكثف 10 nF ، فيجب أن يكون محاثة الملف (من الصيغة أعلاه) 162 μH بالنسبة لنا. انظر الآن إلى الوثائق لحساب ملف مستطيل. لتصفية الملف ، اخترت سلكًا به مقطع عرضي يبلغ 0.2 مم. نتيجة لذلك ، نفتح القسم المقابل من الوثائق ، وتظهر الصيغة المجيدة التالية لأعيننا.

كما ترون ، معلمات سمك وعرض الملف غير معروفة ومتغيرة (تستقر مقابل سمك السلك 0.2 مم) ، لكن التقديرات العامة أعطتني رقم 42 دورة. سيكون من الممكن إجراء العديد من التكرارات ، وإجراء عملية حسابية دقيقة ومباشرة ، ولكن في حالة القطعة لدينا ، سيفي بالغرض.
بعد ذلك ، من الضروري عمل إطار 70 × 40 مم لتصفية الملف. لقد صنعته من ثنائي الفينيل متعدد الكلور ولففت ملفًا حوله.

إطار ثنائي الفينيل متعدد الكلور


لف الملف والانتهاء
لسوء الحظ ، ليس لدي مقياس الحث ، لذلك اضطررت إلى المضي قدمًا باستخدام طريقة الوخز العلمي. نظرًا لأنني ربما أخطأت في الحسابات ، وفي عدد المنعطفات عندما أقوم بلف الملف ، كما فعلت ذلك تقريبًا وبالعين ، فقد قررت تحديد سعة الرنين يدويًا. للقيام بذلك ، قمت بتثبيت الملف على قارئ البطاقة ، ووضعت نهاياته في اللوح ("مرتبة بها ثقوب") ، ثم بدأت في توصيل الحاويات واحدة تلو الأخرى ، أثناء تسجيل الإشارة على الذبذبات.

الشروع في العمل مع مكثف الرنين
أولاً ، قمت بفحص مكثف 10nF ، والذي يجب أن يكون طنينًا. لكن سعة الإشارة انخفضت على الفور مقارنة بالملف الفارغ. ثم أخذت مكثفًا أصغر. وهكذا ذهبت عبر المكثفات حتى التقطت الرنين. وهكذا ، كانت السعة الطنينية للمكثف 3.2 nF.

إشارة بدون مكثف ، ملف فارغ

10 nF إشارة

1 nF ، 2 nF

3 nF ، 4 nF ، 2.2 nF

3.2 nF
يمكن ملاحظة أنني جربت خيارات مختلفة ، وكان من الواضح أن الحد الأقصى يقع في مكان ما بين 3 و 4 nF والنتيجة كانت مكثف 3.2 nF (يتكون من مكثفين على التوازي). هذا كل شيء ، بكرة لدينا جاهزة لمزيد من التجارب.
بشكل عام ، أود أن أشير إلى أنه يمكن صنع الملف بشكل عام على شكل مسارات على لوحة دوائر مطبوعة ، ومع سلسلة صغيرة من المنتجات ، يجب القيام بذلك. فيما يلي مثال على مثل هذه اللوحة ، عند 125 كيلو هرتز من ألكسندر جوثمان . لسوء الحظ ، مات الموقع عمليًا ، ولم يكن المؤلف على اتصال منذ فترة طويلة ، لذلك فنحن نكتفي بصوري فقط. إذا كان بإمكان أي شخص المساعدة في العثور عليه ، فسأكون ممتنًا! لا أعلم ماذا حدث له.

وبالتالي ، فإن صنع المحاكي على الفور على شكل لوحة دوائر مطبوعة ليس مشكلة. أعتقد بوجود الدليل [2] ، يمكنك حساب ذلك بنفسك ، لأن تلميذ ألماني يبلغ من العمر أربعة عشر عامًا يمكنه فعل ذلك.
دعنا نذهب من خلال الكود
دعنا نلقي نظرة سريعة على الكود الذي يمكنك رؤيته هنا . يوجد مثال لمحاكاة نوعين من البطاقات ، سأقوم بتحليل EM4102 فقط.
بادئ ذي بدء ، كما يقول الكود ، عند وميض الميكروكونترولر ، نحتاج إلى وميض بتات الصمامات إلى القيمة lfuse إلى 0xC0 : بحيث يتم تسجيل وحدة التحكم من مولد خارجي. أود أن ألفت انتباهك إلى حقيقة أن أي وميض وحدة تحكم سيرتبط بحقيقة أنه سيحتاج إلى تسجيله من مصدر خارجي ، نظرًا لأننا نضع فتيل بتوليد من مولد خارجي!
كل التعليمات البرمجية تستند إلى وحدات الماكرو. اسمحوا لي أن أذكرك ما هي وحدات الماكرو - برنامج يقوم بإعداد التعليمات البرمجية للترجمة. يتكون برنامجنا من عدد قليل من تعليمات المجمع: rjmp ، call (2 clocks) ، nop ، ldi ، out and ret (كل ساعة واحدة)! كل شيء ، كل ما تبقى من الكود يتكون من وحدات ماكرو اعتمادًا على ماكرو الرقم التسلسلي (تعريف). خصوصية العمل هو أن لدينا عددًا قليلاً من دورات الساعة للعمل العادي. حاول أن تفعل شيئًا في 32 دورة على مدار الساعة ، مع الأخذ في الاعتبار أن تعليمات القفز في وحدة التحكم AVR تستغرق دورتين على مدار الساعة. لذلك ، يتم إنشاء كل التعليمات البرمجية بواسطة وحدات الماكرو اعتمادًا على بطاقة الهوية.
#define FORMAT_IS_EM4102
#define EM4102_MFR_ID 0x12
#define EM4102_UNIQUE_ID 0x3456789A
حدد نوع البطاقة التي نقوم بمحاكاتها وقم بتعيين بطاقات الهوية. هذا هو الماكرو الرئيسي ، على أساسه يتم تشكيل بقية الكود. و، tadam، صاحب الجلالة الماكرو.
.macro delay cycles
.if \cycles > 1
rjmp .+0
delay (\cycles - 2)
.elseif \cycles > 0
nop
delay (\cycles - 1)
.endif
.endm
ماكرو تأخير ، يقبل عدد علامات التأخير كمدخل. ماكرو متكرر واضح إلى حد ما ، يقوم بتنفيذ التأخير باستخدام الأمر nop (بدون عملية ، دورة ساعة واحدة) والأمر rjmp. + 0 (الانتقال إلى السطر التالي ، دورتان على مدار الساعة). من خلال دمج هذه الأوامر مع بعضها البعض ، يمكنك عمل تأخير للطول المطلوب في القياسات. في الواقع ، الكود لا يفعل شيئًا ، إنه فقط يضيع وقت الآلة.
إذا كنت لا تزال تفكر ، فسأغتصب عقلك تمامًا ، لكن الشفرة بارعة جدًا بحيث يتعين عليك تحملها.
ترميز ماكرو متكرر بواسطة كود مانشستر.
.macro manchester bit, count=1
.if \count
manchester (\bit >> 1), (\count - 1)
.if \bit & 1
baseband_1
baseband_0
.else
baseband_0
baseband_1
.endif
.endif
.endm
.macro stop_bit
baseband_0
baseband_1_last
.endm
في الواقع ، يتم تطبيق كل المنطق هنا. يقبل قناع بت وعداد بت كمدخل. إذا لم يكن العداد صفراً ، فإننا ندعو أنفسنا مرة أخرى ، وننقص العداد (الماكرو العودي ، نعم). علاوة على ذلك ، يوجد في الجسم نفسه استدعاءات إلى وحدات الماكرو baseband_0 و baseband_1 و baseband_1_last. اعتمادًا على البتة التي لدينا "1" أو "0" ، نقوم بتعديل إشارة كود مانشستر من صفر إلى واحد أو من واحد إلى صفر.
تذكر أعلاه أنني قدمت جدولًا في المقالة ، وكيف يتم تشفير محتويات البطاقة ، وأين تذهب بتات التكافؤ ، وبتات الإيقاف في النهاية. لذا ، مهمتنا الآن هي ترميز بطاقات التعريف بهذه الطريقة ، ولهذا لدينا وحدتان من وحدات الماكرو.
#define ROW_PARITY(n) ( (((n) & 0xF) << 1) | \
(((n) ^ ((n) >> 1) ^ ((n) >> 2) ^ ((n) >> 3)) & 1) )
#define COLUMN_PARITY ( (EM4102_MFR_ID >> 4) ^ \
(EM4102_MFR_ID) ^ \
(EM4102_UNIQUE_ID >> 28) ^ \
(EM4102_UNIQUE_ID >> 24) ^ \
(EM4102_UNIQUE_ID >> 20) ^ \
(EM4102_UNIQUE_ID >> 16) ^ \
(EM4102_UNIQUE_ID >> 12) ^ \
(EM4102_UNIQUE_ID >> 8) ^ \
(EM4102_UNIQUE_ID >> 4) ^ \
(EM4102_UNIQUE_ID) )
ROW_PARITY - حساب بت التكافؤ في سلسلة من أربع بتات ، COLUMN_PARITY - حساب المجموع الاختباري للرسالة بأكملها.
كل منطق عملنا موصوف في ماكرو في. main
header
manchester ROW_PARITY(EM4102_MFR_ID >> 4), 5
manchester ROW_PARITY(EM4102_MFR_ID >> 0), 5
manchester ROW_PARITY(EM4102_UNIQUE_ID >> 28), 5
manchester ROW_PARITY(EM4102_UNIQUE_ID >> 24), 5
manchester ROW_PARITY(EM4102_UNIQUE_ID >> 20), 5
manchester ROW_PARITY(EM4102_UNIQUE_ID >> 16), 5
manchester ROW_PARITY(EM4102_UNIQUE_ID >> 12), 5
manchester ROW_PARITY(EM4102_UNIQUE_ID >> 8), 5
manchester ROW_PARITY(EM4102_UNIQUE_ID >> 4), 5
manchester ROW_PARITY(EM4102_UNIQUE_ID >> 0), 5
manchester COLUMN_PARITY, 4
stop_bit
حسنًا ، نحن فقط ننقل الرأس 9 بتات بنفس الطريقة ، ثم ترميز مانشستر ، بحساب بت التكافؤ لكل 4 بتات ، وفي النهاية بتة مجموع اختباري وبت توقف.
يبقى معرفة ما هو النطاق الأساسي. لهذا ، لدينا واحد آخر من وحدات الماكرو المجمعة (نعم ، كم عدد ممكن ، إيه؟).
.macro baseband_0
rcall baseband30_0
rjmp .+0
.endm
.macro baseband_1
rcall baseband30_1
rjmp .+0
.endm
.macro baseband_1_last
rcall baseband30_1
rjmp main
.endm
.macro header
manchester 0x1FF, 9
.endm
وحدات ماكرو النطاق الأساسي * - تنفيذ كود التجميع: قم باستدعاء الوظائف المناسبة ، ثم قم بالانتقال إلى تعليمات أخرى. يشبه الماكرو baseband_1_last الماكرو baseband_1 ، باستثناء أنه يقوم بالقفزة غير المشروطة ليس إلى الأمر أدناه ، ولكن إلى بداية الوظيفة الرئيسية. رأس الماكرو - يعمل على عرض رأس تسع بتات من نفس النوع يساوي واحدًا ، ويستدعي ماكرو مانشستر مع إرسال عدد وعدد البتات المرسلة.
آخر شيء تبقى لتحليله هو الدالتان baseband30_0 و baseband30_1. تم وصفها بواسطة الكود التالي.
baseband30_0:
ldi r16, OUT_PINS // 1
rjmp baseband30 // 2
/*
* Emit a 1 at the baseband layer.
* Takes a total of 30 clock cycles, including call overhead.
*/
baseband30_1:
ldi r16, 0 // 1
rjmp baseband30 // 2
/*
* Internal routine for baseband32_0 and _1. Must use
* a total of 24 clock cycles. (32 - 1 ldi - 2 rjmp - 3 rcall)
*/
baseband30:
out _SFR_IO_ADDR(DDRB), r16 // 1
delay 19 // 19
ret // 4
اعتمادًا على الوظيفة المسماة baseband30_0 أو baseband30_1 ، تتم كتابة قيمة ما يجب أن يكون على دبوس الإدخال / الإخراج لتسجيل r16: 1 أو 0. بعد ذلك ، هناك انتقال غير مشروط إلى النطاق الأساسي 30 ، ويتم تنفيذ الإخراج وتأخير 19 دورة ساعة ، وبعد ذلك يتم إرجاع.
أعظم سحر لهذا الرمز هو أنه يتم حسابه بالضبط قبل كل دورة ساعة ، حيث تستغرق كل ساعة إرسال لرمز مانشستر بالضبط العديد من الفترات التي يسمح بها المعيار ، أي 32 دورة ساعة معالج! هذا عبقري خيالي ، عليك أن تتذكر عدد الأشرطة التي يأخذها كل أمر.
دعونا نجمعها بدلاً من ذلك ونرى كيف تبدو ، كيف تتوسع كل وحدات الماكرو هذه. نقوم بالتجميع باستخدام الأمر make (بعد تثبيت avr-gcc) وتفكيك ملف elf الناتج
00000000 __vectors:
0: 0e c0 rjmp .+28 ; 0x1e __ctors_end
2: 15 c0 rjmp .+42 ; 0x2e __bad_interrupt
...
أولاً ، لدينا متجهات المقاطعة ، لكننا مهتمون فقط بالقفزة الأولى. لأن بقية النواقل لا تؤدي إلى أي مكان.
0000001e __ctors_end:
1e: 11 24 eor r1, r1
20: 1f be out 0x3f, r1 ; 63
22: cf e5 ldi r28, 0x5F ; 95
24: d2 e0 ldi r29, 0x02 ; 2
26: de bf out 0x3e, r29 ; 62
28: cd bf out 0x3d, r28 ; 61
2a: 02 d0 rcall .+4 ; 0x30 main
2c: 11 c1 rjmp .+546 ; 0x250 _exit
هنا قمنا بإعداد منافذ الإدخال / الإخراج ، ونسمي الوظيفة الرئيسية. يتكون الرئيسي من كمية مجنونة من المكالمات إلى النطاق الأساسي 30 * ووظائف القفز (هذه هي الطريقة التي بدأ بها سيرك وحدات الماكرو الجهنمية).
00000030 main:
30: 01 d1 rcall .+514 ; 0x234 baseband30_1
32: 00 c0 rjmp .+0 ; 0x34 main+0x4
34: fd d0 rcall .+506 ; 0x230 baseband30_0
36: 00 c0 rjmp .+0 ; 0x38 main+0x8
38: fd d0 rcall .+506 ; 0x234 baseband30_1
3a: 00 c0 rjmp .+0 ; 0x3c main+0xc
3c: f9 d0 rcall .+498 ; 0x230 baseband30_0
3e: 00 c0 rjmp .+0 ; 0x40 main+0x10
40: f9 d0 rcall .+498 ; 0x234 baseband30_1
42: 00 c0 rjmp .+0 ; 0x44 main+0x14
44: f5 d0 rcall .+490 ; 0x230 baseband30_0
46: 00 c0 rjmp .+0 ; 0x48 main+0x18
48: f5 d0 rcall .+490 ; 0x234 baseband30_1
4a: 00 c0 rjmp .+0 ; 0x4c main+0x1c
4c: f1 d0 rcall .+482 ; 0x230 baseband30_0
...
22e: 00 cf rjmp .-512 ; 0x30 main
وهكذا ... حتى ننتقل مرة أخرى إلى الرئيسية
حسنًا ، دعنا نرى كيف تبدو وحدة النطاق الأساسي الخاصة بنا.
00000230 baseband30_0:
230: 08 e1 ldi r16, 0x18 ; 24
232: 02 c0 rjmp .+4 ; 0x238 baseband30
00000234 baseband30_1:
234: 00 e0 ldi r16, 0x00 ; 0
236: 00 c0 rjmp .+0 ; 0x238 baseband30
00000238 baseband30:
238: 07 bb out 0x17, r16 ; 23
23a: 00 c0 rjmp .+0 ; 0x23c baseband30+0x4
23c: 00 c0 rjmp .+0 ; 0x23e baseband30+0x6
23e: 00 c0 rjmp .+0 ; 0x240 baseband30+0x8
240: 00 c0 rjmp .+0 ; 0x242 baseband30+0xa
242: 00 c0 rjmp .+0 ; 0x244 baseband30+0xc
244: 00 c0 rjmp .+0 ; 0x246 baseband30+0xe
246: 00 c0 rjmp .+0 ; 0x248 baseband30+0x10
248: 00 c0 rjmp .+0 ; 0x24a baseband30+0x12
24a: 00 c0 rjmp .+0 ; 0x24c baseband30+0x14
24c: 00 00 nop
24e: 08 95 ret
في النهاية ، يمكنك أن ترى كيف تم توسيع التأخير إلى قائمة قفزات و nop للتأخير. هذا سحر جميل.
حسنًا ، اكتشفنا الرمز. جمع الدماغ من الأذنين ، ننتقل إلى الاختبارات.
الاختبارات
سنطبق جميع المعارف المكتسبة ونجري الاختبارات. نقوم بتجميع البرامج الثابتة ، وميض وحدة التحكم ، وتذكر ضبط بتات الصمامات بشكل صحيح.

وشاح للبرامج الثابتة نقوم
بتوصيل دائرتنا التذبذبية ونختبرها على قارئ صناعي حقيقي ، بلا مقاييس نصفية ، ظروف قتالية عادلة.

اختبار الوقوف
وها! إنه يعمل ويقرأ بشكل صحيح ويعطي المعرف الصحيح في حلقة! بدون مصدر طاقة خارجي ، مع التشغيل فقط من الميدان. يبقى أن نرتب كل هذا ونصنع علامة RFID حقيقية.

النسخة النهائية "مغلفة" من الملصق
مجموع
يمكنني أن أعترف بصدق أنني لم أكن أعتقد تمامًا أنه سينجح. مزود الطاقة من الميدان ، أوضاع التشغيل غير القياسية لوحدة التحكم ، تعمل بشكل صارم وفقًا لدورات الساعة ، محث محلي الصنع. بالإضافة إلى عمل RFID نفسه. والآن ، يبدو أن قطعة تافهة من العمل تنتشر على مدى شهرين من قراءة الوثائق واستخلاص المعلومات. لكنها تعمل ، وهذا الشيء رائع حقًا. إذن يا شباب ، هذا النوع من الأشياء هو قرصنة حقيقية. أذهب خلفها!
واجب منزلي
نظرًا لأنك ما زلت تقرأ هذا المقال الرائع ، فقد كتبته ، وجربته ، وفعلته ، والآن حان الوقت لمحاولة القيام بشيء ما. يحتوي رمز المحاكي على قسم يحاكي بطاقات تقارب HID مع تشفير إزاحة الطور. يجب أن تفهم معيار HID وهذا الترميز من أجل المتعة والاستيعاب الأفضل. أرسل الحل في التعليقات. حظا سعيدا.
فهرس
