اطلاعیه

Collapse
No announcement yet.

تعیین تعداد دفعات انجام کار در میکروکنترلر avr

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

    #16
    پاسخ : تعیین تعداد دفعات انجام کار در میکروکنترلر avr

    نوشته اصلی توسط Amie.s.m نمایش پست ها
    دوست عزیز برای شروع بهتره از آخر به اول بیاییم !

    یعنی برای شروع فعلا روی این کار کنید که برای ایجاد هر برنامه ای اول باید توی کامپایلر یه فایل پروژه ایجاد کرد و تنظیماتش رو انجام داد ( اینی که اینجا داریم سورس کده ) .

    نیاز به اضافه کردن چیزی نیست یعنی چی ؟ این سورس کد تنظیمات و فرایند و کل روتین های برنامه و کلا ساختار اجرای الگوریتم سیستم داخلشه ... هر چیزی لازم باشه بعدا به این سورس باید اضافه بشه ( یا کم بشه )

    فراخوانی ساب روتین ها انجام نشده ؟
    برنامه نویسی اصولی این مدلیه ( اولش براتون توضیح دادم )
    وقفه ها و ایونت ها هستن که روتین ها رو اجرا میکنن ...
    میکرو اول کار یکبار تنظیمات و تعاریف اولیه رو انجام میده و بعد به شکل دائم در حالت اسلیپه ( مگر اینکه رویدادی اتفاق بیفته که بهش رسیدگی میکنه و دوباره برمیگرده به حلقه اصلی و اسلیپ )

    روتین های اصلی یکی وقفه تایمر صفر بعنوان مرجع زمانی ۱ میلی ثانیه است
    دومی هم اینتراپت خارجی صفره که موقع فشار دادن کلیدها اجرا میشه
    این دو تا ISR بقیه روتین ها و فانکشنهای مورد نیاز رو فراخوانی میکنن .

    یعنی کاری که شما شرح دادی کلا توش چند تا کلید بعنوان ورودی بود با دو تا خروجی که یکیش سون سگمنته ( مقداری که با کلیدها تنظیم شده رو نشون میده ) اون یکی هم یدونه خروجی موج مربعی بود .

    اگر چیزی از قلم افتاده اصلاحش کنیم ؟
    در مورد eprom فرمودید کدی که نوشتم خودش اتوماتیک کار ذخیره رو انجام نمیده ...
    اون بخش کدی که در رابطه با خوندن و نوشتن eprom نوشتید رو میشه دوباره قرار بدید ( توی کدهاتون چیزی در مورد eprom یا هر بخش دیگه من ندیدم )

    یه سوال کلی :
    این قراره پروژه پایان ترمی چیزی باشه ، برای آموزش شخصیه یا قراره یک ابزار باشه ؟

    اگر قراره ابزار باشه برای من خیلی ساده تره کامپایلش کنم ایمیج نهاییش رو بهتون بدم مستقیم بریزید روی میکرو
    سپاس بی کران که با سعه صدر پاسخگوی سوالات این حقیر هستی مهندس
    اول عرض کنم دانشجو رشته برق هستم این پروژه قراره به عنوان بخشی از نمره من هم باشه اما به دلیل علاقم به برنامه نویسی جنبه آموزشی داره واسم و هدفم این بوده که تا آخر اجراش کنم و یکبار روی میکرو هم بریزم و روی برد بورد هم پیادش کنم
    اگر براتون امکان کامپایلش هست ممنونتون میشم فایل نهاییش رو در اختیارم بذارید. فایل mbas باشه بهتره که بتونم تغییرات هم اعمال کنم این کدی که محبت کردید داخل میکرو بیسیک کپی کردم اما خطا میگرفت.

    فقط هنوز 3 مسئله توی برنامه برای من حل نشده
    1- مثلا ساب روتین اخری که بوت هستش PORTD = 7 یعنی چی ؟
    2- من بخوام زمان خاموش بودن led اول ، led دوم روشن بشه باید چکار کنم؟ تو برنامه ای که تو پست اول کدش رو فرستادم دو خروجی برای led اول و led دوم تعریف کرده بودم که خروجیشون معکوس هم بودن
    3- در کدی که توی پست اول هست برای eeprom دوتا sub فراخوانی و ذخیره بود
    کد:
    Eeprom_load:
     A = I_eerom
     Num = N_eerom
    Return
    
    '*********************************************
    Eeprom_save:
    I_eerom = A
    N_eerom = Num
    Return
    ببینید من میخواستم کل کاری که برنامم انجام بده این باشه: قبل اجرای برنامه number قبلی که وارد کردم رو از حافظه میکرو فرآخوانی کنه( که شما بطور ثابت 1234 تعریفش کردید که هربار روشن میشه همین 1234 هست) حالا صبر کنه تا پوش باتن on/ off رو فشار بدم( از یک پوش باتن برای on/ off استفاده کنم) زمانی که دکمه on/ off رو فشردم با توجه به number بره برای خاموش روشن کردن ای ای دی ها(تعداد number هم نسبت به یک دقیقه محاسبه بشه). حالا مثلا کلید _ok رو زدم و نامبر 2 بهش دادم 30 ثانیهled 1 روشن بشه و 30 ثانیه بعدی led2 روشن بشه و همینطور toggle کنن تا زمانی که دوباره پوش باتن on/ off فشرده بشه. و اینکه دوتا led سبز و قرمز هم میخوام برای زمانی که استارت زدم و یا استاپ هست روشن بشن یعنی در حالت off ال ای دی قرمز(led3) و حالت on ال ای دی سبز (led4)روشن بشه. (4 ورودی پوش باتن دارم و 4 خروجی led1/2/3/4 و خروجی 7seg)
    مهندس بی ادبی نشه اینارو برای این نوشتم که با تغییراتی که تو برنامه میدید متوجه بشم متغییر های جدیدم رو چطور و کجای برنامه تعریف کردید.
    باسپاس

    دیدگاه


      #17
      پاسخ : تعیین تعداد دفعات انجام کار در میکروکنترلر avr

      خواهش

      ببینید اگر قراره این برنامه بعنوان پروژه دانشجویی باشه که قضیه خیلی تابلو میشه .
      یعنی همون اولش استادتون دو تا سوال بپرسه متوجه میشه اصلا ساختار برنامه رو نمیشناسید ( نوشتن دیگه موضوعیت نداره و معلوم کار کسی دیگه است )

      بریم سراغ اون مثلا ها ( که این مثلا ها همون ساختار برنامه رو تشکیل میده و کسی که برنامه رو نوشته باید خط به خط کارایی که کرده رو بدونه چی بوده و توضیح بده )

      ۱ - این ساب روتین boot init ساب روتین آخری نیست ، از دید ساختار برنامه ساب اوله ( برنامه ها از main شروع میشن )
      پورت ایکس مساوی یک عدد یک دستور عمومی میکروهای avr هست یعنی ( potx=$xx )
      اگر پورت رو خروجی تعریف کرده باشیم پایه های متناظرش مقدار دهی میشن .
      اگر ورودی تعریف کرده باشیم پایه های متناظر پول آپ میشن
      در نتیجه portd=7 یعنی پول آپ سه تا پین d0 تا d2 فعاله ( فکر میکنم خط به خط برنامه رو کامنت کردم جلوی هر بخش توضیح کامل دادم ... )

      ۲ - در شماتیکی که کشیدید و صفحه قبل موجوده کلا یدونه خروجی ال ای دی وجود داشت !
      اینه که در طراحی هم یدونه خروجی در نظر گرفته شده ( در سورس با عنوان _led ) هستش .
      ولی علی ایحال اگر میخواستید دو تا ال ای دی بکنیدش یه پایه دلخواه دیگه میکرو رو خروجی تعریف میکنید مقدارش رو not _led یا not pd.4 باید قرار بدید .

      ۳- متغیر num یا number یک متغیر ۱۶ بیتی هست . در این کدی که نوشتید ( صرفنظر از ساختارش که درسته یا نه ) باید دوخانه eprom خوانده و نوشته بشه که من چنین چیزی نمیبینم ...

      در مورد بقیه اش ...
      طراحی ما مبتنی بر کلید ترکیبی هست گذشته از اینکه ۴ تا کلید برای انجام ۳ کار موضوعیت نداره ( مثلا اگر قرار بود من نوعی این سیستم رو اجرا کنم برای تمام کارهای مد نظر کلا یدونه کلید چند فانکشن در نظر میگرفتم ترتیب یا زمان فشردن کلید تعیین میکرد چه کاری باید انجام بشه )

      در هر صورت الان این سه تا کلید ۴ ترکیب دارن .
      هر کلید به تنهایی فشره بشه ( سه ترکیب )
      دو کلید بالا و پایین باهم فشرده بشن ( ترکیب چهارم )

      در مورد اون دو تا ال ای دی سبز و قرمز نمایشگر خاموش و روشن در جایی که نمایشگر داریم موضوعیت نداره چراغ راهنمایی درست کنیم !
      روی سون سگمنت عبارت on - off رو مینویسیم یا از سگمنت های نقطه ( چهارتاش وصله ) استفاده میکنیم یا گرافیکی با علامتهای I-O نشون میدیم سیستم خروجیش فعاله یا غیر فعال و بهمین ترتیب

      شب فایلهایی که خواستید رو آپلود میکنم ...

      لینک بیلد شده پروژه
      https://up.20script.ir/do.php?filena...egment-SRC.zip

      سورس کد

      کد:
      program LED_7_Seg_Cnt
      ' * Project name:
      '     Seven Segment
      ' * Copyright:
      '     (c) Amir.s.m, 2023
      ' * Revision History:
      '     20230126:
      '       - initial release (PRE);
      ' * Description:
      '     This code demonstrates how to display number on one 7-segment display
      '     (common cathode). Display is connected to PORTB (PB0..PB7, segment A to
      '     PB0, segment B to PB1, etc); common cathode is connected to the pin PC2 to PC5
      '     E2prom 0x10 , 0x11 used for store number
      '
      ' * Test configuration:
      '     MCU:             ATMEGA8
      '     Oscillator:      Internal Clock 02.0000 MHz
      '     Ext. Modules:    None.
      '     SW:              mikroBasic PRO for AVR
      ' * NOTES:
      '
      ' *
      
      
      dim shifter, portb_index , digit as byte
                 cpm , g_time , number as word
                           portb_array as byte[4]
                           _led as sbit at DDRD.4
                           
                           _up as sbit at PIND0_bit
                           _down as sbit at PIND1_bit
                           _ok as sbit at PIND2_bit
                           sys_sts as byte    ' system status D: 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
                                              '                ORQ EPR                  TRG OEN
      sub procedure show                      ' 10ms
        PORTB = 0                             ' turn off all 7seg displays
        PORTB = portb_array[portb_index]      ' bring appropriate value to PORTB
        PORTC = shifter                       ' turn on appropriate 7seg. display
      
      
        shifter = shifter << 1                ' move shifter to next digit
        if (shifter > 32) then
          shifter = 4                         ' return to first digit
        end if
      
        Inc(portb_index)                      ' increment portb_index for 1st to 3th digit
        if (portb_index > 3) then
          portb_index = 0                     ' turn on 1st, turn off 2nd to 4th 7seg.
        end if
      end sub
      
      sub function mask(dim num as byte) as byte
        select case num
          case 0
            result= 0x3F
          case 1
            result= 0x06
          case 2
            result= 0x5B
          case 3
            result= 0x4F
          case 4
            result= 0x66
          case 5
            result= 0x6D
          case 6
            result= 0x7D
          case 7
            result= 0x07
          case 8
            result= 0x7F
          case 9
            result= 0x6F
        end select
      end sub
      
      sub function E2PROM_RD_LD as word
      dim tmp as byte
      
          if (sys_sts.6 = 1)  then               ' ee write request
            tmp = lo(number)                     ' 8 lsb of word
            EEPROM_Write(0x10, tmp)      
            tmp = hi(number)                     ' 8 msb of word
            EEPROM_Write(0x11, tmp)
            result = number
            else                                 ' ee read request
            tmp = EEPROM_Read(0x10)              ' 8 lsb
            result = EEPROM_Read(0x11<<8) or tmp ' 8 msb + 8 lsb
          end if
      end sub
      
      sub procedure refresh                      ' 100 ms
          digit = number / 1000                  ' extract thousands digit
          portb_array[3] = mask(digit)           ' and store it to PORTC array
          digit = (number / 100) mod 10          ' extract hundreds digit
          portb_array[2] = mask(digit)           ' and store it to PORTC array
          digit = (number / 10) mod 10           ' extract tens digit
          portb_array[1] = mask(digit)           ' and store it to PORTC array
          digit = number mod 10                  ' extract ones digit
          portb_array[0] = mask(digit)           ' and store it to PORTC array
      '    Inc(number)                           ' increment number
          if ( number > 9999 ) then
            number = 9999
          end if
          if ( number < 1 ) then
            number = 1
          end if
          if (sys_sts > 0x7f) then         ' run mode set
              sys_sts.0 = 1
              if sys_sts.1 = 1 then        ' first time triger
              _led = 1
              sys_sts.0 = 0
              end if
            else                           ' stop mode set
              sys_sts.0 = 0
              _led = 0
              sys_sts.0 = 0
          end if
          if  ( GICR.6 = 0 ) then               ' Check INT0 STS
             GICR.6 = 1                         ' Enable INT0
          end if
      end sub
      
      sub procedure run(dim num as word)        ' run/stop output CPM = number
      dim tmp as word
          sys_sts.6 = 0
          tmp = E2PROM_RD_LD()                  ' eeprom read current number
          if (tmp<>num) then                    ' number not saved after change
              sys_sts.6 = 1
              tmp = E2PROM_RD_LD()              ' write number on eeprom
          end if
      sys_sts.7 = not sys_sts.7                 ' toggle output sts
      sys_sts.1 = 1                             ' triger bit
      end sub
      
      
      sub procedure KeyPress() iv IVT_ADDR_INT0 ics ICS_AUTO        'int0 Key press low level IRQ
          dim _key , _time as byte
      
          GICR.6 = 0                    ' Disable INT0
          g_time = 0                    ' reset general time
          _time = 10                    ' set debunce time
          while ( g_time < _time )
              _key = PORTD and 0x07     ' Read PD.2,1,0
          wend                          ' 10ms debunce elapsed
      
       select case _key
       case 0                           ' Up AND Down
          exit                          ' cancel change
       case 1                           ' Down
          dec(number)
       case 2                           ' Up
          inc(number)
       case 3                           ' Ok
          run(number)
       case else
       exit                             ' Release Keys
       end select
       
      end sub
      
      sub procedure Timer0Overflow_ISR() org IVT_ADDR_TIMER0_OVF '(1,024ms)
      
        inc(g_time)
        if ( g_time>= 58594) then        ' (60K ms)
         g_time = 0
        end if
      
        if sys_sts.0 = 1 then            ' output active
          if (cpm < (58594/number)) then ' duration < 1min/number
             _led = _led                 ' countinue last status
             inc(cpm)                    ' inc 1ms
             else                        ' pulse duartion elapsed
             _led = not _led             ' change polarity
             cpm = 0                     ' reset cpm
          end if
          else                           ' output disable
          _led = 0
        end if
        
        if (g_time mod 10 = 0) then      ' 10ms interval time
         show                            ' show multiplex segments
          if (g_time mod 100 = 0) then   ' 100ms interval time
           refresh                       ' refresh parameters
          end if
        end if
        
      end sub
      
      sub procedure boot_init
        DDRB = 0xFF                 ' Configure PORTB as output on all pins
        PORTB = 0                   ' Clear PORTB
        
        DDRC = 0x3C                 ' Configure PORTC as output on PC.5,4,3,2
        PORTC = 0                   ' Clear PORTC
        
        DDRD.4 = 1                  ' Configure PD.4 as output LED
        
        PORTD = 7                   ' Pull up on PD.2,1,0
      
        g_time = 0
        cpm = 0
        digit = 0
        portb_index = 0
        shifter = 4
        sys_sts = 0
        cpm = 0
        _led = 0
        
        number = E2PROM_RD_LD()     ' Initial number value read
      
        TCCR0 = 0x02                ' ClkI/O/8 (From prescaler)
        
      
        MCUCR.0 = 0
        MCUCR.1 = 0                 'Low level IRQ INT0 for Keys
        GICR.6 = 1                  'Enable INT0
      
        TOIE0_bit = 1               ' Timer0 overflow interrupt enable
        
        SREG_I_bit = 1              ' General Interrupt enable
      
      end sub
      
      main:
      boot_init()
      
       while true
        nop
       wend
      end.
      جدیدترین ویرایش توسط Amie.s.m; ۲۱:۱۷ ۱۴۰۱/۱۱/۱۰. دلیل: اضافه شدن لینک

      دیدگاه


        #18
        پاسخ : تعیین تعداد دفعات انجام کار در میکروکنترلر avr

        نوشته اصلی توسط Amie.s.m نمایش پست ها
        خواهش

        ببینید اگر قراره این برنامه بعنوان پروژه دانشجویی باشه که قضیه خیلی تابلو میشه .
        یعنی همون اولش استادتون دو تا سوال بپرسه متوجه میشه اصلا ساختار برنامه رو نمیشناسید ( نوشتن دیگه موضوعیت نداره و معلوم کار کسی دیگه است )

        بریم سراغ اون مثلا ها ( که این مثلا ها همون ساختار برنامه رو تشکیل میده و کسی که برنامه رو نوشته باید خط به خط کارایی که کرده رو بدونه چی بوده و توضیح بده )

        ۱ - این ساب روتین boot init ساب روتین آخری نیست ، از دید ساختار برنامه ساب اوله ( برنامه ها از main شروع میشن )
        پورت ایکس مساوی یک عدد یک دستور عمومی میکروهای avr هست یعنی ( potx=$xx )
        اگر پورت رو خروجی تعریف کرده باشیم پایه های متناظرش مقدار دهی میشن .
        اگر ورودی تعریف کرده باشیم پایه های متناظر پول آپ میشن
        در نتیجه portd=7 یعنی پول آپ سه تا پین d0 تا d2 فعاله ( فکر میکنم خط به خط برنامه رو کامنت کردم جلوی هر بخش توضیح کامل دادم ... )

        ۲ - در شماتیکی که کشیدید و صفحه قبل موجوده کلا یدونه خروجی ال ای دی وجود داشت !
        اینه که در طراحی هم یدونه خروجی در نظر گرفته شده ( در سورس با عنوان _led ) هستش .
        ولی علی ایحال اگر میخواستید دو تا ال ای دی بکنیدش یه پایه دلخواه دیگه میکرو رو خروجی تعریف میکنید مقدارش رو not _led یا not pd.4 باید قرار بدید .

        ۳- متغیر num یا number یک متغیر ۱۶ بیتی هست . در این کدی که نوشتید ( صرفنظر از ساختارش که درسته یا نه ) باید دوخانه eprom خوانده و نوشته بشه که من چنین چیزی نمیبینم ...

        در مورد بقیه اش ...
        طراحی ما مبتنی بر کلید ترکیبی هست گذشته از اینکه ۴ تا کلید برای انجام ۳ کار موضوعیت نداره ( مثلا اگر قرار بود من نوعی این سیستم رو اجرا کنم برای تمام کارهای مد نظر کلا یدونه کلید چند فانکشن در نظر میگرفتم ترتیب یا زمان فشردن کلید تعیین میکرد چه کاری باید انجام بشه )

        در هر صورت الان این سه تا کلید ۴ ترکیب دارن .
        هر کلید به تنهایی فشره بشه ( سه ترکیب )
        دو کلید بالا و پایین باهم فشرده بشن ( ترکیب چهارم )

        در مورد اون دو تا ال ای دی سبز و قرمز نمایشگر خاموش و روشن در جایی که نمایشگر داریم موضوعیت نداره چراغ راهنمایی درست کنیم !
        روی سون سگمنت عبارت on - off رو مینویسیم یا از سگمنت های نقطه ( چهارتاش وصله ) استفاده میکنیم یا گرافیکی با علامتهای I-O نشون میدیم سیستم خروجیش فعاله یا غیر فعال و بهمین ترتیب

        شب فایلهایی که خواستید رو آپلود میکنم ...

        لینک بیلد شده پروژه
        آپلود فایل، عکس، آهنگ و فیلم رایگان و با لینک مستقیم و ماندگاری دائمی و سرعت بالا در آپلود سنتر عکس و فایل بیست اسکریپت
        ممنونم مهندس نه زیاد سوال پیچ قرار نیست بشم اما برای همین خواستم چندتا متغییر دیگم مثل 3 تا led هم اضافه کنم که اگر قرار باشه چیزی تغییر کنه خودم انجام بدم و باید روی برد بورد تحویل بدم . البته من از این برنامه ای که نوشتید به عنوان درس آموزشی هم دارم استفاده میکنم چون کدهایی که نوشته شده واسم جدیده .
        بله توضیحات رو بروی هر خط نوشته شده و خیلی هم عالیه اما چون متوجه نشده بودم سوال کردم که شما خیلی عالی پاسخ دادید. سپاس
        در آخر
        این کدی که زحمت کشیدید، فایل hex رو به شبیه ساز پروتئوس دادم و کلاک داخلی هم تنظیم کردم اما روی سون سگمنت اعداد نمایش داده نمیشه اما پایه ها بسرعت صفر و یک میشن و وقتیم که کلید ok رو میزنم فقط در رقم یکان 3 تا سگمنت روشن میشن و برنامه قفل میکنه و به هیچ کدوم از 3 تا کلید دیگه واکنشی نشون نمیده
        من فکر میکنم یا پروتئوس نمیتونه نمایش بده یا مربوط به کلاک هستش
        جدیدترین ویرایش توسط pouriyar; ۱۶:۲۶ ۱۴۰۱/۱۱/۱۱.

        دیدگاه


          #19
          پاسخ : تعیین تعداد دفعات انجام کار در میکروکنترلر avr

          نوشته اصلی توسط pouriyar نمایش پست ها
          ممنونم مهندس نه زیاد سوال پیچ قرار نیست بشم اما برای همین خواستم چندتا متغییر دیگم مثل 3 تا led هم اضافه کنم که اگر قرار باشه چیزی تغییر کنه خودم انجام بدم و باید روی برد بورد تحویل بدم . البته من از این برنامه ای که نوشتید به عنوان درس آموزشی هم دارم استفاده میکنم چون کدهایی که نوشته شده واسم جدیده .
          بله توضیحات رو بروی هر خط نوشته شده و خیلی هم عالیه اما چون متوجه نشده بودم سوال کردم که شما خیلی عالی پاسخ دادید. سپاس
          در آخر
          این کدی که زحمت کشیدید، فایل hex رو به شبیه ساز پروتئوس دادم و کلاک داخلی هم تنظیم کردم اما روی سون سگمنت اعداد نمایش داده نمیشه اما پایه ها بسرعت صفر و یک میشن و وقتیم که کلید ok رو میزنم فقط در رقم یکان 3 تا سگمنت روشن میشن و برنامه قفل میکنه و به هیچ کدوم از 3 تا کلید دیگه واکنشی نشون نمیده
          من فکر میکنم یا پروتئوس نمیتونه نمایش بده یا مربوط به کلاک هستش
          یعنی الان ۳ تا ال ای دی شما روند کار یک سیستم رو میتونه توضیح بده ؟!
          من سعی کردم تا حد ممکن برنامه رو آماتوری بنویسم و تعمدا چند جا چند باره کاری و کدهای غیر بهینه در سورس آوردم که قضیه زیاد شک بر انگیز نشه ، منتهی بعید میدونم استادتون دیگه اینقدر ساده باشه که باور کنه چیزی که شما طراحی کردی و نوشتی رو نمیتونی دیباگ کنی !
          وقتی سورس دستت هست باید هر کاری بتونی انجام بدی .

          ( اصلا قید استاد و نمره و این داستان ها رو بزن برای اطلاعات عمومی خودت هم که شده سخت افزار و نرم افزار رو درست مطالعه کن و تا دقیق درکش نکردی هیچ جایی ارائه اش نده ... برای هدف آموزشی بعد از درک کامل سیستم همه چیز رو از نقطه صفر شروع کن .
          یعنی خودت مجدد روی یک میکروی دیگه سیستم رو طراحی و اجرا کن )
          در مورد پروتئوس و این روندی که چند ساله باب شده مردم فکر میکنن با یکی دو تا نرم افزار میشه کار اجرایی یا تحقیقاتی انجام داد :

          شبیه سازها بغیر از کارهای ساده و کند بخصوص در تحلیل سخت افزار کاربردی ندارن ، اینه که من نمیدونم برنامه ای که بیسش اینتراپته و داره هر میلی ثانیه وضعیت اکثر متغیرها و پورتها رو تغییر میده رو چطور میشه رفتارش رو روی سیمولاتور دید ... در حد ساده دیباگرها میتونن وضعیت متغیرها رو نمایش بدن اونم چون بریک پوینت داریم و استپ به استپ میشه برنامه رو اجرا کرد قابل بررسی هست وگرنه با سرعت انجام دستورات در میکرو و جابجایی های مدام بین روتین ها ردگیری اجرای نرم افزار به شکل ریل تایم تقریبا غیر ممکنه ( جهت اطلاع کامپایلری که دارید باهاش کار میکنید دیباگر هم داره ).

          اصولش اینه باید رفتار سیستم رو روی سخت افزار در دنیای واقعی دید و دیباگ کرد ... برای شروع کار روی میکرو بهتره این روند کار کردن با سیمولاتور رو کلا فراموش کنید .

          موفق باشید

          دیدگاه


            #20
            پاسخ : تعیین تعداد دفعات انجام کار در میکروکنترلر avr

            نوشته اصلی توسط Amie.s.m نمایش پست ها
            یعنی الان ۳ تا ال ای دی شما روند کار یک سیستم رو میتونه توضیح بده ؟!
            من سعی کردم تا حد ممکن برنامه رو آماتوری بنویسم و تعمدا چند جا چند باره کاری و کدهای غیر بهینه در سورس آوردم که قضیه زیاد شک بر انگیز نشه ، منتهی بعید میدونم استادتون دیگه اینقدر ساده باشه که باور کنه چیزی که شما طراحی کردی و نوشتی رو نمیتونی دیباگ کنی !
            وقتی سورس دستت هست باید هر کاری بتونی انجام بدی .

            ( اصلا قید استاد و نمره و این داستان ها رو بزن برای اطلاعات عمومی خودت هم که شده سخت افزار و نرم افزار رو درست مطالعه کن و تا دقیق درکش نکردی هیچ جایی ارائه اش نده ... برای هدف آموزشی بعد از درک کامل سیستم همه چیز رو از نقطه صفر شروع کن .
            یعنی خودت مجدد روی یک میکروی دیگه سیستم رو طراحی و اجرا کن )
            در مورد پروتئوس و این روندی که چند ساله باب شده مردم فکر میکنن با یکی دو تا نرم افزار میشه کار اجرایی یا تحقیقاتی انجام داد :

            شبیه سازها بغیر از کارهای ساده و کند بخصوص در تحلیل سخت افزار کاربردی ندارن ، اینه که من نمیدونم برنامه ای که بیسش اینتراپته و داره هر میلی ثانیه وضعیت اکثر متغیرها و پورتها رو تغییر میده رو چطور میشه رفتارش رو روی سیمولاتور دید ... در حد ساده دیباگرها میتونن وضعیت متغیرها رو نمایش بدن اونم چون بریک پوینت داریم و استپ به استپ میشه برنامه رو اجرا کرد قابل بررسی هست وگرنه با سرعت انجام دستورات در میکرو و جابجایی های مدام بین روتین ها ردگیری اجرای نرم افزار به شکل ریل تایم تقریبا غیر ممکنه ( جهت اطلاع کامپایلری که دارید باهاش کار میکنید دیباگر هم داره ).

            اصولش اینه باید رفتار سیستم رو روی سخت افزار در دنیای واقعی دید و دیباگ کرد ... برای شروع کار روی میکرو بهتره این روند کار کردن با سیمولاتور رو کلا فراموش کنید .

            موفق باشید
            مهندس ببخشید خیلی اذیت شدید قصد جسارت نداشتم فکر کنم ناراحت شدید از بنده
            من شاگردی میکنم دلیل سوالاتم این نبود که برنامه ای که شما نوشتید مشکل داره فقط صرفا خواستم مطلع بشم علت رو
            بله حرف شما کاملا درسته اما پروژه نهایی نیست و انجامش کاملا اختیاری هست بنابراین همین انجامش برای استادم مهمه
            توضیحات شما کاملا عالی و کامله اما حقیقتا گیج شدم از کجا شروع کنم . بیس کار برنامه نویسی در متن های آموزشی تعریف شده اما نمونه برنامه هایی که نوشته میشه رو خیلی سخت میشه فهمید و اینکه علت نوشتن یک کد برات سوال میشه و یا و نوع نوشتن برنامه ها و دستورات هم با هم متفاوته
            مثلا با کامپلایلر بیسیک بنده با خوندن یک تعاریف اولیه ربان برنامه نویسی بسکام و دیدن نمونه برنامه های نوشته شده تونستم دوتا برنامه رو خودم تغییرات روش ایجاد کنم و روی شبیه ساز نتایج کارمو ببینم اما زمانی که نوع نوشتن کد های شما با کامپایلر میکرو بیسیک رو دیدم متوجه شدم نمیتونم تغییرات رو اعمال کنم چون نوع نوشتن برنامه یکم متفاوت شد و من کیش و مات شدم الانم که میفرمایید شبیه ساز با دلایلی که گفتید قابل اجرا نیست پس باید برای مشاهده تغییرات حتما برنامه رو روی میکرو پروگرم کنم.
            مهندس اگر واستون امکان داره لطفا چندتا کتاب یا مطلب آموزشی که بتونه تو برنامه نویسی کمکم کنه بهم معرفی کنید و اینکه از همین ابتدا برم سمت زبان c یا فعلا همین بسکام رو یاد بگیرم.

            دیدگاه


              #21
              پاسخ : تعیین تعداد دفعات انجام کار در میکروکنترلر avr

              نه دوست عزیز برای چی باید ناراحت بشم ...

              اتفاقا خیلی خوبه وقتی که مساله مشخص نیست با سوال حلش کرد .
              در سورس برنامه چند تا باگ وجود داره که امیدوار بودم با بررسی کدها یه مقدار روند دیباگ هم کار کنید ...
              یکی رو اشاره میکنم بقیه اش رو کماکان امیدوارم بگردید و پیدا کنید .

              کد:
              if (sys_sts > 0x7f) then         ' run mode set
                      sys_sts.0 = 1
                      if sys_sts.1 = 1 then        ' first time triger
                      _led = 1
                      sys_sts.0 = 0
                      end if
              که باید باشه

              کد:
              if (sys_sts > 0x7f) then         ' run mode set
                      sys_sts.0 = 1
                      if sys_sts.1 = 1 then        ' first time triger
                      _led = 1
                      sys_sts.1 = 0
                      end if
              « یک بیت اشتباه ست بشه روند کار رو میتونه کاملا مختل کنه ... یک پوینتر خارج از رنج اشاره کنه بهمین ترتیب ... یک پرانتز و و و ... ) »

              در مورد برنامه نویسی زبون و نوعش اصلا اهمیت نداره ( همونطور که زبان صحبت کردن اهمیت نداره مال کجا باشه )
              مساله محتواست .
              در برنامه نویسی بیش از ۹۵ درصد کار الگوریتم و فوچارتهای مربوطه برای حل مساله است که موضوع کاملا ریاضیات و منطق محسوب میشه .

              مثل نوشتن کتابه که محتواش در ذهن نویسنده است .

              اینی که شما با زبان بیسیک الگوریتمت رو بنویسی یا سی یا پاسکال و غیره از دید تقریبا هیچ جایی هیچ تفاوتی ایجاد نمیکنه .
              ( تمام این زبانها نهایتا تبدیل به زبان ماشین میشن تا قابلیت اجرا پیدا کنن ... کامپایلرها کد شما رو اول به زبان اسمبلی ترجمه میکنن اونی که کامپایل میشه معادل اسمبلی کده ... در سیستم عاملها هم clr همین روند رو انجام میده )

              اگر میخوای برنامه نویس بشی یاد گرفتن زبان مساله اصلی که نیست بماند شاید آخرین موضوع باشه ( هر زبانی رو طی چند ساعت تا چند روز میشه از طریق رفرنسهاش یاد گرفت )
              مساله اینه هرکس فارسی صحبت میکنه نمیتونه غزل بگه ، یا هرکس انگلیسی بلده شکسپیر نمیشه .

              باید روی توانایی حل مساله کار کنید

              برای شروع

              خرید کتاب طراحی الگوریتم ها طراحی الگوریتم ها مترجم عین الله جعفرنژاد قمی نویسنده ریچارد نیپولیتان انتشارات علوم رایانه
              جدیدترین ویرایش توسط Amie.s.m; ۱۷:۰۷ ۱۴۰۱/۱۱/۱۲.

              دیدگاه


                #22
                پاسخ : تعیین تعداد دفعات انجام کار در میکروکنترلر avr

                نوشته اصلی توسط pouriyar نمایش پست ها
                مهندس اگر واستون امکان داره لطفا چندتا کتاب یا مطلب آموزشی که بتونه تو برنامه نویسی کمکم کنه بهم معرفی کنید و اینکه از همین ابتدا برم سمت زبان c یا فعلا همین بسکام رو یاد بگیرم.
                با درود
                کامنت اخیر دوستمون مثال خوبی داشت .. پارسی و غزل
                برنامه نویسی قدرت تخیل خوب میخواد .. تمرکز زیاد میخواد .. و ذهن طراح .. و یه هوشی میخواد که چیزی رو جا نندازی
                باید بتونی خالق و خلاق باشی .. نه اینکه برنامه دیگران بیاری و ادیت کنی . البته برخی مواقع برای سرعت کار این کار انجام میشه ..
                برنامه نویس فقط باید به خودش متکی باشه
                باور کن برنامه نویسی یه استعداد خاص میخواد
                دقیقا مثل این نوازندگی یاد بگیری ولی هیچ وقت نتونی نوازنده مطرحی بشی
                یا کلاس خوانندگی بری ولی استعداد خوانندگی نداشته باشی
                خلاصه یه هنره مثل بقیه هنر ها که یه پتانسیل و استعداد ذاتی میخواد

                سی بهتره و ذهنتو باز میکنه و ارتباط نزدیک تری به زبان ماشین داره
                سی رو میشه تو دو کلمه خلاصه کرد ؟ اگر and وگرنه

                دیدگاه


                  #23
                  پاسخ : تعیین تعداد دفعات انجام کار در میکروکنترلر avr

                  نوشته اصلی توسط کاکو نمایش پست ها
                  با درود
                  کامنت اخیر دوستمون مثال خوبی داشت .. پارسی و غزل
                  برنامه نویسی قدرت تخیل خوب میخواد .. تمرکز زیاد میخواد .. و ذهن طراح .. و یه هوشی میخواد که چیزی رو جا نندازی
                  باید بتونی خالق و خلاق باشی .. نه اینکه برنامه دیگران بیاری و ادیت کنی . البته برخی مواقع برای سرعت کار این کار انجام میشه ..
                  برنامه نویس فقط باید به خودش متکی باشه
                  باور کن برنامه نویسی یه استعداد خاص میخواد
                  دقیقا مثل این نوازندگی یاد بگیری ولی هیچ وقت نتونی نوازنده مطرحی بشی
                  یا کلاس خوانندگی بری ولی استعداد خوانندگی نداشته باشی
                  خلاصه یه هنره مثل بقیه هنر ها که یه پتانسیل و استعداد ذاتی میخواد

                  سی بهتره و ذهنتو باز میکنه و ارتباط نزدیک تری به زبان ماشین داره
                  سی رو میشه تو دو کلمه خلاصه کرد ؟ اگر and وگرنه
                  ممنون مهندس از توضیحاتت و راهنمایی بنده
                  فرمایشات شما کاملا درسته بنده تازه شروع کردم دارم کسب تجربه میکنمو از صحبتهای شما اساتید استفاده میکنم
                  سپاسگزارم

                  دیدگاه


                    #24
                    پاسخ : تعیین تعداد دفعات انجام کار در میکروکنترلر avr

                    نوشته اصلی توسط Amie.s.m نمایش پست ها
                    نه دوست عزیز برای چی باید ناراحت بشم ...

                    اتفاقا خیلی خوبه وقتی که مساله مشخص نیست با سوال حلش کرد .
                    در سورس برنامه چند تا باگ وجود داره که امیدوار بودم با بررسی کدها یه مقدار روند دیباگ هم کار کنید ...
                    یکی رو اشاره میکنم بقیه اش رو کماکان امیدوارم بگردید و پیدا کنید .

                    کد:
                    if (sys_sts > 0x7f) then         ' run mode set
                            sys_sts.0 = 1
                            if sys_sts.1 = 1 then        ' first time triger
                            _led = 1
                            sys_sts.0 = 0
                            end if
                    که باید باشه

                    کد:
                    if (sys_sts > 0x7f) then         ' run mode set
                            sys_sts.0 = 1
                            if sys_sts.1 = 1 then        ' first time triger
                            _led = 1
                            sys_sts.1 = 0
                            end if
                    « یک بیت اشتباه ست بشه روند کار رو میتونه کاملا مختل کنه ... یک پوینتر خارج از رنج اشاره کنه بهمین ترتیب ... یک پرانتز و و و ... ) »

                    در مورد برنامه نویسی زبون و نوعش اصلا اهمیت نداره ( همونطور که زبان صحبت کردن اهمیت نداره مال کجا باشه )
                    مساله محتواست .
                    در برنامه نویسی بیش از ۹۵ درصد کار الگوریتم و فوچارتهای مربوطه برای حل مساله است که موضوع کاملا ریاضیات و منطق محسوب میشه .

                    مثل نوشتن کتابه که محتواش در ذهن نویسنده است .

                    اینی که شما با زبان بیسیک الگوریتمت رو بنویسی یا سی یا پاسکال و غیره از دید تقریبا هیچ جایی هیچ تفاوتی ایجاد نمیکنه .
                    ( تمام این زبانها نهایتا تبدیل به زبان ماشین میشن تا قابلیت اجرا پیدا کنن ... کامپایلرها کد شما رو اول به زبان اسمبلی ترجمه میکنن اونی که کامپایل میشه معادل اسمبلی کده ... در سیستم عاملها هم clr همین روند رو انجام میده )

                    اگر میخوای برنامه نویس بشی یاد گرفتن زبان مساله اصلی که نیست بماند شاید آخرین موضوع باشه ( هر زبانی رو طی چند ساعت تا چند روز میشه از طریق رفرنسهاش یاد گرفت )
                    مساله اینه هرکس فارسی صحبت میکنه نمیتونه غزل بگه ، یا هرکس انگلیسی بلده شکسپیر نمیشه .

                    باید روی توانایی حل مساله کار کنید

                    برای شروع

                    https://www.iranketab.ir/book/94451-...-of-algorithms
                    مهندس ممنونم از توضیحاتت حتما بعد از اتمام این برنامه و تحویل پروژه به استادم آموزش رو از صفر شروع میکنم
                    من تمام قطعات رو خریداری کردم دو هفته گذشته اما متاسفانه مادربزرگم فوت شدن و از لحاظ روحی و خانوادگی شرایط و تمرکز درستی نداشتم
                    من تا پنجشنبه این هفته باید این پروژه رو روی برد بورد تحویل استادم بدم الان استرس دارم واقعا امکان سعی و خطا ندارم اگر براتون مقدروه باگ های برنامه رو بهم بگید یا بدون باگ برام زحمت بکشید بفرستید برنامه میکروبیسیک من کرک نشده هستش هرکاری میکنم خروجی hex نمیده.
                    و اینکه چیزی که باید انجام بدم دو خروجی دیگم داره که قبلا هم عرض کردم . در زمان خاموشیled2 ، led1 روشن بشه و همینطور toggle کنن تا زمانی که دوباره پوش باتن on/ off فشرده بشه و یک خروجی سوم هم میخوام که وقتی برنامه on هست( led1 و led2 دارن toggleمیکنن) تا زمان زدن پوش باتن on/ off خروجی یک بده
                    شرمنده مهندس اگر هزینه هم داره بفرمایید تقدیم کنم چون واقعا زمان و تمرکز لازم رو ندارم

                    دیدگاه


                      #25
                      پاسخ : تعیین تعداد دفعات انجام کار در میکروکنترلر avr

                      نوشته اصلی توسط pouriyar نمایش پست ها
                      مهندس ممنونم از توضیحاتت حتما بعد از اتمام این برنامه و تحویل پروژه به استادم آموزش رو از صفر شروع میکنم
                      من تمام قطعات رو خریداری کردم دو هفته گذشته اما متاسفانه مادربزرگم فوت شدن و از لحاظ روحی و خانوادگی شرایط و تمرکز درستی نداشتم
                      من تا پنجشنبه این هفته باید این پروژه رو روی برد بورد تحویل استادم بدم الان استرس دارم واقعا امکان سعی و خطا ندارم اگر براتون مقدروه باگ های برنامه رو بهم بگید یا بدون باگ برام زحمت بکشید بفرستید برنامه میکروبیسیک من کرک نشده هستش هرکاری میکنم خروجی hex نمیده.
                      و اینکه چیزی که باید انجام بدم دو خروجی دیگم داره که قبلا هم عرض کردم . در زمان خاموشیled2 ، led1 روشن بشه و همینطور toggle کنن تا زمانی که دوباره پوش باتن on/ off فشرده بشه و یک خروجی سوم هم میخوام که وقتی برنامه on هست( led1 و led2 دارن toggleمیکنن) تا زمان زدن پوش باتن on/ off خروجی یک بده
                      شرمنده مهندس اگر هزینه هم داره بفرمایید تقدیم کنم چون واقعا زمان و تمرکز لازم رو ندارم

                      دوست عزیز
                      بخاطر اتفاقی که افتاده تسلیت میگم .
                      شما که محدودیت زمانی داشتید بهتر بود همون اول کار عنوان میکردید و کار رو اجرا میکردید ( و خوب هر کاری هم اگر پیگرش نباشی خودبخود انجام نمیشه )

                      طبق جدول زمانبندی انجام کار اجرای شماتیک روی برد برد حدود ۱ ساعت وقت لازم داره .

                      پروگرام کردن میکرو رو بگیم هر دفعه ۲ دقیقه و برای دیباگ و نهایی سازی متوسط ۵ بار اصلاح کد ... اینم هر دفعه ۱۵ دقیقه ...

                      جمع ساعات مفید کاری که قراره انجام بدین زیر ۳ ساعته .

                      از امروز تا ۵ شنبه حدود ۴۰ ساعت وقت دارید که هر چقدر آدم گرفتار باشه ۳ ساعت زمان خالی رو میشه پیدا کرد .

                      پس جای استرس نیست ، بهتره دست به کار بشی

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

                      دیدگاه


                        #26
                        پاسخ : تعیین تعداد دفعات انجام کار در میکروکنترلر avr

                        دوست عزیز

                        به کجا رسیدی ؟
                        فکر کنم کمتر از ۲۴ ساعت مهلت داشته باشی

                        دیدگاه

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