اطلاعیه

Collapse
No announcement yet.

دیمر دیجیتال-تشخیص مدار گذر صفر

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

    #46
    پاسخ : دیمر دیجیتال-تشخیص مدار گذر صفر

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

    الان روی برنامش میتونین کمک کنین؟توی پست قبلی مشکل توی برناممو گفتم

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

    دیدگاه


      #47
      پاسخ : دیمر دیجیتال-تشخیص مدار گذر صفر

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

      الان روی برنامش میتونین کمک کنین؟توی پست قبلی مشکل توی برناممو گفتم

      من میخوام پیوسته بتونم نور لامپو کم و زیاد کنم،البته بعدش میخوام با تایمر و سر زمان مشخص کم و زیاد کنم که فکر کنم تاخیر قرار دادن توی وقفه اینتراپت توی عملکرد تایمر مشکل ایجاد میکنه(در اصل نباید تاخیری توی تابع وقفه اینتراپت ایجاد بشه)
      برنامش فوق العاده راحته. کافیه اینتراپتو روی حالت رایزینگ قرار بدید، بعد توی تابع اینتراپت، توی خط اول تابع ترایاکو روشن کنید، توی خط بعدی یک delay_ms(time قرار بدید. حالا شما توی حلقه اصلی برنامه متغیر time رو از 0 تا 20 مقدار بدید(مثلا با دوتا دکمه). به همین راحتی. البته اگه بجای delay از تایمر استفاده کنید بهتره، شما فرکانس اصلی رو بگید تا بگم مقدار اولیه تایمر چقدر باید باشه
      انسانها 10 دسته اند: دسته ای که باینری میدانند و دسته ای که باینری نمیدانند!

      دیدگاه


        #48
        پاسخ : دیمر دیجیتال-تشخیص مدار گذر صفر

        راستی شما که برد براش زدین اسنابر داره؟
        انسانها 10 دسته اند: دسته ای که باینری میدانند و دسته ای که باینری نمیدانند!

        دیدگاه


          #49
          پاسخ : دیمر دیجیتال-تشخیص مدار گذر صفر

          نوشته اصلی توسط hamedtaran
          برنامش فوق العاده راحته. کافیه اینتراپتو روی حالت رایزینگ قرار بدید، بعد توی تابع اینتراپت، توی خط اول تابع ترایاکو روشن کنید، توی خط بعدی یک delay_ms(time قرار بدید. حالا شما توی حلقه اصلی برنامه متغیر time رو از 0 تا 20 مقدار بدید(مثلا با دوتا دکمه). به همین راحتی. البته اگه بجای delay از تایمر استفاده کنید بهتره، شما فرکانس اصلی رو بگید تا بگم مقدار اولیه تایمر چقدر باید باشه
          ممنون بابت پاسخ،آره منم قبول دارم راحته،ببین کل خواست من اینه که توی زمان های خاص رفته رفته نور لاپو کم کم تا خاموش بیارم و یا ذره ذره نور لامپو کم کم تا زیاد ببرم
          بخاطر این زمان های خاص از تایمر 0 استفاده کردم،کریستالم 16مگاهرتزه،ضریب تقسیمم 1024،محاسبات تایمر رو بلدم
          مثلا این کاری رو که شما گفتینو توی کد زیر گذاشتم و اجرا کردم
          کد:
          #include <mega32a.h>
          #include <delay.h>
          
          int cont,contt;
          char i;//,j=10;
           #define LED PORTB.0
          
          
          interrupt [EXT_INT0] void ext_int0_isr(void)
          {
          TIMSK=0X01;
          TCCR0=0X05;
          TIFR=0X00;
          //TCNT0=0X3F;
          TCNT0=0XB2;
          OCR0=0X00;
          
          
          
            contt++;
          
          
          
          //if(cont>500)
          //{
          
            PORTD.1=0;
            delay_ms(i);
            PORTD.1=1;
          
          
          }
          
          
          
          interrupt [TIM0_OVF] void timer0_ovf_isr(void)
           {
          
          TIMSK=0X01;
          TCCR0=0X05;
          TIFR=0X00;
          //TCNT0=0X3F;
          TCNT0=0XB2;
          OCR0=0X00;
          
           cont++;
          
           if(cont==100)
           {
           LED=!LED;
          // j=j+10;
          
           //PORTD.1=!PORTD.1;
           cont=0;
           }
          
           }
          
          
          void main(void)
          {
          
          PORTA=0x00;
          DDRA=0x08;
          
          PORTB=0x00;
          DDRB=0x01;
          
          PORTC=0x00;
          DDRC=0x00;
          
          PORTD=0x00;
          DDRD=0x02;
          
          //TCCR0=0x00;
          //TCNT0=0x00;
          //OCR0=0x00;
          
          
          TIMSK=0X01;
          TCCR0=0X05;
          TIFR=0X00;
          //TCNT0=0X3F;
          TCNT0=0XB2;
          
          OCR0=0X00;
          
          
          
          
          
          
          TCCR1A=0x00;
          TCCR1B=0x00;
          TCNT1H=0x00;
          TCNT1L=0x00;
          ICR1H=0x00;
          ICR1L=0x00;
          OCR1AH=0x00;
          OCR1AL=0x00;
          OCR1BH=0x00;
          OCR1BL=0x00;
          
          ASSR=0x00;
          TCCR2=0x00;
          TCNT2=0x00;
          OCR2=0x00;
          
          
          
          
          
          
          
          
          
          GICR|=0x40;
          MCUCR=0x02;
          MCUCSR=0x00;
          GIFR=0x40;
          
          
          //TIMSK=0x00;
          
          UCSRB=0x00;
          
          ACSR=0x80;
          SFIOR=0x00;
          
          
          ADCSRA=0x00;
          
          
          SPCR=0x00;
          
          
          TWCR=0x00;
          
          #asm("sei")
          
          while (1)
             {
             PORTA.3=0;
             i=20;
             }
          }

          اما مشکل ها کجاست،1 اینکه وقفه تایمرم اجرا نمیشه(هر1ثانیه،درحالیکه اگر تو اینتراپت تاخیر رو نذارم درست اجرا میشه تایمرم)
          مشکل 2 اینکه این برنامه رو که ریختم لامپ اصلا یک وضع یا سیکل مشابه رو انجام نمیده،یه لحظه سریع خاموش و روشن میشه،یه لحظه از زیاد به کم میشه،یه لحظه کم میمونه،یه لحظه روشن میمونه
          اما سیکل مشابه از زیاد به کم رو طی نمیکنه ادامه دار
          مشکلم کجاست؟

          دیدگاه


            #50
            پاسخ : دیمر دیجیتال-تشخیص مدار گذر صفر

            نوشته اصلی توسط hamedtaran
            راستی شما که برد براش زدین اسنابر داره؟
            نه اسنابر نداره،من فقط میخوام نور یه لامپ 100 رو کنترل کنم و موتور اینا نیست
            الان مشکل رو برنامست ظاهرا
            اسنابرو مگه برای حفاظت و سرعت سوئیچینگ نمیذارن؟

            دیدگاه


              #51
              پاسخ : دیمر دیجیتال-تشخیص مدار گذر صفر

              من این برنامه رو گذاشتم و از بازه 10 به بعد که با تاخیر 1میلی روشن میشه،روشن میمونه تا بازه 40-50 که تاخیر 10 میلی،و تو این بازه ها نور هیچ تغییری نمیکنه،اما از بازه 50 به بعد که تاخیر 15 میلی و بالاتر میشه نور لامپ هی خاموش و روشن میشه(ریز و قابل حس)
              مشکل چیه؟
              این لاکردار اصل قلق کم نور و پور نور کردنش چیه؟مگ نباید تاخیر زمانی رو توی لحظه گذر صفر دستکاری کرد؟پس چرا تاثیری توش نداره؟

              کد:
              #include <mega32a.h>
              #include <delay.h>
              
              int cont,contt;
              char i;//,j=10;
               #define LED PORTB.0
              
              
              interrupt [EXT_INT0] void ext_int0_isr(void)
              {
              
              
              //if(cont>500)
              //{
               // if(contt==10)
               // {
               //PORTD.1=0;
               //delay_ms(1);
               // PORTD.1=0;
               // }
              
              
              
                 if(contt>10 && contt<20)
               {
               PORTD.1=0;
               delay_ms(1);
               PORTD.1=1;
                }
              
              
              
                if(contt>10 && contt<20)
               {
               PORTD.1=0;
               delay_ms(3);
               PORTD.1=1;
                }
              
              
              
                 if(contt>30 && contt<40)
               {
               PORTD.1=0;
               delay_ms(6);
               PORTD.1=1;
                }
              
                  if(contt>40 && contt<50)
               {
               PORTD.1=0;
               delay_ms(10);
               PORTD.1=1;
                }
              
              
              
                    if(contt>50 && contt<60)
               {
               PORTD.1=0;
               delay_ms(15);
               PORTD.1=1;
                }
              
                     if(contt>60 && contt<70)
               {
               PORTD.1=0;
               delay_ms(20);
               PORTD.1=1;
                }
              
              
               /*
               if(contt==10)PORTD.1=1;
               if(contt==20)PORTD.1=0;
               */
              
              
              
               /*
                PORTD.1=0;
               for(i=0;i<8;i++)
               {
              
              
                delay_us(500);
                }
                 PORTD.1=1;
               */
              }
              
              
              
              interrupt [TIM0_OVF] void timer0_ovf_isr(void)
               {
              
              TIMSK=0X01;
              TCCR0=0X05;
              TIFR=0X00;
              //TCNT0=0X3F;
              TCNT0=0XB2;
              OCR0=0X00;
              
               cont++;
              
               if(cont==100)
               {
               contt++;
               LED=!LED;
              // j=j+10;
              
               //PORTD.1=!PORTD.1;
               cont=0;
               }
              
               }
              
              
              void main(void)
              {
              
              PORTA=0x00;
              DDRA=0x08;
              
              PORTB=0x00;
              DDRB=0x01;
              
              PORTC=0x00;
              DDRC=0x00;
              
              PORTD=0x00;
              DDRD=0x02;
              
              //TCCR0=0x00;
              //TCNT0=0x00;
              //OCR0=0x00;
              
              
              TIMSK=0X01;
              TCCR0=0X05;
              TIFR=0X00;
              //TCNT0=0X3F;
              TCNT0=0XB2;
              
              OCR0=0X00;
              
              
              
              
              
              
              TCCR1A=0x00;
              TCCR1B=0x00;
              TCNT1H=0x00;
              TCNT1L=0x00;
              ICR1H=0x00;
              ICR1L=0x00;
              OCR1AH=0x00;
              OCR1AL=0x00;
              OCR1BH=0x00;
              OCR1BL=0x00;
              
              ASSR=0x00;
              TCCR2=0x00;
              TCNT2=0x00;
              OCR2=0x00;
              
              
              
              
              
              
              
              
              
              GICR|=0x40;
              MCUCR=0x02;
              MCUCSR=0x00;
              GIFR=0x40;
              
              
              //TIMSK=0x00;
              
              UCSRB=0x00;
              
              ACSR=0x80;
              SFIOR=0x00;
              
              
              ADCSRA=0x00;
              
              
              SPCR=0x00;
              
              
              TWCR=0x00;
              
              #asm("sei")
              
              while (1)
                 {
                 PORTA.3=0;
                 i=i+10;
                 //j=i/10;
                 }
              }

              دیدگاه


                #52
                پاسخ : دیمر دیجیتال-تشخیص مدار گذر صفر

                ببینید این مدار دیمر گذر از صفر همینه یا 220 ولت رو وصل می کنه یا قطع . این یعنی اینکه هیچ وقت ولتاژ مثلا 110 ولت یا کمتر به لامپ نمی رسونه کاهش ولتاژنیست که.(اسمش روشه دیمر دیجیتال )پس انتظار اینکه نور کم شه تو مدارت وجود نداره .برای کنترل نورلامپ این مدار مناسب نیست.
                بنابراین هیچوفت انتظار کم شدن نوررو نداشته باش.برنامه ات درسته و الان به هدف این پروژه رسیده ای .
                از این دیمر برای کنترل المنت ها و دور موتورها و...استفاده میشه .
                هر آموزشگاهی را که باز کنید در زندانی را بسته اید.

                دیدگاه


                  #53
                  پاسخ : دیمر دیجیتال-تشخیص مدار گذر صفر

                  نوشته اصلی توسط namvar141
                  ببینید این مدار دیمر گذر از صفر همینه یا 220 ولت رو وصل می کنه یا قطع . این یعنی اینکه هیچ وقت ولتاژ مثلا 110 ولت یا کمتر به لامپ نمی رسونه کاهش ولتاژنیست که.(اسمش روشه دیمر دیجیتال )پس انتظار اینکه نور کم شه تو مدارت وجود نداره .برای کنترل نورلامپ این مدار مناسب نیست.
                  بنابراین هیچوفت انتظار کم شدن نوررو نداشته باش.برنامه ات درسته و الان به هدف این پروژه رسیده ای .
                  از این دیمر برای کنترل المنت ها و دور موتورها و...استفاده میشه .
                  oo: oo:
                  تاحالا توی نت اکثرا هر کی از میکرو استفاده کرده بود هدفش کنترل نورش بود،وگرنه که اصلا به میکرو نیاز نیست که،میشه با ترایاک تنها هم خاموش و روشنش کرد
                  من با دستکاری زمان ها سیکل کم و زیاد شدنشو میبینم گاهی اوقات(از پرنور میاد به خاموش،و از خاموش میاد به پرنور)یعنی شدنی هست،اما مشکل اینه که دقیق و متناوب و منظم تکرار نمیشه

                  کمبود این مدار یا برنامه چیه که نمیشه شدت نور رو کنترل کرد؟؟

                  دیدگاه


                    #54
                    پاسخ : دیمر دیجیتال-تشخیص مدار گذر صفر

                    نوشته اصلی توسط namvar141
                    ببینید این مدار دیمر گذر از صفر همینه یا 220 ولت رو وصل می کنه یا قطع . این یعنی اینکه هیچ وقت ولتاژ مثلا 110 ولت یا کمتر به لامپ نمی رسونه کاهش ولتاژنیست که.(اسمش روشه دیمر دیجیتال )پس انتظار اینکه نور کم شه تو مدارت وجود نداره .برای کنترل نورلامپ این مدار مناسب نیست.
                    بنابراین هیچوفت انتظار کم شدن نوررو نداشته باش.برنامه ات درسته و الان به هدف این پروژه رسیده ای .
                    از این دیمر برای کنترل المنت ها و دور موتورها و...استفاده میشه .
                    اصلا اینطور نیس، این مدار میتونه نور لامپ رشته ای رو کم و زیاد کنه. کلا لامپ و المنت توی گروه بارهای مقاومتی قرار میگیرند و عملا کارشون یکیه. وظیفه مدار دیمر، کنترل زاویه آتش هست، یهنی اگر بعد از مدار دیمر، شما پل دیود و خازن بذارید و ولتاژ dc بشه میبینید که با کم و زیاد کردن ولتاژ در دیمر، ولتاژ dc هم کم و زیاد میشه
                    انسانها 10 دسته اند: دسته ای که باینری میدانند و دسته ای که باینری نمیدانند!

                    دیدگاه


                      #55
                      پاسخ : دیمر دیجیتال-تشخیص مدار گذر صفر

                      نوشته اصلی توسط hamedtaran
                      اصلا اینطور نیس، این مدار میتونه نور لامپ رشته ای رو کم و زیاد کنه. کلا لامپ و المنت توی گروه بارهای مقاومتی قرار میگیرند و عملا کارشون یکیه. وظیفه مدار دیمر، کنترل زاویه آتش هست، یهنی اگر بعد از مدار دیمر، شما پل دیود و خازن بذارید و ولتاژ dc بشه میبینید که با کم و زیاد کردن ولتاژ در دیمر، ولتاژ dc هم کم و زیاد میشه
                      مهندس میشه به برنامه آخر یه نگاه کنین و ببینین گیر کار کجاست؟اگر شما نمونه برنامه ای دارین،یا اصل کار کم و زیاد کردن پیوسته نور رو بگین چیه ممنون میشم
                      همه میگن زمان رو کم و زیاد کن،اما میکنم یا مقطعه خاموش و روشن شدنش،یا اصلا کم نمیشه

                      دیدگاه


                        #56
                        پاسخ : دیمر دیجیتال-تشخیص مدار گذر صفر

                        درمورد کنترل ولتاژمثل اینکه حق باشماست (هرچند که قانع نشدم)اما یه سوال دارم ازتون اونم اینه که شما portd.1 رو هم تو برنامه وقفه int0وهم تو برنامه وقفه تایمر toggle کردین اینها تداخل ایجاد می کنند.(من زبان اصلیم بیسیکه ولی سی رو هم کمی بلدم )
                        هر آموزشگاهی را که باز کنید در زندانی را بسته اید.

                        دیدگاه


                          #57
                          پاسخ : دیمر دیجیتال-تشخیص مدار گذر صفر

                          نوشته اصلی توسط namvar141
                          درمورد کنترل ولتاژمثل اینکه حق باشماست (هرچند که قانع نشدم)اما یه سوال دارم ازتون اونم اینه که شما portd.1 رو هم تو برنامه وقفه int0وهم تو برنامه وقفه تایمر toggle کردین اینها تداخل ایجاد می کنند.(من زبان اصلیم بیسیکه ولی سی رو هم کمی بلدم )
                          نه با // غیر فعاله اون خط توی وقفه تایمر
                          تاگل فقط فقط توی وقفه اینتراپت و با تاخیر انجام میشه

                          من با بیسیک هم اوکی هستم،اگه به بیسیک هم راهنمایی دارین ممنون میشم

                          دیدگاه


                            #58
                            پاسخ : دیمر دیجیتال-تشخیص مدار گذر صفر



                            این شماتیک منه که با یک قسکت های اون کاری نداریم چون این مدار یک افق مصنوعیه
                            این هم قسمت های برنامش

                            این تابع main

                            [code=c]
                            #include <mega16a.h>
                            #define TRIAK_ON DDRD.2=1,PORTD.2=1,delay_us(50),PORTD.2=0

                            void main(){

                            #asm("sei&quot
                            while(1){

                            }
                            }

                            [/code]


                            این هم تابعی هست که نور کم یا زیاد میکنه

                            [code=c]


                            char W,Light=80;
                            interrupt [EXT_INT2] void ext_int2_isr(void)
                            {
                            for(W=0 ; W<Light ; W++)delay_us(100);
                            if(Light<79)TRIAK_ON;
                            }


                            void INT_ENB(){

                            GICR|=(0<<INT1) | (0<<INT0) | (1<<INT2);
                            MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
                            MCUCSR=(0<<ISC2);
                            GIFR=(0<<INTF1) | (0<<INTF0) | (1<<INTF2);
                            delay_ms(100);
                            }


                            void INT_DIS(){

                            MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
                            MCUCSR=(0<<ISC2);
                            delay_ms(100);
                            }


                            ///////////////////////////////////

                            char I_Light;
                            void Loss_light(){ // kaheshe nor
                            INT_ENB();
                            lcd_clear();
                            for(I_Light=0 ; I_Light<80 ; I_Light++){
                            Light=I_Light;
                            lcd_gotoxy(0,0);
                            lcd_putsf("Loss Of Light.."
                            lcd_gotoxy(0,1);
                            sprintf(lcd,"Light:%3u%% ",I_Light);
                            lcd_puts(lcd);
                            delay_ms(8000);
                            }

                            lcd_clear();
                            lcd_putsf("Done..."
                            delay_ms(2000);
                            INT_DIS();
                            lcd_clear();
                            }


                            void Light_Boost(){ // afzayeshe nor
                            INT_ENB();
                            lcd_clear();
                            for(I_Light=78 ; I_Light>0 ; I_Light--){
                            Light=I_Light;
                            lcd_gotoxy(0,0);
                            lcd_putsf("Light_Boost.."
                            lcd_gotoxy(0,1);
                            sprintf(lcd,"Light:%3u%% ",I_Light);
                            lcd_puts(lcd);
                            delay_ms(5000);
                            }
                            lcd_clear();
                            lcd_putsf("Done..."
                            delay_ms(5000);
                            I_Light=80;
                            lcd_clear();
                            INT_DIS();

                            }

                            [/code]

                            این مال قدیمه
                            با فراخوانی هر یک از توابع Light_Boost یا Loss_light نور کم یا زیاد میشه
                            اون تاخیر 8000 میلی ثانیه هم میتونی تغییر بدی سرعتش کم یا زیاد میشه

                            دیدگاه


                              #59
                              پاسخ : دیمر دیجیتال-تشخیص مدار گذر صفر

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


                              این شماتیک منه که با یک قسکت های اون کاری نداریم چون این مدار یک افق مصنوعیه
                              این هم قسمت های برنامش

                              این تابع main

                              [code=c]
                              #include <mega16a.h>
                              #define TRIAK_ON DDRD.2=1,PORTD.2=1,delay_us(50),PORTD.2=0

                              void main(){

                              #asm("sei&quot
                              while(1){

                              }
                              }

                              [/code]


                              این هم تابعی هست که نور کم یا زیاد میکنه

                              [code=c]


                              char W,Light=80;
                              interrupt [EXT_INT2] void ext_int2_isr(void)
                              {
                              for(W=0 ; W<Light ; W++)delay_us(100);
                              if(Light<79)TRIAK_ON;
                              }


                              void INT_ENB(){

                              GICR|=(0<<INT1) | (0<<INT0) | (1<<INT2);
                              MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
                              MCUCSR=(0<<ISC2);
                              GIFR=(0<<INTF1) | (0<<INTF0) | (1<<INTF2);
                              delay_ms(100);
                              }


                              void INT_DIS(){

                              MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
                              MCUCSR=(0<<ISC2);
                              delay_ms(100);
                              }


                              ///////////////////////////////////

                              char I_Light;
                              void Loss_light(){ // kaheshe nor
                              INT_ENB();
                              lcd_clear();
                              for(I_Light=0 ; I_Light<80 ; I_Light++){
                              Light=I_Light;
                              lcd_gotoxy(0,0);
                              lcd_putsf("Loss Of Light.."
                              lcd_gotoxy(0,1);
                              sprintf(lcd,"Light:%3u%% ",I_Light);
                              lcd_puts(lcd);
                              delay_ms(8000);
                              }

                              lcd_clear();
                              lcd_putsf("Done..."
                              delay_ms(2000);
                              INT_DIS();
                              lcd_clear();
                              }


                              void Light_Boost(){ // afzayeshe nor
                              INT_ENB();
                              lcd_clear();
                              for(I_Light=78 ; I_Light>0 ; I_Light--){
                              Light=I_Light;
                              lcd_gotoxy(0,0);
                              lcd_putsf("Light_Boost.."
                              lcd_gotoxy(0,1);
                              sprintf(lcd,"Light:%3u%% ",I_Light);
                              lcd_puts(lcd);
                              delay_ms(5000);
                              }
                              lcd_clear();
                              lcd_putsf("Done..."
                              delay_ms(5000);
                              I_Light=80;
                              lcd_clear();
                              INT_DIS();

                              }

                              [/code]

                              این مال قدیمه
                              با فراخوانی هر یک از توابع Light_Boost یا Loss_light نور کم یا زیاد میشه
                              اون تاخیر 8000 میلی ثانیه هم میتونی تغییر بدی سرعتش کم یا زیاد میشه
                              اول تشکر فراوان بابت برنامه ای که قرار دادی
                              دوم اینکه من وقفم int0 و کریستال میکروم 16مگا هرتزه،بنابراین برنامه رو اینجوری گذاشتم(رجیسترهای اینتراپت رو عوض کردم)

                              کد:
                              #include <mega32a.h>
                              #include <delay.h>
                              #define TRIAK_ON DDRD.1=1,PORTD.1=0,delay_us(50),PORTD.1=1
                              
                              
                              
                              char W,Light=80;
                              char I_Light;
                              
                              
                              int cont,contt;
                              //char i;//,j=10;
                              #define LED PORTB.0
                              
                              
                              interrupt [EXT_INT0] void ext_int0_isr(void)
                              {
                              for(W=0 ; W<Light ; W++)delay_us(100);
                              if(Light<79)TRIAK_ON;
                              
                              }
                              
                              
                              
                              
                              
                              
                              void INT_ENB(){
                              
                              GICR|=(0<<INT1) | (1<<INT0) | (0<<INT2);
                              MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
                              MCUCSR=(0<<ISC2);
                              GIFR=(0<<INTF1) | (1<<INTF0) | (0<<INTF2);
                              delay_ms(100);
                              }
                              
                              
                              
                              
                              void INT_DIS(){
                              
                              MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
                              MCUCSR=(0<<ISC2);
                              delay_ms(100);
                              }
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                               {
                              
                              TIMSK=0X01;
                              TCCR0=0X05;
                              TIFR=0X00;
                              TCNT0=0XB2;
                              OCR0=0X00;
                              
                               cont++;
                              
                               if(cont==100)
                               {
                               contt++;
                               LED=!LED;
                               cont=0;
                               }
                              
                               }
                              
                              
                              
                              void Loss_light(){  // kaheshe nor
                              INT_ENB();
                              
                              for(I_Light=0 ; I_Light<80 ; I_Light++){
                              Light=I_Light;
                              delay_ms(2000);
                              }
                              
                              delay_ms(1000);
                              INT_DIS();
                              }
                              
                              
                              
                              
                              
                              void Light_Boost(){ // afzayeshe nor
                              INT_ENB();
                              
                              for(I_Light=78 ; I_Light>0 ; I_Light--){
                              Light=I_Light;
                              delay_ms(2000);
                              }
                              
                              delay_ms(2000);
                              I_Light=80;
                              
                              INT_DIS();
                              
                              }
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              
                              void main(void)
                              {
                              
                              PORTA=0x00;
                              DDRA=0x08;
                              
                              PORTB=0x00;
                              DDRB=0x01;
                              
                              PORTC=0x00;
                              DDRC=0x00;
                              
                              PORTD=0x00;
                              DDRD=0x02;
                              
                              //TCCR0=0x00;
                              //TCNT0=0x00;
                              //OCR0=0x00;
                              
                              
                              TIMSK=0X01;
                              TCCR0=0X05;
                              TIFR=0X00;
                              //TCNT0=0X3F;
                              TCNT0=0XB2;
                              
                              OCR0=0X00;
                              
                              
                              
                              
                              
                              
                              TCCR1A=0x00;
                              TCCR1B=0x00;
                              TCNT1H=0x00;
                              TCNT1L=0x00;
                              ICR1H=0x00;
                              ICR1L=0x00;
                              OCR1AH=0x00;
                              OCR1AL=0x00;
                              OCR1BH=0x00;
                              OCR1BL=0x00;
                              
                              ASSR=0x00;
                              TCCR2=0x00;
                              TCNT2=0x00;
                              OCR2=0x00;
                              
                              
                              
                              
                              
                              
                              
                              
                              /*
                              GICR|=0x40;
                              MCUCR=0x02;
                              MCUCSR=0x00;
                              GIFR=0x40;
                              */
                              
                              //TIMSK=0x00;
                              
                              UCSRB=0x00;
                              
                              ACSR=0x80;
                              SFIOR=0x00;
                              
                              
                              ADCSRA=0x00;
                              
                              
                              SPCR=0x00;
                              
                              
                              TWCR=0x00;
                              
                              #asm("sei")
                              
                              while (1)
                                 {
                                 PORTA.3=0;
                                 Loss_light();
                                 delay_ms(2000);
                              
                                 Light_Boost();
                              
                                 //i=i+10;
                                 //j=i/10;
                                 }
                              }
                              حتی loss_light رو تنها هم گذاشتم تو حلقه while اما نور لامپ پیوسته کم نشد،علی رغم اینکه من تاخیرهای 8000 میلی رو کم کردم،اما برای اینکه نور لامپ کم و کمتر بشه 20-30 بار چشمک زن میشه تا یکم نورش کمتر بشه،خاموش هم که نشد(توی حالتی که فقط حالت کم کردن تو حلقه بود)
                              ممنون بابت کمک ها

                              دیدگاه


                                #60
                                پاسخ : دیمر دیجیتال-تشخیص مدار گذر صفر

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


                                این شماتیک منه که با یک قسکت های اون کاری نداریم چون این مدار یک افق مصنوعیه
                                این هم قسمت های برنامش

                                این تابع main

                                [code=c]
                                #include <mega16a.h>
                                #define TRIAK_ON DDRD.2=1,PORTD.2=1,delay_us(50),PORTD.2=0

                                void main(){

                                #asm("sei&quot
                                while(1){

                                }
                                }

                                [/code]


                                این هم تابعی هست که نور کم یا زیاد میکنه

                                [code=c]


                                char W,Light=80;
                                interrupt [EXT_INT2] void ext_int2_isr(void)
                                {
                                for(W=0 ; W<Light ; W++)delay_us(100);
                                if(Light<79)TRIAK_ON;
                                }


                                void INT_ENB(){

                                GICR|=(0<<INT1) | (0<<INT0) | (1<<INT2);
                                MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
                                MCUCSR=(0<<ISC2);
                                GIFR=(0<<INTF1) | (0<<INTF0) | (1<<INTF2);
                                delay_ms(100);
                                }


                                void INT_DIS(){

                                MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
                                MCUCSR=(0<<ISC2);
                                delay_ms(100);
                                }


                                ///////////////////////////////////

                                char I_Light;
                                void Loss_light(){ // kaheshe nor
                                INT_ENB();
                                lcd_clear();
                                for(I_Light=0 ; I_Light<80 ; I_Light++){
                                Light=I_Light;
                                lcd_gotoxy(0,0);
                                lcd_putsf("Loss Of Light.."
                                lcd_gotoxy(0,1);
                                sprintf(lcd,"Light:%3u%% ",I_Light);
                                lcd_puts(lcd);
                                delay_ms(8000);
                                }

                                lcd_clear();
                                lcd_putsf("Done..."
                                delay_ms(2000);
                                INT_DIS();
                                lcd_clear();
                                }


                                void Light_Boost(){ // afzayeshe nor
                                INT_ENB();
                                lcd_clear();
                                for(I_Light=78 ; I_Light>0 ; I_Light--){
                                Light=I_Light;
                                lcd_gotoxy(0,0);
                                lcd_putsf("Light_Boost.."
                                lcd_gotoxy(0,1);
                                sprintf(lcd,"Light:%3u%% ",I_Light);
                                lcd_puts(lcd);
                                delay_ms(5000);
                                }
                                lcd_clear();
                                lcd_putsf("Done..."
                                delay_ms(5000);
                                I_Light=80;
                                lcd_clear();
                                INT_DIS();

                                }

                                [/code]

                                این مال قدیمه
                                با فراخوانی هر یک از توابع Light_Boost یا Loss_light نور کم یا زیاد میشه
                                اون تاخیر 8000 میلی ثانیه هم میتونی تغییر بدی سرعتش کم یا زیاد میشه
                                خیلی خیلی ممنون بابت راهنمایی و کمک
                                دقیقا همین برنامه با تابع های خوبش خیلی خوب کمکم کرد
                                مشکل چشمک زدنش هم توی مقدار start و end توی Light بود که با تنظیمش خیلی خوب و دقیق کار کرد
                                سپاس فراوان :nice: :applause:

                                دیدگاه

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