<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های KAYT33N  | کیان</title>
        <link>https://virgool.io/feed/@KAYT33N</link>
        <description>صبحا مهندس مکانیک، شبا برنامه نویس
علاقه مند اوپن سورس و هر نوع ساختن
https://github.com/KAYT33N</description>
        <language>fa</language>
        <pubDate>2026-04-15 08:51:03</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1745685/avatar/hH3waQ.jpg?height=120&amp;width=120</url>
            <title>KAYT33N  | کیان</title>
            <link>https://virgool.io/@KAYT33N</link>
        </image>

                    <item>
                <title>قسمت ۲: چشمک زدن با میکروکنترلر</title>
                <link>https://virgool.io/@KAYT33N/%D9%82%D8%B3%D9%85%D8%AA-%DB%B2-%DA%86%D8%B4%D9%85%DA%A9-%D8%B2%D8%AF%D9%86-%D8%A8%D8%A7-%D9%85%DB%8C%DA%A9%D8%B1%D9%88%DA%A9%D9%86%D8%AA%D8%B1%D9%84%D8%B1-gdv7lym52b2y</link>
                <description>اگر از دنبال کنندگان این مجموعه مقالات برنامه نویسی برای میکروکنترلر ها با C باشید و طبق مقالات قبل، سیستم خود را آماده برنامه نویسی AVR و برد و مدار اتصالات بین میکروکنترلر و آردینو را برقرار کرده باشید، پس آماده اید که از برد آردینیوتون به عنوان ISP استفاده کنید و اولین برنامه خود را که به زبان C نوشته اید بر روی میکروکنترلر دلخواهتون آپلود کنید.در این قسمت یاد میگیریم که چطوری کدی بنویسیم که باعث روشن و خاموش شدن یک LED کوچک بشود، این اتفاق شاید در نظر شما قدم بزرگی نیاد ولی میتونید به اون به چشم Hello World! در دنیای برنامه نویسی Embedded نگاه کنید که باعث میشه بتونید اولین کد خودتون رو بدون کمک آردینو بنویسید!در این مقاله : یکم راجع به DDRXو PINX و PORTX توضیح میدیم، یک پروژه حداقلی رو با زبان C مینویسیم که یکی از پایه های میکروکنترلرمون رو خاموش و روشن بکنه، اونو با avr-gcc کامپایل و لینک میکنیم، با avr-objcopy ترجمش میکنیم و بعد از آماده کردن مدار، کد رو با avrdude آپلود میکنیم تا led بهمون چشمک بزنه.پورت، پین و رجیستر هاپین های ورودی و خروجی میکروکنترلرهای AVR مثل ATmega16 در دسته های ۸ تایی به نام های (A, B, C, و غیره) گروه بندی میشوند و وضعیت هر پین از طریق سه رجیستر ۸ بیتی تعیین میشود:رجیستر DDRx: Data Diretion register :وضعیت ورودی یا خروجی بودن پین را مشخص میکند. ۰ به معنی ورودی و ۱ به معنی خروجی میباشد؛ برای مثال، کد زیر تمام پین های گروه B را خروجی میکند.DDRB = 0b11111111;رجیستر PORTx: Port Register :برای پین های خروجی، مقدار ۰ یا ۱ به معنی خاموش یا روشن کردن (high/low) پین است و در پین های ورودی، به معنی فعال یا غیر فعال کردن مقاومت داخلی pull-up برای پین مورد نظر است.رجیستر PINx: Pin Register :در پین های ورودی، وضعیت بالا یا پایین (high/low) بودن پین رو در خودش داره.کار با رجسیترهابرای کار راحت تر با رجسیترها ترجیحا موارد زیر رو یاد بگیرید و یا دم دستتون داشته باشید که بتونید راحت ازشون استفاده بکنید.اعداد در مبنای ۱۰ و ۲ و ۱۶در صورت امکان و برای جلوگیری از خستگی، ابتدا راجع به عملگرهای بیتی مثل AND, OR, XOR و استفاده از آنها در زبان C مطالعه کنید.مقادیر hex مبنا ۱۶مقدار مبنای ۱۶ 0xF0 با مقدار مبنای ۲ 0b11110000 برابر بوده و ۴ بیت با ارزش یک رجیستر ۸ بیتی را برابر با ۱ قرار میدهد؛ همچنین مقادیر 0x0F و 0xFF نیز به ترتیب برابر با مقادیر 0b00001111 و 0b11111111 میباشند. برای مثال برای روشن کردن ۴ پین کم ارزش گروه B میتوانید از کد زیر استفاده کنید :// روشن کردن ۴ پین اول
// و خاموش کردن ۴ پین دوم
PORTB = 0x0F;

