اطلاعیه

Collapse
No announcement yet.

ریزه کاری های اتمل استودیو

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    ریزه کاری های اتمل استودیو

    سلام خدمت دوستان
    راستش من با خوندن این تایپیک یکم گیج شدم
    IDE به این خوبی، دسترسی بیتی به پورت های میکرو رو برامون فراهم نمی کنه؟
    و باید براش ماکرو بنویسیم؟
    ممکنه لطف کنین در این مورد راهنمایی کنین؟
    در مورد لایبرری ها :
    مشابه لایبرری های زیر (مال کدویژنه) توی اتممل استودیو چیه؟
    delay.h - alcd.h
    خیلی ممنون
    همیشه کامل توضیح بدهیم تا جواب کامل بگیریم.
    لطفا برای تشکر روی دکمه تشکر بزنید و بخاطر این پست نزنید که تایپیک شلوغ نشود
    تایپیک های من:
    حل تمام مشکلات atmega128a (eca.ir)
    آموزش کار با سایت (eca.ir)

    #2
    پاسخ : ریزه کاری های اتمل استودیو

    باسلام.
    دسترسی بیتی یک فیچر سخت افزاری هست و برای همه رجیستر ها در دسترس نیست ولی طبق چیزی که در یک تاپیک دیگه پرسیدید ،طریقه نوشتن یک ماکرو برای این کار رو یاد دادم که براحتی با استفاده از اون میتونید یک بیت خاص از یه رجیستر رو صفر یا یک کنید.
    به صورت استاندارد برای LCD های گرافیکی و کاراکتری کتابخانه ای وجود نداره ولی مشابه اونها در اینترنت هست و یا میتونید به عنوان تمرین کار با سخت افزار خودتون کتابخانه توسعه بدید.
    #include<util/delay.h>
    _delay_ms();
    _delay_us();
    هدر فایل مربوط به تاخیر و توابع تاخیر میلی ثانیه و میکرو ثانیه رو بالا نوشتم.

    دیدگاه


      #3
      پاسخ : ریزه کاری های اتمل استودیو

      نوشته اصلی توسط A.I.E نمایش پست ها
      باسلام.
      دسترسی بیتی یک فیچر سخت افزاری هست و برای همه رجیستر ها در دسترس نیست ولی طبق چیزی که در یک تاپیک دیگه پرسیدید ،طریقه نوشتن یک ماکرو برای این کار رو یاد دادم که براحتی با استفاده از اون میتونید یک بیت خاص از یه رجیستر رو صفر یا یک کنید.
      به صورت استاندارد برای LCD های گرافیکی و کاراکتری کتابخانه ای وجود نداره ولی مشابه اونها در اینترنت هست و یا میتونید به عنوان تمرین کار با سخت افزار خودتون کتابخانه توسعه بدید.
      #include<util/delay.h>
      _delay_ms();
      _delay_us();
      هدر فایل مربوط به تاخیر و توابع تاخیر میلی ثانیه و میکرو ثانیه رو بالا نوشتم.
      سلام خیلی ممنون
      اون ماکرو ای که نوشتین فقط برای set کردن به کار می رفت
      اگه ممکنه برای reset کردنش هم ماکرو بنویسین ممنون میشم
      *اتمل استودیو کلمات کلیدی به زبان C اضافه نکرده مثل کدویژن؟ که لازم باشه در موردش تحقیق کنم؟
      خیلی ممنون
      همیشه کامل توضیح بدهیم تا جواب کامل بگیریم.
      لطفا برای تشکر روی دکمه تشکر بزنید و بخاطر این پست نزنید که تایپیک شلوغ نشود
      تایپیک های من:
      حل تمام مشکلات atmega128a (eca.ir)
      آموزش کار با سایت (eca.ir)

      دیدگاه


        #4
        پاسخ : ریزه کاری های اتمل استودیو

        نوشته اصلی توسط electromohammad نمایش پست ها
        سلام خیلی ممنون
        اون ماکرو ای که نوشتین فقط برای set کردن به کار می رفت
        اگه ممکنه برای reset کردنش هم ماکرو بنویسین ممنون میشم
        *اتمل استودیو کلمات کلیدی به زبان C اضافه نکرده مثل کدویژن؟ که لازم باشه در موردش تحقیق کنم؟
        خیلی ممنون
        سلام

        #define sbi(reg, bit) reg |= (1<<bit) // Set Bit
        #define cbi(reg, bit) reg &= ~(1<<bit) // Clear Bit
        #define toggle(reg, bit) reg ^= (1<<bit) // Toggle Bit

        کلمه کلیدی خاصی که فکر نکنم داشته باشه. به صورت کلی هر کمپایلری ممکنه کلمات کلیدی یا ثوابت خاصی داشته باشه ولی برای کاربردهای معمول من چیزی به ذهنم نمیرسه.
        جدیدترین ویرایش توسط hossein.m98; ۱۹:۳۵ ۱۴۰۰/۰۶/۱۳.

        دیدگاه


          #5
          پاسخ : ریزه کاری های اتمل استودیو

          باسلام.
          البته با اجازه از حسین آقا که استاد ما هستن.یکی کلمه کلیدی ISR به معنی سرویس مدیریت وقفه اضافه شده و برای ذخیره کردن دیتا در حافظه فلش که در کدویژن از کلمه کلیدی flash استفاده میشد ،حذف شده و باید از تایپ دیتا های موجود در کتابخانه pgmspace.h استفاده کرد که من خودم موفق به استفاده نشده ام و اگه حسین آقا تجربه ای دارند برای ما هم توضیح بدن.

          دیدگاه


            #6
            پاسخ : ریزه کاری های اتمل استودیو

            نوشته اصلی توسط A.I.E نمایش پست ها
            باسلام.
            البته با اجازه از حسین آقا که استاد ما هستن.یکی کلمه کلیدی ISR به معنی سرویس مدیریت وقفه اضافه شده و برای ذخیره کردن دیتا در حافظه فلش که در کدویژن از کلمه کلیدی flash استفاده میشد ،حذف شده و باید از تایپ دیتا های موجود در کتابخانه pgmspace.h استفاده کرد که من خودم موفق به استفاده نشده ام و اگه حسین آقا تجربه ای دارند برای ما هم توضیح بدن.
            اختیار دارید من کوچیک شما هستم
            بله کلمه flash مختص خود کدویژنه و جای دیگه ای وجود نداره. در مورد ISR هم به نظرم بیشتر یک جور ماکرو هستش تا کلمه کلیدی!
            برای pgmspace هم کافیه متغیر رو const تعریف کنید و کلمه PROGMEM هم داخل تعریف متغیر به کار ببرید. برای دسترسی به متغیری که به این شکل تعریف شده هم یک سری ماکرو مثل pgm_read_byte وجود داره که باید از اونا استفاده بشه (آدرس بهش میدید دیتا بر میگردونه). البته ظاهرا راه جایگزینی وجود داره که جناب مهندس کینژاد در یک تاپیک همین انجمن به من گفتن ولی من متأسفانه خیلی وقته با AVR کار نمیکنم و یادم نمونده به چه شکل بود.
            برای مثال یه قطعه کد اینجا میذارم شاید که راهگشا باشه، فقط ببخشید تستش نکردم ممکه ایراد داشته باشه:

            #include <avr/io.h>
            #include <avr/pgmspace.h>
            #include <stdint.h>


            #define F_CPU 8000000UL
            #include <util/delay.h>


            const uint8_t PROGMEM Data[10] =
            {
            0,
            1,
            2,
            3,
            4,
            5,
            6,
            7,
            8,
            9
            };


            int main(void)
            {
            DDRA = 0xFF;
            while(1)
            {
            for (uint8_t i=0; i<10; i++)
            {
            PORTA = pgm_read_byte(Data + i);
            _delay_ms(1000);
            }
            }
            }
            جدیدترین ویرایش توسط hossein.m98; ۲۲:۰۸ ۱۴۰۰/۰۶/۱۳.

            دیدگاه


              #7
              پاسخ : ریزه کاری های اتمل استودیو

              نوشته اصلی توسط hossein.m98 نمایش پست ها
              اختیار دارید من کوچیک شما هستم
              بله کلمه flash مختص خود کدویژنه و جای دیگه ای وجود نداره. در مورد ISR هم به نظرم بیشتر یک جور ماکرو هستش تا کلمه کلیدی!
              برای pgmspace هم کافیه متغیر رو const تعریف کنید و کلمه PROGMEM هم داخل تعریف متغیر به کار ببرید. برای دسترسی به متغیری که به این شکل تعریف شده هم یک سری ماکرو مثل pgm_read_byte وجود داره که باید از اونا استفاده بشه (آدرس بهش میدید دیتا بر میگردونه). البته ظاهرا راه جایگزینی وجود داره که جناب مهندس کینژاد در یک تاپیک همین انجمن به من گفتن ولی من متأسفانه خیلی وقته با AVR کار نمیکنم و یادم نمونده به چه شکل بود.
              برای مثال یه قطعه کد اینجا میذارم شاید به راهگشا باشه، فقط ببخشید تستش نکردم ممکه ایراد داشته باشه:

              #include <avr/io.h>
              #include <avr/pgmspace.h>
              #include <stdint.h>


              #define F_CPU 8000000UL
              #include<util/delay.h>


              const uint8_t PROGMEM Data[10] =
              {
              0,
              1,
              2,
              3,
              4,
              5,
              6,
              7,
              8,
              9
              };


              int main(void)
              {
              DDRA = 0xFF;
              while(1)
              {
              for (uint8_t i=0; i<10; i++)
              {
              PORTA = pgm_read_byte(Data + i);
              _delay_ms(1000);
              }
              }
              }
              ,باسلام.
              واقعا ازتون ممنونم من یه برنامه نوشته بودم برای راهندازی ساده یه کیبرد و سون سگمنت ماتریسی ولی نمیتونستم کد های کیبرد و سون سگمنت ذخیره شده توی فلش رو بخونم ،متاسفه مشکل استفاده نکردن pgm_read_byte بود که حل شد.کد رو هم میزارم شاید دوستان استفاده کردن.


              * Keyboard_7segment.c
              *
              * Created: 7/12/2021 11:39:10 PM
              * Author : *
              * Chip : ATmega32
              D0 D1 D2
              --|--|--|--D3
              --|--|--|--D4
              --|--|--|--D5
              --|--|--|--D6

              PORTA0 -> a
              PORTA1 -> b
              PORTA2 -> c
              PORTA3 -> d
              PORTA4 -> e
              PORTA5 -> f
              PORTA6 -> g
              PORTA7 -> dp

              PORTB0 -> 7seg0
              PORTB1 -> 7seg1
              PORTB2 -> 7seg2
              PORTB3 -> 7seg3
              */


              #define F_CPU 1000000UL
              #include <avr/io.h>
              #include <util/delay.h>
              #include <avr/pgmspace.h>
              #include <avr/interrupt.h>
              #define TRUE 1
              #define FALSE 0
              #define NO_KEY_CODE 12


              //Global Variables
              unsigned const char PROGMEM seg_table[] = {0xF9, 0xA4, 0xB0, 0x99, 0x92,
              0x82, 0xF8, 0x80, 0x90, 0xC0,
              0xFF, 0xBF};
              unsigned const char PROGMEM key_table[] = {0x76, 0x75, 0x73,
              0x6E, 0x6D, 0x6B,
              0x5E, 0x5D, 0x5B,
              0x3E, 0x3D, 0x3B};
              volatile unsigned char disp_data[] = {11, 11, 11, 11};//Display initialize (- - - -)
              volatile unsigned char key_code=NO_KEY_CODE;


              int main(void)
              {
              //Variables
              unsigned char old_key_code = NO_KEY_CODE,temp_key_code;
              unsigned char i = 4;
              //7 segment port configuration
              DDRA |= (1 << DDA0) | (1 << DDA1) | (1 << DDA2) | (1 << DDA3) | (1 << DDA4) | (1 << DDA5) | (1 << DDA6) | (1 << DDA7);
              DDRB |= (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3);
              //Timer/Counter configuration
              OCR0 = 124;
              TIMSK = (1 << OCIE0);//Enable compare match interrupt
              TCCR0 = (1 << WGM01) | (1 << CS01) ;//Timer clock:fclk_io/8 ; mode:CTC
              sei();
              while (1)
              {
              temp_key_code = key_code;
              if(temp_key_code != old_key_code){
              old_key_code = temp_key_code;
              if(temp_key_code != NO_KEY_CODE){
              disp_data[i] = temp_key_code;
              if (--i == 0xFF) i=4;
              }
              }
              }
              }


              ISR(TIMER0_COMP_vect){
              static unsigned char x20 = 0;
              static unsigned char pointer = 0;
              unsigned char temp, i;
              //7 segment refresh routine
              PORTB = 0;//Turn off all segments
              PORTA = pgm_read_byte(seg_table + disp_data[pointer]);
              PORTB = (1 << pointer);
              if(++pointer == 4) pointer = 0;
              //Keyboard scan routine
              if (++x20 == 20){
              x20 = 0;
              DDRD = (1 << DDD3) | (1 << DDD4) | (1 << DDD5) | (1 << DDD6);
              PORTD = (1 << PD0) | (1 << PD1) | (1 << PD2);
              _delay_us(5);//signal stabilization
              temp = (PIND & 0x07);
              DDRD = (1 << DDD0) | (1 << DDD1) | (1 << DDD2);
              PORTD = (1 << PD3) | (1 << PD4) | (1 << PD5) | (1 << PD6);
              _delay_us(5);
              temp |= (PIND & 0x78);
              for(i=0;i<12;i++){
              if(temp == pgm_read_byte(key_table + i)){
              key_code = i;
              break;
              }
              else key_code = NO_KEY_CODE;
              }
              }

              جدیدترین ویرایش توسط A.I.E; ۲۲:۰۰ ۱۴۰۰/۰۶/۱۳.

              دیدگاه


                #8
                پاسخ : ریزه کاری های اتمل استودیو

                نوشته اصلی توسط A.I.E نمایش پست ها
                باسلام.
                دسترسی بیتی یک فیچر سخت افزاری هست و برای همه رجیستر ها در دسترس نیست ولی طبق چیزی که در یک تاپیک دیگه پرسیدید ،طریقه نوشتن یک ماکرو برای این کار رو یاد دادم که براحتی با استفاده از اون میتونید یک بیت خاص از یه رجیستر رو صفر یا یک کنید.
                به صورت استاندارد برای LCD های گرافیکی و کاراکتری کتابخانه ای وجود نداره ولی مشابه اونها در اینترنت هست و یا میتونید به عنوان تمرین کار با سخت افزار خودتون کتابخانه توسعه بدید.
                #include<util/delay.h>
                _delay_ms();
                _delay_us();
                هدر فایل مربوط به تاخیر و توابع تاخیر میلی ثانیه و میکرو ثانیه رو بالا نوشتم.
                سلام خدمت دوستان خوبم
                میشه در مورد این جمله یه توضیحی بدین؟ "دسترسی بیتی یک فیچر سخت افزاری هست و برای همه رجیستر ها در دسترس نیست"
                یعنی تو کدویژن که می نویسیم portx.0 = 1 در واقع داره مشابه همون ماکرو ای که ذکر کردین رو می سازه؟ یعنی نهایت سرعت پایه های میکرو کنترلر می تونه با دستورات بایتی بیشتر از دستور بیتی بشه؟

                ممکنه برای این دستور" pinx.0 " هم ماکرویی در اختیار بذارین؟
                خیلی ممنون
                جدیدترین ویرایش توسط electromohammad; ۱۴:۰۶ ۱۴۰۰/۰۷/۰۱.
                همیشه کامل توضیح بدهیم تا جواب کامل بگیریم.
                لطفا برای تشکر روی دکمه تشکر بزنید و بخاطر این پست نزنید که تایپیک شلوغ نشود
                تایپیک های من:
                حل تمام مشکلات atmega128a (eca.ir)
                آموزش کار با سایت (eca.ir)

                دیدگاه


                  #9
                  پاسخ : ریزه کاری های اتمل استودیو

                  نوشته اصلی توسط electromohammad نمایش پست ها
                  سلام خدمت دوستان خوبم
                  میشه در مورد این جمله یه توضیحی بدین؟ "دسترسی بیتی یک فیچر سخت افزاری هست و برای همه رجیستر ها در دسترس نیست"
                  یعنی تو کدویژن که می نویسیم portx.0 = 1 در واقع داره مشابه همون ماکرو ای که ذکر کردین رو می سازه؟ یعنی نهایت سرعت پایه های میکرو کنترلر می تونه با دستورات بایتی بیشتر از دستور بیتی بشه؟

                  ممکنه برای این دستور" pinx.0 " هم ماکرویی در اختیار بذارین؟
                  خیلی ممنون
                  سلام خدمت دوستان
                  الان کدویژن به صورت نرم افزاری داره به صورت بیتی دستکاری می کنه؟ یا نه می تونه به تغییر بیتی از طریق سخت افزار دسترسی داشته باشه؟
                  برای خوندن از یه پایه چه ماکرو ای باید نوشت؟
                  ممنون دوستان
                  همیشه کامل توضیح بدهیم تا جواب کامل بگیریم.
                  لطفا برای تشکر روی دکمه تشکر بزنید و بخاطر این پست نزنید که تایپیک شلوغ نشود
                  تایپیک های من:
                  حل تمام مشکلات atmega128a (eca.ir)
                  آموزش کار با سایت (eca.ir)

                  دیدگاه


                    #10
                    پاسخ : ریزه کاری های اتمل استودیو

                    نوشته اصلی توسط electromohammad نمایش پست ها
                    سلام خدمت دوستان
                    الان کدویژن به صورت نرم افزاری داره به صورت بیتی دستکاری می کنه؟ یا نه می تونه به تغییر بیتی از طریق سخت افزار دسترسی داشته باشه؟
                    برای خوندن از یه پایه چه ماکرو ای باید نوشت؟
                    ممنون دوستان
                    باسلام.
                    واقعیتا من نمیدونم این کد ویژن چیکار میکنه!ولی مشخصا از همین ماکرو ها باید باشه میتونید فایل اسمبلی برنامه رو بگیرید و بررسی کنید.
                    برای خوندن هم توی یکی از تاپیک ها یه ماکرو ارائه داده بودم که بازم مینویسم:

                    #define bitread(pin,port) ((port & (1 << pin)) >> pin)

                    دیدگاه


                      #11
                      پاسخ : ریزه کاری های اتمل استودیو

                      نوشته اصلی توسط A.I.E نمایش پست ها
                      باسلام.
                      واقعیتا من نمیدونم این کد ویژن چیکار میکنه!ولی مشخصا از همین ماکرو ها باید باشه میتونید فایل اسمبلی برنامه رو بگیرید و بررسی کنید.
                      برای خوندن هم توی یکی از تاپیک ها یه ماکرو ارائه داده بودم که بازم مینویسم:

                      #define bitread(pin,port) ((port & (1 << pin)) >> pin)

                      سلام خدمت دوستان
                      اگه ممکنه این رو هم مثل سایر ماکرو ها از هم بپاشونین و توضیح بدین که چرا باید اینطور نوشته بشه
                      خیلی ممنون میشم
                      همیشه کامل توضیح بدهیم تا جواب کامل بگیریم.
                      لطفا برای تشکر روی دکمه تشکر بزنید و بخاطر این پست نزنید که تایپیک شلوغ نشود
                      تایپیک های من:
                      حل تمام مشکلات atmega128a (eca.ir)
                      آموزش کار با سایت (eca.ir)

                      دیدگاه


                        #12
                        پاسخ : ریزه کاری های اتمل استودیو

                        باسلام.
                        خب فرض کنیم میخوایم وضعیت بیت 5 از عدد باینری 0b01110010 بدست بیاریم.
                        اولین قدم اینه که بیایم و بیت مدنظر رو نگه داریم و بقیه رو صفرکنیم.پس میایم عدد 1 رو به اندازه 4 بار به چپ شیفت میدیم تا عدد باینری 0b00010000 بدست بیاد.سپس عدد بدست اومده و عدد اولیه رو باهم اند بیت وایز میکنیم و چون اگه هر عدد با صفر اند بشه صفر میشه و اگه با یک اند میشه حالت خودش حفظ میشه ،بیت 5 باقی میمونه یعنی عدد باینری 0b00010000.
                        حالا اگه این عدد رو 4 بار به راست شیفت بدیم میشه عدد باینری 0b00000001 که همون 1 خودمون هست.
                        بخش اول کار برای این انجام شد تا بیت های بعد بیت مد نظر ما صفر بشن تا بتونیم 0 یا 1 بدست بیاریم چون بیت های قبل بیت مدنظر توی شیفت آخر ازبین میرن.

                        دیدگاه

                        لطفا صبر کنید...
                        X