اطلاعیه

Collapse
No announcement yet.

مشکل با وقفه خارجی در Atmel studio

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

    مشکل با وقفه خارجی در Atmel studio

    دوستان من از وقفه خارجی شماره یک در میکروکنترلر ATmega8 می خواهم استفاده کنم.

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

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

    برنامه زبان C:

    [code=c]#include <avr/io.h>
    #define F_CPU 16000000UL
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <stdio.h>
    #include "uart.h"


    int main(void)
    {
    char buffer[200];
    char x=0;

    uart_init();
    DDRD |= (1<<PIND2);
    PORTD |= (1<<PIND2);

    MCUCSR |= (1 << ISC11); //Set ISC11 in MCUCSR register -> falling edge
    MCUCSR &= ~(1 << ISC10); //Reset ISC10 in MCUCSR register -> falling edge

    //MCUCSR |= (1 << ISC11); //Set ISC11 in MCUCSR register -> rising edge
    //MCUCSR |= (1 << ISC10); //Set ISC10 in MCUCSR register -> rising edge

    GICR |= (1<<INT1); //Enable interrupt 1 in GICR register
    sei();
    while (1)
    {
    x++;
    sprintf(buffer,"X=%i\r\n",x);
    uart_puts(buffer);
    _delay_ms(1000);
    }
    }



    ISR(INT1_vect)
    {
    uart_puts("INT\r\n"
    }
    [/code]


    برنامه بیسیک:

    [code=vb]$regfile = "m8def.dat"
    $crystal = 16000000
    $baud = 9600

    Config Portd.2 = Output
    Portd.2 = 1

    Config Int1 = Rising
    Enable Int1
    On Int1 Ext_int1

    Enable Interrupts


    Dim X As Byte



    Do

    Print X
    Incr X
    Wait 1
    Loop

    Ext_int1:
    Print "INT"
    Return[/code]

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


    [code=c]#include <avr/io.h>
    #include <avr/interrupt.h>
    #define F_CPU 16000000UL
    #include <util/delay.h>


    int main(void)
    {
    DDRD |= (1<<PIND2);
    DDRB |= (1<<PINB1);

    PORTD |= (1<<PIND2);

    //MCUCSR |= (1 << ISC11); //Set ISC11 in MCUCSR register -> falling edge
    //MCUCSR &= ~(1 << ISC10); //Reset ISC10 in MCUCSR register -> falling edge
    MCUCSR = 0x0F;
    //MCUCSR |= (1 << ISC11); //Set ISC11 in MCUCSR register -> rising edge
    //MCUCSR |= (1 << ISC10); //Set ISC10 in MCUCSR register -> rising edge

    GICR |= (1<<INT1); //Enable interrupt 1 in GICR register
    sei();

    while (1)
    {
    PORTB &= ~(1 << PINB1);
    _delay_ms(200);
    }
    }


    ISR(INT1_vect)
    {
    //uart_puts("INT\r\n"
    //reti();
    //PORTB ^= (1 << PINB1);
    PORTB |= (1 << PINB1);

    }

    [/code]

    #2
    پاسخ : مشکل با وقفه خارجی در Atmel studio

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



    موفق باشید. :smile:

    دیدگاه


      #3
      پاسخ : مشکل با وقفه خارجی در Atmel studio

      ممنون از راهنمایی شما
      این کار رو قبلا هم انجام دادم ولی باز هم مشکل حل نشد.

      دیدگاه


        #4
        پاسخ : مشکل با وقفه خارجی در Atmel studio

        اوه :question:

        خب یه کاری

        اون بیت مربوط به فلگ وقفه مد نظرتون را دستی پاکش کنید .

        امیدوارم مشکلتون حل شه .

        دیدگاه


          #5
          پاسخ : مشکل با وقفه خارجی در Atmel studio

          سلام
          این کد رو تست کن
          [code=cpp]#include <avr/io.h>
          #include <avr/interrupt.h>
          #define F_CPU 16000000UL
          #include <util/delay.h>


          int main(void)
          {
          DDRD |= (1<<PIND2);
          DDRB |= (1<<PINB1);

          PORTD |= (1<<PIND2);
          GICR |= 0x80;
          MCUCR =0x0c;
          MCUCSR = 0x00;
          GIFR=0x80;

          //Enable interrupt 1 in GICR register
          sei();

          while (1)
          {
          PORTB &= ~(1 << PINB1);
          _delay_ms(200);
          }
          }


          ISR(INT1_vect)
          {
          //uart_puts("INT\r\n"
          //reti();
          //PORTB ^= (1 << PINB1);
          PORTB |= (1 << PINB1);

          }[/code]
          امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

          دیدگاه


            #6
            پاسخ : مشکل با وقفه خارجی در Atmel studio

            مشکل حل شد :wow:
            مشکل کار من چی بود؟

            دیدگاه


              #7
              پاسخ : مشکل با وقفه خارجی در Atmel studio

              اوه من الان فقط می خوام سرم رو بکوبم به دیوار
              من تاحالا به جای MCUCR داشتم MCUCSR رو مقدار دهی می کردم. الان دو روز بود درگیرش بودم
              خیلی خیلی ممنون از راهنماییتون

              دیدگاه


                #8
                پاسخ : مشکل با وقفه خارجی در Atmel studio

                نوشته اصلی توسط Homayon
                مشکل حل شد :wow:
                مشکل کار من چی بود؟
                سلام
                رجیستر mcucsr برای مقدار دهی امکانات دیگه مثلا در atmega32 به بالا هست تازه این رجیستر در atmega128 بازم اسمش فرق میکنه
                اما رد atmega8 رجیستر mcucr برای تنظیم وقفه خارجی کافیه
                امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

                دیدگاه


                  #9
                  پاسخ : مشکل با وقفه خارجی در Atmel studio

                  نوشته اصلی توسط mahdi8866 نمایش پست ها
                  سلام
                  رجیستر mcucsr برای مقدار دهی امکانات دیگه مثلا در atmega32 به بالا هست تازه این رجیستر در atmega128 بازم اسمش فرق میکنه
                  اما رد atmega8 رجیستر mcucr برای تنظیم وقفه خارجی کافیه
                  سلام منم توی atmega128 همین مشکل رو دارم برنامه از روال کار خارج میشه
                  من باسه تا وقفه خارج کار کردم و مشکلی نبود به درستی برنامه اجرا میشد ولی وقتی pwm و تایمر 1 و 3 رو توی atmega128 فعال میکنم دیگه برنامه کار نمیکنه البته هنگامی که pwm و تایمرا رو روشن میکنم و یه وقفه به برنامه هم اضافه میکنم برنامه به درستی کار میکنه ولی دومین وقفه رو که روشن میکنم برنامه دیگه کار نمیکنه سخت افزار هم تست کردم مشکلی نداره.
                  میشه کمک کنید یه هفته هست که سرش گیرم همه چیزو تست کردم.

                  دیدگاه


                    #10
                    پاسخ : مشکل با وقفه خارجی در Atmel studio

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

                    دیدگاه


                      #11
                      پاسخ : مشکل با وقفه خارجی در Atmel studio

                      نوشته اصلی توسط mahdi8866 نمایش پست ها
                      سلام
                      تعداد وقفه ها ی خارجی و داخلی که میخوای بکار ببری چند تاست؟و ترتیبتشون رو هم بگید
                      سلام ممنون که جواب دادین دیگه هیچ چیزی به ذهنم نمیزنه که انجام بدم
                      وقفه های خارجی 2و3و7 و روشن بود تایمر 1 و 3 برای خروجی Pwm روی پایه های ocr1a و ocr1b و ocr1c و ocr3a روی حالت icr برای تولید فرکانس 73.5 و روشن بودن تایمر صفر برای تولید زمان دقیق 4 میلی ثانیه و آپدیت lcd هر 60 میلی ثانیه.(تمام چیزایی که گفتم زمانی که خروجی pwmفعال نباشه درست کار میکنه فقط کافیه خروجی یکی از pwm ها فعال بشه تا lcd دیگه آپدیت نشه . اینم بگم که هر 15 بار که تایمر صفر زمان 4 میلی ثانیه رو اعلام میکنه lcdآپدیت میشه).( البته من با کدویژن کار میکنما )
                      ممنون
                      جدیدترین ویرایش توسط aro.r; ۱۷:۱۴ ۱۳۹۵/۰۶/۰۶.

                      دیدگاه


                        #12
                        پاسخ : مشکل با وقفه خارجی در Atmel studio

                        سلام
                        برنامه اپدیت lcd در زیر برنامه تایمر0 نوشتی یا در while ؟
                        امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

                        دیدگاه


                          #13
                          پاسخ : مشکل با وقفه خارجی در Atmel studio

                          سلام ممنون
                          در while
                          بازم تست کردم برنامه رو انگار کلا بر نامه توی وقفه هست من یه برنامه نوشتم که هر 1 ثانیه یه عدد روی lcd بندازه در حالی که خیلی سریع اعداد رو اضافه میکرد بعد برنامه قبلیم هم کار میکرد ولی خیلی کند یعنی مثلا قرار بود هر 30 میلی ثانیه سر lcd بنویسه هر 3 یا 4 ثانیه مینویسه.یعنی کلا توی ئقفه هست خیلی کم میره تو وایل. نمیدونید مشکل چیه ؟

                          دیدگاه


                            #14
                            پاسخ : مشکل با وقفه خارجی در Atmel studio

                            سلام
                            یعنی شما اومدی تو زیر برنامه تایمر 0 یه متغیر گذاشتی که هر بار به عدد 15 برسه و در while شرط گذاشتی که متغیره عددش 15 شد دستور نمایش السی دی اجرا بشه؟
                            تو خوده زیر برنامه وقفه هم نوشتی؟

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

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

                            دیدگاه

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