اطلاعیه

Collapse
No announcement yet.

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

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

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

    سلام به همگی

    من یه برنامه نوشتم که در آن قراره دو تا سیگنال ورودی به 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 درست انجام شده...؟

    ممنونم از محبتتون.
لطفا صبر کنید...
X