NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 4343 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 6 از 6

موضوع: سوالاتی درباره برنامه اسیلوسکوپ + کد برنامه

  1. #1
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    77
    تشکر
    46
    تشکر شده 29 بار در 26 پست

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

    سلام به همگی

    من یه برنامه نوشتم که در آن قراره دو تا سیگنال ورودی به ADC برن و شکل موج آنها روی glcd نمایش داده بشه و میکرو از طریق هشت تا پوش باتن بتونه شکل موج رو دستکاری کنه....

    این پروژه ای هست که همه چیز آنرا خودم درست کردم:



    و برنامه اینه:
    کد:
    #include <mega16a.h>
    #include <delay.h>
    // Graphic LCD functions
    #include <glcd.h>
    // Font used for displaying text
    // on the graphic LCD
    #include <font5x7.h>
    int i,j,p,L1,L2,a2d;
    int vdc1=0,vdc2=0;
    int k=0;
    void selectch1(void);
    void selectch2(void);
    void selectbothchannels(void);
    void Lissajous (void);
    void incvoltdiv (void);
    void decvoltdiv (void);
    void inctimediv (void);
    void dectimediv (void);
    interrupt [17] void adc(void)
    {
          a2d = ADCW; 
          p =  ((a2d))/64;
          for(k=0;k<=127;k++){
          glcd_clrpixel(k,p);
          delay_ms(5);
          glcd_setpixel(k,p);
          }
          if (k==128){
          k=0;
          }
         //// kelid 1
         if(PINB.0 ==0){
         delay_ms(20);
         if(PINB.0 ==0)
         selectch1();
         } 
         /// kelid 2
         if(PINB.1 ==0){
         delay_ms(20);
         if(PINB.1 ==0)
         selectch2();
         } 
              /// kelid 3
         if(PINB.2 ==0){
         delay_ms(20);
         if(PINB.2 ==0)
         selectbothchannels();
         } 
         ///kelid 4 
         if(PINB.3 ==0){
         delay_ms(20);
         if(PINB.3 ==0)
         Lissajous();
         }
         //kelid 5
         if(PINB.4 ==0){
         delay_ms(20);
         if(PINB.4 ==0)
         incvoltdiv();
         vdc1++;
         } 
         // kelid 6
         if(PINB.5 ==0){
         delay_ms(20);
         if(PINB.5 ==0)
         decvoltdiv();
         vdc2++;
         }
         /// kelid 7
         if(PINB.6 ==0){
         delay_ms(20);
         if(PINB.6 ==0)
         inctimediv();
         } 
         /// kelid 8
         if(PINB.7 ==0){
         delay_ms(20);
         if(PINB.7 ==0)
         dectimediv();
         }            
    }
    void main(void)
    {
    // Declare your local variables here
    // Graphic LCD initialization data
    GLCDINIT_t glcd_init_data;
    // Graphic LCD initialization
    // The KS0108 connections are specified in the
    // Project|Configure|C Compiler|Libraries|Graphic LCD menu:
    // DB0 - PORTC Bit 0
    // DB1 - PORTC Bit 1
    // DB2 - PORTC Bit 2
    // DB3 - PORTC Bit 3
    // DB4 - PORTC Bit 4
    // DB5 - PORTC Bit 5
    // DB6 - PORTC Bit 6
    // DB7 - PORTC Bit 7
    // E - PORTD Bit 0
    // RD /WR - PORTD Bit 1
    // RS - PORTD Bit 2
    // /RST - PORTD Bit 3
    // CS1 - PORTD Bit 4
    // CS2 - PORTD Bit 5
    // Specify the current font for displaying text
    glcd_init_data.font=font5x7;
    // No function is used for reading
    // image data from external memory
    glcd_init_data.readxmem=NULL;
    // No function is used for writing
    // image data to external memory
    glcd_init_data.writexmem=NULL;
    glcd_init(&glcd_init_data);
          glcd_outtextxyf(0,0,"DIGITAL OSILLOSCOPE");
          glcd_outtextxyf (0,22,"BY AVR MICOCTRL");
          glcd_outtextxyf (0,45,"HAMID REZA RABET" ); 
          delay_ms(30);
          glcd_clear();
           ADCSRA=0xff;
          SFIOR=0x00;
          ADMUX=0x40;   
          glcd_putcharxy( 1, 56, 'v'); 
          glcd_putcharxy( 66, 56, 't');
          glcd_putcharxy( 6, 56, '='); 
          glcd_putcharxy( 71, 56, '=');
          for (i=0;i<128;i++){
          glcd_setpixel (64,i);
          }
          for (j=0;j<128;j++){
          glcd_setpixel (j,32);
          } 
    
          glcd_putcharxy( 32, 30, '|');
          glcd_putcharxy( 94, 30, '|');
          glcd_putcharxy( 62, 10, '_');
          glcd_putcharxy( 62, 45, '_');
          #asm("sei");
    while (1)
          {     
    
    }
    }
    //// entekhab kanal 1
    void selectch1 (void)
    {
    glcd_outtextxyf (2,5,"SEL CH1");
    delay_ms(30);
    for(i=0;i<30;i++){
    for(j=0;j<60;j++)
    glcd_clrpixel(j,i);
    }
    ADMUX=0x00;
    }
    //// entekhab kanal 2
    void selectch2 (void)
    {
    glcd_outtextxyf (2,5,"SEL CH2");
    delay_ms(30);
    for(i=0;i<30;i++){
    for(j=0;j<60;j++)
    glcd_clrpixel(j,i);
    }
    ADMUX=0x01;
    }
    /// entekhab har do kanal
    void selectbothchannels (void)
    {
    glcd_outtextxyf (2,5,"SEL CH1&2");
    delay_ms(30);
    for(i=0;i<32;i++){
    for(j=0;j<62;j++)
    glcd_clrpixel(j,i);
    }
    ADMUX=0x00;
    delay_ms(10);
    ADMUX=0x01;
    }
    //// namayesh lissajous
    void Lissajous (void)
    {
    glcd_outtextxyf (2,5,"Lissajous");
    delay_ms(30);
    for(i=0;i<32;i++){
    for(j=0;j<62;j++)
    glcd_clrpixel(j,i);
    }
    if(ADMUX==0x00)
    L1=ADCW;
    else {
    if(ADMUX==0x01)
    L2=ADCW ;
    }
    }
    //// afzayesh volt division
    void incvoltdiv (void)
    {
    glcd_outtextxyf (2,5,"incvoltdiv");
    delay_ms(30);
    for(i=0;i<32;i++){
    for(j=0;j<62;j++)
    glcd_clrpixel(j,i);
    }
    glcd_putcharxy( 12,55,'1');
    if(vdc1==1){
    glcd_putcharxy( 12,55,'2');
    }
    if(vdc1==2){
    glcd_putcharxy( 12,55,'5');
    }
    else
    vdc1=0;
    p=p*2;
    }
    //// kahesh volt division
    void decvoltdiv (void)
    {
    glcd_outtextxyf (2,5,"decvoltdiv");
    delay_ms(30);
    for(i=0;i<32;i++){
    for(j=0;j<62;j++)
    glcd_clrpixel(j,i);
    }
    glcd_putcharxy( 12,55,'5');
    if(vdc2==2){
    glcd_putcharxy( 12,55,'2');
    }
    if(vdc2==3){
    glcd_putcharxy( 12,55,'1');
    }
    else
    vdc2=0;
    p=p/2;
    }
    //// afzayesh time division
    void inctimediv (void)
    {
    glcd_outtextxyf (2,5,"inctimediv");
    delay_ms(30);
    for(i=0;i<32;i++){
    for(j=0;j<62;j++)
    glcd_clrpixel(j,i);
    }
    }
    //// kahesh time division
    void dectimediv (void)
    {
    glcd_outtextxyf (2,5,"dectimediv");
    delay_ms(30);
    for(i=0;i<32;i++){
    for(j=0;j<62;j++)
    glcd_clrpixel(j,i);
    }
    }
    سوالاتی که برام پیش اومده به شرح زیرند:

    چیکار باید بکنم تا مجبور نشم در روتین وقفه ای که برای ADC هست خوندن کلید ها رو چک کنم...؟

    به بیان دیگر .... تا قبل از این تمامی دستوراتی که با کامنتهای kelid نمایششون دادم در حلقه while بودند ولی از وقتی دستور "SEI" رو گذاشتم دیگه هیچکدوم اجرا نمیشن لذا مجبور شدم این دستورات رو در روتین وقفه بگذارم...

    میخوام با زدن کلید هایی که به اسم incvoltdiv و decvoltdiv نمایش داده شدند کاری کنم با زدن کلید اولی در بار اول عدد 1 و بار دوم عدد 2 و بار سوم عدد 5 و بار چهارم هیچی نمایش داده بشه و با کلید decvoltdiv این روند عوض بشه... خودم دوتا کانتر به اسم vdc1و vdc2 درست کردم و شرط گذاشتم که اگر به 3 رسید مقدارشون صفر بشه... ولی ظاهرا وقتی دوتا کلید یکی بعد از دیگری زده میشه اطلاعات ارسال شده بهم میخوره و اعداد به ترتیب نامرتبی نمایش داده میشه...

    این رو چیکار باید بکنم...؟

    یه نگاهی هم به کلیت برنامه بندازید... مقدار دهی رجیستر های ADC درست انجام شده...؟

    ممنونم از محبتتون.

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    مدير بخش STM32 sadmonew آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    صادق محمدي
    نوشته ها
    2,002
    تشکر
    6,283
    تشکر شده 3,115 بار در 1,408 پست

    پیش فرض

    سلام مهندس
    بررسي فشرده شدن كليدها تو وقفه adc كار مناسبي نيست. براي بررسي فشرده شدن كليد ها ميتونيد از وقفه تايمر استفاده كنيد.
    _____________________________________
    _____________________________________

  4. تشکرها از این نوشته :


  5. #3
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    77
    تشکر
    46
    تشکر شده 29 بار در 26 پست

    پیش فرض

    نقل قول نوشته اصلی توسط sadmonew نمایش پست ها
    سلام مهندس
    بررسي فشرده شدن كليدها تو وقفه adc كار مناسبي نيست. براي بررسي فشرده شدن كليد ها ميتونيد از وقفه تايمر استفاده كنيد.
    ممکنه بیشتر توضیح بدید...؟

    تایمر باید چقدر باشه...؟ چند ثانیه..؟ مد نرمال یا ctc...؟

  6. #4
    مدیرکل انجمنها
    تاریخ عضویت
    May 2011
    نام
    احسان صفامنش
    نوشته ها
    1,763
    تشکر
    919
    تشکر شده 2,261 بار در 1,056 پست

    پیش فرض

    مد نرمال تایمر 256 بیتی در کمترین سرعت باید کافی باشه.
    از خود پین وقفه ی خارجی نمیتونین استفاده کنین؟؟؟؟

  7. تشکرها از این نوشته :


  8. #5
    کاربر فعال
    تاریخ عضویت
    Mar 2010
    نوشته ها
    236
    تشکر
    101
    تشکر شده 246 بار در 163 پست

    پیش فرض

    داخل اینتراپت adc
    گذاشتن Delay اشتباه هست . تو یه حلقه 128 تایی هرکدوم 5 میلی ثانیه تاخیر داره !!!!
    تعجب میکنم کد کار میکنه .توجه داشته باشید که تا زمانی که داخل اینتراپت هستید دیگه اینتراپت نمیخورید!!!
    این حلقه برای چی هست؟تاخیر رو بردارید و کد کلید رو ببرید داخل حلقه while داخل تابع main
    فکر نمیکنم استفاده از تایمر درست باشه چون اولویت با Adc هست.

  9. تشکرها از این نوشته :


  10. #6
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    77
    تشکر
    46
    تشکر شده 29 بار در 26 پست

    پیش فرض

    نقل قول نوشته اصلی توسط mrm نمایش پست ها
    داخل اینتراپت adc
    گذاشتن Delay اشتباه هست . تو یه حلقه 128 تایی هرکدوم 5 میلی ثانیه تاخیر داره !!!!
    تعجب میکنم کد کار میکنه .توجه داشته باشید که تا زمانی که داخل اینتراپت هستید دیگه اینتراپت نمیخورید!!!
    این حلقه برای چی هست؟تاخیر رو بردارید و کد کلید رو ببرید داخل حلقه while داخل تابع main
    فکر نمیکنم استفاده از تایمر درست باشه چون اولویت با Adc هست.
    ممنون...

    تا همین دیشب در برنامه دستور کنترل کلید ها داخل While بود ولی الان که وقفه گذاشتم و از دستور
    کد:
    asm("sei")
    استفاده میکنم اصلا وارد while نمیشه که بخواد کلیدی رو کنترل بکنه....

    خودم هم میدونم این نوع نوشتن کد کلید داخل روتین وقفه کاری عجیب هست ولی چاره ای نداشتم...!!

    در ضمن اگر منظورتون از حلقه همون حلقه for است باید بگم برای نمایش 128 پیکسل در موقعیت های تعریف شده در طول glcd 128*64 بکار میره.

    بازهم از راهنماییتون سپاسگذارم.

موضوعات مشابه

  1. اسیلوسکوپ جیبی
    توسط goooodboy_35 در انجمن پیشنهاد واردات قطعات / اضافه کردن محصول به فروشگاه
    پاسخ: 1
    آخرين نوشته: 05-10-2012, 16:35
  2. پاسخ: 32
    آخرين نوشته: 01-08-2012, 12:51
  3. پاسخ: 2
    آخرين نوشته: 03-11-2011, 11:52
  4. ساخت اسیلوسکوپ ؟
    توسط nefel در انجمن الکترونیک
    پاسخ: 1
    آخرين نوشته: 11-08-2010, 20:40
  5. کاربرد کابل اسیلوسکوپ
    توسط Hesam1984 در انجمن طراحی و ساخت و آزمایش مدارت الکترونیک
    پاسخ: 6
    آخرين نوشته: 06-02-2010, 02:40

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •