سلام به همگی
من یه برنامه نوشتم که در آن قراره دو تا سیگنال ورودی به ADC برن و شکل موج آنها روی glcd نمایش داده بشه و میکرو از طریق هشت تا پوش باتن بتونه شکل موج رو دستکاری کنه....
این پروژه ای هست که همه چیز آنرا خودم درست کردم:
پ
و برنامه اینه:
سوالاتی که برام پیش اومده به شرح زیرند:
چیکار باید بکنم تا مجبور نشم در روتین وقفه ای که برای ADC هست خوندن کلید ها رو چک کنم...؟
به بیان دیگر .... تا قبل از این تمامی دستوراتی که با کامنتهای kelid نمایششون دادم در حلقه while بودند ولی از وقتی دستور "SEI" رو گذاشتم دیگه هیچکدوم اجرا نمیشن لذا مجبور شدم این دستورات رو در روتین وقفه بگذارم...
میخوام با زدن کلید هایی که به اسم incvoltdiv و decvoltdiv نمایش داده شدند کاری کنم با زدن کلید اولی در بار اول عدد 1 و بار دوم عدد 2 و بار سوم عدد 5 و بار چهارم هیچی نمایش داده بشه و با کلید decvoltdiv این روند عوض بشه... خودم دوتا کانتر به اسم vdc1و vdc2 درست کردم و شرط گذاشتم که اگر به 3 رسید مقدارشون صفر بشه... ولی ظاهرا وقتی دوتا کلید یکی بعد از دیگری زده میشه اطلاعات ارسال شده بهم میخوره و اعداد به ترتیب نامرتبی نمایش داده میشه...
این رو چیکار باید بکنم...؟
یه نگاهی هم به کلیت برنامه بندازید... مقدار دهی رجیستر های ADC درست انجام شده...؟
ممنونم از محبتتون.
من یه برنامه نوشتم که در آن قراره دو تا سیگنال ورودی به 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 درست انجام شده...؟
ممنونم از محبتتون.