میکروکنترلر PIC PIC16f877a یکی از مشهورترین میکروکنترلرها در صنعت است. استفاده از این میکروکنترلر بسیار راحت میباشد، برنامهنویسی این کنترلکننده نیز آسانتر است. یکی از مزایای اصلی این است که میتواند چندین بار نوشته و پاک شود زیرا از فناوری حافظه FLASH استفاده میکند. مجموعاً 40 پایه دارد و 33 پایه برای ورودی و خروجی وجود دارد. PIC16F877A در بسیاری از پروژههای میکروکنترلر PIC مورداستفاده قرار میگیرد. PIC16F877A همچنین در مدارهای الکترونیکی دیجیتال کاربرد زیادی دارد.
PIC16f877a در تعداد زیادی دستگاه پیدا میشود. در سنسورهای از راه دور، وسایل امنیتی و ایمنی، اتوماسیون خانگی و بسیاری از ابزارهای صنعتی استفاده میشود. EEPROM همچنین در آن وجود دارد که امکان ذخیره برخی از اطلاعات بهصورت دائمی مانند کدهای فرستنده و فرکانسهای گیرنده و برخی دیگر از دادههای مرتبط را فراهم میکند. هزینه این کنترلکننده پایین است و کار با آن نیز آسان است، انعطافپذیر است و میتواند در مناطقی که قبلاً از میکروکنترلرها استفادهنشده است مانند برنامههای ریزپردازنده و عملکردهای تایمر و غیره استفاده شود.
- دارای 35 دستورالعمل کوچکتر است.
- این میتواند تا فرکانس 20 مگاهرتز کار کند.
- ولتاژ کار بین 4.2 ولت تا 5.5 ولت است. اگر ولتاژ آن بیشتر از 5.5 ولت باشد، ممکن است بهطور دائمی آسیب ببیند.
- مانند PIC18F46K22، PIC18F4550 دارای نوسانساز داخلی نیست.
- حداکثر جریانی که هر PORT میتواند سینک شود یا سورس آن باشد حدود 100mA است. بنابراین، حد فعلی برای هر پایه GPIO PIC16F877A ده میلیآمپر است.
- این در چهار بستهبندی IC مانند 40-pin PDIP 44-pin PLCC، 44-pin TQFP، 44-pin QFN موجود است.
پیکره بندی و شرح پین میکروکنترلر PIC16F877A
همانطور که قبلاً ذکر شد، پکیج 40 پین این آی سی میکروکنترلر وجود دارد. از دو تایمر 8 بیتی و 16 بیتی تشکیلشده است. ماژولهای کپچر و مقایسه، پورتهای سریال، پورتهای موازی و پنج پورت ورودی / خروجی نیز در آن وجود دارد. این تصویر نمودار پین دیاگرام PIC16F877A را نشان میدهد.
پین 1 MCLR: اولین پین master clear این IC است. میکروکنترلر را مجدداً تنظیم میکند و با منطق 0 فعال است، به این معنی که دائماً باید ولتاژ 5 ولتی به آن داده شود و اگر 0 ولت داده شود، کنترلکننده مجدداً ریست میشود. با ریست مجدد کنترلر، آن را به خط اول برنامه که در IC رایت شده است برمیگرداند.
- یک دکمهفشاری و یک مقاومت به پایه متصل شده است. پین در حال حاضر توسط 5 ولت ثابت تأمین میشود. هنگامیکه میخواهیم IC را دوباره ریست کنیم، فقط باید دکمه را فشار دهیم که باعث میشود پین MCLR به 0 بالقوه برسد و درنتیجه ریست مجدد کنترلکننده انجام میشود.
- پین 2: RA0 / AN0 PORTA: از 6 پایه تشکیلشده است، از پایه 2 تا پایه 7، همه این پایههای ورودی / خروجی دو طرفه هستند. پایه 2 اولین پایه این درگاه است. از این پین میتوان بهعنوان پین آنالوگ AN0 نیز استفاده کرد.
- پین 3: RA1 / AN1: این میتواند ورودی آنالوگ 1 باشد.
- پین 4: RA2 / AN2 / Vref-: همچنین میتواند بهعنوان ورودی آنالوگ 2 عمل کند. یا ولتاژ مرجع آنالوگ منفی میتواند به آن داده شود.
- پین 5: RA3 / AN3 / Vref +: میتواند بهعنوان ورودی آنالوگ 3 عمل کند یا میتواند بهعنوان ولتاژ مرجع مثبت آنالوگ عمل کند.
- پین 6: RA0 / T0CKI: برای تایمر 0 این پایه میتواند بهعنوان پایه ورودی کلاک عمل کند، نوع خروجی اوپن درین است.
- پین 7: RA5 / SS / AN4: این میتواند ورودی آنالوگ 4 باشد. در کنترلکننده نیز پورت سریال همزمان وجود دارد و میتوان از این پین بهعنوان انتخاب برده برای آن پورت استفاده کرد.
- پین 8: RE0 / RD / AN5 PORTE: از پایه 8 تا پایه 10 شروع میشود و این نیز یک درگاه ورودی خروجی دو طرفه است. این میتواند ورودی آنالوگ 5 باشد یا برای پورت slave موازی میتواند بهعنوان یک پین “کنترل” عمل کند که کمفعال خواهد بود.
- پین 9: RE1 / WR / AN6: میتواند ورودی آنالوگ 6 باشد. و برای درگاه slave موازی میتواند بهعنوان “کنترل نوشتن” عمل کند که با 0 فعال خواهد بود.
- پین 10: RE2 / CS / A7: میتواند ورودی آنالوگ 7 باشد، یا برای درگاه slave موازی میتواند بهعنوان “کنترل انتخاب” عمل کند که همچنین مانند پینهای کنترل خواندن و نوشتن کمفعال خواهد بود.
- پین 11 و 32: VDD: این دو پین مثبت تغذیه برای پینهای ورودی / خروجی و منطقی هستند. هر دو آنها باید به 5 ولت متصل شوند.
- پین 12 و 31: VSS: این پینها مرجع گراند هستند برای پینهای ورودی / خروجی و منطقی هستند. آنها باید به 0 بالقوه متصل شوند.
- پین 13: OSC1 / CLKIN: این ورودی اسیلاتور یا پین ورودی کلاک خارجی است.
- پین 14: OSC2 / CLKOUT: این پین خروجی اسیلاتور است. یک کریستال رزوناتور بین پایه 13 و 14 متصل شده است تا کلاک خارجی را برای میکروکنترلر فراهم کند. ¼ از فرکانس OSC1 در صورت حالت RC توسط OSC2 تولید میشود. این میزان سیکل دستورالعمل را نشان میدهد.
- پین 15: RC0 / T1OCO / T1CKI PORTC: از 8 پایه تشکیلشده است. همچنین یک درگاه ورودی خروجی دو طرفه است. از بین آنها پین 15 اولین است. این پین میتواند ورودی کلاک تایمر 1 یا خروجی اسیلاتور تایمر 2 باشد.
- پین 16: RC1 / T1OSI / CCP2: میتواند ورودی اسیلاتور تایمر 1 یا ورودی کپچر 2، خروجی مقایسه 2، خروجی PWM 2 باشد.
- پین 17: RC2 / CCP1: این میتواند ورودی کپچر 1 / خروجی مقایسه 1 / خروجی PWM 1 باشد.
- پین 18: RC3 / SCK / SCL: میتواند خروجی برای حالتهای SPI یا I2C باشد و میتواند ورودی / خروجی برای کلاک سریال سنکرون باشد.
- پین 23: RC4 / SDI / SDA: میتواند پین data in در SPI باشد. یا در حالت I2C میتواند پین ورودی / خروجی داده باشد.
- پین 24: RC5 / SDO: میتواند پین data out در حالت SPI باشد.
- پین 25: RC6 / TX / CK: میتواند کلاک سنکرون یا پین ارسال آسنکرون USART باشد.
- پین 26: RC7 / RX / DT: میتواند پین داده سنکرون یا پین دریافت USART باشد.
- پین 19،20،21،22،27،28،29،30: همه این پینها به PORTD تعلق دارند که بازهم یک ورودی و خروجی دو طرفه است. وقتی قرار است بأس ریزپردازنده اینترفیس شود، میتواند بهعنوان درگاه slave موازی عمل کند.
- پین 33-40: پورت B: تمام این پینها به PORTB تعلق دارند. از این موارد RB0 میتواند بهعنوان پین وقفه خارجی و RB6 و RB7 میتوانند بهعنوان پینهای اشکالزدایی در مدار استفاده شوند.
توجه: همه پینها از قابلیتهای مختلفی برخوردارند. مانند پینهای PORTC میتوان بهعنوان پایههای ورودی دیجیتال، پایههای خروجی دیجیتال، برای ارتباطات UART، ارتباطات I2C استفاده کرد. اما، ما میتوانیم همزمان از یک عملکرد از هر پورت استفاده کنیم. باید آن را هوشمندانه برنامهریزی کنید تا بتوانید بین قابلیتهای مختلف جابجا شوید. مانند یک بار که برای خواندن سیگنال آنالوگ به یک پین نیاز دارید، آن را برای اهداف آنالوگ تعریف کنید و سپس به سایر توابع مانند خروجی دیجیتال و غیره بروید. برای مبتدیان، ما پیشنهاد میکنیم که از یک پین برای عملکردهای تک استفاده کنید و پسازاینکه در برنامهنویسی متخصص شدید، میتوانید از حالت چندمنظوره استفاده کنید.
چگونه میتوان پورت های ورودی و خروجی را برنامه ریزی کرد
- همانطور که ما 5 پورت ورودی و خروجی یعنی PORTA، PORTB، PORTC، PORTD و PORTE را مطالعه کردهایم که میتوانند دیجیتال و همچنین آنالوگ باشند.
- ما آنها را با توجه به نیاز خود پیکرهبندی خواهیم کرد. اما در حالت آنالوگ، پینها یا پورتها فقط میتوانند بهعنوان ورودی عمل کنند. مبدل آنالوگ به دیجیتال وجود دارد که در چنین مواردی استفاده میشود. از مدارهای مالتی پلکسر نیز استفاده میشود.
- اما در حالت دیجیتال محدودیتی وجود ندارد. ما میتوانیم پورتها را بهعنوان خروجی یا بهصورت ورودی پیکرهبندی کنیم. این کار از طریق برنامهنویسی انجام میشود. برای PIC کامپایلر ارجح mikro C pro است که میتواند از وبسایت آنها دانلود شود.
- رجیستری به نام TRIS وجود دارد که جهت پورتها را کنترل میکند. برای درگاههای مختلف رجیسترهای مختلفی مانند TRISA TRISB و غیره وجود دارد.
- اگر یک بیت از رجیستر TRIS را روی 0 قرار دهیم، بیت پورت متناظر بهعنوان خروجی دیجیتال عمل میکند.
- اگر یک بیت از رجیستر TRIS را روی 1 قرار دهیم، بیت پورت متناظر بهعنوان ورودی دیجیتال عمل میکند.
- برای مثال برای تنظیم کل portb بهعنوان خروجی، میتوانیم برنامه را بهصورت زیر بنویسیم:
TRISB=0;
- در حال حاضر پورت به عنوان پورت خروجی عمل میکند و ما میتوانیم هر مقداری را بر روی خروجی ارسال کنیم.
PORTB=0XFF;
- FF تمام 1 ها را به صورت باینری نشان میدهد یعنی FF = 11111111، اکنون تمام پایه های پورت b یک هستند. اگر LED ها را در تمام پایه ها متصل کنیم، همه در این شرایط شروع به روشن شدن میکنند.
- اگر میخواهیم مقادیر پورت b را منفی کنیم میتوانیم از عبارت زیر استفاده کنیم:
PORTB=~PORTB;
- اکنون تمام پایه های پورت b صفر می شوند.
کامپایلر میکروکنترلر PIC16F877A
- سه کامپایلر معروف که برای برنامهریزی میکروکنترلرهای pic مورداستفاده قرار میگیرد MPLAB XC8،Mikro C، کامپایلر PIC CCS و کامپایلر Hi-Tech است.
- کامپایلر رسمی کامپایلر MPLAB XC8 است که توسط تولیدکنندگان PIC16F877A ساختهشده است.
- ما بهطورکلی Mikro C را برای مبتدیان و کامپایلر MPLAB XC8 را برای کسانی که میخواهند برنامهنویسی میکروکنترلرهای pic را از مفاهیم سطح رجیستر یاد بگیرند، توصیه میکنیم.
- برای جزئیات بیشتر میتوانید به مقاله کامپایلرهای میکروکنترلر pic list ما مراجعه کنید.
ویژگی های اصلی میکروکنترلر PIC16F877A
مانند تمام میکروکنترلرهای دیگر، PIC16F877A نیز ویژگیهای مفیدی را ارائه میدهد که در این لیست ذکرشده است:
- ماژول مبدل آنالوگ به دیجیتال: دارای ماژول 8 بیتی ADC است که از 8 کانال تشکیلشده است. با این میکروکنترلر میتوانیم از 8 سنسور آنالوگ استفاده کنیم.
- Timers: سه تایمر timer0، timer1 و timer2 را فراهم میکند. همه این تایمرها یا در حالت تایمر یا در حالت شمارنده قابلاستفاده هستند. از این تایمرها برای ایجاد تأخیر، PWM، شمارش وقایع خارجی و وقفههای تایمر استفاده میشود. TIMER0 یک تایمر 8 بیتی است و میتواند با فرکانس داخلی یا خارجی کار کند. وقتی از Timer0 در حالت تایمر استفاده میکنیم، معمولاً آن را با فرکانس داخلی فعال میکنیم و در حالت شمارنده، آن را با منبع کلاک خارجی فعال میکنیم. بهطور مشابه، TIMER1 یک تایمر 16 بیتی است و همچنین میتواند در هر دو حالت کار کند. TIMER2 نیز 8 بیتی است. با PWM بهعنوان پایه زمانی برای ماژول CCP استفاده میشود.
- EEPROM: همچنین دارای حافظه داخلی فقط خواندنی قابل پاک کردن 256 * 8 بایت است که میتواند برای ذخیره دادهها بهصورت دائمی استفاده شود حتی اگر میکروکنترلر خاموش باشد، دادهها در آنجا باقی میمانند. این معمولاً با پروژههای مربوط به قفل الکترونیکی استفاده میشود.
- ماژولهای PWM: همچنین 2 ماژول CCP را ارائه میدهد. CCP مخفف کلمات ماژولهای capture compare PWM است. ما میتوانیم بهراحتی با این میکروکنترلر دو سیگنال PWM تولید کنیم. حداکثر رزولوشن پشتیبانی شده 10 بیت است.
- پینهای ارتباطی سریال یا UART: از یک کانال UART پشتیبانی میکند. پینهای UART برای ارتباط سریال بین دستگاههای دیجیتال استفاده میشود. پین RC7 یک فرستنده یا پین RX است که پین شماره 26 است. RC6 یک گیرنده یا پین Tx است که پین شماره 25 است.
- ارتباطات PIC16F877A:I2C همچنین از ارتباطات I2C پشتیبانی میکند و دارای یک واحد ارتباطات I2C است. پین شماره 18 / RC3 و 23 / RC4 به ترتیب پینهای SCL و SDA هستند. SCL یک خط کلاک سریال و SDA یک خط داده سریال است.
- وقفهها: وقفهها درزمینه سیستمهای نهفته کاربردهای شگفتانگیزی دارند. اگر درباره وقفهها اطلاعی ندارید، من به شما پیشنهاد میکنم درک کاملی در مورد آنها داشته باشید. میکروکنترلر PIC16F877A هشت نوع وقفه را پشتیبانی میکند. وقفههای خارجی، وقفههای تایمر، وقفههای تغییر حالت PORT، وقفههای UART، وقفههای I2C،PWM.
- ماژول مقایسه کننده: دارای یک ماژول مقایسه کننده است که از دو مقایسه کننده تشکیلشده است. آنها برای مقایسه سیگنالهای آنالوگ مثل مقایسه کنندهها در مدارهای الکترونیکی استفاده میشوند. پایههای ورودی برای این مقایسه کنندهها RA0، RA1، RA2 و RA3 است و خروجی میتواند از طریق RA4 و RA5 اندازهگیری شود.
- WDT:Watchdog timer یک اسیلاتور جداگانهای بر روی تراشه است که آزادانه کار میکند. این یک اسیلاتور جدا از OSC1 / CLKI است. WDT حتی اگر دستگاه در حالت خواب باشد نیز کار خواهد کرد. این برای خارج شدن دستگاه از حالت خواب استفاده میشود و همچنین برای ایجاد ریست تایمر نگهبان استفاده میشود.
- حالت خواب: PIC16F877A همچنین عملکرد حالت خواب را فراهم میکند. در این حالت، دستگاه با توان بسیارکم کار میکند. تمام وسایل جانبی حداقل مقدار جریان را میکشند.
- تشخیص Brown out: همچنین دارای یک مدار تشخیص Brown out است که افت قابلتوجه ولتاژ منبع تغذیه را تشخیص میدهد. در صورت افت ولتاژ از حد معینی، سیگنالهای وقفه ایجاد میکند. بیت پیکرهبندی (BODEN) برای غیرفعال کردن یا فعال کردن این مدار استفاده میشود.
- ریست Brown out: این آپشن با تشخیص سیگنال وقفه Brown out از سیگنال BODEN، دستگاه را ریست میکند. اگر ولتاژ تغذیه بیش از 100 میکروثانیه به زیر آستانه برسد.
- محافظت از کد قابلبرنامهریزی، ریست Brown off رخ میدهد و دستگاه تا زمانی که ولتاژ به مقدار اسمی خود نرسد، دوباره ریست میشود. دستگاه پس از هر 72 میلیثانیه ولتاژ را بررسی میکند.
برخی از ویژگی های مهم دیگر در زیر ذکر شده است:
- ریست روشن شدن
- گروه اسیلاتور چندگانه
- مدار اشکالزدایی داخلی
- مدار داخلی برنامهنویسی سریال
- برنامهریزی ICSP ولتاژ پایین
کد LED چشمک زن
این آموزش ساده در مورد چشمک زدن یک LED با میکروکنترلر PIC16F877A است. ما برای نوشتن این کد از Mikro C برای کامپایلر PIC استفاده میکنیم.
void main() { TRISB.F0 = 0 // the direction of RB0 is set as output //or TRISB = 0xFE (0xFE = 11111110) do // setting the infinite loop { PORTB.F0 = 1; // setting the RB0 pin to high Delay_ms(500); // delay of 500 milli seconds PORTB.F0 = 0; // setting the RB0 pin to low Delay_ms(500); // again a delay of 500 milli seconds }while(1); }
این کد برای تغییر وضعیت پین شماره صفر PORTC با تأخیر 500 میلی ثانیه استفاده میشود. در داخل تابع main، این خط RB0 را به عنوان پایه خروجی دیجیتال مقداردهی اولیه میکند:
TRISB.F0 = 0
بعد از آن از حلقه while استفاده میشود، زیرا ما می خواهیم LED را بارها و بارها تغییر دهیم. در داخل حلقه do while، این خط باعث می شود RB0 دیجیتال برای 500ms یک باشد:
PORTB.F0 = 1; // setting the RB0 pin to high Delay_ms(500); // delay of 500 milli seconds
و به طور مشابه این خطوط، LED را برای 500 میلی ثانیه خاموش میکند:
PORTB.F0 = 0; // setting the RB0 pin to low Delay_ms(500); // again a delay of 500 milli seconds
نمودار مدار برای چشمک زدن LED با PIC16F877A
- این مدار را در پروتئوس طراحی کنید. همانطور که در قسمت توضیحات پین توضیح دادهشده است، پینها را با منبع، زمین و اسیلاتور متصل کنید.
- از طریق دو خازن 22 پیکو فاراد، اسیلاتور 8 مگاهرتزی را با OSCI و OSC2 وصل کنید.
- 5 ولت برای ریست پین از طریق مقاومت 10 کیلو اهم فراهم کنید. مقاومت در شبیهسازی نشان داده نشده است، اما شما باید در هنگام ساخت مدار مقاومت را وصل کنید.
- یک LED بر روی پین 33 RB0 متصل است، از یک مقاومت برای محدود کردن جریان و جلوگیری از سوختن LED استفاده میشود. برنامه را در mikro C pro بنویسید و کامپایل کنید.
- با دوبار کلیک بر روی کنترلر موجود در پروتئوس، میکروکنترلر را با پرونده hex رایت کرده و مدار را با موفقیت اجرا کنید. بهترین راه برای یادگیری هر میکروکنترلر بررسی دیتاشیت آن است.
- Pic kit3 یک پروگرامر معروف است که برای بارگذاری کد در تراشههای میکروچیپ استفاده میشود.
منبع: سیسوگ