// روشن کردن ۴ پین اول
// بدون تغییر دادن وضعیت ۴ پین دوم
PORTB |= 0x0F;مقادیر باینری مبنا ۲برای روشن کردن PB4 و دست نخوردن مقادیر بقیه پین ها :PORTB |= (1 &lt;&lt; PB4);برای خاموش کردن کردن PB4 و دست نخوردن مقادیر بقیه پین ها :PORTB &amp;= ~(1 &lt;&lt; PB4);برای تغییر وضعیت پین PB4 به صورت toggle ( در صورت روشن بودن خاموش و در صورت خاموش بودن روشن شود) :PORTB ^= (1 &lt;&lt; PB4);دقت کنید که با جایگزین کردن PORTB در تکه کدهای بالا با DDRB میتوانید وضعیت ورودی یا خروجی بودن پین PB4 رو تعیین کنید.طرز تهیه LED چشمک زن۱. نوشتن کدما از پایه شماره ۲۱ میکروکنترلر ATmega16 برای روشن و خاموش کردن led مورد نظرمون استفاده میکنیم، این پایه در گروه D قرار داره و شمارش داخل گروه PD7 هستش. این کدها را در فایل main.c قرار میدهیم.// برای کار با رجیستر ها
#include &lt;avr/io.h&gt; 

// برای ایجاد تاخیر بین روشن و خاموش شدن
#include &lt;util/delay.h&gt; 

int main(void) {
  // تنظیم پایه به عنوان خروجی
  DDRD |= (1 &lt;&lt; PD7);

  while (1) { // حلقه اصلی برنامه
    
    PORTD |= (1 &lt;&lt; PD7); // روشن کردن لامپ
    _delay_ms(500); // تاخیر نیم ثانیه ای

    PORTD &amp;= ~(1 &lt;&lt; PD7); // خاموش کردن لامپ
    _delay_ms(500); // تاخیر نیم ثانیه ای

  }
}همچنین برای کوتاه تر کردن کد میتوانستید از کد زیر در حلقه اصلی استفاده کنید که مقدار پایه شماره ۷ از گروه D را در هر تکرار از ۰ به ۱ و بالعکس تغییر میدهد.  while (1) { // حلقه اصلی برنامه
    PORTD ^= (1 &lt;&lt; PD7); // روشن و خاموش کردن لامپ
    _delay_ms(500); // تاخیر نیم ثانیه ای
  }چند نکته درباره کددلیل وجود نداشتن مقدار بازگشتی return در تابع main این است که کد های embeded باید دائما تکرار بشوند و در یک حلقه بینهایت قرار بگیرند.فرآیند زمان سنجی در توابعی مانند delay به وجود و درستی مقدار F_CPU وابسته میباشد که یا در هنگام کامپایل و یا در بدنه کد نیاز به تعریف شدن دارد که ما در هنگام کامپایل تعریف میکنیم.در زبان C فقط تابع main وجود دارد و در حقیقت آردینو از کد زیر برای اجرای کد های شما استفاده میکند.int main(void){
  setup();
  loop();
}حجم این کد پس از کامپایل حدود ۲۰۰ بیت میشود که در برابر حجم کیلوبایتی آردینو بسیار ناچیز است.۲. بستن مدارخیلی پیچیدش نمیکنیم، کلا یک مقاومت نیاز دارید با یک LED، پایه مثبت LED رو به پایه PD7 میکروکنترلرتون ( برای atmega16 پایه شماره ۲۱ ) متصل کنید و پایه منفی رو هم با مقاومت به GND متصل کنید.۳. کامپایل و لینک کردن و تهیه فایل hexبرای استفاده از avrdude فلش کردن کدی که در مرحله قبل نوشتیم، نیاز به یک فایل .hex داریم که شامل کد های کامپایل شده ما باشد؛ با ترمینال به محل پروژه بروید و به ترتیب فرمان های زیر را وارد کنید :کامپایل C به .oavr-gcc -Os -DF_CPU=1000000 -mmcu=m16 -c main.c -o firmware.oمقدار DF_CPU برابر فرکانس کاری میکروکنترلر است که در قسمت قبلی مقاله با تغییر فیوزها تنظیم کردید.مقدار mmcu برابر مدل میکروکنترلر است که ما از ATmega16 استفاده میکنیم.لینک کردن و تهیه فایل .elfavr-gcc -DF_CPU=1000000 -mmcu=m16 -o firmware.elf firmware.oترجمه فایل .hex از فایل .elfavr-objcopy -O ihex firmware.elf firmware.hex۴. فلش کردن hex با avrdudeدقت کنید که برای فلش کردن کد نیاز دارید که ابتدا مدار ISP که در مقاله قبل بستیم رو به مدار فعلی اضافه کنید.avrdude -c arduino -p m16 -P /dev/ttyACM0 -b 19200 -U flash:w:firmware.hexمقدار c برابر با مدل ISP میباشد که ما از Arduino as ISP استفاده میکنیم.مقدار P برابر پورت اتصال پروگرمر میباشد که در لینوکس به صورت پیشفرض ttyACM0 میباشد.در صورت وجود هرگونه خطا در هنگام فلش کردن، میتوانید به مقاله قبل و بخش رفع عیب avrdude مراجعه کنید.چند نکته کوچیکنتیجه این پروژه قرار بود این باشه که لامپی که داخل مدار قرار دادیم نیم ثانیه روشن و خاموش بشه.اگه لامپ روشن یا خاموش نمیشه :چک کنید که آیا پین درستی رو استفاده میکنید ؟پین رو به عنوان خروجی تعیین کردید ؟و در نهایت حلقه رو بررسی کنید که آیا به درستی پین رو ۰ و ۱ یک میکنید یا نهاگه لامپ خیلی سریع یا کند خاموش و روشن میشهمقدار DF_CPU رو اشتباه وارد کردید، میتونید با استفاده از مقاله قبلی و بخش فیوزها، متوجه بشید که فرکان میکروکنترلرتون چقدر تنظیم شده و در صورت نیاز اون رو یا مقدار DF_CPU رو تغییر بدید.۵. تهیه فایل makeبه دلیل تکراری بودن روند کامپایل و فلش کردن کد از C به میکروکنترلر و برای اتوماسیون کردن این فرآیند، میتوانیم یک فایل به نام Makefile بدون پسوند در روت پروژه بسازیم و کد های زیر را در آن کپی کنیم :FLNAME	= main.c
TARGET  = atmega16a
DF_CPU	= 1000000
ISP_PORT= /dev/ttyACM0
BAUD    = 19200

