# برنامه نویسی میکروکنترلر (MicroController) ها و MicroProcessor ها > برنامه نویسی سیستم های Embeded > سوال: درخواست نظر برای برنامه اسیلوسکوپ دوکاناله + ویدیوی پروژه + سوال

## roberty

با عرض بهترین درودها خدمت دوستان

من یه برنامه ای برای پروژه اسیلوسکوپ دوکاناله نوشتم که به شرح زیر هست:
#include <mega32a.h>
#include <delay.h>
#include <stdio.h>
#include <glcd.h>
// Font used for displaying text
// on the graphic LCD
#include <font5x7.h>
int i,j,a2d;
int vdc1=0,vdc2=0;
int tdc1=0,tdc2=0;
unsigned char    Xmax = 127;
unsigned char    x = 1;
unsigned char    inv,y;
unsigned char    oldv[Xmax];
unsigned char A[20];
void selectch1(void);
void selectch2(void);
void selectbothchannels(void);
void Lissajous (void);
void incvoltdiv (void);
void decvoltdiv (void);
void inctimediv (void);
void dectimediv (void);
void readkeys (void);
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(3000);
      glcd_clear();
      ADCSRA=0xf8;
      SFIOR=0x00;
      ADMUX=0x60;   
      glcd_putcharxy( 1, 56, 'v'); 
      glcd_putcharxy( 66, 56, 't');
      glcd_putcharxy( 7, 56, '='); 
      glcd_putcharxy( 72, 56, '='); 
      for(i=0;i<=54;i+=2){
      glcd_setpixel(0,i);
      glcd_setpixel(127,i);
      }
      glcd_putcharxy (14,55,'5');
      glcd_outtextxy (80,56,"0.1");
while (1)
      {  
    ///// namayesh moj 
    a2d = ADCH;
    inv = 54-((54 *a2d) /255);
    glcd_clrpixel(x, oldv[x]);    //Clear previous set pixel
    glcd_setpixel(x, inv);            //Set current pixel
    oldv[x] = inv; 
    x++;
    if(x>=Xmax)        
       x = 1;              
       //// namayesh meghdar a2d
       sprintf(A,"%2d",a2d);
       glcd_outtextxy(110,55,A);
    /// nayaesh kadr ofoghi
       for(i=0;i<128;i+=2){
      glcd_setpixel(i,54);
      glcd_setpixel(i,0);
      }
      // namayesh mehvar haye ofoghi va amoodi
      glcd_putcharxy( 30, 24, '|');
      glcd_putcharxy( 92, 24, '|');
      glcd_putcharxy( 62, 7, '_');
      glcd_putcharxy( 62, 35, '_');
      glcd_line(0,27,128,27);
      glcd_line(64,0,64,64);
      readkeys();
}
}
void readkeys (void)
{
     //// 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();
     }  
}
//// entekhab kanal 1
void selectch1 (void)
{
glcd_outtextxyf (2,5,"SEL CH1");
delay_ms(30);
for(i=2;i<20;i++){
for(j=2;j<60;j++)
glcd_clrpixel(j,i);
}
ADMUX=0x60;
}
//// entekhab kanal 2
void selectch2 (void)
{
glcd_outtextxyf (2,5,"SEL CH2");
delay_ms(30);
for(i=2;i<20;i++){
for(j=2;j<60;j++)
glcd_clrpixel(j,i);
}
ADMUX=0x61;
}
/// entekhab har do kanal
void selectbothchannels (void)
{
glcd_outtextxyf (2,5,"SEL CH1&2");
delay_ms(30);
for(i=2;i<20;i++){
for(j=2;j<62;j++)
glcd_clrpixel(j,i);
}
ADMUX=0x60;
delay_ms(10);
ADMUX=0x61;
}

//// namayesh lissajous
void Lissajous (void)
{
glcd_outtextxyf (2,5,"Lissajous");
delay_ms(30);
for(i=2;i<20;i++){
for(j=2;j<62;j++)
glcd_clrpixel(j,i);
}
ADMUX=0x70;
}
//// afzayesh volt division
void incvoltdiv (void)
{
glcd_outtextxyf (2,5,"incvoltdiv");
delay_ms(30);
for(i=2;i<20;i++){
for(j=2;j<62;j++)
glcd_clrpixel(j,i);
}
if(vdc1>=0){
glcd_putcharxy (14,55,'5');
}
y=5;
}
//// kahesh volt division
void decvoltdiv (void)
{
glcd_outtextxyf (2,5,"decvoltdiv");
delay_ms(30);
for(i=2;i<20;i++){
for(j=2;j<62;j++)
glcd_clrpixel(j,i);
}
if(vdc2>=0)
{
glcd_putcharxy( 14,55,'2');
}
y=2;
}
//// afzayesh time division
void inctimediv (void)
{
glcd_outtextxyf (2,5,"inctimediv");
delay_ms(30);
for(i=2;i<20;i++){
for(j=2;j<62;j++)
glcd_clrpixel(j,i);
}
if(tdc1 >=0)
glcd_outtextxy(80,56,"0.1  ");
}
//// kahesh time division
void dectimediv (void)
{
glcd_outtextxyf (2,5,"dectimediv");
delay_ms(30);
for(i=2;i<20;i++){
for(j=2;j<62;j++)
glcd_clrpixel(j,i);
}      
if(tdc2>=0)
glcd_outtextxy(80,56,"0.01");
}

برنامه  بدون مشکل اجرا میشه و کادربندی و نمایش حروف و اعداد بدون مشکل هست...فقط مشکلی که وجود داره با نمایش شکل موج هستش...شکل موج تیکه تیکه میشه و علتش هم ارسال بلادرنگ و آنلاین مقادیر a2d بر روی glcd هست

ویدیو رو ببینید:

http://www.8pic.ir/images/yltrsoqabcr2hufiza9.rar

کیفیت نمایش موج جالب نیست...

دوستی میگفت که نباید از ارسال آنلاین استفاده کرد بلکه باید بافری به اندازه 128 یعنی عرض  صفحه نمایش داشته باشیم...و این همون چیزی هست که من درباره اش سوال دارم...

یه بار دیگه تکه کد مربوط به نمایش موج رو میذارم تا ببینید:

    a2d = ADCH;
    inv = 54-((54 *a2d) /255);
    glcd_clrpixel(x, oldv[x]);    //Clear previous set pixel
    glcd_setpixel(x, inv);            //Set current pixel
    oldv[x] = inv; 
    x++;
    if(x>=Xmax)        
       x = 1; 

در خط دوم این تیکه کد عدد 54 دیده میشه...علت اینه که از 64 پیکس عمودی 10 تای اونها میره برای نمایش مقدار ولت دیویژن و تایم دیویژن و میمونه 54 تا...از طرف دیگه با اون رابطه ریاضی کاری کردم که کمترین ولتاژ بیفته پایین glcd و بیشترین هم بیفته بالای اون... 255 هم حداکثر مقدار رجیستر ADCH هست.

یه کمکی بکنید تا بافر گفته شده رو تولید کنم.

ممنون.

----------

