اطلاعیه

Collapse
No announcement yet.

ATTINY13 کم حافظه

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

    ATTINY13 کم حافظه

    سلام .
    من یه مدار ساختم که دو کاره هست :
    1. چشمک زن دو ال ای دی با تعیین مقدار تاخیر بین چشمک
    2. آژیر با فرکانس و شدت صدای متغیر.
    اما مشکل اینه که وقتی میام برنامه رو کامپایل کنم میگه : out of Sram
    این برنامه:
    http://xbluesky.persiangig.com/document/attiny13a.bas

    این مدار :


    J1 برای تامین تغذیه مدار
    RV1 برای کم و زیاد کردن شدت صدا
    RV2 برای تغییر فرکانس صدا از طریق ADC
    کلید متصل به PORTB.5 برای جابه جایی بین وضعیت چشمک زن ال ای دی و آژِیر خطر

    لطفا اگه لازم بود در مدار هم تغییری انجام شود ایراد را بیان کنید.
    چجوری میشه یه کاری کرد که برنامه تو حافظه اش جا شود؟
    [glow=green,2,300][b]بشر ممکن الخطاست
    درخت هرچه پربار تر سر به زیر تر[/glow]

    #2
    پاسخ : ATTINY13 کم حافظه

    سلام، چون Tiny13 فقط 64 بایت SRAM داره و کامپایلر بسکام (بیسکام) به صورت پیشفرض توی قسمت Options میاد 88 بایت رو به فریم و پشته نرم افزاری و سخت افزاری اختصاص میده باید تنظیمات این قسمت رو روی حداقل بزاری، بهترین کار اینه که این تنظیمات رو مجدداً در قسمت کد برنامه بازنویسی کنی، یعنی سه تا خط زیر رو به ابتدای برنامه بعد از regfile و crystal اضافه کن و دستور sim رو هم مارک کن یا کلاً پاکش کن. ضمناً بهتره دستور Declare Sub Change رو هم پاک کنی چون بحث سابروتین از لیبل جداست و موقع تعریف لیبل هیچ نیازی به تعریف سابروتین در ابتدای برنامه نیست. مطلب خاص دیگه ای به ذهنم نمیرسه، حالا با همین تغییرات مدار رو ببند اگه کار نکرد بگو تا بررسی کنیم، شاید مقاومت پول دان برای PORTB.0 لازم باشه، چون من از دستور debounce تا حالا استفاده نکردم و مستقیماً وضعیت پایه رو با if بررسی می کنم. کد های زیر رو اضافه کن:

    کد:
    $regfile = "attiny13.dat"
    $crystal = 9600000
    
    $hwstack=16
    $swstack=16
    $framesize=16
    
    '$sim

    دیدگاه


      #3
      پاسخ : ATTINY13 کم حافظه

      من برنامه رو کلا تغییر دادم و اینطوری کردم :
      کد:
      $regfile = "attiny13.dat"
      $crystal = 9600000
      '-------------------------------------------------------------------------------
      ' an LED is connected to PORTB.3
      ' another LED is connected to PORTB.4
      ' a speaker ( 8 ohm & 0.5 W ) is connected to PORTB.1
      ' a 10K volome is connected to PORTB.2
      ' a push button is connected to PORTB.0
      ' PORTB.5 is used as RESET
      '-------------------------------------------------------------------------------
      Config Adc = Single , Prescaler = Auto , Reference = Avcc
      Start Adc
      '-------------------------------------------------------------------------------
      Dim S As Byte
      Dim D As Word
      '-------------------------------------------------------------------------------
      Config Portb.3 = Output
      Config Portb.4 = Output
      Config Portb.1 = Output
      Config Portb.2 = Input
      Config Portb.0 = Input
      '-------------------------------------------------------------------------------
      Do
      '-------------------------------------------------------------------------------
      If Portb.0 = 1 Then
      
        If S = 0 Then
         S = 1
        Elseif S = 1 Then
         S = 0
        End If
      
      End If
      '-------------------------------------------------------------------------------
      If S = 0 Then
      
        D = Getadc(1)
        D = D / 2
      
        Portb.3 = 1
        Portb.4 = 0
        Waitms D
        Portb.3 = 0
        Portb.4 = 1
        Waitms D
      '-------------------------------------------------------------------------------
      Elseif S = 1 Then
      
        D = Getadc(1)
        D = D * 46
        D = D / 2
      
        Portb.1 = 0
        Waitus D
        Portb.1 = 1
        Waitus D
      
      End If
      '-------------------------------------------------------------------------------
      Loop
      End
      ولی بسکام ایراد out of Sram space رو گرفت اما برنامه رو کامپایل کرد .
      من هم فایل هگز رو ریختم تو میکرو و تونست که پروگرم کنه.
      حالا یه مشکل دیگه دارم .
      اینکه تو برنامه ای که دادم با زدن کلید متصل به PORTB.0 وضعیت چشمک زن ال ای دی به آژیر خطر عوض نمیشه در حالی که باید عوض شه.
      و فقط بخش چشمک زن ال ای دی کار می کنه.
      فکر کنم همون مقاومت رو باید وصل کنم.

      درباره دستور debounce هم باید بگم که این دستور بر خلاف بررسی با IF در یک لحظه در برنامه ، درست مثل وقفه تایمر عمل میکنه یعنی همیشه در حال چک کردن پایه هست که هر وقت وضعیتش اونی شد که ما بهش گفتیم 25 میلی ثانیه صبر می کنه و دوباره میاد چک می کنه اگه باز هم همونطوری بود میپره به اون LABLE یا SUB که ما بهش گفتیم.

      تو بعضی برنامه ها این دستور خیلی به درد می خوره.
      من خودم یه بار یه برنامه داشتم که باید 1 ثانه کلید رو نگه می داشتی تا بخونه و وارد IF بشه.
      [glow=green,2,300][b]بشر ممکن الخطاست
      درخت هرچه پربار تر سر به زیر تر[/glow]

      دیدگاه


        #4
        پاسخ : ATTINY13 کم حافظه

        سلام
        1- دستوراتی که تو پست قبل گفتم به ابتدای برنامه اضافه نشده :question:
        2- موقع تعریف ورودی/ خروجی نباید رجیستر port تعریف بشه بلکه باید رجیستر pin رو config کنید مثلاً config pinb.0 = input
        3- مقاومت پول دان روی پایه B.0 به زمین قرار داده بشه (پایه B.0 میکرو باید با یه مقاومت 4.7 کیلو به زمین GND وصل بشه)
        4- موقع چک کردن پایه نباید port رو چک کنید باید رجیستر pin بررسی بشه، یعنی جای portb.0 در دستور If باید بنویسید pinb.0
        5- ضمناً اون همه زحمتی هم که برای 0 و 1 کردن متغیر S کشیدید با یه دستور toggle انجام میشه؛ البته باید متغیر S از نوع Bit تعریف بشه :smile:
        6- elseif و شرط جلوش هم نیازی نیست چون فقط دو حالت 0 و 1 داریم و else خالی بدون شرط کفایت میکنه

        اصلاً بزار یه بار دیگه کد رو اصلاح کنیم: (اونجاهایی که ستاره میزارم اصلاح شده) :read:

        کد:
        $regfile = "attiny13.dat"
        $crystal = 9600000
        
        $hwstack=16 '***********
        $swstack=16 '***********
        $framesize=16 '***********
        
        Config Adc = Single , Prescaler = Auto , Reference = Avcc
        Start Adc
        '-------------------------------------------------------------------------------
        Dim S As Bit '***********
        Dim D As Word
        '-------------------------------------------------------------------------------
        Config Pinb.3 = Output '***********
        Config Pinb.4 = Output '***********
        Config Pinb.1 = Output '***********
        Config Pinb.2 = Input '***********
        Config Pinb.0 = Input '***********
        '-------------------------------------------------------------------------------
        Do
        '-------------------------------------------------------------------------------
        If Pinb.0 = 1 Then '***********
          toggle S
          waitms 500
        End If
        '-------------------------------------------------------------------------------
        If S = 0 Then
        
          D = Getadc(1)
          D = D / 2
        
          Portb.3 = 1
          Portb.4 = 0
          Waitms D
          Portb.3 = 0
          Portb.4 = 1
          Waitms D
        '-------------------------------------------------------------------------------
        Else '***********
        
          D = Getadc(1)
          D = D * 46
          D = D / 2
        
          Portb.1 = 0
          Waitus D
          Portb.1 = 1
          Waitus D
        
        End If
        '-------------------------------------------------------------------------------
        Loop
        End

        دیدگاه


          #5
          پاسخ : ATTINY13 کم حافظه

          من اون سه خط رو اضافه کردم .کدی که پست شد اشتباهی بود .
          الان داره خوب کار می کنه.
          خیلی ممنون.
          [glow=green,2,300][b]بشر ممکن الخطاست
          درخت هرچه پربار تر سر به زیر تر[/glow]

          دیدگاه


            #6
            پاسخ : ATTINY13 کم حافظه

            خواهش میکنم.
            خوشحالم که درست شد :wow: :applause:

            دیدگاه

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