آیا تا به حال خواسته اید به میکروکنترلر AVR خود وارد شوید؟ آیا تا به حال به این فکر کرده اید که برای دیدن محتویات آن یک ثبت نام را «گربه» کنید؟ آیا همیشه به دنبال راهی برای روشن و خاموش کردن زیرسیستم های جانبی مجزای AVR یا آردوینو در *زمان واقعی* بوده اید؟ من نیز، بنابراین AVR Shell را نوشتم، پوسته ای شبیه یونیکس.
شبیه یونیکس است زیرا یادآور اکانت پوستهای است که برای اجرای رباتهای irc nick collision خود خریداری کردهاید و همچنین دارای یک یا دو دستور مشترک است. همچنین دارای یک سیستم فایل شبیه به extf های یونیکس است که از یک EEPROM خارجی استفاده می کند، اما این به خودی خود تبدیل به یک پروژه شده است، بنابراین من آن ماژول را به طور جداگانه تحت یک دستورالعمل متفاوت زمانی که برای تولید آماده شد منتشر می کنم.
در اینجا لیستی از کارهایی است که در حال حاضر می توانید با AVR Shell انجام دهید:
-
- همه ثبتهای جهت داده (DDRn)، پورتها و پینهای خود را بهصورت بلادرنگ بخوانید
- برای روشن کردن موتورها، LEDها یا خواندن حسگرها در زمان واقعی، روی همه DDRn ها، پورت ها و پین های خود بنویسید.
- تمام ثبت های شناخته شده در سیستم را فهرست کنید
- ایجاد و ذخیره مقادیر در متغیرهای تعریف شده توسط کاربر که توسط EEPROM پشتیبان گرفته شده است.
- یک رمز عبور root ایجاد کنید و در برابر آن احراز هویت کنید (برای دسترسی به telnet استفاده می شود)
- سرعت ساعت CPU پیکربندی شده را بخوانید
- با تنظیم پیش مقیاس کننده، سرعت ساعت CPU خود را تغییر دهید
- شروع و توقف تایمرهای 16 بیتی برای زمان بندی موارد مختلف
- روشن و/یا خاموش کردن زیرسیستم های جانبی: مبدل های آنالوگ به دیجیتال (ADC)، رابط جانبی سریال (SPI)، رابط دو سیمه (TWI/I2C)، UART/USART. برای زمانی که می خواهید مصرف برق میکروکنترلر را کاهش دهید یا عملکردهای خاصی را فعال کنید مفید است.
- در C++ با اشیاء قابل استفاده مجدد نوشته شده است.
این دستورالعمل نصب، استفاده و سفارشی سازی avrsh را بررسی می کند.
مرحله 1: آنچه شما نیاز دارید
این دستورالعمل به چیز زیادی نیاز ندارد به جز اینکه شما:
-
- آردوینو یا ATmega328P داشته باشید. سایر AVR ها می توانند کار کنند، اما ممکن است لازم باشد کد را تغییر دهید تا هر ثبتی که مختص MCU شما است را فهرست کند. نامها فقط باید با آنچه در فایل سرصفحه <avr/io*.h> فهرست شده است مطابقت داشته باشند که منحصر به فرد MCU شماست. بسیاری از نام های رجیستر بین AVR ها یکسان است، بنابراین مسافت پیموده شده شما ممکن است هنگام انتقال متفاوت باشد.
- راهی برای اتصال به سریال USART آردوینو/AVR خود داشته باشید. این سیستم به طور گسترده با ترمینال AVR آزمایش شده است ، یک برنامه ویندوز که اتصال سریال را از طریق پورت USB یا COM شما برقرار می کند. با Arduinos با استفاده از اتصال USB و هر AVR با استفاده از USB-BUB از Moderndevice.com کار می کند . سایر گزینه های ترمینال عبارتند از: Putty، minicom (Linux و FreeBSD)، صفحه نمایش (Linux/FreeBSD)، Hyperterminal، Teraterm. من متوجه شده ام که بتونه و تراترم هنگام اتصال مقداری زباله ارسال می کند تا اولین دستور شما مخدوش شود.
- سفتافزار AVR Shell را نصب و اجرا کنید که میتوانید آن را از این صفحات دانلود کنید، یا همیشه آخرین نسخه را در BattleDroids.net دریافت کنید .
برای نصب ترمینال AVR کافیست آن را از بسته بندی خارج کرده و اجرا کنید. برای نصب فریمور AVR Shell، آن را دانلود کنید و مستقیما فایل هگز را آپلود کنید و ترمینال سریال خود را با 9600 baud وصل کنید، یا خودتان آن را با "make" و سپس "make program" برای آپلود هگز کامپایل کنید. توجه داشته باشید، ممکن است لازم باشد تنظیمات AVRDUDE را تغییر دهید تا درگاه COM شما منعکس شود.
توجه: ویژگی PROGMEM در اجرای AVR GCC فعلی برای C++ شکسته شده است و این یک اشکال شناخته شده است. اگر آن را کامپایل میکنید، انتظار داشته باشید که پیامهای هشدار زیادی دریافت کنید که میگویند: «هشدار: فقط متغیرهای اولیه را میتوان در ناحیه حافظه برنامه قرار داد». این هشدار علاوه بر اینکه دیدن آن آزاردهنده است، بی ضرر است. از آنجایی که C++ در پلتفرم تعبیهشده در فهرست اولویتهای AVR GCC قرار ندارد، مشخص نیست چه زمانی این مشکل برطرف میشود. اگر کد را بررسی کنید، میبینید که من در کجا تلاش کردهام تا این هشدار را با اجرای عبارات ویژگی خودم کاهش دهم.
خیلی ساده. هر چیزی را که ممکن است نیاز داشته باشید دانلود و نصب کنید، سپس صفحه را ورق بزنید و اجازه دهید کرک کنیم.
مرحله 2: خواندن و نوشتن رجیسترها
AVR Shell در اصل برای دسترسی به برخی از سنسورهایی که به AVR خود متصل کرده بودم نوشته شده بود. با یک LED ساده شروع شد و سپس به سنسورهای نور، سنسورهای دما و در نهایت به دو مبدل اولتراسونیک منتقل شد. avrsh می تواند اجزای دیجیتالی این سنسورها را با نوشتن روی رجیسترهایی که آنها را کنترل می کنند تنظیم کند.
دستکاری رجیسترهای AVR در حین اجرا
برای دریافت لیستی از همه رجیسترهای شناخته شده در آردوینو، تایپ کنید:
و شما یک پرینت به این شکل دریافت خواهید کرد…
I know about the following registers: TIFR0 PORTC TIFR1 PORTD TIFR2 DDRD PCIFR DDRB EIFR DDRC EIMSK PINB EECR PINC EEDR PIND SREG EEARL GPIOR0 EEARH GPIOR1 GTCCR GPIOR2 TCCR0A TCCR0B TCNT0 OCR0A OCR0B SPCR SPDR ACSR SMCR MCUSR MCUCR SPMCSR WDTCSR CLKPR PRR OSCCAL PCICR EICRA PCMSK0 PCMSK1 TIMSK0 TIMSK1 TIMSK2 ADCL ADCH ADCSRA ADCSRB ADMUX DIDR0 DIDR1 TCCR1A TCCR1B TCCR1C TCNT1L TCNT1H ICR1L ICR1H OCR1AL OCR1AH OCR1BL OCR1BH TCCR2A TCCR2B TCNT2 OCR2A OCR2B ASSR TWBR TWSR TWAR TWDR TWCR TWAMR UCSR0A UCSR0B UCSR0C UBRR0L UBRR0H UDR0 PORTB root@ATmega328p>
مرحله 3: فیوزهای خواندن و نوشتن
فیوزها انواع خاصی از رجیسترها هستند. آنها همه چیز را از سرعت ساعت میکروکنترلر شما گرفته تا روش های برنامه نویسی برای محافظت از نوشتن EEPROM کنترل می کنند. گاهی اوقات لازم است این تنظیمات را تغییر دهید، به خصوص اگر در حال ایجاد یک سیستم AVR مستقل هستید. من مطمئن نیستم که باید تنظیمات فیوز خود را در آردوینو تغییر دهید. مراقب فیوزهای خود باشید؛ اگر آنها را نادرست تنظیم کنید می توانید خود را قفل کنید.
در یک دستورالعمل قبلی، من نشان دادم که چگونه می توانید فیوزهای خود را با استفاده از برنامه نویس و avrdude خود بخوانید و تنظیم کنید. در اینجا، من به شما نشان خواهم داد که چگونه فیوزهای خود را در زمان اجرا بازخوانی کنید تا ببینید که MCU شما چگونه آنها را تنظیم کرده است. توجه داشته باشید که این تنظیم زمان کامپایل نیست که از تعاریف <avr/io*.h> دریافت میکنید، بلکه فیوزهای واقعی زمانی است که MCU آنها را در زمان اجرا میخواند.
از جدول 27-9 در برگه داده ATmega328P (کتاب داده، بیشتر شبیه آن) بیت های Fuse Low Byte به شرح زیر است: