اطلاعیه

Collapse
No announcement yet.

یک و صرف کردن یک پایه ATMEGA8 با بیسیک در زمان مشخص بدون ایجاد وقفه در بقیه...

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

    #31
    پاسخ : یک و صرف کردن یک پایه ATMEGA8 با بیسیک در زمان &#1

    نوشته اصلی توسط hamidelectroniic
    سلام مهندس اسدی
    من ببجز برنامه شما از دستور sound برای بازر استفاده کردم
    الان مشکل اینه هر وقت دستور sound اجرا میشه تایمر زمانش بیشتر میشه
    ممنون میشم راهمایی کنید.
    راستی یک سوال دیگه برای اون کریستال ساعت باید فیوز بیت هنگام پروگرام کردن تنظیم بشه؟
    با تشکر
    درود حمید جان
    ظاهرا دستور Sound از تایمر دو استفاده میکنه ...
    بنابراین باید با یک تایمر دیگر این کار رو بکنید ...
    من این کار رو با تایمر 1 انجام دادم ...
    کار کردنش خیلی راحته ...
    خودتون هم یه نگاهی بیندازید متوجه می شوید که چیکار کردم ...
    ورودی اول تعداد پالسهاست . بازه این ورودی از 1 تا 30,000 است
    ورودی دوم هم برای مدت زمان بر حسب میکروثانیه است . بازه این ورودی بین 50 تا 60,000 است

    این هم برنامه :
    کد:
    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 50
    $swstack = 50
    $framesize = 50
    
    Config Pinc.0 = Input
    Config Portb = Output
    Config Pinb.6 = Input
    Config Pinb.7 = Input
    Config Portd.6 = Output
    Mq9 Alias Portb.0                      'Timer
    Led1 Alias Portb.1
    Led2 Alias Portb.2
    Rel1 Alias Portb.3
    Buz Alias Portd.6
    
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Enable Adc                         'adc
    Stop Adc
    
    Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.4 , Rs = Portd.5
    Config Lcd = 16 * 2
    
    Config Timer1 = Timer , Prescale = 8
    Enable Ovf1
    On Ovf1 __sound
    Stop Timer1
    
    Config Timer2 = Timer , Async = On , Prescale = 128     'Timer
    On Timer2 Timer_1s                     'Timer
    Enable Timer2                        'Timer
    Enable Interrupts                      'Timer
    
    Declare Sub _sound(byval Pulse_1_to_30000 As Word , Byval Period_50_to_60000_us As Word)
    
    
    Cursor Off
    Dim A As Word , B As Word , On_time As Word , Off_time As Word    'Timer
    A = 0
    On_time = 1                         'Timer - (Seconds)
    Off_time = 1                        'Timer - (Seconds)
    Off_time = On_time + Off_time                'Timer - (On_time + Off_time) nabayad bozorgtar az 65535 shavad
    
    Dim W(10) As Word , I As Byte , Avrage As Word
    Dim K As Byte,
    Dim K1 As Byte
    Dim Mq9_1 As Word , Mq9_90 As Word , Mq9_60 As Word
    Dim Counter_pulses As Word , Pulses As Word , Period As Word
    
    Reset Rel1
    Home
    Waitms 900
    Cls
    Locate 1 , 2
    Lcd "By"
    Locate 2 , 2
    Lcd "Hamidelectronic"
    Wait 3
    Home
    Cls
    Reset Mq9
    Locate 1 , 4
    Lcd "Please Wait"
    Locate 2 , 4
    Lcd "Senssor Set"
    For K = 0 To 20 Step 1
      Toggle Led1
      Waitms 100
      Toggle Led2
    Next K
    Set Led1
    Reset Led2
    
    Setup2:
    Do
      For I = 1 To 10
       Start Adc
       W(i) = Getadc(0)
       Stop Adc
       Avrage = Avrage + W(i)
       Waitms 30
      Next I
    
      Avrage = Avrage / 10
      Cls
      Locate 1 , 5
      Lcd "CO2="
      Locate 1 , 9
      Lcd Avrage
      If Avrage > 350 Then
       Locate 2 , 4
       Lcd "Danger Gas"
       Call _sound(100 , 50 )
       Call _sound(100 , 100)
       Call _sound(100 , 150)
       Call _sound(100 , 200)
       Call _sound(100 , 250)
       Call _sound(100 , 250)
       Call _sound(100 , 250)
       Call _sound(100 , 300)
       Call _sound(100 , 350)
       Reset Led1
       Toggle Led2
       Set Rel1
       Goto Setup2
      Else
       Reset Led2
       Set Led1
       Locate 2 , 5
       Lcd "Good Gas"
       Reset Rel1
      End If
    Loop
    
    End
    Timer_1s:
      Incr A
      If A = On_time Then Reset Mq9
      If A = Off_time Then
       Set Mq9
       A = 0
      End If
    Return
    
    __sound:
      Toggle Buz
      Tcnt1 = Period
      Incr Counter_pulses
      If Pulses = Counter_pulses Then
       Reset Buz
       Stop Timer1
      End If
    Return
    
    Sub _sound(byval Pulse_1_to_30000 As Word , Byval Period_50_to_60000_us As Word)
      Stop Timer1
      Period = Period_50_to_60000_us / 2
      Period = 65535 - Period
      Pulses = Pulse_1_to_30000 + Pulse_1_to_30000
      Counter_pulses = 0
      Start Timer1
      Do : Loop Until Tccr1b = 0
    End Sub

    پاسخ 2 :
    خیر . نیازی نیست ... چون دارید کریستال ساعت کار میکنید و نمی خواهید کلاک سیستم را تامین کنید ...
    فقط یه چیزی
    CKSEL3-2-1-0
    0-1-0-0
    تنظیم کنید تا فرکانس میکرو روی 8 مگا هرتز تنظیم شود ...

    سوالی بود در خدمتم
    موفق باشید
    =====================
    یه چیزی یادم اومد
    پایه های B.6 و B.7 رو بهتر است که ورودی در نظر بگیریم .
    چون باید کریستال بهش وصل بشه !
    [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
    معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
    معرفی نرم افزار Codewizard PWM
    با من بیشتر آشنا شوید

    دیدگاه


      #32
      پاسخ : یک و صرف کردن یک پایه ATMEGA8 با بیسیک در زمان &#1

      سلام استاد
      مشکل حل نشد و همونجوری هستش :(
      شاید بخاطر این باشه برنامه تا دستورات SOUND اجرا نکنه نمیره سراخ خطهای بعدی
      اینو واسه این به نظرم رسید چون زمان 1 ثانیه در برنامه قبلی 3 ثانیه تبدیل میشد اما در این یکی حدود 5 تا 6 ثانیه شده
      حتما چون دستورات زیاد شده زمان بیشتر شده،
      یک چیز که خیلی عجیبه اینه که من به خروجی تایمر یک COUNTER TIMER وصل میکنم و همون 1 ثانیه نشون میده که تو برنامه نوشتیم اما خودم که با گوشی یا با شمردن 1001 به بعد میشمرم بیشتره! برنامه قبلی هم همینطوره
      خیلی عجیبه oo:
      میگم نظرتون چیه دستورات SOUND شبیه سازی کنم؟ یعنی از دستور WAITMS استفاده کنم اینجوری :
      کد:
      Set Buz
      Waitms 50
      Reset Buz
      Waitms 50
      Set Buz
      Waitms 100
      Reset Buz
      Waitms 100
      Set Buz
      Waitms 150
      Reset Buz
      Waitms 150
      Set Buz
      Waitms 200
      Reset Buz
      Waitms 200
      Set Buz
      Waitms 250
      Reset Buz
      Waitms 250
      Set Buz
      Waitms 250
      Reset Buz
      Waitms 250
      Set Buz
      Waitms 250
      Reset Buz
      Waitms 250
      Set Buz
      Waitms 300
      Reset Buz
      Waitms 300
      Set Buz
      Waitms 350
      Reset Buz
      Waitms 350
      Set Buz
      ولی این هم مشکل داره، مشکلش اینه که تو کار LCD و محاسبه ADC وقفه ایجاد میکنه چون باید تو حلقه LOOP بنویسم
      با این وجود باید با دستور TOGGLE بنویسمش که اونم یه کم وقفه ایجاد میکنه اما از اینی که با WAITMS نوشتم بهتره
      نظر شما چی هست؟

      دیدگاه


        #33
        پاسخ : پاسخ : یک و صرف کردن یک پایه ATMEGA8 با بیسیک در زمان 

        نوشته اصلی توسط hamidelectroniic
        سلام استاد
        مشکل حل نشد و همونجوری هستش :(
        شاید بخاطر این باشه برنامه تا دستورات SOUND اجرا نکنه نمیره سراخ خطهای بعدی
        اینو واسه این به نظرم رسید چون زمان 1 ثانیه در برنامه قبلی 3 ثانیه تبدیل میشد اما در این یکی حدود 5 تا 6 ثانیه شده
        حتما چون دستورات زیاد شده زمان بیشتر شده،
        یک چیز که خیلی عجیبه اینه که من به خروجی تایمر یک COUNTER TIMER وصل میکنم و همون 1 ثانیه نشون میده که تو برنامه نوشتیم اما خودم که با گوشی یا با شمردن 1001 به بعد میشمرم بیشتره! برنامه قبلی هم همینطوره
        خیلی عجیبه oo:
        میگم نظرتون چیه دستورات SOUND شبیه سازی کنم؟ یعنی از دستور WAITMS استفاده کنم اینجوری :
        کد:
        Set Buz
        Waitms 50
        Reset Buz
        Waitms 50
        Set Buz
        Waitms 100
        Reset Buz
        Waitms 100
        Set Buz
        Waitms 150
        Reset Buz
        Waitms 150
        Set Buz
        Waitms 200
        Reset Buz
        Waitms 200
        Set Buz
        Waitms 250
        Reset Buz
        Waitms 250
        Set Buz
        Waitms 250
        Reset Buz
        Waitms 250
        Set Buz
        Waitms 250
        Reset Buz
        Waitms 250
        Set Buz
        Waitms 300
        Reset Buz
        Waitms 300
        Set Buz
        Waitms 350
        Reset Buz
        Waitms 350
        Set Buz
        ولی این هم مشکل داره، مشکلش اینه که تو کار LCD و محاسبه ADC وقفه ایجاد میکنه چون باید تو حلقه LOOP بنویسم
        با این وجود باید با دستور TOGGLE بنویسمش که اونم یه کم وقفه ایجاد میکنه اما از اینی که با WAITMS نوشتم بهتره
        نظر شما چی هست؟
        سلام عزیزم
        همین الان برنامه رو با پروتئوس امتحانش کردم دیدم درست کار میکنه ...
        بدون هیچ مشکلی برنامه کار میکنه ...
        میشه مدارتون رو با پروتئوس بکشید و بگذارید اینجا؟؟
        کریستال ساعت رو چطوری نصبش کردید ؟؟ شمارش چنده؟؟
        [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
        معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
        معرفی نرم افزار Codewizard PWM
        با من بیشتر آشنا شوید

        دیدگاه


          #34
          پاسخ : یک و صرف کردن یک پایه ATMEGA8 با بیسیک در زمان مشخص بدون ایجاد وقفه در بقیه...

          موقعی این مشکل داره که از پورتی که مربوط به بازر هست استفاده و به بازر وصل بشه، اینم فایل پروتئوس :
          کد:
          http://upir.ir/aban93/Timer.rar

          دیدگاه


            #35
            پاسخ : یک و صرف کردن یک پایه ATMEGA8 با بیسیک در زمان مشخص بدون ایجاد وقفه در بقیه...

            نوشته اصلی توسط hamidelectroniic
            موقعی این مشکل داره که از پورتی که مربوط به بازر هست استفاده و به بازر وصل بشه، اینم فایل پروتئوس :
            کد:
            http://upir.ir/aban93/Timer.rar
            شما منظورتون اینه که برای بازر هست؟؟
            بازر رو مستقیما به میکروکنترلر متصلش کنید !! مشکلی پیش نمیاد ...
            بازرتون اینه ؟
            [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
            معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
            معرفی نرم افزار Codewizard PWM
            با من بیشتر آشنا شوید

            دیدگاه


              #36
              پاسخ : یک و صرف کردن یک پایه ATMEGA8 با بیسیک در زمان &#1

              نوشته اصلی توسط سامان اسدی
              شما منظورتون اینه که برای بازر هست؟؟
              بازر رو مستقیما به میکروکنترلر متصلش کنید !! مشکلی پیش نمیاد ...
              بازرتون اینه ؟
              بله همینه
              با ترانزیستور bc547 سویچش کردم
              بدون ترانزیستور هم در تایمر وقفه ایجاد میکنه

              دیدگاه


                #37
                پاسخ : پاسخ : یک و صرف کردن یک پایه ATMEGA8 با بیسیک در زمان 

                نوشته اصلی توسط hamidelectroniic
                بله همینه
                با ترانزیستور bc547 سویچش کردم
                بدون ترانزیستور هم در تایمر وقفه ایجاد میکنه
                بدون ترانزیستور ببند ... مشکلی نداره ... من خودم بدون ترانزیستور بستم مشکلی هم نداشته ...
                در عمل امتحان کن ... توی پروتئوس به دلیل اینکه پردازش کم میاره اینجوری میشه ... پس حتما حتما در عمل امتحان کن ...
                برنامه شما مشکلاتی هم داشت و اون رو اصلاح کردم
                این هم کد :
                کد:
                $regfile = "m8def.dat"
                $crystal = 8000000
                $hwstack = 50
                $swstack = 50
                $framesize = 50
                
                Config Pinc.0 = Input
                Config Portb = Output
                Config Pinb.6 = Input
                Config Pinb.7 = Input
                Config Portd.6 = Output
                Mq9 Alias Portb.0                      'Timer
                Led1 Alias Portb.1
                Led2 Alias Portb.2
                Rel1 Alias Portb.3
                Buz Alias Portd.6
                
                
                Config Adc = Single , Prescaler = Auto , Reference = Internal
                Enable Adc                         'adc
                Stop Adc
                
                Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.4 , Rs = Portd.5
                Config Lcd = 16 * 2
                
                Config Timer1 = Timer , Prescale = 8
                Enable Ovf1
                On Ovf1 __sound
                Stop Timer1
                
                Config Timer2 = Timer , Async = On , Prescale = 128     'Timer
                On Timer2 Timer_1s                     'Timer
                Enable Timer2                        'Timer
                Enable Interrupts                      'Timer
                
                Declare Sub _sound(byval Pulse_1_to_30000 As Word , Byval Period_50_to_60000_us As Word)
                
                
                Cursor Off
                Dim A As Word , B As Word , On_time As Word , Off_time As Word    'Timer
                A = 0
                On_time = 1                         'Timer - (Seconds)
                Off_time = 1                        'Timer - (Seconds)
                Off_time = On_time + Off_time                'Timer - (On_time + Off_time) nabayad bozorgtar az 65535 shavad
                
                Dim W As Word , Avrage As Word , I As Byte
                Dim K As Byte , K1 As Byte
                Dim Mq9_1 As Word , Mq9_90 As Word , Mq9_60 As Word
                Dim Counter_pulses As Word , Pulses As Word , Period As Word
                
                Reset Rel1
                Home
                Waitms 900
                Cls
                Locate 1 , 2
                Lcd "By"
                Locate 2 , 2
                Lcd "Hamidelectronic"
                Wait 3
                Home
                Cls
                Reset Mq9
                Locate 1 , 4
                Lcd "Please Wait"
                Locate 2 , 4
                Lcd "Senssor Set"
                For K = 0 To 20 Step 1
                  Toggle Led1
                  Waitms 100
                  Toggle Led2
                Next K
                Set Led1
                Reset Led2
                
                Setup2:
                Do
                  Avrage = 0
                  For I = 1 To 10
                   Start Adc
                   W = Getadc(0)
                   Stop Adc
                   Avrage = Avrage + W
                   Waitms 30
                  Next I
                  Avrage = Avrage / 10
                  Cls
                  Locate 1 , 5
                  Lcd "CO2="
                  Locate 1 , 9
                  Lcd Avrage
                  If Avrage > 350 Then
                   Locate 2 , 4
                   Lcd "Danger Gas"
                   Call _sound(100 , 50 )
                   Call _sound(100 , 100)
                   Call _sound(100 , 150)
                   Call _sound(100 , 200)
                   Call _sound(100 , 250)
                   Call _sound(100 , 250)
                   Call _sound(100 , 250)
                   Call _sound(100 , 300)
                   Call _sound(100 , 350)
                   Reset Led1
                   Toggle Led2
                   Set Rel1
                   Goto Setup2
                  Else
                   Reset Led2
                   Set Led1
                   Locate 2 , 5
                   Lcd "Good Gas"
                   Reset Rel1
                  End If
                Loop
                
                End
                Timer_1s:
                  Incr A
                  If A = On_time Then Reset Mq9
                  If A = Off_time Then
                   Set Mq9
                   A = 0
                  End If
                Return
                
                __sound:
                  Toggle Buz
                  Tcnt1 = Period
                  Incr Counter_pulses
                  If Pulses = Counter_pulses Then
                   Reset Buz
                   Stop Timer1
                  End If
                Return
                
                Sub _sound(byval Pulse_1_to_30000 As Word , Byval Period_50_to_60000_us As Word)
                  Stop Timer1
                  Period = Period_50_to_60000_us / 2
                  Period = 65535 - Period
                  Pulses = Pulse_1_to_30000 + Pulse_1_to_30000
                  Counter_pulses = 0
                  Start Timer1
                  Do : Loop Until Tccr1b = 0
                End Sub
                برای محافظت از ورودی ADC که بیشتر از 2.56 ولت نشود یک مقاومت 27 کیلو و یک دیود زنر 2.7 ولت گذاشتم ...
                مدارتون هم با پروتئوس را اصلاح کردم ...
                http://s5.picofile.com/file/8158234718/Timer_2.zip.html

                بازر رو پاکش کردم ... اون رو خودتون زحمت کشیدنش رو بکشید ...

                موفق باشید
                [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                معرفی نرم افزار Codewizard PWM
                با من بیشتر آشنا شوید

                دیدگاه

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