hex:
  avr-gcc -Os -DF_CPU=$(DF_CPU) -mmcu=$(TARGET) -c $(FLNAME) -o firmware.o
  avr-gcc -DF_CPU=$(DF_CPU) -mmcu=$(TARGET) -o firmware.elf firmware.o
  avr-objcopy -O ihex firmware.elf firmware.hex
flash:
  avrdude -c arduino -p m16 -P $(ISP_PORT) -b $(BAUD) -U flash:w:firmware.hex

all: hex flashازین به بعد با باز کردن ترمینال و رفتن به روت پروژه و وارد کردن فرمان های زیر، میتونیم فرآیند آپلود کد رو راحت تر طی کنیم؛ همینطور میتونید، در صورت نیاز با تغییر متغیر های تعریف شده چند خط اول فایل، اون رو با توجه به نیازتون شخصی سازی کنید.# کامپایل کردن کد
make hex
# آپلود کردن کد کامپایل شده
make flash

# کامپایل و فلش کردن کد
make allجمع بندی و قدم بعدییه روز دیگه، یه قدم دیگه به سمت پروژه نهایی این دوره! تونستید با C و یک میکروکنترلر و بدون کمک آردینو اولین چراغ این مسیر رو روشن کنید، بعدش خاموش کنید، دوباره روشن کنید و همینطور تا ابد.در مقاله بعدی یاد میگیریم که چطور از دکمه ها بدون مقاومت خارجی استفاده کنیم، با debouncing آشنا میشیم و توضیح میدم که چطور مقدار دکمه ها رو داخل کدمون بخونیم و با توجه به اون ها یه تغییری ایجاد کنیم. دکمه و مقاومتتون رو بردارید که قراره میکروکنترلرتون رو زنده کنید.</description>
                <category>KAYT33N  | کیان</category>
                <author>KAYT33N  | کیان</author>
                <pubDate>Wed, 08 Oct 2025 15:02:23 +0330</pubDate>
            </item>
                    <item>
                <title>قسمت ۱ : استفاده از آردینو به عنوان پروگرمر</title>
                <link>https://virgool.io/codenevis/%D9%82%D8%B3%D9%85%D8%AA-%DB%B1-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%A2%D8%B1%D8%AF%DB%8C%D9%86%D9%88-%D8%A8%D9%87-%D8%B9%D9%86%D9%88%D8%A7%D9%86-%D9%BE%D8%B1%D9%88%DA%AF%D8%B1%D9%85%D8%B1-lm8awdvqzwkt</link>
                <description>اگر از علاقه مندان به آردینو هستید و آماده اید تا خودتون رو از محدودیت های برد و محیط برنامه نویسی آردینو رها کنید و به برنامه نویسی بدون واسطه برای میکروکنترلرها بپردازید، اولین ابزاری که برای آپلود کدهای خود بر روی میکروکنترلر نیاز دارید یک پروگرمر ISP programmer خواهد بود و اولین قدم در این مسیر تهیه این ابزار، از بازار و یا استفاده از همان برد آردینویی که در اختیار دارید به عنوان پروگرمر هستش.در این قسمت از سری مقالات برنامه نویسی C برای AVRها، مراحل مورد نیاز برای استفاده از برد آردینویی که دارید به عنوان پروگرمر، طرز سیم کشی بین آردینو و میکروکنترلر و تفاوت بین استفاده از بوتلودر آردینو و فلش مستقیم کد رو به طور کامل بررسی میکنیم و در نهایت نکاتی درباره فیوزهای میکروکنترلر مرور میکنیم که باعث میشن نتونید تراشتون رو خراب کنید.چرا به ISP نیاز داریم؟برنامه نویسی داخل سیستمی (ISP:In-system programming) روشی برای برنامه نویسی میکروکنترلرها هستش برای وقتی که میکروکنترلرها در مدار قرار دارند، برای همین بهش &quot;درون سیستمی&quot; میگن. این روش از یک پروتکل سریال بر روی پین های SPI برای ارتباط بین پروگرمر و میکروکنترلر هدف استفاده میکنه، که باعث میشه بتونید بدون برداشتن تراشه، امضای دستگاه رو بخونید، فیوز ها رو تغییر بدید و نرم افزار جدید رو روی تراشه مورد نظر آپلود کنید.بخشی از تنوع مدل های AVRولی چرا از ISP و C بجای برنامه نویسی در محیط راحت تر آردینو استفاده میکنیم ؟۱. بدون سربار (overhead) بوت لودربوتلودر آردینو علاوه بر اشغال کردن حدود ۲ کیلوبایت از حافظه محدود و ارزشمندی که روی میکروکنترلر در اختیار داریم، باعث ایجاد تاخیر در راه اندازیش هم میشود. این تاخیر و حجم اشغال شده موقع کار با C خالص و استفاده از ISP وجود ندارند و میتوانید از تمام فضای تراشه برای کدهای خود استفاده کنید.۲. انعطاف پذیری بیشترآردینو در مدل های مختلفی برای خرید ارائه شده است ولی این تنوع نسبت به تنوع میکروکنترلرهای AVR خیلی چشم گیر نیست. برای مثال تراشه ATmega16 که در این سری از آن استفاده خواهیم کرد در مدل های ۲۸ و ۳۲ و ۴۰ و ۴۴ پین در دو مدل smdو dip موجود است که محیط برنامه نویسی آردینو از هیچ کدام آنها پشتیبانی نمیکند.۳. مقرون به صرفههزینه خرید یک پروگرمر ساده به همراه یک میکروکنترلر Atmega328 که در آردینو استفاده میشود، باز هم نسبت به خرید آردینو مقرون به صرفه تر خواهد بود، در حالی که امکان استفاده از پروگرمر را با تراشه های مختلف و در پروژه های دیگر بدون هزینه اضافی خواهید داشت. همچنین امکان انتخاب دقیق تراشه با توجه به نیاز های پروژه خود در هنگام تولید انبوه محصول میتواند هزینه های تولید انبوه را به حداقل برساند.استفاده از آردینو به عنوان ISPقبل از هرکاری مطمعن شوید که مراحل مورد نیاز را انجام داده اید و وسایل مورد نیاز را تهیه کرده اید.سری ابزار مورد نیاز برای برنامه نویسی AVR که در قسمت ۰ نصب کردیم.avr-gcc, make, avrdudeیک برد آردینو برای تبدیل کردن به پروگرمر (برد شما خراب نمیشود و این پروسه قابل بازگشت است)نرم افزار آردینو Arduino IDEیک میکروکنترلر AVR (ما از ATmega16 استفاده میکنیم)یک برد بورد و تعدادی سیم برای اتصالاتیک خازن 10μF الکترولیتیمرحله ۱: آماده کردن آردینونرم افزار آردینو رو باز کنید و سپس از بخش مثال ها، ArduinoISP را باز کنید.File &gt; Examples &gt; 11.ArduinoISP &gt; ArduinoISPبرد خود را انتخاب کنید و فایل باز شده را بر روی آن آپلود کنید.تمام! برد شما آماده استفاده به عنوان پروگرمر است.مرحله ۲: غیرفعال کردن ریست خودکار آردینوتصویر مدار پس از اتصالاتخازن 10μF الکترولیتی که تهیه کردید را بین پایه های RESET و GND روی برد آردینو قرار بدهید.اهمیت این کار این است که برد های آردینو موقع مشغول شدن توسط نرم افزار هایی مثل avrdude ریست میشن ولی ما داریم از این برد به عنوان پروگرمر استفاده میکنیم و برد آردینومون تمام مدت باید هشیار باشه که خازن جلوی این فرمان ریست رو میگیره.مرحله ۳: تشخیص پایه های تراشهبرای برنامه نویسی با ISP پروگرمر نیاز به تشخیص ۴ پایه روی تراشمون داریم.SCK, MOSI, MISO, RESETتصویر نتیجه برای عبارت ATmega16 pinoutبرای تشخیص این ۴ پایه، میتونید اسم تراشتون رو به همراه عبارت pinout گوگل کنید و داخل تصاویر دنبال این پایه ها بگردید.همچنین باید ۲ تا پایه vcc, AVCC و دو پایه GND تراشتون رو هم از داخل تصویر پیدا کنید.مرحله ۳: سیم کشی بین برد و تراشهشماتیک مدار بین آردینو و میکروکنترلرشماره پایه های گفته شده در این مرحله مربوط به ATmega16 هست و در صورت استفاده از تراشه ای غیر از اون میتونید از طریق مرحله قبل پایه های مربوطه رو پیدا کنید.+5 ولت آردینو به AVCC و VCC ( پایه های ۱۰ و ۳۰)پایه منفی آردینو به GND ها (پایه های ۱۱ و ۳۱)پایه ۱۰ آردینو SS/Reset به شماره ۹ تراشه RESETپایه ۱۱ آردینو MOSI به پایه ۶ تراشه MOSIپایه ۱۲ آردینو MISO به پایه 7 تراشه MISOپایه ۱۳ آٰردینو SCK به پایه ۸ تراشهSCKاگر تراشه شما دسته دو هست و فیوزهای اون قبلا برای استفاده از کلاک خارجی آماده شدن، برای استفاده از اون نیاز به وصل کردن کریستال مورد نظرتون به پایه های XTAL1 و XTAL2 (شماره ۱۲ و ۱۳) دارید ولی در این مرحله از آموزش برای تراشه های نو نیاز به این کار نیست و تراشه ها به صورت پیش فرض از کلاک ۱MHz داخلی استفاده میکنند.مرحله ۵: روشن کردنآردینو را به کامپیوتر خود متصل کنید تا هردو تراشه روشن بشوند. سپس برای اطمینان از صحت اتصالات میتوانید از قطعه کد زیر در ترمینال خود استفاده کنید و خوانده شدن صحیح امضای دستگاه به معنی درست بودن سیم کشی ها میباشد. کارمون همینجا تمومه و توی قسمت بعدی قراره اولین برناممون رو آپلود بکنیم!avrdude -c arduino -p m16 -P /dev/ttyACM0 -b 19200 -vمقدار m16 مربوط به atmega16 هست و در صورت استفاده از مدل های دیگه باید مدل میکروکنترلر خودتون رو جایگزینش کنید.فیوز AVR چیه و چطور تراشمون رو خراب نکنیمفیوزها تنظیمات ثابت سخت افزاری هستند که با مقادیر خودشون مشخص میکنند که تراشمون برای مثال از چه فرکانس خارجی یا داخلی ای استفاده میکنه، رفتارش با eeprom موقع آپلود کد و تنظیمات دیگه رو تعیین میکنه.این فیوز ها از حافظه های فلش و eeprom جدا هستند.برای ATmega16 این فیوزها وجود دارند و میتونید از داخل دیتاشیت اون بیشتر دربارشون بخونید.فیوز پایین (LFUSE)وظیفه کنترل کلاک و تعیین استفاده از نوسان داخلی یا خارجی و سرعت اون رو بر عهده داره. برای مثال مقدار 0xE1 به معنی فرکانس 8MHz داخلی این مدل هستش.فیوز بالا (HFUSE)مقدار ۰یا۱ برای SPIEN امکان آپلود کد از طریق SPI رو فعال و غیرفعال میکنه.مقدار BOOTSZ حجم کد بوت رو مشخص میکنه. مقدار 0x00 به معنی کل حافظه فلش به عنوان بوت لودر هست.تغییر RSTDISBL به ۱ به معنی استفاده از پین ریست به عنوان ورودی و خروجی و عدم استفاده به عنوان پین ریست هست!تغییر BODLEVEL برای تعیین رفتار تراشه در صورت افت ولتاژبرای خواندن وضعیت فعلی فیوزها از روی تراشه میتوانید از فرمان زیر استفاده کنید.avrdude -c arduino -p m16 -P /dev/ttyACM0 -b 19200 -U lfuse:r:-:h -U hfuse:r:-:h -U efuse:r:-:hبرای تنظیم کردن فیوز ها به مقادیر جدید میتوانید از کد زیر استفاده کنیدavrdude -c arduino -p m16 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xE4:mچطور تراشمون رو تبدیل به آجر نکنیم!همیشه قبل از تغییر فیوزها، اول مقادیر فعلی اونها رو بخونید و ازشون پشتیبان بگیرید تا در صورت وجود مشکل بتونید برگردید.از ماشین حساب های آنلاین مثل Engbedded محاسبه مقادیر فیوزها برای محاسبه استفاده کنید تا جلوی اشتباهات محاسباتی رو بگیرید.به فیوز RSTDISBL دست نزنید! تغییر مقدار اون باعث میشه که تراشتون از روش های معمولی قابل برنامه نویسی نباشه.روشن کردن BODLEVEL باعث میشه که تراشتون در صورت وجود افت ولتاژ خودش رو ریست بکنه.در صورت نیاز به تغییر فیوزها ، اونها رو یکی یکی تغییر بدید و توی هر مرحله تست کنید که آیا تراشتون سالمه یا نه.مشکلات رایج استفاده از avrdude و ArduinoISPحتی با اتصالات بی نقص هم ممکنه به مشکلاتی بر بخورید که اینجا مرورشون میکنیم.avrdude: stk500_getsync(): not in sync: resp=0x00programmer not respondingاحتمالا خازن 10μF به درستی بین پایه های reset و gnd آردینو قرار داده نشده است.یا ممکن است که مقدار baudrate (-b 19200) با مقدار ArduinoISP متفاوت باشد که میتوانید از داخل اسکچ مقدار درست را بررسی کنید.avrdude: Yikes! Invalid device signatureمقدار اشتباه برای مدل تراشه در دستور avrdudeاشتباه در سیم کشی (معمولا miso و mosi)خاموش بودن تراشه هدف ( اتصالات مثبت و منفی را چک کنید)avrdude: error: could not find USB deviceپورت اشتباهی را در avrdude انتخاب کرده اید، برای پیدا کردن مقدار صحیح در لینوکس از lsusb و در ویندوز از Device Manager استفاده کنید تا پورت درست را پیدا و جایگزین مقدار dev/ttyACM0 در دستورات کنید.avrdude: verification errorکد فلش شده است ولی تایید نمیشود. میتوانید سرعت ارتباط را از 19200به مثلا 9600 کاهش دهید.rc=-1 یا no responseفیوزها رو تغییر دادید و باید از کریستالی که در فیوزها مشخص کردید استفاده کنید.Permission deniedدسترسی کافی به avrdude داده نشده است. داخل لینوکس از sudo و در ویندوز از run as admin استفاده کنید.سرعت آپلود کد ها کم هستسرعت ارتباط پایین هستش و در صورت کشش و ثابت بودن ارتباط میتونید از مقادیر بالاتر مثل 115200 استفاده کنید. برای این کار، داخل اسکچ آردینو مقدار رو مشخص کنید و موقع صدا کردن avrdude از مقدار جدید استفاده کنید.در صورت نبودن مشکل شما در لیست بالا میتونید از -v برای نمایش جزییات avrdude استفاده کنید و با استفاده از خطاهای موجود سوالتون رو مطرح کنید.صبور باشید! بیشتر مشکلات معمولا به سیم کشی یا تنظیمات برمیگردن و وقتی که کار کنن دیگه چیزی جلودارتون نیست :)جمع بندی و قسمت بعددر این مقاله یاد گرفتیم که چطور از برد آردینویی که داریم به عنوان پروگرمر ISPاستفاده کنیم، به جزییاتش مثل تنظیمات و سیم کشی ها و مشکلات رایجش پرداختیم و گفتیم که فیوزها اصلا چی هستن و به چه درد میخورن.در مقاله بعدی یاد میگیریم که پورت و رجسیتر ها چی هستن، بعدشم کد یک LED ساده چشمک زن (لذت بخش ترین کد ممکن)‌ رو با avr-gcc کامپایل و با استفاده از avrdude اون رو روی تراشمون فلش می کنیم.led و مقاومتاتون رو آماده کنید که قسمت بعدی مقاله قراره با جادو روشنش کنید.</description>
                <category>KAYT33N  | کیان</category>
                <author>KAYT33N  | کیان</author>
                <pubDate>Wed, 01 Oct 2025 14:36:37 +0330</pubDate>
            </item>
                    <item>
                <title>قسمت ۰ : شروع برنامه نویسی AVR</title>
                <link>https://virgool.io/codenevis/%D9%82%D8%B3%D9%85%D8%AA-%DB%B0-%D8%B4%D8%B1%D9%88%D8%B9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-avr-fkmny0uende2</link>
                <description>اگه با بردهای آردینو (Arduino) کار کرده باشی‌، احتمالا تو هم با لذت سادگی برنامه نویسی و آپلود کردن کد روی برد و بعدش تماشای چشمک زدن LED با گرفتن ورودی از سنسورهایی که به بردت وصل کردی آشنایی؛ ولی زیر این ظاهر کاربر پسند و راحت آردینو، دنیای قدرتمند برنامه نویسی ماشین بدون واسطه (bare-metal) و میکروکنترلرهای AVR قایم شدن؛ دنیایی که توش هر چرخه پردازنده و پین و رجسیترها رو کنترل میکنی.به عنوان یک توسعه دهنده که تصمیم به مهاجرت از اکوسیستم آردینو، به C خالص روی تراشه های AVR رو داره، در مسیر باز کردن دروازه هایی از بهینه سازی، کارایی بیشتر، و درک عمیقتر از سیستم های تعبیه شده (embedded systems) هستید.ما در این مجموعه مقالات ابتدا به مرور روند انجام فرایند های بنیادی در AVR با استفاده از زبان C خالص مثل ورودی و خروجی دیجیتال و آنالوگ، و در نهایت به پیاده سازی یک نسخه متفاوت از بازی دایناسوری گوگل کروم برای مرور مباحث میپردازیم. در این مقاله که اولین مقاله از این سری مقالات است، AVR ها را بررسی میکنیم، متوجه تفاوت آنها با بردهای آردینو میشویم و میفهمیم که چرا ارزش یادگیری دارند و چطور میتونید سیستمتون رو آماده کار باهاشون بکنید.میکرو کنترلر AVR چیست و چرا هنوز استفاده میشوند؟میکروکنترلرهای AVR تراشه های ۸ بیتی مبتنی بر RISC هستند که توسط Atmel توسعه یافته اند، از دهه ۱۹۹۰ میلادی مغز متفکر پروژه های بسیار زیادی مثل ترموستات های هوشمند، کنترلر های از راه دور و حتی برخی از سیستم های خودرو ها بوده اند. از مدل های محبوب این سری از میکروکنترلرها میتوان به ATmega328P که در آردینو مدل Uno استفاده میشود اشاره کرد. مدلی که ما در این مجموعه به دلیل پین های ورودی خروجی زیاد و حافظه مناسبش از آن استفاده میکنیم؛ ATmega16 هست.AVR ها از معماری هاروارد استفاده میکنند که در آن حافظه برنامه و داده ها جدا از یکدیگر میباشد و شامل حافظه فلش برای ذخیره سازی کدها، SRAM برای متغیرهای زمان اجرا و EEPROM برای داده های پایدار است. آنها همچنین از دستگاه های جانبی مثل تایمرها، مبدل های آنالوگ به دیجیتال (ADC)، مدولاسیون پهنای پالس (PWM) و ارتباط سریال پشتیبانی میکنند.بخش های تشکیل دهنده یک تراشه AVRاما در دنیایی که تحت سلطه تراشه های ARM 32 مثل Raspberry Pi Pico یا STM32 است و در سال ۲۰۲۵ چه دلیلی برای یادگیری برنامه نویسی برای میکروکنترلر ۸ بیتی وجود دارد ؟۱. ساده و کم مصرفavr ها سبک هستند و در حالت فعال در حد میلی وات و در حالت خواب در حدود میکرو وات مصرف میکنند و این ویژگی ها یعنی سبکی و مصرف کم باعث میشود که برای استفاده دستگاه های پوشیدنی یا اینترنت اشیا باتری دار مناسب باشند.۲. مقرون به صرفه و در دسترستراشه هایی مثل ATmega16 در حدود ۳ دلار (۲۷۰ هزار تومان امروز) قیمت دارند و قیمت آنها برای استفاده در تولید انبوه به نسبت بردهای آردینو با قیمت هایی که از ۱۵ دلار شروع میشوند به شدت توجیح اقتصادی دارد.۳. ارزش آموزشی و جامعه برنامه نویسانبرنامه نویسی AVR مهارت هایی را آموزش میدهد که حتی در برنامه نویسی آٰردینو هم به شما کمک میکند. همچنین کتابخانه های متن باز مثل AVR libc و منابع گسترده آنلاین مثل انجمن ها و مطالب زیادی برای این کار در دسترس است که شما را در این مسیر همراهی میکنند.اگر شما یک کاربر آردینو هستید که به دنبال نوشتن برنامه های بهینه، کم مصرف و سریع قابل اجرا بر روی تراشه های ارزان قیمت و امکان تولید و فروش انبوه محصولات خود هستید، برنامه نویسی AVR همراه شما در این مسیر خواهد بود.برنامه نویسی با C در مقابل آردینوآردینو با محیط توسعه Arduino IDE و بردهای آماده استفاده خودش، برنامه نویسی میکروکنترلر رو راحت تر کرده ولی این راحتی استفاده با خودش یک سری تفاوت هایی نسبت به برنامه نویسی AVR با C خالص رو به همراه داره که این تفاوت ها شامل موارد زیر میشوند:۱. لایه انتزاعیتوابع آردینو مثل digitalWrite یا analogRead جزییات اتفاقاتی که در رجسیتر رخ میدن رو از برنامه نویس میپوشونند و کدهای نوشته شده رو خواناتر و قابل حمل میکنند ولی این ویژگی به قیمت از بین رفتن بهینگی کد شما خواهد بود. برای مثال در AVR برای تغییر مقدار باینری یک پین خروجی، مستقیما مقدار رجسیتر مربوط به اون پین (مثلا DDRB) تغییر میدیم که باعث میشه ‍overhead کمتری در کدمون داشته باشیم.۲. بوت لودر در برابر فلش مستقیم کدآردینو از بوت لودری استفاده میکنه که امکان آپلود کردن کدها از طریق USB و استفاده از کدهای آردینویی رو برامون فراهم میکنه ولی این بوت لودر حدود ۲ کیلوبایت از حجم فلش رو اشغال میکنه و باعث به وجود اومدن تاخیری در بوت شدن میکروکنترلر ما میشه. استفاده از AVR ساده با C بجای این کار، مستقیما کدهای شما رو از طریق ISP در حافظه فلش میکروکنترلر ذخیره میکنه و این حجم اضافی اشغال شده رو برای کد شما آزاد میکنه.۳. عملکرد و بهینه سازیکتابخانه های آردینو راحتی رو به همراه دارند ولی حجم بالای رو اشغال میکنند. با استفاده از C خالص، شما سرعت و حجم کدتون رو بهینه میکنید که این ویژگی برای وظایف لحظه ای و حساس به زمان و سرعت حیاتی هست.۴. انعطاف پذیری سخت افزاریبردهای آردینو شما را در پین های خروجی و ولتاژهای ثابت محدود میکنند، با استفاده از تراشه های AVR بر روی بردهای اختصاصی میتوانید مواردی مثل کریستال ها و سرعت پردازش، زمان بندی ها و ارتباط بین سنسورها و سخت افزار رو شخصی سازی کنید.۵. اشکال زدایی و منحنی یادگیریآردینو با سریال مانیتور، روند اشکال زدایی و تشخیص ایرادها رو راحت تر میکنه ولی در هنگام برنامه نویسی AVR ها امکانات شما به LED ها و آنالیزورهای منطقی یا URART محدود میشود؛ که ماه عسل این محدودیت ها آشنایی بیشتر شما میکروکنترلرها میباشد.مهاجرت به برنامه نویسی با C باعث تقویت مهارت کد نویسی شما، افزایش دانش سخت افزاری، تقویت مهارت خواندن datasheet ها و آماده کردن شما برای برنامه نویسی سایر میکروکنترلرها میشود. اگر در هنگام استفاده از آردینو احساس محدودیت میکنید، زبان C خام قدم بعدی شما در راستای استقلال از محدودیت های آردینو خواهد بود.نصب ابزار های مورد نیاز برنامه نویسی AVRبرای برنامه نویسی AVR ها با زبان C به یک سری ابزار (toolchain) نیاز دارید :کامپایلر avr-gccآپلودر کد avrdudeاتوماسیون ساخت makeکه همه این ابزارها رایگان و متن باز هستند و نصب آنها بر روی اوبونتو، فدورا و آرچ لینوکس و همچنین ویندوز را پوشش خواهم داد.اوبونتو (ubuntu) یا توزیع های مبتنی بر دبیانsudo apt update
