کدنویسی AVR

سلام. اقصدداشتم درکدویژن دریک حلقه for، براساس افزایش یاکاهش استپها، DDR , PORTها خروجی و یک،، بشوند…لطفا راهنمایی کنید.ممنون

سلام، خب دلیلش این هست که شما نمی تونید از i در ترکیب PORTB.i استفاده کنید. PORTB در واقع یک متغیر از نوع struct هست که در فصل arm باهاش حسابی آشنا میشید.
PORTB و همینطور DDRB دو تا رجیستر ۸ بیتی هستن که هر بیتشون مربوط به یکی از پایه ها میشه. مثلا بیت ۰ ام PORTB مربوط به پایه PB.0 هست و بیت ۷ ام مربوط به PB.7 هست. پس شما برای اینکه بتونید در یک حلقه for به این پایه دسترسی داشته باشید، باید از شیفت های چپ ۱ استفاده کنید. در واقع منظور شما از PORTB.i = 1 رو میشه با این کد انجام داد:
PORTB = 1<< i
وقتی که i برابر ۰ هست، ۱ شیفت چپ به اندازه ۰ میشه خود ۱. پس شما بیت اول PORTB رو ۱ کردید که باعث میشه روی پین ۰ ام تاثیر بذاره. دفعه بعد i برابر ۱ هست و ۱ شیفت چپ به اندازه ۱ میشه 0b00000010 (یک عدد باینری که بیت ۱ ام اش ۱ هست) و این دفعه روی پین ۱ ام تاثیر گذاشتید. این روند ادامه پیدا میکنه تا i برابر ۷ بشه که عدد ۱ شیفت چپ به اندازه ۷ میشه 0b10000000 (یک عدد باینری که بیت ۷ام اش برابر ۱ هست.) و این دفعه پین ۷ ام رو روشن می کنید.
البته دقت کنید که با این روش، هر پینی که روشن می کنید، بقیه پین ها رو دارید خاموش می کنید. اگر می خواهید که هر پین مستقل از بقیه کنترل بشه، از دستور زیر استفاده کنید:
PORTB |= 1 << i
اون علامت |= که خونه میشه (or مساوی) رو هم توی arm باهاش آشنا میشید. (می تونید اگه هنوز نرسیدید یک سر بزنید به اون قسمت و برگردید.)‌ کارش این هست:
A |= B -------> A = A | B
یعنی خودش رو با اون مقدار جدید or می کنه و باعث میشه هر بیتی که ۱ هست واقعا ۱ بشه ولی بیت هایی که ۰ هستن رو دست نمی زنه.
چونکه توی آموزش ها کامل توضیح داده شده من دیگه ادامه نمی دم توضیح رو. اگه نامفهوم بود توضیحاتم بگید که بیشتر راهنمایی کنم.

سلام دوست عزیز. شما بسته رو تا کجا مشاهده کردید؟ کد هایی که در اواسط بسته با هم می نویسیم خیلی خیلی پیچیده تر از کدی هست که شما توصیف کردید. لطفا با توجه به آموزش های داخل بسته، حدس خودتون رو از کد احتمالی اینجا ارسال کنید تا من در تکمیلش کمکتون کنم.

@Mehrad#807 سلام.ممنون جناب مهندس .مشکل حل شد.بازهم ازاینکه وقت میگذارید و پاسخ میدهیدکمال تشکررادارم.اجرکم عندالله محفوظ انشاء الله.

for(i = 0; i < 8; i++){PORTB.i = 1;delay_ms(500);PORTB.i = 0;} ، که خطا میدهد.البته با استفاده از دستور شرطی if (i == 0) , PORTB.0 = 1 میشود کار راانجام داد. اما آیا راه حل دیگری که بشود همانند قسمت اول کد پورتها را تعریف منیم هست یا نه.ممنون