اطلاعیه

Collapse
No announcement yet.

طریقه مالتی پلکس کردن سون سگمنت

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

    طریقه مالتی پلکس کردن سون سگمنت

    سلام
    یک مشکلی برام پیش اومده اونم اینکه توی کار کردن با 7سگمنهای چند تایی گیر کردم
    حالت عادی و شماره ثابت مشکلی نیست ، ولی وقتی می خوام مثلا یک شمارنده صعودی نزولی درست بکنم یا همچین چیزی دیگه نمی تونم درست اعداد رو نشون بدم .
    یک باری درست کار کرد ولی با کلی رفرش که تابلو بود ! بعدش اصلا کار نکرد .
    تو انجمن هم گشتم ولی چیز خاصی ندیدم ، اونایی هم که بود 99% به زبون بیسیک که چیزی ازش نفهمیدم !
    میشه کسی با زبان c بگه چجوری باید از اینتراپت و تایمر استفاده بکنم تا بتونم خروجی رو نشون بدم .
    یه چند جا هم دیدم که گفتن بوسیله یه آی سی 4017 که شمارنده هست میشه مالتی پلکس کرد . طریقه هماهنگ کردن اون رو هم با برنامه میکرو کسی توضیح بده خیلی ممنون میشم .
    لطفا به زبان c

    #2
    پاسخ : طریقه مالتی پلکس کردن سون سگمنت

    اینم کدی که من نوشتم
    چرا کار نمی کنه رو موندم !
    کد:
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V2.04.4a Advanced
    Automatic Program Generator
    © Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    
    Project : 
    Version : 
    Date  : 2010/04/19
    Author : NeVaDa
    Company : ECA
    Comments: 
    
    
    Chip type        : ATmega8L
    Program type      : Application
    AVR Core Clock frequency: 8.000000 MHz
    Memory model      : Small
    External RAM size    : 0
    Data Stack size     : 256
    *****************************************************/
    
    #include <mega8.h>
    #include <delay.h>
     int a[10]={0b1000000,0b1111001,0b0100100,0b0110000,0b0011001,0b0010010,0b0000010,0b1111000,0b0000000,0b0010000},b=0,c=0,d=0,e=0,f=0,g=0;
    
    // Timer 0 overflow interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    // Reinitialize Timer 0 value
    // TCNT0=0x50; 
    b++; 
    if (b==10000){
    c++;
    b=0;
    if (c==10){
    d++;
    c=0;
    if (d==10){
    e++;
    d=0;
    if (e==10){
    f++;
    e=0;
    if (f==10){
    f=0;
    }
    }
    }
    }
    }
    
    
      
    
    
    
    }
    
    // Declare your global variables here
    
    void main(void)
    {
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // Port B initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
    // State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1 
    PORTB=0xFF;
    DDRB=0xFF;
    
    // Port C initialization
    // Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out 
    // State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0 
    PORTC=0x00;
    DDRC=0x0F;
    
    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out 
    // State7=T State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0 
    PORTD=0x00;
    DDRD=0x0F;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 8000.000 kHz
    TCCR0=0x01;
    TCNT0=0x50;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    MCUCR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x01;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // Global enable interrupts
    #asm("sei")
    
    while (1)
       {  
       PORTC=0b00000001;
       PORTB=a[c];
       delay_us(100);
    
       PORTC=0b00000010;
       PORTB=a[d];
       delay_us(100);
    
       PORTC=0b00000100;
       PORTB=a[e];
       delay_us(100);
    
       PORTC=0b00001000;
       PORTB=a[f];
       delay_us(100);
       };
    }

    دیدگاه


      #3
      پاسخ : طریقه مالتی پلکس کردن سون سگمنت

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

      دیدگاه


        #4
        پاسخ : طریقه مالتی پلکس کردن سون سگمنت

        نوشته اصلی توسط فرشاد اکرمی
        سلام
        یک مشکلی برام پیش اومده اونم اینکه توی کار کردن با 7سگمنهای چند تایی گیر کردم
        حالت عادی و شماره ثابت مشکلی نیست ، ولی وقتی می خوام مثلا یک شمارنده صعودی نزولی درست بکنم یا همچین چیزی دیگه نمی تونم درست اعداد رو نشون بدم .
        یک باری درست کار کرد ولی با کلی رفرش که تابلو بود ! بعدش اصلا کار نکرد .
        تو انجمن هم گشتم ولی چیز خاصی ندیدم ، اونایی هم که بود 99% به زبون بیسیک که چیزی ازش نفهمیدم !
        میشه کسی با زبان c بگه چجوری باید از اینتراپت و تایمر استفاده بکنم تا بتونم خروجی رو نشون بدم .
        یه چند جا هم دیدم که گفتن بوسیله یه آی سی 4017 که شمارنده هست میشه مالتی پلکس کرد . طریقه هماهنگ کردن اون رو هم با برنامه میکرو کسی توضیح بده خیلی ممنون میشم .
        لطفا به زبان c
        جناب آقای اکرمی
        از شانس شما من بیسیک کار می کنم
        ولی می تونم چند تا راهنمایی کوچیک بکنم فک کنم بدردت بخوره
        البته نمیدونم از چه سخت افزاری استفاده می کنی
        تایمر رو طوری تنظیم کن که در هر ثانیه 40 برابر تعداد سون سگمنت ها رفرش بشه
        اگه زیاد تر باشه مشکلی نیست ولی اگه کمتر باشه 7 سگمنت هات چشمک میزنه
        کافیه اعداد رو توی یک ارایه ذخیره داشته باشی (این کار به درک برنامه هم کمک می کنه ) مثلا رقم یکان توی ارایه 1 رقم دهگاه توی آرایه 2 و ....
        با هر بار سرریز تایمر اول مقدار قبلی رو صفر کن تا سون سگمنت چیزی نشن نده بعدت مقدار جدید رو توی متغیری که اعداد رو نمایش می ده بریز
        اگه این کار رو نکنی سون سگمت ممکنه اعداد رو قاطی نشون بده مثلا اگه 25 رو می خای نشون بدی 85 یا 88 نشون میده
        اون اس سی 4017 شمارنده است اتفاقا خیلی بدرد کاهش مصرف پین می خوره
        برای مثال اگه می خوای 8 رقم داشته باشی تنها 1 پین رو مصرف می کنه تا به هر 8 تا فرمان بده
        من خودم با اون و یه کمی مدار جانبی یه تابلو روان 64 تایی ساختم که فقط 1 پین صرف پالس های ورودی شد

        نمیدونم منظورم رو فهمیدی یا نه
        برای سادگی کار :
        فرض کن توی هر بار سرریز تایمر فقط یک 7سگمنت اطلاعاتش رو نشون می ده



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

        دیدگاه


          #5
          پاسخ : طریقه مالتی پلکس کردن سون سگمنت

          از آی سی های لچ استفاده کن اینطوری اگه 50 تا سگمنت هم داشته باشی هیچ مشکلی برات پیش نمیاد .
          A-Hosseini

          دیدگاه


            #6
            پاسخ : طریقه مالتی پلکس کردن سون سگمنت

            ممنون از کمکتون .
            تمامی مواردی که سعید جان گفتن عمل کردم ، ولی همچنان پرپر زدن رو داشتم !
            یه بار مدار رو از برد بورد باز کردم و از دوباره تمیز بستم ! با کمال تعجب همون برنامه ای که تو پست دوم گذاشتم به خوبی کار کرد بودن هیچ پرپر زدنی .
            پروژه رو اینجا میزارم ، کسی مشکلی داشت مثل من گیر نکنه .
            فایل کامل کدویژن و پروتئوس برای راه اندازی 4 عدد 7سگمنت بصورت مالتی پلکس
            فایل های پیوست شده

            دیدگاه


              #7
              پاسخ : طریقه مالتی پلکس کردن سون سگمنت

              جناب اکرمی
              یکی از اون نکته هایی رو که گفتم رعایت نکردی

              من برنامه ات رو نیگاه کردم
              توی فایل لود شده توسط پروتئوس بجای .hex از .cof استفاده کن
              حالا می تونی شبیه سازی خط بخ خط رو ببینی
              برنامه یه ایراد داره که قبل از خاموش شدن مقدار قبلی مقدار جدید روی سون سگمنت لود میشه

              خودت نگاه کن




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

              دیدگاه


                #8
                پاسخ : طریقه مالتی پلکس کردن سون سگمنت

                مقدار قبلی خاموش میشه و جدید نوشته میشه .
                الانم مدار داره درست کار می کنه !
                پورت c پایه مشترک 7سگمنته که قبل اینکه مقدار رو نشون بده قبلیش خاموش و بعدی روشن میشه .
                اگر اشتب بود که برنامه کار نمی کرد .
                یه سوال هم دارم ، این سیمولینک خط به خط پروتئوس از کجا باید فعال بشه ؟ چون پیداش نکردم !

                دیدگاه


                  #9
                  پاسخ : طریقه مالتی پلکس کردن سون سگمنت

                  نوشته اصلی توسط فرشاد اکرمی
                  مقدار قبلی خاموش میشه و جدید نوشته میشه .
                  الانم مدار داره درست کار می کنه !
                  پورت c پایه مشترک 7سگمنته که قبل اینکه مقدار رو نشون بده قبلیش خاموش و بعدی روشن میشه .
                  اگر اشتب بود که برنامه کار نمی کرد .
                  یه سوال هم دارم ، این سیمولینک خط به خط پروتئوس از کجا باید فعال بشه ؟ چون پیداش نکردم !
                  د خاموش نمیشه
                  من با برنامه خودت امتحان کردم

                  توی فایل لود شده توسط پروتئوس بجای .hex از .cof استفاده کن

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



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

                  دیدگاه


                    #10
                    پاسخ : طریقه مالتی پلکس کردن سون سگمنت

                    ببخشید که وسط بحثتون میپرم دو تا سوال داشتم :
                    این سون سگمنت های تکی (10 پایه) چرا دو تا پایه com دارن در صورتی که با هر کدام از com ها به تنهایی میشه led ها رو روشن کرد؟
                    یه سون سگمنت سه تایی گرفتم که 12 پایه داره میشه در مورد پایه هاش توضیح بدید؟

                    دیدگاه


                      #11
                      پاسخ : طریقه مالتی پلکس کردن سون سگمنت

                      سلام
                      دوستان من در پورت A یک سون سگمنت چهارتایی آند مشترک با آی سی 7447 گذاشتم به شکل زیر اما نمیدونم چه طور میشه پایه های آند مشترک رو کنترول کرد که بتونم یک شمارنده 0 تا 9999 بسازم
                      هر کار میکنم ابتدا یکان شروع به شمارش میکنه وقتی به 9 میرسه دهگان یه چشمک میزنه دوباره خاموش میشه البته دهگان درست میشمره فقط ثابت نمیونه چشکم میزنه اینم برنامش
                      دوستان دقت کنید فقط میخوام از پورت A و آی سی 7447 استفاده کنم

                      #include <mega16.h>
                      #include <delay.h>

                      unsigned char h,i,j,k;

                      void main (void)
                      {
                      PORTA=0xff;
                      DDRA=0xff;
                      while (1)
                      {
                      for (h=0;h<10;h++)
                      {
                      PORTA=h;
                      for (i=0;i<10;i++)
                      {
                      PORTA=i;
                      for (j=0;j<10;j++)
                      {
                      PORTA=j;
                      for (k=0;k<10;k++)
                      {
                      PORTA=k;
                      PORTA.4=1;
                      delay_ms (300);
                      }
                      }
                      }
                      }
                      }
                      }

                      دیدگاه


                        #12
                        پاسخ : طریقه مالتی پلکس کردن سون سگمنت

                        :nerd:
                        آموزش راه اندازی سون سگمنت های تکی دوتایی سه تایی و چهار تایی رو دارم آماده می کنم!
                        همچنین استفاده از روش مالتی پلکس برای نمایش شمارنده 0000 تا 9999 و همچنین نمایش متن HELLO ECA به روش تابلو روان بر روی سون سگمنت 4تایی! :applause:
                        خودش یه پروژه بسیار جذاب و حرفه ای کار با سون سگمنت هست که ان شاالله تا ابتدای شهریور می نویسم و تصاویر آموزشی و پیکربندی سخت افزاری و نرم افزاری رو براتون قرار میدم!
                        فایل شبیه سازی پروتئوس و سورس برنامه نویسی به زبان کدویژن!
                        حتما حتما به انجمن سری بزنید! :applause:
                        آنچه كه باعث موفقيت انسان ها مي شود سخت كوشي است و نه نخبه بودن! Porsche 911 Turbo S 181.000 $ USD
                        جناب سعدی فرموده بودند: "بر احوال ان مرد باید گریست _ که دخلش بود نوزده، خرجش بیست!"
                        که اگه الان بود باید میگفت: "بود حال و احوال آن مرد زار _ که دخلش ریال است ، خرجش دلار :|"
                        http://www.eca.ir/forum2/index.php?topic=80472.msg489565#msg489565
                        http://www.eca.ir/forum2/index.php?topic=82242.msg501926#msg501926

                        دیدگاه


                          #13
                          پاسخ : طریقه مالتی پلکس کردن سون سگمنت

                          دوست عزیز اگه شما میخوای از دوتا پورت استفاده کنی از این برنامه استفاده کن
                          مشکل اساسی من با یک پورته اگه دوستان کسی هست راهنمایی کنه مرسی
                          کد:
                          #include <mega16.h> 
                          #include <delay.h> 
                          #define Up PINC.0
                          #define Down PINC.1
                          #define Set PINA.3
                          #define Inc PINA.4
                          #define Dec PINA.5
                          unsigned char i,k=1,buf[6]={0,0,0,0,0,0};
                          int secondl=0,secondh=0,minutel=0,minuteh=0,hourl=0,hourh=0;
                          
                          void settime(void){
                          signed char q,r;
                          q=0;
                          TCCR1B=0x00;
                          TCNT1H=0x0B;
                          TCNT1L=0xDB;        
                            #asm 
                            cli  
                            loop1:
                            sbis 0x19,3
                            rjmp loop1
                            #endasm
                          r=secondl;
                          while(1){
                          if(q==6){
                            secondl=buf[5];
                            secondh=buf[4];
                            minutel=buf[3];
                            minuteh=buf[2];
                            hourl=buf[1];
                            hourh=buf[0];
                            TCCR1B=0x03;
                            #asm("sei")
                            break; 
                            }
                          if(Set==0){
                            #asm   
                            loop:
                            sbis 0x19,3
                            rjmp loop
                            #endasm
                            q++;
                            if(q==1) r=secondh;
                            if(q==2) r=minutel;
                            if(q==3) r=minuteh;
                            if(q==4) r=hourl;
                            if(q==5) r=hourh;
                            }
                          if(Inc==0){
                            delay_ms(400);
                            r++;
                            if(q==0 | q==2 | q==4) if (r>9) r=0;
                            if(q==1 | q==3) if (r>5) r=0;
                            if(q==5) if(r>2) r=0;
                            }
                          if(Dec==0){
                            delay_ms(400);
                            r--;
                            if(q==0 | q==2 | q==4) if (r<0) r=9;
                            if(q==1 | q==3) if (r<0) r=5;
                            if(q==5) if(r<0) r=2;
                            }
                          if(q==0) buf[5]=r;
                          if(q==1) buf[4]=r;
                          if(q==2) buf[3]=r;
                          if(q==3) buf[2]=r;
                          if(q==4) buf[1]=r;
                          if(q==5) buf[0]=r;  
                          i=0;
                          PORTB=i;
                          k>>=1;
                          if(k==0)k=32;
                          PORTB=k;    
                          if(k==32)i=buf[5];
                          if(k==16)i=buf[4]; 
                          if(k==8)i=buf[3];
                          if(k==4)i=buf[2];
                          if(k==2)i=buf[1];
                          if(k==1)i=buf[0];
                          i|=0x40;
                          PORTB|=0x40;
                          PORTB=i;
                          }
                          }
                          
                          interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                          {
                          unsigned char reg;
                          reg=SREG; 
                          i=0;
                          PORTB=i;
                          k>>=1;
                          if(k==0)k=32;
                          PORTB=k;    
                          if(k==32)i=buf[5];
                          if(k==16)i=buf[4]; 
                          if(k==8)i=buf[3];
                          if(k==4)i=buf[2];
                          if(k==2)i=buf[1];
                          if(k==1)i=buf[0];
                          i|=0x40;
                          PORTB|=0x40;
                          PORTB=i;
                          SREG=reg; 
                          } 
                          
                          interrupt [TIM1_OVF] void timer1_ovf_isr(void)
                          {
                          TCNT1H=0x0B;
                          TCNT1L=0xDB;
                          if(secondl>9){
                            secondl=0; 
                            secondh++;
                            }
                          if(secondh>5){
                            secondh=0; 
                            minutel++;
                            }
                          if(minutel>9){
                            minutel=0; 
                            minuteh++;
                            } 
                          if(minuteh>5){
                            minuteh=0; 
                            hourl++;
                            }
                          if(hourh==0|hourh==1){
                            if(hourl>9){
                            hourl=0;
                            hourh++;
                            }
                          }
                          if(hourh==2){
                            if(hourl>3){
                            hourl=0;
                            hourh++;
                            }
                          }
                          if (hourh>2) secondl=secondh=minutel=minuteh=hourl=hourh=0;
                          buf[0]=hourh;
                          buf[1]=hourl; 
                          buf[2]=minuteh;
                          buf[3]=minutel;
                          buf[4]=secondh;    
                          buf[5]=secondl;
                          secondl++;
                          }
                          
                          void main(void)
                          {
                          unsigned char a=0; 
                          PORTB=0x00;
                          DDRB=0x7F;
                          PORTC=0x00;
                          DDRC.0=1;
                          DDRC.1=1;
                          PORTD=0x00;
                          DDRD=0xFF;
                          //DDRA=0;
                          TCCR0=0x03;
                          TCNT0=0x00;
                          
                          TIMSK=0x05;
                          ACSR=0x80;
                          
                          TCCR1A=0x00;
                          TCCR1B=0x03;
                          TCNT1H=0x0B;
                          TCNT1L=0xDB;
                          #asm("sei")
                          while (1){
                              if (Up==1){
                                  if (a<255) a++;
                              }
                              if (Down==1){
                                  if(a>0) a--;
                              }
                              PORTD=a;
                              delay_ms(100);
                              if(Set==0) settime();
                          };
                             
                          }

                          دیدگاه


                            #14
                            پاسخ : طریقه مالتی پلکس کردن سون سگمنت

                            سلام ، آقا این شمارنده که مث برق میشماره میره* جلو اگر بخوام مث ساعت ثانیه به ثانیه بره جلو باید چیکار کنم؟؟؟
                            اگر مقدار delay بهش بدم کلا بهم میخوره ⁦☹️⁩

                            دیدگاه

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