PDA

View Full Version : سوال: درخواست نظر برای برنامه اسیلوسکوپ دوکاناله + ویدیوی پروژه + سوال



roberty
دوشنبه 26 تیر 1391, 13:06 عصر
با عرض بهترین درودها خدمت دوستان

من یه برنامه ای برای پروژه اسیلوسکوپ دوکاناله نوشتم که به شرح زیر هست:

#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 هست.

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

ممنون.