sudo apt install gcc-avr binutils-avr avr-libc avrdude makeفدورا (Fedora)sudo dnf install avr-gcc avr-binutils avr-libc avrdude makeآرچ (Arch)sudo pacman -Syu avr-gcc avr-binutils avr-libc avrdude makeویندوز (Widnows)برای ویندوز روش های مختلفی وجود دارد که بعضی از آنها منسوخ شده اند و پشتیبانی از آنها توسط توسعه دهندگان صورت نمیگیرد ولی ما از یک محیط POSIX به نام MSYS2 استفاده میکنیم که به ما امکان استفاده از پکیج های مورد نیازمان را در ویندوز میدهد.ابتدا MSYS2 را از این لینک دانلود و نصب کنید؛ سپس ترمینال آن را باز و دستورات زیر را وارد کنید.pacman -Syu
pacman -S mingw-w64-x86_64-avr-gcc mingw-w64-x86_64-avr-libc mingw-w64-x86_64-avrdude makeو پس از آن محل فایل های باینری MSYS2 را (معمولا C:\msys64\mingw64\bin) به متغیر PATH ویندوز خود اضافه کنید.چک کردن نصب صحیح ابزارهابرای چک کردن نصب شدن ابزار ها میتوانید دستورات زیر را در سیستم خود وارد کنید و از ورژن نصب شده ابزار اطلاع پیدا کنید.avrdude -v
make --version
avr-gcc --versionهمچین برای چک کردن نصب بودن بقیه موارد میتوانید یک فایل به نام test.c بسازد و در آن خط زیر را بنویسید#include &lt;avr/io.h&gt; int main(){return 0;}و اجرای موفق این فرمانavr-gcc -mmcu=atmega16 -o test.elf test.cبه معنی نصب موفقیت آمیز کامپایلر شما میباشد.برای نوشتن راحت تر کدها و فایل های make میتوانید از vscode با افزونه های مربوطه استفاده کنید.سخت افزارهای مورد نیاز در این دورهمیکروکنترلر MCUمیکروکنتلر ATmega16 که پردازنده اصلی ما با ۱۶ کیلوبایت حافظه فلش، ۱ کیلوبایت حافظه متغیرهای دائمی، ۵۱۲ بیت SRAM و ۳۲ پین ورودی و خروجی خواهد بود که در هنگام کار با LCD از آنها استفاده میکنیم.پروگرمر Programmerبرای آپلود کردن کدهای خود بر روی میکروکنترلر به یک پروگرمر نیاز دارید. علاوه بر امکان تهیه پروگرامر تخصصی که به شما امکانات مختلفی مانند استفاده یا دیباگ راحت تر میدهد، میتوانید از بردهای آردینو خود به عنوان پروگرمر استفاده کنید که در مقاله بعدی به آن میپردازیم.لوازم دیگریک بردبورد breadboard و تعدادی سیم و led های کوچک دو پایه به مقدار لازم :)مقاومت های ۲۲۰ اهم برای led ها، چند دکمه و مقاومت های ۱۰ کیلو اهم برای استفاده های دیگر.پتانسیومتر یک یا دو عدد (در پروژه استفاده نمیشود ولی میتوانید برای تغییر کنتراست یا روشنایی تصویر LCD از آنها استفاده کنید؛ همچین برای دریافت ورودی آنالوگ در صورت نیاز به آن احتیاج خواهید داشت.)منبع تغذیه ۵ ولت که ما باز هم از آردینو استفاده میکنیم ولی شما میتونید از ترکیب یک آداپتور ۵ ولت با خازن برای تثبیت ولتاژ در صورت نیاز استفاده کنید.یک LCD سازگار با HD44780 با قابلیت نمایش 16x2 کرکترچیدمانمیکروکنتلر را طوری در وسط برد قرار بدهید که تمامی پین های آن در سوراخ های دو طرف شیار وسط بردبورد قرار بگیرند. در گوگل pinout میکروکنتلر خود را سرچ کنید (مثلا Atmega16a pinouts) و با توجه به تصاویر موجود در سایت ها و دیتاشیت میکروکنتلر :پین های VCC و AVCC را به سمت مثبت (در ATmega16 پین های ۱۰ و ۳۰)و پین های GND میکروکنتلر را به قطب منفی (در ATmega16 پین های ۱۱ و ۳۱)منبع تغذیه خود متصل کنید.جمع بندیالان دیگه هرچیزی که برای برنامه نویسی میکروکنترلر AVR نیاز بوده رو نصب و تهیه کردید و آماده اید که برنامه نویسی آردینو رو کنار بزارید و توی مهارت کدنویسی با C مسلط بشید.در مقاله بعدی یاد میگیرم که چطور از برد آردینویی که داریم به عنوان پروگرمر استفاده کنیم؛ سیم کشی بین آردینو و میکروکنترلر رو بررسی میکنیم، اولین برنامه رو فلش میکنیم و بعدشم راجع به فیوز ها یاد میگیریم و اینکه چطوری میکروکنترلرمون رو خراب نکنیم.</description>
                <category>KAYT33N  | کیان</category>
                <author>KAYT33N  | کیان</author>
                <pubDate>Tue, 23 Sep 2025 16:57:21 +0330</pubDate>
            </item>
            </channel>
</rss>