چون تازه واردم سلام میکنم

.میخواستم یه توضیح مختصر درباره ساختن یه اسلسکوپ ساده بوسیله AVR بدم.نمیدونم چرا هیچ جا توضیح ندادن انگار چیه :wow:اونایی هم که حرفه ای اند زیاد بهشون بر نخوره چون واسه تازه کار اما زود پیشرفت کنایی مثل خودم دارم توضیح میدم،خلاصه ببخشن. :cry2:
الان یه توضیح میدم که قشنگ شیر فهم شید.بعدشم برنامه سادشو با پروتئوسشو میذارم که قشنگ با هم باشیم :nerd:، البته من فقط مراحلشو میگم جزئیاتش رو که فوق العاده ساده تره رو میذارم به عهده خودتون.
از اینجا شروع میکنم که باید کار با GLCD رو یاد بگیرید ، اونم اینجورییکه GLCD شصت و چهار تا سطر داره و 128 تا ستون که کنترل هر کدام از 64 ستون اول و دوم دست یک تراشه KS0128 است،که با پایه های CS1,CS2 روی همان GLCD مشخص می شود.البته باید بگم که این 64 سطر واقع در 8 صفحه است که هر صفحه 8 بیت میشود
یعنی شما میتونید دونه دونه ستونها رو مقدار دهی کنید اما نمیتونید دونه دونه سطرها رو مقدار دهی کنید یعنی باید ابتدا صفحه را مشخص کنید بعد با گذاشتن عددی بین 0 تا 255 ،یا 0X00 تا 0XFF داتهای مورد نظر را روشن کنید.خب توضیح زیاد شد اگه میخوایید کامل مسئله GLCD رو بفهمید برید مراجعش مخصوصا کتاب مرجع(مظاهریان،بیانلو) رو بخونید. کاربرد دیگری که در این پروژه هست ADC است . اگه دقت کرده باشید ADC در ساختار خودش چند خاصیت دارد.یکی اینکه ولتاژ منفی را تبدیل نمیکند(که این کار با کانال تفاضلی حل میشود)
و دیگر اینکه دقت پایین دارد (یعنی هر پله آن 0.005 است که خواهید دید که دقت خوبی نیست)اینم دو تا نکته از ADC :redface:
توضیح برنامه اینکه ابتدا یک تصویر در GLCD لود میشود وبترتیب بجای اینکه صفحه پاک شود بعد از هر 100 میلی ثانیه دوباره لود میشود که تشکیل دهنده صفحه اصلی اسکوپ است. و واحد ACD
را که به صورت کانال تفاضلی(برای اینکه منفی را هم تشخیص دهد ) پیکر بندی شده را احضار میکند.
چون در هر ستون باید یک بیت روشن باشد(0و1و2و4و8و16و32و64و128) به صورت فورمولیک تابع مقدار بیت و سطر را تعیین میکند(البته باید یک معیار هم داشته باشید ، مثلا من سطر 4 خانه 0 را صفر اسکوپ و سطر 0 و بیت 0 را 5 گرفتم)
بعد بیت و سطر تعیین شده و ستون هم که مشخص است میکرو داتی روی همان جایی که ما میخواهیم ایجاد میکند .
البته بهمین سادگی ها هم نیست یه ذره روش فکر کنید
در پایان 4 نکته رو هم بگم که کامل بشه :
1.این اسکوپ میتواند تواناییهای دیگر هم داشته باشه ، مثلا قاعدتا نمیتونه بیشتر از 1KHZ رو نشون بده چون ADC توانایی نداره
پس میشه براش TIME/DIV تعریف کرد .یا اینکه آنرا تریگر کرد.یا VOLT/DIV گذاشت که اگه یه ذره فکر کنید کاملا قابل حله
2.فرکانس میکرو 16MHZ است.
3.اگه تازه کاریید ابتدا کتابی رو در زمینه ی GLCD , ADC مطالعه کنید.
4.اگه میتونید یه سوالی هم واسه من پیش اومده هر کی جواب داد جایزه داره .چی جوری میشه GLCD رو بسمت چپ و راست شیفت داد(مرسی)
[[left][left][right][center][left][center][pre]
left]/
[left]/**************************************************//avr ossiloscope//***********************************//************************************************** **************************************************
#include <mega32.h>
#include <delay.h>
#define LCD_PORT PORTD
#define LCD_RST PORTB.0
#define LCD_E PORTB.1
#define LCD_RW PORTB.2
#define LCD_RS PORTB.3
#define LCD_CS2 PORTB.4
#define LCD_CS1 PORTB.5
#define ADC_VREF_TYPE 0x50
int r;
unsigned int x,y,i;
unsigned int j,w,z;
unsigned int k,l=0,m,o,h;
//************************************************** *********************************
char picture[]={
کد های یه عکس با استفاده از GLCD TOOL
};
//************************************************** **********************************
void write_lcd(char columns,char page,char data);
void latchlcd();
void glcd_init();
void read_adc(void)
{
ADMUX=ADC_VREF_TYPE;
#asm
in r30,mcucr
cbr r30,__sm_mask
sbr r30,__se_bit | __sm_adc_noise_red
out mcucr,r30
sleep
cbr r30,__se_bit
out mcucr,r30
#endasm
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
r=ADCW;
if(r>=0&&r<=128){
m=3;
h=(float)(128-r)/128*7;
o=1;
o<<=h;
}
else if(r>=129&&r<=256){
m=2;
h=(float)(256-r)/128*7;
o=1;
o<<=h;
}
else if(r>=257&&r<=384){
m=1;
h=(float)(384-r)/128*7;
o=1;
o<<=h;
}
else if(r>=385&&r<=511){
m=0;
h=(float)(511-r)/128*7;
o=1;
o<<=h;
o=o+1;
}
else if(r>=512&&r<=640){
m=7;
h=(float)(640-r)/128*7;
o=1;
o<<=h;
o=o+128;
}
else if(r>=641&&r<=768){
m=6;
h=(float)(768-r)/128*7;
o=1;
o<<=h;
}
else if(r>=769&&r<=896){
m=5;
h=(float)(896-r)/128*7;
o=1;
o<<=h;
}
else if(r>=897&&r<=1024){
m=4;
h=(float)(1024-r)/128*7;
o=1;
o<<=h;
}
LCD_RS=0;
LCD_RW=0;
LCD_PORT=0xB8 | m;
latchlcd();
LCD_RS=0;
LCD_RW=0;
LCD_PORT=0x40 | l;
latchlcd();
LCD_RS=1;
LCD_RW=0;
LCD_PORT=o;
latchlcd();
l++;
//delay_us(20);
}
void main(void)
{
DDRD=255;
DDRB=255;
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x85;
glcd_init();
while(1){
x=0; y=0;
for(i=0;i<1024;i++){
if(x>127){
x=0;
y++;
}
write_lcd(x,y,picture[i]);
x++;
}
for(k=0;k<=104;k++){
if(k<=63){
LCD_CS1=1;
LCD_CS2=0;
}
else{
LCD_CS1=0;
LCD_CS2=1;
if(l==40)
l=1;
}
if(l==64)
l=0;
read_adc();
}
delay_ms(150);
l=0;
};
}
//************************************************** ***************************************
void write_lcd(char columns,char page,char data){
if(columns>=64){
LCD_CS1=0;
LCD_CS2=1;
}else{
LCD_CS1=1;
LCD_CS2=0;
}
LCD_RW=0;
LCD_RS=0;
LCD_PORT=0xB8 | page;
latchlcd();
LCD_RW=0;
LCD_RS=0;
LCD_PORT=0x40 | columns;
latchlcd();
LCD_RW=0;
LCD_RS=1;
LCD_PORT=data;
latchlcd();
}
//************************************************** ***************************************
void glcd_init(){
unsigned char i;
LCD_RST=0;
LCD_RST=1;
LCD_RS=0;
LCD_CS1=0;
LCD_CS2=1;
for(i=0;i<2;i++){
LCD_PORT=0x3E;
latchlcd();
LCD_PORT=0x40;
latchlcd();
LCD_PORT=0xB8;
latchlcd();
LCD_PORT=0xC0;
latchlcd();
LCD_PORT=0x3F;
latchlcd();
LCD_CS1=~LCD_CS1;
LCD_CS2=~LCD_CS2;
}
}
//************************************************** ***************************************
void latchlcd(){
LCD_E=1;
LCD_E=0;
}
http://www.mediafire.com/download.php?iwobflmlezg


الان سه روز از نوشتن این مطلب میگذره که من بطور کامل اسیلسکوپو نوشتم :wow: دیدید گفتم کاری نداره :NO:
عکساشو پایین میذارم.


دیدگاه