محاسبات کارآمد برای سیستمهای نهفته و پلتفرم آردوینو
اشارهگرها به رجیسترها در C: راهنمای آسان دسترسی به رجیسترها. کد خود را کارآمد کنید.
مراحل در زنجیره کامپایلر GNU: سفر از کد منبع تا فایل اجرایی
سادهسازی فرآیند کامپایل: Makefile چیست و چگونه از آن استفاده کنیم؟
پروتکلهای ارتباطی (TWI/I2C, SPI U(S)ART, debugWIRE, Bit Banging) سیستمهای نهفته: MCU چگونه ارتباط برقرار میکند و چگونه آن را پیکربندی کنیم؟
چگونه AVR را با استفاده از debugWIRE اشکالزدایی کنیم؟ (چگونه محتویات رجیستر را بخوانیم، گام به گام برنامه را اجرا کنیم؟)
هدف Boot Loader چیست؟ چگونه AVR را بدون آن برنامهنویسی کنیم؟ (از طریق ISP)
از مالکیت فکری (IP) خود محافظت کنید: فیوزها و قفلهای AVR
مهارتهای توسعه سیستمهای نهفته خود را ارتقا دهید و با اطمینان گامهای بعدی را بردارید.
مستندات گسترده است، اما ترسناک نیست. بیاموزید چگونه اطلاعات مورد نیاز خود را به دست آورید.
پیش نیازها:
دانش کاری در C یا آردوینو
مهارتهای لحیمکاری/کار با بِرِدبورد برای مثالها و تمرینها
توانایی کار با مولتیمتر و خواندن دیاگرامهای مدار
به عنوان یکی از جامعترین دورههای موجود: ما به همه چیز و فراتر از آن در هسته آردوینو خواهیم پرداخت. در بطن خود، میکروکنترلر ATmega328P بسیاری از ویژگیها را یکپارچه میکند که از طریق کتابخانه آردوینو در دسترس نیستند. دانشجو ضمن یادگیری نحوه عملکرد قطعات جانبی، کدی مینویسد که عملکرد بالا را با مصرف برق کم به نمایش میگذارد. سیستمهای نهفته مستقر در میدان که با باتریهای کوچک تغذیه میشوند، میتوانند برای سالها کار کرده و داده جمعآوری کنند.
مزیت بزرگ پلتفرم AVR این است که بسیاری از مفاهیم معرفی شده در این دوره برای سایر میکروکنترلرها نیز کاربرد دارند. بنابراین، مجموعهای کامل از میکروکنترلرها، از ATtiny کوچک تا سری ATmega بزرگتر، قابل دسترسی میشوند. ATmega328P استفاده شده در این دوره تنها یک مثال است و دانش کسب شده برای بسیاری از سیستمهای نهفته که محدود به پلتفرم آردوینو نیستند، قابل اعمال است. این امر با جلسات عملی و تمرینها که در آنها مشکلات واقعی حل میشوند، تقویت میگردد. در صورت بروز سوالات در حین پیادهسازی، دانشجو میتواند به راهنماییها و نکات نگاهی بیندازد و اگر هیچ چیز کار نکرد، به راهحلها با توضیحات فراوان در کد منبع نیز دسترسی دارد.
این دوره شامل زیرنویسهای دستساز به زبان انگلیسی است که مباحث زیر را پوشش میدهد و بر جنبههای عملی و کاربرد یک مفهوم تمرکز دارد. علاوه بر این، دوره از یک چارچوب خاص پیروی نمیکند و مباحث میتوانند بر اساس علاقه و نیازها به هر ترتیبی گرفته شوند. مباحث پوشش داده شده شامل:
مجموعه کامپایلر GNU و آنچه در هر مرحله و چرا اتفاق میافتد
مقدمهای کوتاه بر C و اشارهگرها
انتقال از کتابخانه آردوینو به AVR: تجمل کمتر، اجرای سریعتر، منابع کمتر
چگونه با Makefiles کامپایل کنیم؟ اهداف، قوانین و میانبرها
اشتباهات رایج در C و نحوه اجتناب از آنها
بردارهای حمله
قطعات جانبی:
تایمرها، شمارندهها و مدولاسیون عرض پالس (PWM)
وقفهها (Interrupts)
پروتکلهای ارتباطی
UART/USART
I2C/TWI
SPI
DHT و 1-Wire
USI
چگونه پروتکلهای دیگر، که قبلاً ناسازگار و پشتیبانینشده بودند را شبیهسازی کنیم؟
مبدل آنالوگ به دیجیتال (ADC)
چگونه کار میکند؟
اندازهگیری دما بدون قطعات خارجی
اندازهگیری سطح باتری با ADC
مقایسهگر آنالوگ
حافظههای غیر فرار
فلش
چگونه از فلش (حافظه برنامه) برای ثابتها استفاده کنیم؟
چگونه از فلش در حین اجرای برنامه استفاده کنیم؟
EEPROM
فیوزها
منابع کلاک
بیتهای قفل (Lock Bits)
اشکالزدایی
راهاندازی AVR روی بِرِدبورد
صرفهجویی در مصرف برق
حالت Sleep
فرکانس کلاک پویا
خاموش کردن قطعات غیرضروری
منابع بیدار شدن
اشکالزدایی (با مثالهای عملی)
شبیهسازها
JTAG
debugWIRE
فصل جایزه: اجرای موازی وظایف
پس از اتمام این دوره، دانشجو موفق تجربه کافی را برای ارزیابی نرمافزارهای موجود و همچنین ایجاد پیادهسازیهایی که به شدت بهینه شدهاند تا روی میکروکنترلرهای کوچک مستقر شوند و هر ذره از عملکرد و عمر باتری را استخراج کنند، خواهد داشت.
سرفصل ها و درس ها
Welcome
خوش آمدید!
Welcome!
بهروزرسانیها در شبکههای اجتماعی
Updates on Social Media
فصل جایزه
Bonus Chapter
مجموعه کامپایلر گنو
The GNU Compiler Collection
مقدمه
Introduction
مقدمه
Introduction
پیشپردازنده
The Preprocessor
دیباگر
The Debugger
دیباگر
The Debugger
کامپایلر
The Compiler
اسمبلر
The Assembler
لینکر
The Linker
لینکر
The Linker
کپی شیء
The Object Copy
کپی شیء
The Object Copy
آپلودر
The Uploader
خلاصه
Summary
تمرین
Exercise
مقدمهای بر C
Introduction into C
انواع داده پایه و جریان کنترل
Basic Types and Control Flow
انواع داده پایه و جریان کنترل
Basic Types and Control Flow
آرایهها و اشارهگرها
Arrays and Pointers
تمرین: الحاق رشته
Exercise: String Concatenation
Enum، Union و Struct
Enum, Union, and Struct
تمرینها: اندازههای نوع
Exercises: Type Sizes
Enum، Union و Struct
The Enum, Union, and Struct
فراخوانی با مقدار/ارجاع
Call by Value/Reference
تمرین: فراخوانی با مقدار/ارجاع
Exercise: Call by Value/Reference
آردوینو به AVR
Arduino -> AVR
آردوینو به AVR
Arduino -> AVR
آردوینو به AVR
Arduino -> AVR
عملکرد داخلی یک پین چگونه است؟
How does a Pin work internally?
عملکرد داخلی یک پین چگونه است؟
How does a Pin work internally?
فضای حافظه، رجیسترها و اشارهگرها
Memory Space, Registers, and Pointers
فضای حافظه، رجیسترها و اشارهگرها
Memory Space, Registers, and Pointers
تمرین: فضای حافظه، رجیسترها و اشارهگرها
Exercise: Memory Space, Registers, and Pointers
کتابخانه AVR
The AVR Library
کتابخانه AVR
The AVR Library
تمرین: کتابخانه AVR
Exercise: The AVR Library
Makefile
Makefile
چرا Makefile؟ اصول آن
Why Makefile? Its Basics
چرا Makefile؟ اصول آن
Why Makefile? Its Basics
بیایید بریانی بپزیم - مثالی کاربردی و خوشمزه برای Makefiles
Let's cook Biryani - A practical and tasty Example for Makefiles
بیایید بریانی بپزیم - مثالی کاربردی و خوشمزه برای Makefiles
Let's cook Biryani - A practical and tasty Example for Makefiles
AVR-GCC
The AVR-GCC
AVR-GCC
The AVR-GCC
main() و دستورات #include کجا هستند؟
Where is the main() and #include directives?
تمرین: Makefile و چشمکزن فقط با استفاده از کتابخانه AVR
Exercise: Makefile and Blink using only the AVR Library
آپلود با استفاده از AVRDUDE
Uploading using AVRDUDE
تمرین: Makefile و آپلود
Exercise: Makefile and Upload
خلاصه
Summary
اشتباهات رایج در C
Easy Mistakes in C
مثال کلاسیک: سرریز بافر
Classic Example: Buffer Overflow
مثال کلاسیک: سرریز بافر
Classic Example: Buffer Overflow
دموی سرریز بافر و مقدمهای بر GDB
Buffer Overflow Demo and Introduction into GDB
کاهش سرریز بافر
Buffer Overflow Mitigation
تمرین: printf ناامن؟
Exercise: Unsafe printf?
تمرین: سرریز بافر و GDB
Exercise: Buffer Overflow and GDB
استاندارد کدنویسی SEI CERT C/C++
SEI CERT C/C++ Coding Standard
استاندارد کدنویسی SEI CERT C/C++
SEI CERT C/C++ Coding Standard
DCL30-C (اعلام اشیاء با دورههای ذخیرهسازی مناسب)
DCL30-C (Declare Objects with Appropriate Storage Durations)
DCL30-C (اعلام اشیاء با دورههای ذخیرهسازی مناسب)
DCL30-C (Declare Objects with Appropriate Storage Durations)
تمرین: DCL30-C (اعلام اشیاء با دورههای ذخیرهسازی مناسب)
Exercise: DCL30-C (Declare Objects with Appropriate Storage Durations)
EXP33-C (حافظه غیراولیه را نخوانید)
EXP33-C (Do not read uninitialized Memory)
EXP33-C (حافظه غیراولیه را نخوانید)
EXP33-C (Do not read uninitialized Memory)
EXP34-C (اشارهگرهای NULL را از ارجاع خارج نکنید)
EXP34-C (Do not dereference NULL Pointers)
EXP34-C (اشارهگرهای NULL را از ارجاع خارج نکنید)
EXP34-C (Do not dereference NULL Pointers)
EXP42-C (دادههای پدینگ را مقایسه نکنید)
EXP42-C (Do not compare padding Data)
EXP42-C (دادههای پدینگ را مقایسه نکنید)
EXP42-C (Do not compare padding Data)
STR31-C (فضای ذخیرهسازی برای رشتهها دارای فضای کافی برای داده و NULL است)
STR31-C (Storage for Strings has sufficient Space for Data and NULL)
STR31-C (فضای ذخیرهسازی برای رشتهها دارای فضای کافی برای داده و NULL است)
STR31-C (Storage for Strings has sufficient Space for Data and NULL)
MEM30-C (به حافظه آزاد شده دسترسی پیدا نکنید)
MEM30-C (Do not access freed Memory)
MEM30-C (به حافظه آزاد شده دسترسی پیدا نکنید)
MEM30-C (Do not access freed Memory)
FIO47-C (از رشتههای فرمت معتبر استفاده کنید)
FIO47-C (Use valid Format Strings)
ENV33-C (تابع system() را فراخوانی نکنید)
ENV33-C (Do not call system())
ENV33-C (تابع system() را فراخوانی نکنید)
ENV33-C (Do not call system())
MSC30-C/MSC32-C (تولیدکنندههای اعداد شبهتصادفی)
MSC30-C/MSC32-C (Pseudorandom Number Generators)
MSC30-C/MSC32-C (تولیدکنندههای اعداد شبهتصادفی)
MSC30-C/MSC32-C (Pseudorandom Number Generators)
FLP30-C (از متغیرهای ممیز شناور به عنوان شمارنده حلقه استفاده نکنید)
FLP30-C (Do not use Floating-Point Variables as Loop Counters)
FLP30-C (از متغیرهای ممیز شناور به عنوان شمارنده حلقه استفاده نکنید)
FLP30-C (Do not use Floating-Point Variables as Loop Counters)
خلاصه
Summary
تایمرها، شمارندهها و PWM (مدولاسیون عرض پالس)
Timers, Counters, and PWM (Pulse Width Modulation)
مقدمهای بر تایمرها/شمارندهها
Introduction into Timers/Counters
مقدمهای بر تایمرها/شمارندهها
Introduction into Timers/Counters
کلاکهای تایمر و پیشمقیاسکنندهها (CSn2:0)، پینهای Tn و TOSC
Timer Clocks and Prescalers (CSn2:0), Tn and TOSC pins
کلاکهای تایمر و پیشمقیاسکنندهها (CSn2:0)، پینهای Tn و TOSC
Timer Clocks and Prescalers (CSn2:0), Tn and TOSC pins
حالت عادی
Normal Mode
حالت عادی
Normal Mode
حالت پاک کردن تایمر در تطابق مقایسه (CTC)
Clear Timer on Compare Match (CTC) Mode
حالت پاک کردن تایمر در تطابق مقایسه (CTC)
Clear Timer on Compare Match (CTC) Mode
تمرین: حالت پاک کردن تایمر در تطابق مقایسه (CTC)
Exercise: Clear Timer on Compare Match (CTC) Mode
مدولاسیون عرض پالس سریع (PWM)
Fast Pulse Width Modulation (PWM)
تمرین: مدولاسیون عرض پالس سریع (PWM)
Exercise: Fast Pulse Width Modulation (PWM)
مدولاسیون عرض پالس با فاز صحیح (PWM)
Phase Correct Pulse Width Modulation (PWM)
مدولاسیون عرض پالس با فاز و فرکانس صحیح (PWM)
Phase and Frequency Correct Pulse Width Modulation (PWM)
حالتهای تایمر
Timer Modes
تفاوتهای تایمرها و واحد ضبط ورودی
Differences of the Timers and the Input Capture Unit
تفاوتهای تایمرها و واحد ضبط ورودی
Differences of the Timers and the Input Capture Unit
خلاصه
Summary
IRQ (وقفهها)
IRQ (Interrupts)
وقفهها در مقابل نظرسنجی
Interrupts versus Polling
مثال عملی: وقفه در مقابل نظرسنجی
Practical Example: Interrupt versus Polling
وقفه در مقابل نظرسنجی
Interrupt versus Polling
زیربرنامه وقفه (ISR)
Interrupt Subroutine (ISR)
فعالسازی وقفههای محلی و جهانی
Activation of local and global Interrupts
ارتباط: رابط جانبی سریال (SPI)
Communication: Serial Peripheral Interface (SPI)
مقدمهای بر SPI (رابط جانبی سریال)
Introduction into SPI (Serial Peripheral Interface)
توپولوژیهای SPI
SPI Topologies
رجیستر کنترل SPI (SPCR)
The SPI Control Register (SPCR)
رجیستر وضعیت SPI (SPSR) و رجیستر داده SPI (SPDR)
The SPI Status Register (SPSR) and the SPI Data Register (SPDR)
جلسه عملی: Master SPI و Slave SPI
Practical Session: Master SPI and Slave SPI
تمرین: انتقال داده SPI موازی
Exercise: Parallel SPI Data Transfer
خلاصه
Summary
ارتباط: 1-Wire
Communication: 1-Wire
DHT11/22 یک دستگاه 1-Wire نیست
The DHT11/22 is not a 1-Wire device
توان انگلگونه در 1-Wire
Parasitic Power in 1-Wire
باس 1-Wire
The 1-Wire Bus
پروتکل 1-Wire
The 1-Wire Protocol
دستور Search ROM
The Search ROM Command
پشتیبانی کتابخانه و اسیلوسکوپ
Library Support and Oscilloscope
تمرین قسمت اول: چگونه از اسیلوسکوپ Atmega استفاده کنیم؟
Exercise Part I: How to use the Atmega Oscilloscope?
تمرین قسمت دوم: پیادهسازی یک DHT Master
Exercise Part II: Implement a DHT Master
ارتباط: رابط سریال جهانی (USI در ATtiny)
Communication: the Universal Serial Interface (USI in the ATtiny)
1-Wire و UART
1-Wire and UART
UART، I2C و SPI به USI
UART, I2C, and SPI to USI
USI در ATtiny
USI in ATtiny
مبدل آنالوگ به دیجیتال (ADC)
Analog-to-Digital Converter (ADC)
دنیای آنالوگ (مقدمهای بر مبدل آنالوگ به دیجیتال [ADC])
The Analog World (Analog-to-Digital Converter [ADC] Introduction)
ADC: ولتاژهای مرجع
ADC: Reference Voltages
ADC: حسگر دما و کالیبراسیون آن
ADC: The Temperature Sensor and its Calibration
ADC: مرجع Bandgap (اندازهگیری وضعیت باتری)
ADC: The Bandgap Reference (Measuring the State of the Battery)
ADC در AVR: ADMUX (قسمت 1، ولتاژ مرجع)
ADC in the AVR: ADMUX (Part 1, Reference Voltage)
ADC در AVR: ADMUX (قسمت 2، کانالهای ورودی)
ADC in the AVR: ADMUX (Part 2, Input Channels)
ADC در AVR: ADSC در ADCSRA (رجیستر پیکربندی و وضعیت A)
ADC in the AVR: ADSC in ADCSRA (Configuration and Status Register A)
ADC در AVR: نرخ نمونهبرداری
ADC in the AVR: Sample Rate
ADC در AVR: منابع راهاندازی خودکار (ADATE)
ADC in the AVR: Autotriggering Sources (ADATE)
ADC در AVR: منابع راهاندازی خودکار (ADATE)
ADC in the AVR: Autotriggering Sources (ADATE)
ADC در AVR: کاهش نویز/توان (DIDR) و تصادفی بودن
ADC in the AVR: Reducing Noise/Power (DIDR) and Randomness
تمرین: اسیلوسکوپ دیجیتال ATmega
Exercise: The ATmega Digital Oscilloscope
تمرین: اسیلوسکوپ آنالوگ ATmega
Exercise: The ATmega Analogue Oscilloscope
مقایسهکننده آنالوگ (AC)
Analog Comparator (AC)
مقایسهکننده آنالوگ در ATmega
The Analog Comparator in the ATmega
تمرین: حسگرهای مجاورت با مقایسهکننده آنالوگ
Exercise: Proximity Senors with the Analog Comparator
تمرین جایگزین: یافتن ولتاژ مرجع Bandgap
Alternative Exercise: Find the Bandgap Reference Voltage
فلش و EEPROM در ATmega
Flash and EEPROM in the ATmega
حافظه ناپایدار: ذخیرهسازی دادهها به عنوان ثابت در فلش (فضای برنامه)
Non-Volatile Memory: Storing Data as Constants in the Flash (Program Space)
ذخیرهسازی ثابتهای رشتهای در یک آرایه در فضای برنامه
Storing String Constants in an Array in the Program Space
کلمه کلیدی __flash به جای PROGMEM
The __flash keyword instead of PROGMEM
فلش: No-Read-While-Write (NRWW)، Read-While-Write (RWW) و BOOTSZ
Flash: No-Read-While-Write (NRWW), Read-While-Write (RWW) and BOOTSZ
تعیین تنظیمات BOOTSZ
Determining BOOTSZ Settings
ذخیرهسازی داده در فلش (مثال عملی)
Storing Data in the Flash (Practical Example)
یافتن صفحات آزاد در فلش
Locating free Pages in the Flash
یافتن صفحات آزاد در فلش
Locating free Pages in the Flash
تمرین: برنامهریزی فلش و ذخیره ثابتها در فلش (حافظه برنامه)
Exercise: Program the Flash and store constants in the Flash (Program Memory)
EEPROM در ATmega (توضیحات رجیستر)
EEPROM of the ATmega (Register Description)
زمانبندیهای نوشتن EEPROM و اولیه سازی
EEPROM Writing Timings and Initialization
اولیه سازی EEPROM (جلسه عملی)
Initialization of the EEPROM (Practical Session)
خلاصه: فلش و EEPROM (مقایسه سریع)
Summary: Flash and EEPROM (Quick Comparison)
تمرین: دادههای کالیبراسیون حسگر دمای داخلی ذخیرهشده در EEPROM
Exercise: Internal Temperature Sensor Calibration Data stored in the EEPROM
AVR مستقل
Standalone AVR
قابلیتهای ارائه شده توسط برد آردوینو
The Functionalities provided by an Arduino Board
منبع تغذیه و ریست خودمان برای ATmega
Our own Power Supply and Reset for the ATmega
کلاک سیستم خودمان و LFuse
Our own System Clock and the LFuse
برنامهریز درونسیستمی (ISP)/برنامهریز سریال درونمدار (ICSP)
The In-System Programmer (ISP)/In-Circuit Serial Programmer (ICSP)
Bit-Banging ISP از طریق FTDI232 و سایر تنظیمات Arduino ISP (کانکتور X3)
Bit-Banging ISP through FTDI232 and other Arduino ISP Settings (X3 Connector)
تمرین: ATmega مستقل
Exercise: Standalone ATmega
SLEEP (خواب)
SLEEP
فرکانس کلاک در برابر VCC در برابر جریان
Clock Frequency vs VCC vs Current
فرکانس کلاک در برابر VCC در برابر جریان
Clock Frequency vs VCC vc Current
رجیستر کاهش توان (PRR)
The Power Reduction Register (PRR)
حالتهای خواب و انرژی: کلاک سریع و خواب طولانی یا کلاک آهسته و خواب کوتاه؟
Sleep Modes and Energy: Fast Clock and long Sleep or slow Clock and short Sleep?
یک مورد استفاده برای رجیستر ورودی/خروجی عمومی
A Use Case for the General Purpose I/O Register
پینهای شناور و خوابیده
Floating and Sleeping Pins
واتچداگ (ریست سیستم یا بیدارباش یا هر دو)
The Watchdog (System Reset or Wake-Up or Both)
آشکارساز Brown-Out
The Brown-Out Detector
آشکارساز Brown-Out
The Brown-Out Detector
مقایسه در جلسه عملی
Show Down in the Practical Session
تمرین: کاهش مصرف توان
Exercise: Reduce the Power Consumption
خلاصه
Summary
دیباگینگ با debugWIRE
Debugging with debugWIRE
شبیهسازی میکروکنترلر ATmega
Simulating the ATmega MCU
JTAG، debugWIRE، ریست و High Fuse
JTAG, debugWIRE, Reset and the High Fuse
نمایش نظرات