اطلاعیه

Collapse
No announcement yet.

وقفه در وقفه

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

    وقفه در وقفه

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

    این سورس کد بسکام مگا 32 یک دزگیر است

    اون قسمت تماس گرفتنش در حقیقت وقفه در وقفه شده اول enable enterapt بعد هم وقتی وقفه میاد ،یکی از دوستان گفته بود با dtmf تداخل ایجاد میکنه و هیچ شماره ایی نمیگیره

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

    $regfile = "M32def.dat" ' use the Mega8

    $crystal = 4000000

    $baud = 9600


    Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
    Config Lcd = 16 * 2


    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Pinb.2 = Output

    Dim In_put As Byte
    Dim Mobile As String * 12
    Mobile = "09161234567"

    Enable Interrupts

    Enable Urxc

    Enable Int0

    Enable Int1





    On Int0 Zone_1_alarm

    On Int1 Zone_2_alarm

    On Urxc Stop_alarm




    Set Portb.2
    Cursor Off
    Cls
    Lcd "remot is active"


    Do


    Loop



    Zone_1_alarm:

    Cls

    Lcd "zone_1 is on"

    Home

    Set Portb.1

    Goto Telephone
    Return



    Zone_2_alarm:

    Cls

    Lcd "zone_2 is on"

    Home

    Set Portb.1


    Goto Telephone

    Return




    Stop_alarm:

    In_put = Waitkey()

    If In_put = 0 Then

    Goto L

    Elseif In_put = 99 Then

    Cls

    Lcd "alarm off"


    Reset Portb.2
    Reset Portb.1
    Home

    Elseif In_put = 100 Then

    Cls

    Lcd "alarm on"

    Reset Portb.1
    Set Portb.2


    Home

    End If

    L:

    Return

    Telephone:

    Wait 2
    Cls
    Lcd "daill number"
    Lowerline
    Lcd "09161234567"
    Set Portb.0
    Wait 2
    Dtmfout Mobile , 50
    Wait 10
    Cls
    Lcd "call done"
    Reset Portb.0
    Wait 10
    Return

    #2
    پاسخ : وقفه در وقفه

    سلام
    دوست عزیز برای کار با dtmout میکرو Avr به لینک های زیر مراجعه کنید در لینک های زیر هم من و هم دوستان توضیح دادن.

    http://www.eca.ir/forum2/index.php?action=thankyoupostlist;topic=13445.0;ms g=60719
    http://www.eca.ir/forum2/index.php?topic=27921.msg134178
    http://www.eca.ir/forum2/index.php?topic=5604.0;prev_next=prev

    یک سرچی در سایت بزنی اطلاعات بیشتری پیدا میکنی.

    موفق باشی

    دیدگاه


      #3
      پاسخ : وقفه در وقفه

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

      به جای اون do loop که گزاشتی یکی از وقفه ها رو بزار یعنی یکی از وقفه ها رو وردار و دایم تو do loop این پین رو چک کن و به جای اون goto هم یه متغیر از بیت بزار و وقتی که میخوای goto کونی اول این رو یک کن بعد که به main اصلی رسیدی به اون متغیر نگاه کن اگه عوض شده برو به goto برس(من جات بودم call میزاشتم)
      علم چندانکه بیشتر خوانی چون عمل در تو نیست نادانی

      دیدگاه


        #4
        پاسخ : وقفه در وقفه

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

        به جای اون do loop که گزاشتی یکی از وقفه ها رو بزار یعنی یکی از وقفه ها رو وردار و دایم تو do loop این پین رو چک کن و به جای اون goto هم یه متغیر از بیت بزار و وقتی که میخوای goto کونی اول این رو یک کن بعد که به main اصلی رسیدی به اون متغیر نگاه کن اگه عوض شده برو به goto برس(من جات بودم call میزاشتم)
        سلام دست درد نکنه
        باشه از call استفاده می کنم ولی برای اصلاح وقفه در وقفه نگفتی چه کاری بکنم(یه دستی به کدش بکش دعات میکنم)

        دیدگاه


          #5
          پاسخ : وقفه در وقفه

          نوشته اصلی توسط علی حیاتی
          سلام
          دوست عزیز برای کار با dtmout میکرو Avr به لینک های زیر مراجعه کنید در لینک های زیر هم من و هم دوستان توضیح دادن.

          http://www.eca.ir/forum2/index.php?action=thankyoupostlist;topic=13445.0;ms g=60719
          http://www.eca.ir/forum2/index.php?topic=27921.msg134178
          http://www.eca.ir/forum2/index.php?topic=5604.0;prev_next=prev

          یک سرچی در سایت بزنی اطلاعات بیشتری پیدا میکنی.

          موفق باشی
          من با dtmf کار کردم ولی نمیدونم چه جوری در کنار interapt باش کار کنم
          فکنم قضیه از این قرار باشه وقتی یه وقفه ای میاد ایجاد میشه یه بیتی (i) صفر میشه حالا دستور dtmf موقعی کار میکنه که این بیت 1 باشه :nerd:

          راه حلتون چیه

          با تشکر

          دیدگاه


            #6
            پاسخ : وقفه در وقفه

            کد:
            $regfile = "M32def.dat"                   ' use the Mega8
            
            $crystal = 4000000
            
            $baud = 9600
            
            
            Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
            Config Lcd = 16 * 2
            
            
            Config Pinb.0 = Output
            Config Pinb.1 = Output
            Config Pinb.2 = Output
            
            
            
            Declare Sub Telephone
            
            
            Dim In_put As Byte
            Dim Mobile As String * 12
            Mobile = "09163191859"
            Dim Tell As Bit
            Tell = 0
            
            Enable Interrupts
            
            Enable Urxc
            
            Enable Int0
            
            Enable Int1
            
            
            
            
            
            On Int0 Zone_1_alarm
            
            On Int1 Zone_2_alarm
            
            On Urxc Stop_alarm
            
            
            
            
            Set Portb.2
            Cursor Off
            Cls
            Lcd "remot is active"
            
            
            Do
            If Tell = 1 Then Call Telephone
            
            Loop
            
            
            
            Zone_1_alarm:
            
             Cls
            
              Lcd "zone_1 is on"
            
              Home
            
              Set Portb.1
              Tell = 1
             ' Goto Telephone
            Return
            
            
            
            Zone_2_alarm:
            
             Cls
            
              Lcd "zone_2 is on"
            
              Home
            
              Set Portb.1
            
              Tell = 1
             ' Goto Telephone
            
            Return
            
            
            
            
            Stop_alarm:
            
              In_put = Waitkey()
            
              If In_put = 0 Then
            
               'Goto L
            
              Elseif In_put = 99 Then
            
               Cls
            
               Lcd "alarm off"
            
            
               Reset Portb.2
               Reset Portb.1
               Home
            
              Elseif In_put = 100 Then
            
               Cls
            
               Lcd "alarm on"
            
               Reset Portb.1
               Set Portb.2
            
            
               Home
            
              End If
            
              'L:
            
            Return
            
            
            
            
            
            Sub Telephone
            Tell = 0
            
            Wait 2
            Cls
            Lcd "daill number"
            Lowerline
            Lcd "09161234567"
            Set Portb.0
            Wait 2
            Dtmfout Mobile , 50
            Wait 10
            Cls
            Lcd "call done"
            Reset Portb.0
            Wait 10
            End Sub
            lمکن کارت رو درست نمی دونم ولی حواست باشه میکرو منتظر می مونه تو خط waitkey

            تست کن ببین مشکلت حل شد یا نه
            چیزایی رو که حذف کردم مثل goto l , و خود l نترس درسته :agree:
            علم چندانکه بیشتر خوانی چون عمل در تو نیست نادانی

            دیدگاه


              #7
              پاسخ : وقفه در وقفه

              نوشته اصلی توسط blueray-ir

              من با dtmf کار کردم ولی نمیدونم چه جوری در کنار interapt باش کار کنم
              فکنم قضیه از این قرار باشه وقتی یه وقفه ای میاد ایجاد میشه یه بیتی (i) صفر میشه حالا دستور dtmf موقعی کار میکنه که این بیت 1 باشه :nerd:

              راه حلتون چیه

              با تشکر
              سلام
              دوست عزیز من دقیقا منظورتو متوجه نشدم ولی دستور DTMFOUT هیچ ربطی به وقفه نداره.شما با دستور Enable Interrupts وقفه ها رو فعال میکنید چون از خروجی تایمر یک میگیرید.

              دیدگاه


                #8
                پاسخ : وقفه در وقفه

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

                من تست کردم خروجی dtmf پورت 19 اصلا کار نمی کند.

                http://blueray.persiangig.com/other/systemnew.zip

                اینم لینک فایل پروتوس برای تست که درست کردم با کد بسکامی که شما زحمتو کشیدید

                دیدگاه


                  #9
                  پاسخ : وقفه در وقفه

                  نوشته اصلی توسط علی حیاتی

                  سلام
                  دوست عزیز من دقیقا منظورتو متوجه نشدم ولی دستور DTMFOUT هیچ ربطی به وقفه نداره.شما با دستور Enable Interrupts وقفه ها رو فعال میکنید چون از خروجی تایمر یک میگیرید.
                  منظورم اینه اگر یه وقفه ای بیاد ایا بعد از آن میشه از دستور dtmfout استفاده کرد
                  این تحلیل درسته یا غط؟
                  جناب omega_adiban ممکنه dtmfout که کار نمیکنه به خاطر همین مشکل بالا باشه؟

                  دیدگاه


                    #10
                    پاسخ : وقفه در وقفه


                    The DTMFOUT statement is based on an Atmel application note (314).



                    It uses TIMER1 to generate the dual tones. As a consequence, timer1 can not be used in interrupt mode by your application. You may use it for other tasks.



                    Since the TIMER1 is used in interrupt mode you must enable global interrupts with the statement ENABLE INTERRUPTS. The compiler could do this automatic but when you use other interrupts as well it makes more sense that you enable them at the point where you want them to be enabled.



                    The working range is from 4 MHz to 10 MHz system clock(xtal).



                    The DTMF output is available on the TIMER1 OCA1 pin. For a 2313 this is PORTB.3.





                    Take precautions when connecting the output to your telephone line.



                    Ring voltage can be dangerous!
                    طبق حرف خود بسکام شما نمی تونین از تایمر1 استفاده کنید تو برنامه ای که از دستور dtmfout کار میکنه
                    پس فقط کافیه تایمر1 رو به حال خودش بزارین و هر کاری که دوست دارین انجام بدین و یه نکته دیگه اینکه حتما باید کریستالت خارجی باشه و مقدارش بین 4 تا 12 مگاهرتز باشه
                    علم چندانکه بیشتر خوانی چون عمل در تو نیست نادانی

                    دیدگاه


                      #11
                      پاسخ : وقفه در وقفه

                      نوشته اصلی توسط omega_adiban

                      The DTMFOUT statement is based on an Atmel application note (314).



                      It uses TIMER1 to generate the dual tones. As a consequence, timer1 can not be used in interrupt mode by your application. You may use it for other tasks.



                      Since the TIMER1 is used in interrupt mode you must enable global interrupts with the statement ENABLE INTERRUPTS. The compiler could do this automatic but when you use other interrupts as well it makes more sense that you enable them at the point where you want them to be enabled.



                      The working range is from 4 MHz to 10 MHz system clock(xtal).



                      The DTMF output is available on the TIMER1 OCA1 pin. For a 2313 this is PORTB.3.





                      Take precautions when connecting the output to your telephone line.



                      Ring voltage can be dangerous!
                      طبق حرف خود بسکام شما نمی تونین از تایمر1 استفاده کنید تو برنامه ای که از دستور dtmfout کار میکنه
                      پس فقط کافیه تایمر1 رو به حال خودش بزارین و هر کاری که دوست دارین انجام بدین و یه نکته دیگه اینکه حتما باید کریستالت خارجی باشه و مقدارش بین 4 تا 12 مگاهرتز باشه
                      اصلاح میکنم
                      از int 1 هم استفاده نکردم بازم نشد!
                      خروجی نمیده

                      تایمر 1 مگر نه همون int 1 است؟

                      با تشکر

                      دیدگاه


                        #12
                        پاسخ : وقفه در وقفه

                        از int 1 استفاده نکردم dtmfout کار نمیده که نمیده

                        اینم برنامه بدون int1

                        $regfile = "M32def.dat" ' use the Mega8

                        $crystal = 4000000

                        $baud = 9600


                        Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
                        Config Lcd = 16 * 2


                        Config Pinb.0 = Output
                        Config Pinb.1 = Output
                        Config Pinb.2 = Output



                        Declare Sub Telephone


                        Dim In_put As Byte
                        Dim Mobile As String * 12
                        Mobile = "09161234567"
                        Dim Tell As Bit
                        Tell = 0

                        Enable Interrupts

                        Enable Urxc

                        Enable Int0

                        'Enable Int1





                        On Int0 Zone_1_alarm

                        'On Int1 Zone_2_alarm

                        On Urxc Stop_alarm




                        Set Portb.2
                        Cursor Off
                        Cls
                        Lcd "remot is active"


                        Do
                        If Tell = 1 Then Call Telephone

                        Loop



                        Zone_1_alarm:

                        Cls

                        Lcd "zone_1 is on"

                        Home

                        Set Portb.1
                        Tell = 1
                        ' Goto Telephone
                        Return



                        Zone_2_alarm:

                        Cls

                        Lcd "zone_2 is on"

                        Home

                        Set Portb.1

                        Tell = 1
                        ' Goto Telephone

                        Return




                        Stop_alarm:

                        In_put = Waitkey()

                        If In_put = 0 Then

                        'Goto L

                        Elseif In_put = 99 Then

                        Cls

                        Lcd "alarm off"


                        Reset Portb.2
                        Reset Portb.1
                        Home

                        Elseif In_put = 100 Then

                        Cls

                        Lcd "alarm on"

                        Reset Portb.1
                        Set Portb.2


                        Home

                        End If

                        'L:

                        Return





                        Sub Telephone
                        Tell = 0

                        Wait 2
                        Cls
                        Lcd "daill number"
                        Lowerline
                        Lcd "09161234567"
                        Set Portb.0
                        Wait 2
                        Dtmfout Mobile , 50
                        Wait 10
                        Cls
                        Lcd "call done"
                        Reset Portb.0
                        Wait 10
                        End Sub

                        این برنامه کجاش می لنگه که dtfmout کار نمیکنه

                        دیدگاه


                          #13
                          پاسخ : وقفه در وقفه

                          از خروجی oc1a استفاده میکنی؟
                          کریستال خارجی؟
                          از خروجی oc1a هم باید 2 تا خازن و مقاومت بزاری که شکل مدارش رو بگردی گزاشتم می بینی.تمام این کارارو کردی؟
                          علم چندانکه بیشتر خوانی چون عمل در تو نیست نادانی

                          دیدگاه


                            #14
                            پاسخ : وقفه در وقفه

                            نوشته اصلی توسط omega_adiban
                            از خروجی oc1a استفاده میکنی؟
                            کریستال خارجی؟
                            از خروجی oc1a هم باید 2 تا خازن و مقاومت بزاری که شکل مدارش رو بگردی گزاشتم می بینی.تمام این کارارو کردی؟
                            بله خروجی oc1a

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



                            موقع اجرا باید ولتاژ تغییرات پی در پی داشته باشه دیگه؟

                            فایلشم گذاشته بودم.فکنم شک داری یه موقع ویروسی باشه :nerd:

                            http://blueray.persiangig.com/other/systemnew.zip

                            دیدگاه


                              #15
                              پاسخ : وقفه در وقفه

                              اون مقاومت رو 1 کیلو بزار خازن رو 100 نانو و همین خازن و مقاومت رو دو بار پشت سر هم بزار (2 تا مشتق گیر پشت سر هم)من با اتمگا8 تست کردم و کریستال

                              10mhz

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

                              دیدگاه

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