اطلاعیه

Collapse
No announcement yet.

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

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

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

    سلام خدمت اساتید محترم
    من یک برنامه نوشتم توی بسکام که با میکرو atmega 8 میخوام انجامش بدم
    برنامه اینه من میخوام برنامم به این صورت باشه که یک led رو به تعداد دفعات دلخواه روشن خاموش کنم(یعنی فقط یک خروجی دارم) و این عدد برای بار اول به بعد در حافظه میکرو ذخیره بشه تا اینکه مجدد کلید تنظیم زده بشه و مقدار جدید بدم بهش
    و اینکه 4 تا پوش باتن دارم و یک سون سگمنت 4 دیجیت مالتی پلکس
    یک پوش باتن برای استارت و استاپ برنامه
    یک پوش باتن برای تنظیم تعداد دفعات دلخواه خاموش و روشن شدن led
    و دو پوش باتن بعدی برای آپ و دان شمارنده عدد دلخواهم

    مشکلم اینجاست که میخوام برای ستینگ و نمایشش عددی که وارد می کنم بر روی سون سگمنت، یک sub بذارم اما نمیدونم چکار کنم
    لطفا کمکم کنید برای وارد کردن عدد دلخواهم روی سون سگمنت چکار کنم
    کد:
    $regfile = "m8def.dat"
    $crystal = 800000
    Config Debounce = 50 , Delay = 50
    Declare Sub Eeprom_load
    Declare Sub Show_7seg
    'I/O:
    Config Pinc.0 = Input : Down Alias Pinc.0
    Config Pinc.1 = Input : Set_ Alias Pinc.1
    Config Pinc.2 = Input : Up Alias Pinc.2
    Config Pinb.5 = Input : On_off Alias Pinb.5
    Config Portd = Output : 7seg Alias Portd
    Config Portc.5 = Output : Dp Alias Portc.5
    Config Portb.0 = Output : Dig4 Alias Portb.0
    Config Portb.1 = Output : Dig3 Alias Portb.1
    Config Portb.2 = Output : Dig2 Alias Portb.2
    Config Portb.3 = Output : Dig1 Alias Portb.3
    Config Portb.4 = Output : Led1 Alias Portb.4
    Config Portc.3 = Output : Led2 Alias Portc.3
    Config Portc.4 = Output : Beep2 Alias Portc.4
    
    '**************************************
    'Var:
    Dim I As Byte
    Dim A As Word
    Dim B As Byte
    Dim C As Byte
    Dim D As Single
    Dim E As Byte
    Dim H As Bit
    Dim I_eerom As Byte
    Dim Num As Word
    '*************************** begin **************************************
    Num = 0
    If Num > 0 Then Goto Off_ Else Goto Setting
    
    '******************************** MAIN **********************************
    Off_:
    H = 0
    A = 60000 / Num
    If Set_ = 1 And H = 0 Then H = 1
    Waitms 300
    Goto On_
    On_:
    Do
    Portc.0 = 1
    Portc.1 = 0
    Waitms = A
    Portc.0 = 0
    Portc.1 = 1
    Waitms = A
    Loop Until Set_ = 1 And H = 1
    H = 0
    Goto Off_
    
    
    '*********************************************
    Eeprom_load:
     A = I_eerom
     Num = N_eerom
    Return
    
    '*********************************************
    Eeprom_save:
    I_eerom = A
    N_eerom = Num
    Return
    
    '------------------------------------ SHOW 7SEG --------------------------------
    Show_7seg:
    
    
    
    Return
    
    
     '************************************ SETTING **********************************
    Setting:
    
    goto Eeprom_save 
    Return
    
    '--------------------------------- INCR / DECR ---------------------------------
    Decrease:
    
    
    Return
    '-------------------------------------------------------------------------------
    Increase:
    
    
    Return
    
    '-------------------------------------------------------------------------------
    
    Dta:
    Data &HC0 , &HF9 , &HA4 , &HB0 , &H99 , &H92 , &H82 , &HF8 , &H80 , &H90       'DIGIT
    
    '***************************************END***************************************
    جدیدترین ویرایش توسط pouriyar; ۰۱:۵۳ ۱۴۰۱/۱۱/۰۵.

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

    دوست عزیز الان مشکل شما مشخصا کدوم بخشه ؟ ( تقرببا هیچکدوم از ساب روتین های اصلی رو ننوشتی )

    مشکلت بخش نمایشگر سون سگمنته یا استراکچر کلی برنامه ؟
    اون حلقه اصلی که نوشتید داره مدام یک پایه رو toggle میکنه ( دو تا بخش اوش هم اصلا اعمال نمیشه )

    دیدگاه


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

      اساتید کسی نیست بنده رو راهنمایی کنه؟
      من میخوام تعداد خاموش روشن شدن یک led رو توی یک دقیقه خودم تعیین کنم و هربار تغییرش بدم و اینکه اینکار با 3 پوش باتن و یک سون سگمنت 4 دیجیت مالتی پلکس انجام بدم
      خواهش میکنم راهنماییم کنید

      دلیل: ادغام دو پست برای جلوگیری از اسپم

      نوشته اصلی توسط Amie.s.m نمایش پست ها
      دوست عزیز الان مشکل شما مشخصا کدوم بخشه ؟ ( تقرببا هیچکدوم از ساب روتین های اصلی رو ننوشتی )

      مشکلت بخش نمایشگر سون سگمنته یا استراکچر کلی برنامه ؟
      اون حلقه اصلی که نوشتید داره مدام یک پایه رو toggle میکنه ( دو تا بخش اوش هم اصلا اعمال نمیشه )
      بله من حلقه اصلیم داره همون کار خاموش روشن led رو با تعدادی که وارد میکنم انجام میده
      اما تعداد خاموش روشن شدن یک led رو توی یک دقیقه خودم تعیین کنم و هربار تغییرش بدم و اینکه اینکار با 3 پوش باتن و یک سون سگمنت 4 دیجیت مالتی پلکس انجام بدم حالا من اومدم این برنامه رو فعلا تا اینجا که کدشو نوشتم پیش بردم اما نمیدونم چطور مثلا اعداد رو بالا پایین کنم و روی سون سگمنت به نمایش بذارم و دوباره این عدد سیو بشه تو eeprom و وارد حلقه اصلی بشه برنامه و دوباره اینبار با مقدار جدید led رو خاوش و روشن بکنه
      مثلا میام ستینگ رو میزنم منتظر بمونه تا عدد رو بالا پایین کنم و بعد دوباره ستینگ رو زدم سیو کنه عدد رو و بره داخل حلقه اصلی و تا زمانی که دکمه خاموش شدن برنامه رو نزدم تو لوپ بمونه

      دلیل: ادغام دو پست برای جلوگیری از اسپم

      نوشته اصلی توسط Amie.s.m نمایش پست ها
      دوست عزیز الان مشکل شما مشخصا کدوم بخشه ؟ ( تقرببا هیچکدوم از ساب روتین های اصلی رو ننوشتی )

      مشکلت بخش نمایشگر سون سگمنته یا استراکچر کلی برنامه ؟
      اون حلقه اصلی که نوشتید داره مدام یک پایه رو toggle میکنه ( دو تا بخش اوش هم اصلا اعمال نمیشه )
      دوست عزیز من میخواستم ساب روتین بذارم اما موندم چطور انجامش بدم فعلا خالی گذاشتم ببینم چکار باید بکنم
      اگر بدون ساب هم میشه نوشت ممنون میشم راهنماییم کنی
      مشکل نمایش مثل عدد 4 رقمی روی سون سگمنت هست و کم و زیاد کردنش و همون بخش ستینگ
      اون حلقه اصلی همون کار تاگل رو باید انجام بده تا زمانی که ستینگ رو بزنیم یا دکمه stop

      دیدگاه


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

        دوست عزیز متوجه کاری که میخوای انجام بدی هستم ، مساله اینه این کدی که نوشتی عملا هیچی داخلش نیست !

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

        روش درست برنامه نویسی باید با اینتراپت ، تایمر و امثالهم باشه ...نه دیلی و مدام پایه های کلید رو خوندن .
        کلا سیستم سون سگمنتی و مولتی پلکس اینطوری اجرا نمیشه .

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

        دیدگاه


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

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

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

          روش درست برنامه نویسی باید با اینتراپت ، تایمر و امثالهم باشه ...نه دیلی و مدام پایه های کلید رو خوندن .
          کلا سیستم سون سگمنتی و مولتی پلکس اینطوری اجرا نمیشه .

          اگر مدار رو نبستی بهتره الگوریتم کلی برنامه ای که میخوای اجرا بشه رو بنویسی ... مبتنی بر الگوریتم برای کسی که بخواد سیستم رو از صفر پیاده کنه خیلی راحت تر و بهتر میشه اجراش کرد تا این چند تا تعریف اولیه ناقص .
          استفاده از اینتراپت و تایمر خود میکرو رو برای این برنامه حقیقت نمیدونم چطور باید انجام بدم
          دانشجو تازه کارم کلا سومین برنامه هست که دارم مینویسم و خیلی چیزا هست که باید یاد بگیرم یکم گیج شدم
          لطفا کمکم کن اگر وقتشو داری ممنونت میشم
          بازر ندارم اون beep که نوشتم کپی از یک برنامه دیگه بوده یادم رفته پاکش کنم فقط 3 تا پوش باتن دارم یکی برای setting و دوتا برای افزایش و کاهش و یک سون سگمنت 4 دیجیت

          دیدگاه


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

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

            اگر الگوریتم نویسی وارد نیستی بصورت شفاف و دقیق بنویس قراره این سیستم فلان ورودی ها رو بگیره مبتنی بر فلان ورودی ها فلان خروجی ها رو ارائه بده ( هر تعداد بند و ماده و تبصره هم نیازه باید ذکر کنی )

            دیدگاه


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

              نوشته اصلی توسط Amie.s.m نمایش پست ها
              اوکی ،
              الگوریتم کاری که میخوای انجام ببشه رو بنویس ، نوشتن کدش کار چند دقیقه است .

              اگر الگوریتم نویسی وارد نیستی بصورت شفاف و دقیق بنویس قراره این سیستم فلان ورودی ها رو بگیره مبتنی بر فلان ورودی ها فلان خروجی ها رو ارائه بده ( هر تعداد بند و ماده و تبصره هم نیازه باید ذکر کنی )
              ممنونم

              من شماتیک کار رو توی پروتئوس پیاده کردم که عکسشو گذاشتم این شماتیک رو همینطوری کشیدم یعنی برام مهم نیست کدوم پورت و پین به کجا وصل بشه و همینطور پول آپ و پول دان بودن مهم نیست هرطور دوست داشتی خروجی ها و ورودی ها و همینطور پول آپ و پول دان رو تعریف کن
              برنامه میخوام این کارو انجام بده برای بار اول بیاد عددی که میخوایم توی یک دقیقه led خاموش و روشن بشه رو اگه اولین باره برنامه استارت میشه بگیره و اگر قبلا این عدد رو وارد کردیم قبلش از حافظه فراخوانی کنه و بره تو ساب off منتظر زدن کلید on-off بشه
              اول برنامه num=0 گذاشتم بعد نوشتم اگر بزرگتر از صفر نبود بره تو قسمت ستینگ منتظر بمونه عدد برای بار اول وارد بشه اما اگر این عدد قبلا وارد شده باشه بره تو ساب off بمونه تا زمانی که دکمه on -off زده بشه و بعد زدن دکمه on -off بره تو حلقه on بعد از اون یک متغییر a تعریف کردم که 60000 میلی ثانیه رو تقسیم بر num کنه و تاخیر بین toggle led باشه و تا زمانی که دکمه on - off رو دوباره نزدم از حلقه خارج نشه
              حالا زمانی که مجدد بخوام عدد جدید وارد کنم دکمه set بزنم برنامه وارد ساب set بشه و با دکمه افزایش و کاهش عدد رو تعیین کنم و روی سون سگمنت هم عددی که دارم وارد میکنم رو ببینم بعد عدد جدید ذخیره بشه و دوباره برگردیم به ساب off و منتظر دکمه استارت بمونه
              یک نکته ای هم که هست من بی تجربه و کاراموزم اینم مد نظرتون باشه میخوام زمانم دقیق یک دقیقه باشه اما بطور مستمر ادامه پیدا کنه و متوقف نشه . مثلا اگر عدد 6 وارد کردم 10 ثانیه اول led روشن بشه و 10 ثانیه دوم خاموش بشه و همینطور ادامه پیدا کنه تا دکمه خاموش رو بزنم

              دیدگاه


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

                این سیستم از نظر سخت افزاری هم طراحی نشده ، اول باید طراحی بشه ...


                سعی میکنم تا فردا شماتیک اصلاح شده با سورس فریمور رو قرار بدم .
                رزولوشن روشن و خاموش شدن led قراره چقدر باشه ؟ یعنی حداکثر در ۱ دقیقه چند بار toggle کنه ؟
                ( از نظر نمایشگر با اعداد دسیمال حداکثرش 9999 سیکل میشه که رزولوشن ۶ میلی ثانیه میده ... اگر عدد رو هگز بخوای نشون بدی تا زیر ۱ میلی ثانیه هم میشه )
                جدیدترین ویرایش توسط Amie.s.m; ۲۱:۴۸ ۱۴۰۱/۱۱/۰۵.

                دیدگاه


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

                  نوشته اصلی توسط Amie.s.m نمایش پست ها
                  این سیستم از نظر سخت افزاری هم طراحی نشده ، اول باید طراحی بشه ...


                  سعی میکنم تا فردا شماتیک اصلاح شده با سورس فریمور رو قرار بدم .
                  رزولوشن روشن و خاموش شدن led قراره چقدر باشه ؟ یعنی حداکثر در ۱ دقیقه چند بار toggle کنه ؟
                  ( از نظر نمایشگر با اعداد دسیمال حداکثرش 9999 سیکل میشه که رزولوشن ۶ میلی ثانیه میده ... اگر عدد رو هگز بخوای نشون بدی تا زیر ۱ میلی ثانیه هم میشه )
                  ممنونم از لطفتون
                  تعدادش حداکثر عددی باشه که میشه با سون سگمنت نشون داد یعنی همون 9999

                  دیدگاه


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

                    نوشته اصلی توسط pouriyar نمایش پست ها
                    ممنونم از لطفتون
                    تعدادش حداکثر عددی باشه که میشه با سون سگمنت نشون داد یعنی همون 9999
                    دوست عزیز این کد اولیه اش
                    ( جاهایی که نیاز داری هم خالی گذاشتم خودت متغیر مد نظرت رو تعریف کن )

                    کد:
                    . 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 on
                    '
                    ' * Test configuration:
                    '     MCU:             ATMEGA8
                    '     Oscillator:      Internal Clock 02.0000 MHz
                    '     Ext. Modules:    None.
                    '     SW:              mikroBasic PRO for AVR
                    ' * NOTES:
                    '
                    ' *
                    
                    
                    dim shifter, portd_index , digit as byte
                                     g_time , number as word
                                         portd_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
                    
                    sub procedure show
                      PORTC  = 0                          ' turn off all 7seg displays
                      PORTB = portd_array[portd_index]   ' bring appropriate value to PORTB
                      PORTC = shifter                    ' turn on appropriate 7seg. display
                    
                      ' move shifter to next digit
                      shifter= shifter << 1
                      if (shifter > 32) then
                        shifter = 4
                      end if
                      ' increment portd_index
                      Inc(portd_index)
                      if (portd_index > 3) then
                        portd_index = 0                  ' turn on 1st, turn off 2nd 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 procedure refresh
                        digit = number / 1000               ' extract thousands digit
                        portd_array[3] = mask(digit)        ' and store it to PORTB array
                        digit = (number / 100) mod 10       ' extract hundreds digit
                        portd_array[2] = mask(digit)        ' and store it to PORTB array
                        digit = (number / 10) mod 10        ' extract tens digit
                        portd_array[1] = mask(digit)        ' and store it to PORTB array
                        digit = number mod 10               ' extract ones digit
                        portd_array[0] = mask(digit)        ' and store it to PORTB array
                    '    Inc(number)                         ' increment number
                        if ( number > 9999 ) then
                          number = 9999
                        end if
                        if ( number < 1 ) then
                          number = 1
                        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)
                    
                    
                    end sub
                    
                    
                    sub procedure KeyPress() iv IVT_ADDR_INT0 ics ICS_AUTO
                        dim _key , _time as byte
                    
                        GICR.6 = 0                  'Disable INT0
                        g_time = 1                  'reset general time
                        _time = 11                  '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 (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
                      digit = 0
                      portd_index = 0
                      shifter = 4
                    
                      number = 1234               ' Initial number value
                    
                      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; ۱۹:۲۰ ۱۴۰۱/۱۱/۰۷.

                    دیدگاه


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

                      نوشته اصلی توسط Amie.s.m نمایش پست ها
                      دوست عزیز این کد اولیه اش
                      ( جاهایی که نیاز داری هم خالی گذاشتم خودت متغیر مد نظرت رو تعریف کن )


                      _
                      مهندس از وقتی که گذاشتی و لطفی که کردی بسیار بسیار سپاسگزارم
                      الان یکم گیج شدم حقیقت معذرت میخوام من مبتدیم هضم کردنش برام زمان میبره اگه جایی سوال خیلی بی ربط و یا بی دقتی کردم قبلش عذر میخوام
                      سوالاتم اینه
                      1- من متوجه نشدم کجا باید متغییر تعریف کنم ؟ و اینکه number ی که دریافت میشه تو حافظه میکرو ذخیره نمیشه؟
                      2-کامپایل گرفتم تو بسکام این قسمت کد رو که پایین اوردم خطا میده اگر ممکنه فایل .bas برنامه رو برام بذاری ممنون میشم چون کپی گرفتم بهم ریخته
                      3- توی شماتیک برای پایه های 1 تا 4 سون سگمنت از دیود و مقاومت استفاده کردید این برای جلوگیری از نویز هستش؟
                      بازم از وقتی که برای راهنمایی بنده میذاری ممنونم
                      کد:
                      dim shifter, portd_index , digit as byte
                                       g_time , number as word
                                           portd_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
                      جدیدترین ویرایش توسط pouriyar; ۰۲:۵۵ ۱۴۰۱/۱۱/۰۷.

                      دیدگاه


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

                        نوشته اصلی توسط pouriyar نمایش پست ها
                        مهندس از وقتی که گذاشتی و لطفی که کردی بسیار بسیار سپاسگزارم
                        الان یکم گیج شدم حقیقت معذرت میخوام من مبتدیم هضم کردنش برام زمان میبره اگه جایی سوال خیلی بی ربط و یا بی دقتی کردم قبلش عذر میخوام
                        سوالاتم اینه
                        1- من متوجه نشدم کجا باید متغییر تعریف کنم ؟ و اینکه number ی که دریافت میشه تو حافظه میکرو ذخیره نمیشه؟
                        2-کامپایل گرفتم تو بسکام این قسمت کد رو که پایین اوردم خطا میده اگر ممکنه فایل .bas برنامه رو برام بذاری ممنون میشم چون کپی گرفتم بهم ریخته
                        3- توی شماتیک برای پایه های 1 تا 4 سون سگمنت از دیود و مقاومت استفاده کردید این برای جلوگیری از نویز هستش؟
                        بازم از وقتی که برای راهنمایی بنده میذاری ممنونم
                        کد:
                        dim shifter, portd_index , digit as byte
                                         g_time , number as word
                                             portd_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
                        You welcome

                        مشکلی نداره دوست عزیز ... همه امون یه زمانی مبتدی بودیم .
                        در مورد سوالاتتون ؛

                        ۱- کجا باید متغیر تعریف کنید ؟
                        هرجا نیاز دارید ... در برنامه بالا متغیری که داره بعنوان متغیر اصلی نمایش داده میشه و بوسیله کلیدهای پایین و بالا مقدارش عوض میشه متغیر number از نوع word با رنج ۱ تا ۹۹۹۹ هستش .

                        مقدار اولیه فعلی این متغیر ۱۲۳۴ هست در زیر برنامه اینتراپت صفر بسته به اینکه کدوم کلید ( یا ترکیب کلیدها ) فشرده بشن فعلا مقدار فوق طی هر ۱۰۰ میلی ثانیه یک واحد کم یا زیاد میشه .
                        اونجایی که میخواهید خروجی فعال بشه ساب روتین run هستش برنامه با زدن کلید ok به این روتین منتقل میشه ( یک ورد بعنوان ورودی میگیره ) که خالی گذاشتمش ...
                        شما میخوای متغیر number بعد از تغییر روی eprom ذخیره بشه دو بایت eprom برای ذخیره اش باید در نظر بگیری بسته به کامپایلر کتابخونه آماده برای دسترسی به eprom داریم که مطابق روند کتابخونه مد نظر باید بنویسید ( من کار با eprom رو با اسمبلی انجام میدم منجمله خیلی دستورات دیگه که نمیخواستم اسمبلی وارد کد فعلی بشه واسه همین به کد فعلی اضافه اش نکردم چون گیج اتون میکنه )

                        ۲ - این کد به زبان بیسیک با کامپایلر mikeobasic نوشته شده ( اول کد همه این موارد رو کامنت کردم )
                        درسته زبان بیسیک هست اما مستقیم نمی‌تونید از این کامپایلر به یه کامپایلر دیگه برید ! یعنی بغیر از زبانهای مفسری ( مثل پایتون اونم در سیستمهای interpreter کپی پیست نیست مقادیری تطبیق لازم دارن ) در سیستمهای کامپایلری باید یکمی تغییرات در ساختار کد ( معادل کامپایلر مد نظرتون ) اعمال کنید .

                        ۳ - کجای شماتیک برای سون سگمنت از دیود استفاده شده ؟

                        ۸ تا مقاومت آرایه ای ۳۳۰ اهم داریم که محدود کننده جریان led هستن و کلا قانون اتصال led به میکرو بوسیله محدود کننده جریانه ( سون سگمنت مجموعه ۷ ال ای دی برای هر رقمه ) .

                        ۴ تا کاتد مشترک ( سون سگمنت ما کاتد مشترکه ) باید بوسیله سوییچ low side مولتی پلکس بشن .
                        چون پورت میکروها محدودیت جریان حدود ۲۰ میلی آمپری دارن شما نمیتونی جریان ۷ یا ۸ تا ال ای دی سون سگمنت رو بوسیله یک پایه میکرو تامین کنی . ترانزیستورهای npn برای درایو کاتد مشترک استفاده شدن ( اینم باز روش استاندارد درایو سون سگمنت با میکرو هست )

                        طبق اینکه کدوم سون سگمنت باید چه عددی رو با توجه به محل قرار گیری اش نشون بده ترکیب رقمی معادل عدد به ۷ ال ای دی سون سگمنت مربوطه توسط پورت B میکرو با ۱ شدن بیت های معادل روی پورت قرار میگیره ( این ۴ سون سگمنت آندهاشون بهم وصله ) .
                        اینکه کدوم رقم باید روشن بشه بوسیله درایو کردن کاتد سون سگمنت مربوط به اون رقم انجام میشه ... ۱۰ میلی ثانیه این سون سگمنت روشنه ، بعد میریم رقم بعدی به همین ترتیب ۱۰ میلی ثانیه روشنه و این روند مدام داره تکرار میشه .
                        در هر ثانیه ۱۰۰ بار ترکیب روشن شدن این ۴ سون سگمنت باعث میشه بیننده متوجه عدم پیوستگی نمایش نشه .

                        چیزی برای جلوگیری از نویز نداریم ( کدوم نویز ؟ )

                        خازنهای ۱۰ نانو موازی با کلیدها برای از بین بردن گلیچ و دیبانس کلید مکانیکیه .
                        دو تا دیود روی همین کلیدها استفاده شده که بدلیل محدودیتهای سخت افزاری میکرو مورد نظرتون پایه اینتراپت صفر ( مستقیم برای کلید ok ) رو در اختیار اون دو تا کلید که اینتراپت ندارن هم قرار میده .

                        یعنی هر کدوم از کلیدها فشرده بشه ( صفر بشه ) اینتراپت صفر رو تریگر میکنه ( پول آپ داخلی میکرو خروجی کلیدها رو ۱ نگه میداره ) زیر برنامه اینتراپت صفر چک میکنه کدوم کلیدها فشرده شدن ( قبل از خوندن کلیدها هم ۱۰ میلی ثانیه دیبانس گیری میکنه که برخوردهای تصادفی با کلیدها رو بعنوان کلید فشرده شده در نظر نگیریم )

                        کماکان اگر جایی از سیستم مجهول بود بفرمایید توضیح بدم

                        دیدگاه


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

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

                          مشکلی نداره دوست عزیز ... همه امون یه زمانی مبتدی بودیم .
                          در مورد سوالاتتون ؛

                          ۱- کجا باید متغیر تعریف کنید ؟
                          هرجا نیاز دارید ... در برنامه بالا متغیری که داره بعنوان متغیر اصلی نمایش داده میشه و بوسیله کلیدهای پایین و بالا مقدارش عوض میشه متغیر number از نوع word با رنج ۱ تا ۹۹۹۹ هستش .

                          مقدار اولیه فعلی این متغیر ۱۲۳۴ هست در زیر برنامه اینتراپت صفر بسته به اینکه کدوم کلید ( یا ترکیب کلیدها ) فشرده بشن فعلا مقدار فوق طی هر ۱۰۰ میلی ثانیه یک واحد کم یا زیاد میشه .
                          اونجایی که میخواهید خروجی فعال بشه ساب روتین run هستش برنامه با زدن کلید ok به این روتین منتقل میشه ( یک ورد بعنوان ورودی میگیره ) که خالی گذاشتمش ...
                          شما میخوای متغیر number بعد از تغییر روی eprom ذخیره بشه دو بایت eprom برای ذخیره اش باید در نظر بگیری بسته به کامپایلر کتابخونه آماده برای دسترسی به eprom داریم که مطابق روند کتابخونه مد نظر باید بنویسید ( من کار با eprom رو با اسمبلی انجام میدم منجمله خیلی دستورات دیگه که نمیخواستم اسمبلی وارد کد فعلی بشه واسه همین به کد فعلی اضافه اش نکردم چون گیج اتون میکنه )

                          ۲ - این کد به زبان بیسیک با کامپایلر mikeobasic نوشته شده ( اول کد همه این موارد رو کامنت کردم )
                          درسته زبان بیسیک هست اما مستقیم نمی‌تونید از این کامپایلر به یه کامپایلر دیگه برید ! یعنی بغیر از زبانهای مفسری ( مثل پایتون اونم در سیستمهای interpreter کپی پیست نیست مقادیری تطبیق لازم دارن ) در سیستمهای کامپایلری باید یکمی تغییرات در ساختار کد ( معادل کامپایلر مد نظرتون ) اعمال کنید .

                          ۳ - کجای شماتیک برای سون سگمنت از دیود استفاده شده ؟

                          ۸ تا مقاومت آرایه ای ۳۳۰ اهم داریم که محدود کننده جریان led هستن و کلا قانون اتصال led به میکرو بوسیله محدود کننده جریانه ( سون سگمنت مجموعه ۷ ال ای دی برای هر رقمه ) .

                          ۴ تا کاتد مشترک ( سون سگمنت ما کاتد مشترکه ) باید بوسیله سوییچ low side مولتی پلکس بشن .
                          چون پورت میکروها محدودیت جریان حدود ۲۰ میلی آمپری دارن شما نمیتونی جریان ۷ یا ۸ تا ال ای دی سون سگمنت رو بوسیله یک پایه میکرو تامین کنی . ترانزیستورهای npn برای درایو کاتد مشترک استفاده شدن ( اینم باز روش استاندارد درایو سون سگمنت با میکرو هست )

                          طبق اینکه کدوم سون سگمنت باید چه عددی رو با توجه به محل قرار گیری اش نشون بده ترکیب رقمی معادل عدد به ۷ ال ای دی سون سگمنت مربوطه توسط پورت B میکرو با ۱ شدن بیت های معادل روی پورت قرار میگیره ( این ۴ سون سگمنت آندهاشون بهم وصله ) .
                          اینکه کدوم رقم باید روشن بشه بوسیله درایو کردن کاتد سون سگمنت مربوط به اون رقم انجام میشه ... ۱۰ میلی ثانیه این سون سگمنت روشنه ، بعد میریم رقم بعدی به همین ترتیب ۱۰ میلی ثانیه روشنه و این روند مدام داره تکرار میشه .
                          در هر ثانیه ۱۰۰ بار ترکیب روشن شدن این ۴ سون سگمنت باعث میشه بیننده متوجه عدم پیوستگی نمایش نشه .

                          چیزی برای جلوگیری از نویز نداریم ( کدوم نویز ؟ )

                          خازنهای ۱۰ نانو موازی با کلیدها برای از بین بردن گلیچ و دیبانس کلید مکانیکیه .
                          دو تا دیود روی همین کلیدها استفاده شده که بدلیل محدودیتهای سخت افزاری میکرو مورد نظرتون پایه اینتراپت صفر ( مستقیم برای کلید ok ) رو در اختیار اون دو تا کلید که اینتراپت ندارن هم قرار میده .

                          یعنی هر کدوم از کلیدها فشرده بشه ( صفر بشه ) اینتراپت صفر رو تریگر میکنه ( پول آپ داخلی میکرو خروجی کلیدها رو ۱ نگه میداره ) زیر برنامه اینتراپت صفر چک میکنه کدوم کلیدها فشرده شدن ( قبل از خوندن کلیدها هم ۱۰ میلی ثانیه دیبانس گیری میکنه که برخوردهای تصادفی با کلیدها رو بعنوان کلید فشرده شده در نظر نگیریم )

                          کماکان اگر جایی از سیستم مجهول بود بفرمایید توضیح بدم
                          ممنونم از توضیحاتت مهندس
                          فقط هنوز دو مسئله توی برنامه برای من حل نشده
                          اول اینکه من این کد رو توی microbasic هم نتونستم build کنم یعنی خطای not found میزنه و ونشد فایل هگز ازش بگیرم که تو شبیه ساز پروتئوس تستش کنم
                          الان این برنامه ای که شما زحمت کشیدید نوشتید کامله و نیاز به اضافه کردن چیزی نیست؟ یکم با برنامه هایی که شروع کردم یاد بگیرم فرق داره و اینکه فرآخوانی برای ساب روتین ها نشده پس چطور اجرا میشه؟
                          دوم اینکه اون کدهایی که من برای ذخیره number توی eeprom نوشتم درست نیست؟ یعنی خود میکرو خودکار ذخیره کنه و نیاز نباشه اسمبلی نوشتش

                          و در اخر اینکه من چطور میتونم مثل شما حرفه ای برنامه بنویسم یعنی بهتره از کجا شروع کنم که مسیر رو درست برم ؟
                          جدیدترین ویرایش توسط pouriyar; ۲۳:۱۹ ۱۴۰۱/۱۱/۰۹.

                          دیدگاه


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

                            نوشته اصلی توسط pouriyar نمایش پست ها
                            ممنونم از توضیحاتت مهندس
                            فقط هنوز دو مسئله توی برنامه برای من حل نشده
                            اول اینکه من این کد رو توی microbasic هم نتونستم build کنم یعنی خطای not found میزنه و ونشد فایل هگز ازش بگیرم که تو شبیه ساز پروتئوس تستش کنم
                            الان این برنامه ای که شما زحمت کشیدید نوشتید کامله و نیاز به اضافه کردن چیزی نیست؟ یکم با برنامه هایی که شروع کردم یاد بگیرم فرق داره و اینکه فرآخوانی برای ساب روتین ها نشده پس چطور اجرا میشه؟
                            دوم اینکه اون کدهایی که من برای ذخیره number توی eeprom نوشتم درست نیست؟ یعنی خود میکرو خودکار ذخیره کنه و نیاز نباشه اسمبلی نوشتش

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

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

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

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

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

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

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

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

                            اگر قراره ابزار باشه برای من خیلی ساده تره کامپایلش کنم ایمیج نهاییش رو بهتون بدم مستقیم بریزید روی میکرو

                            دیدگاه


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

                              می خوای حین کار فلش رو دست کاری کنی؟
                              بچه بیا پایین کار تو نیست
                              Eeprom رو استفاده کن. نخواستی حافظه خارجی بذار. دستکاری فلش حین کار تجربه می خواد.

                              دیدگاه

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