ايران ويج

نسخه‌ی کامل: آموزش بیسکام و کدویژن با پروژه های عملی ( بدون جزوه و فیلم )
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2 3 4 5 6 7 8 9 10
سلام دوستان.
اینم یک پروژه باحال.
این پروژه اندازه گیری ولتاژ 0 تا 220ولت Dc با میکروکنترل avr مدل atmega8 هستش.

مشخصات پروژه:
میکرو کنترل به کار رفته:atmega8
کریستال:8.000.000
زبان برنامه:بیسیک و سی

توجه:تمامی فایل های بیسیک و سی و شبیه ساز رو پیوست کردم.
توجه:اگه این مطلب به دردتون خورد یا هرچیز دیگه ای تشکر کردن(البته با استفاده از گزبنه ی تشکر)رو فراموش نکنید.
توجه:از این به بعد هر برنامه ای رو که قرار میدیم دیگه توضحات اضافی و توضیحاتی رو که قبلا دادم رو نمیدم.(بدلیل اینکه وقت ندارم).
هر کی هر سوالی داشت میتونه همینجا مطرح کنه یا ایمیل بزنه یا زنگ بزنه یا .......

برنامه به زبان بیسیک:
کد:
$regfile = "m8def.dat"
$crystal = 8000000

Config Lcdpin = Pin , Db7 = Portd.7 , Db6 = Portd.6 , Db5 = Portd.5 , Db4 = Portd.4 , E = Portd.3 , Rs = Portd.2 : Config Lcd = 16 * 2
Config Adc = Single , Prescaler = Auto

Dim A As Word
Dim B As Single
Dim V As String * 5

Cursor Off

Locate 1 , 1 : Lcd "Www.IranLed.Com" : Locate 2 , 1 : Lcd "h.unique" : Wait 1 : Cls

Start Adc

Do
A = Getadc(6)
B = A * 0.2150537634408602
V = Fusing(b , "#.&")
Locate 1 , 1 : Lcd "Vlotag:" ; V ; "v" ; " "
Locate 2 , 1 : Lcd "Dc VoltMetr"

Loop

End

برنامه به زبان سی:
کد:
#include <mega8.h>
#include <alcd.h>
#include <stdio.h>
#include <delay.h>

unsigned int a;
float b;
char v[20];

unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (0x40 & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

void main(){
ADMUX=0x40 & 0xff;
ADCSRA=0x83;
lcd_init(16);
lcd_gotoxy(0,0);lcd_putsf("Www.IranLed.Com");lcd_gotoxy(0,1);lcd_putsf("h.unique");delay_ms(1000);lcd_clear();
do{
a=read_adc(6);
b=a*0.2150537634408602;
sprintf(v,"Vlotag:%0.1f v ",b);
lcd_gotoxy(0,0);lcd_puts(v);
lcd_gotoxy(0,1);lcd_putsf("Dc VoltMetr");
}while(1);
}

شبیه ساز:
[تصویر:  Dc_Voltmetr_220V_Pic.jpg]

توضیحات کلی:
مبدل آنالوگ به دیجیتال.
یکی از قابلیت های میکروکنترل Avr اینه که یک مبدل آنالوگ به دیجیتال 10 بیتی دارن که اگه ولتاژ آنالوگ بین 0 تا 5 ولت رو رو پایه های ADCx قرار بدیم اونو اندازه گیری میکنه و اگه 0 بود ریجستر خودشو 0 میکنه و اگه 5ولت بود رجیسترش برابر 1023میشه.
تو این پروژه هم با استفاده از پل مقاومت 220 ولت رو به 5ولت تبدیل کردیم که میکرو بتونه اونو اندازه گیری کنه.
اون پتانسیومتری رو هم که قرار دادم واسه ایته که ولتاژ رو ورودی رو تغییر بدیم.
اگه ما ولتاژ اصلی رو بر 1023 تفسیم کنیم و بعد جواب رو ضرب در مقدار ADC کنیم ولتاژ رو میتونیم رو Lcd نشون بدیم!

تـوجـه:حتما هردو پایه های Avcc و Aref رو به +5ولت متصل کنید.

توضیحات برنامه بیسیک:
1.پیکر بندی ADC در بیسیک:
کد:
CONFIG ADC = single, PRESCALER = AUTO, REFERENCE = opt
فقط در اینجا اگر گزینه ی REFERENCE رو انتخاب کنیم ما 3تا انتخاب خواهیم داشت.
1.Avcc
2.Aref
3.Internal
اگه ما گزینه ی Avcc رو انتخاب کنیم ولتاژ پایه adc با ولتاژ پایه Avcc مقایسه میشه.
اگه ما گزینه ی Aref رو انتخاب کنیم ولتاژ پایه adc با ولتاژ پایه Aref مقایسه میشه.
اگه ما گزینه ی Internal رو انتخاب کنیم ولتاژ پایه adc با ولتاژ داخلی میکرو که 2.56 ولت هستش مقایسه میشه.

2.دستورات مربوط به ADC:

2-1:برای شروع مقایسه باید از دستور:
کد:
Start Adc
استفاده کنیم و واسه استپ کردن مقایسه از دستور:
کد:
Stop Adc
استفاده کنیم.

2-2:برای دریافت مقدار ADC باید یک متغیر از نوع Word تعریف کنیم و از دستور:
کد:
var = GETADC(channel [,offset])
متغیری رو که تعریف کردیم برابر این دستور قرار میدیم و بجای Channel شماره پایه ADC که رو اون ولتاژ قرار داره رو قرار میدیم.
مثال:
کد:
Config Adc = Single , Prescaler = Auto
Dim A As Word
A = Getadc(0)
Lcd A
در مثال بالا مقدار ADC0 تو متغیر a ریخته میشه و رو lcd نمایش داده میشه.

3.دستور Fusing.
این دستور برای ساده کردن متغیر ها استفاده میشه.
فرم کلی این دستور:
کد:
target = FUSING(source, "mask")
مثال:
کد:
V = Fusing(b , "#.&")
متغیری که برابر این دستور قرار میگره حتما باید از توع String باشه.
در این مثال متغیر b با یک رغم اعشار ساده شده ولی روند نشده.
این علامت & برای ساده کردن هستش ولی عدد رو رند نمیکنه.
این علامت # برای ساده کردن هستش ولی عدد رو هم رند میکنه.

توضیحات برنامه سی:
در این کامپایلر دستوراتی همانند دستورات بیسکام وجود نداره و باید ریجستر هارو دستی مقدار دهی کنیم که اگه من بخوام ریجیستر ها و مقدار دهی اونارو توضیح بدم خیلی خیلی حجم مطالب زیاد میشه لذا از توضیح دادن این مطالب خوداری میکنم و به شما عزیزان توصیه میکنم که حتما یک کتاب مانند مرجع کامل میکرو کنترل های AVR تهیه کنید.اگر بازم کسی سوالی در این مورد داشت حتما با من در میون بزاره.

ساخت کد ها با استفاده از کدویزاد در کدویژن:
1.بر روی گزینه ی CodeWizard کلیک کنید.با کلیک بر روی این گزینه صفحه ی زیر باز میشه و بعد از انتخاب گزینه ی اول برروی ok کلیک کنید.
[تصویر:  Dc_Voltmetr_220V_CodeWizard_1_.jpg]

بعد از انجام کار های بالا صفحه ی زیر باز میشه.
[تصویر:  Dc_Voltmetr_220V_CodeWizard_2_.jpg]
در این صفحه گزینه ی ADC رو انتخاب کنید.
بعد گزینه ی Enable ADC رو انتخاب کنید.
در قسمت 5 پایه ای که ولتاژ روی اون با ADC مقایسه میشه رو انتخاب کنید و در قسمت 6 هم اون فرکانسی که دوس دارین رو انتخاب کنید.
اگه گزینه ی Use 8 bit رو انتخاب کنید مقایسه کننده از 10 بیتی به 8 بیتی تغییر میکنه.
اگه گزینه ی Interrupt رو انتخاب کنید بعد از پایان مقایسه یک وقفه رخ میده.
بعد از اینکه تنظیمات مورد نظرتونو انجام دادین رو گزینه 7 که Preview هستش رو انتخاب کنید.
بعد از انتخاب این گزینه کد های شما در صفحه ی Program Preview نمایش داده میشه.اون کد هارو مارک آل کنید و درون برنامه اصلی قرار بدین.

برای خواندن مقدار ADC ابتدا یک متغیر 16 بیتی تعریف میکنیم و از دستور:
کد:
var=read_adc(x);
که در اینجا var نام متغیری هستش که تعریف کردیم و x هم شماره پایه ای هستش که ولتاژ رو اون قرار داره.
مثال:
کد:
a=read_adc(0);
در مثال بالا مقدار ADC0 درون متغیر a قرار میگیره.

نـــکــــتـــه:بچه ها این کد هایی که در زیر گذاشتم مربوط به پیکر بدی ADC هستش.همون دستوراتی که با کدویزارد به دست آوردیم.
کد:
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (0x40 & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

تــــــــــوجه:اگه این مطلب به دردتون خورد یا هرچیز دیگه ای تشکر کردن(البته با استفاده از گزبنه ی تشکر)رو فراموش نکنید.
توجه:تمامی فایل های بیسیک و سی و شبیه ساز رو پیوست کردم.

امید وارم که توضیحات من و این پروژه بهتون کمکی کرده باشه.
موفق باشید.....Heart
حسین جون یه قفل رمز ساختم ولی نتونستم کی پدشو راه بندازم؛ یعنی حوصله ور رفتن نداشتمWhistle
مدارشو با برنامه بیسیک واست میذارم،قربون دستات ببین چطور میتونم برنامه کی پد و اصلاح کنم؛

کد:
$regfile = "m32def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
Config Kbd = Porta , Debounce = 200 , Delay = 100
Dim X As Byte
Dim F As Byte
Dim B As Byte
Dim Y As Byte
Dim Ramz As Integer
Dim Count As Byte
Declare Sub Convert()
Cursor Off
Cls
Locate 1 , 1
Lcd "enter pass"
Ramz = 0
Locate 1 , 2
Cursor Blink
Main:
Do
X = Getkbd()
Y = 16
If X < 16 Then Call Convert
If X = 0 Then
Waitms 200
Shiftcursor Left
Ramz = Ramz / 10
If Count > 1 Then Count = Count - 1
End If
If Y <= 9 Then
Waitms 200
Lcd Y
Ramz = Ramz * 10
Ramz = Ramz + Y
Count = Count + 1
End If
Loop Until Count = 4
If Ramz = 1372 Then
Locate 2 , 13
Lcd "pass is true "
Set Portd.1
Else
Lcd "pass is false "
End If
Goto Main
Sub Convert()
Select Case X
Case 8 : Y = 2
Case 4 : Y = 3
Case 5 : Y = 0
Case 13 : Y = 1
End Select
End Sub

پروژه هارو بدون منبع خودم کار می کنم، نمیدونم تا چه حد درسته؟

اینم کل پروژه؛

فایل پروژه
سلام به همگی

این بار می خواهیم یاد بگیریم چطوری توسط adc میکرو یک سنسوری رو راه بندازیم؟
پروژه ای که میخواهیم کار کنیم، راه اندازی یه سنسور دما توسط میکرو avr که مقدار افزایش و کاهش دما روی lcd قابل رویت باشه.

[تصویر:  wqsw0kcwk0qj2olbj1kj.jpg]

برای راه اندازی این پروژه من از یک ای تی 32 ، یک سنسور دما lm35 و یک lcd 2*16 استفاده کردم؛

برنامه بیسیک(کلیه قسمت ها تو پروژه های قبلی توضیح داده شده اند) ؛

کد:
$regfile = "m32def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5
Config Adc = Single , Prescaler = Auto , Reference = Avcc

Dim Dama As Word
Dim A As Byte

Cursor Off

start adc

Do

A = Getadc(0)
Dama = A / 2
Dama = Dama - 1
Locate 1 , 1
Lcd "dama is : " ; Dama;
Loop
end


سورس و شبیه ساز پیوست شد.
امید جان اینم همونی که میخواستی.
فقط چند تا توضیح بدم.موقعی که میخوای رمز انتخاب کنی(تو برنامه)اول رمزتو یدونه صفر بزار.ولی موقعی که میخوای اونو اجرا کنی نیازی به وارد کردن اون 0 اولی نیس.
اگه توجه کنی تو برنامه رمز رو:
کد:
Ramz = "012345"
انخاب کردم.ولی موقعی که میخوای رمز رو وارد کنی باید 12345 رو بزنی تا رمز رو قبول کنه.
بعد از اینکه رمزتو وارد کردی مساوی(=)رو بزن تا رمز تست شه.
بعد از اینکه رمز تست شد اگه اشتباه بود یا هر چیز دیگه و خواستی دوباره رمز بزنی کلید(on/c)رو بزن ورمزتو وارد کن.

بعد اون برنامه ای که لطف کردی و گذاشتی(همون دما سنجه)تو برنامه ای که نوشتی چندتا ایراد بود:
1.کریستال تو برنامه ای که نوشتی اشتباس.بجای 1مگا هرتز 100کیلو هرتز رو انتخاب کردی.
2.آخر برنامه هم End نذاشتی.
3.متغیر هارو بعد از کانفیگ تعریف کن.
4.Cursor Off رو هم نیازی نیس که تو حلقه بزاری.قبله حلقه بزار.
اینم برنامه اصلاح شده:
کد:
$regfile = "m32def.dat" : $crystal = 1000000

Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 : Config Lcd = 16 * 2
Config Adc = Single , Prescaler = Auto , Reference = Avcc

Dim Dama As Word
Dim A As Byte

Cursor Off

Start Adc

Do

A = Getadc(0)
Dama = A / 2
Dama = Dama - 1
Locate 1 , 1 : Lcd "dama is : " ; Dama;

Loop

End

راستی پروتوس من با lm35 مشکل داره.دیگه نشد که اون تابعی که نوشتی رو چک کنم.Biggrin

موفق باشی.....Heart
سلام دوستان.
اینم یک پروژه دیگه.
این پروژه ساخت ساعت دقیق و تقویم شمسی با تایمر های میکرو هستش.

مشخصات پروژه:
میکرو کنترل به کار رفته:atmega8
کریستال:1.000.000
زبان برنامه:بیسیک و سی

توجه:تمامی فایل های بیسیک و سی و شبیه ساز رو پیوست کردم.
توجه:اگه این مطلب به دردتون خورد یا هرچیز دیگه ای تشکر کردن(البته با استفاده از گزبنه ی تشکر)رو فراموش نکنید.
توجه:از این به بعد هر برنامه ای رو که قرار میدیم دیگه توضحات اضافی و توضیحاتی رو که قبلا دادم رو نمیدم.(بدلیل اینکه وقت ندارم).
هر کی هر سوالی داشت میتونه همینجا مطرح کنه یا ایمیل بزنه یا زنگ بزنه یا .......

برنامه به زبان بیسیک:
کد:
$regfile = "m8def.dat"
$crystal = 1000000

Config Lcdpin = Pin , Db7 = Portd.7 , Db6 = Portd.6 , Db5 = Portd.5 , Db4 = Portd.4 , E = Portd.3 , Rs = Portd.2 : Config Lcd = 16 * 2
Config Timer2 = Timer , Async = On , Prescale = 128
Config Portc = Input

Dim H As Byte , M As Byte , S As Byte , Mo As Byte , D As Byte
Dim Y As Word

On Timer2 Timee

Enable Interrupts : Enable Timer2

Start Timer2

Cursor Off

Locate 1 , 1 : Lcd "Www.IranLed.Com" : Locate 2 , 1 : Lcd "h.unique" : Wait 1 : Cls

Y = 91 : Mo = 6 : D = 29 : H = 9 : M = 34 : S = 00

Do
If S > 59 Then : S = 0 : Incr M : End If
If M > 59 Then : S = 0 : M = 0 : Incr H : End If
If H > 23 Then : S = 0 : M = 0 : H = 0 : Incr D : End If

If D > 31 And Mo > 0 And Mo < 7 Then : Incr Mo : D = 1 : End If
If D > 30 And Mo > 6 And Mo < 9 Then : Incr Mo : D = 1 : End If
If D > 29 And Mo = 12 Then : Incr Y : Mo = 1 : D = 1 : End If
If Mo > 12 Then : Incr Y : Mo = 1 : D = 1 : End If

If Pinc.0 = 1 Then : Incr S : Bitwait Pinc.0 , Reset : End If
If Pinc.1 = 1 Then : Incr M : Bitwait Pinc.1 , Reset : End If
If Pinc.2 = 1 Then : Incr H : Bitwait Pinc.2 , Reset : End If

If Pinc.3 = 1 Then : Incr D : Bitwait Pinc.3 , Reset : End If
If Pinc.4 = 1 Then : Incr Mo : Bitwait Pinc.4 , Reset : End If
If Pinc.5 = 1 Then : Incr Y : Bitwait Pinc.5 , Reset : End If

Locate 1 , 1 : Lcd "H:" ; H ; " M:" ; M ; " S:" ; S ; " "
Locate 2 , 1 : Lcd "Y:" ; Y ; " M:" ; Mo ; " D:" ; D ; " "
Loop

End 'end program

Timee:
Incr S
Timer2 = 51
Return

برنامه به زیان سی:
کد:
#include <mega8.h>
#include <delay.h>
#include <alcd.h>
#include <stdio.h>

unsigned char h=9,m=34,s=0,mo=6,d=29;
unsigned int y=91;

char time[16];
char day[16];

interrupt [TIM2_OVF] void timer2_ovf_isr(void){
s++;
TCNT2=51;
}

void main(){
lcd_init(20);
ASSR=0x08;
TCCR2=0x05;
TIMSK=0x40;
#asm("sei")
DDRC=0xff;
lcd_gotoxy(0,0);lcd_putsf("Www.IranLed.Com");lcd_gotoxy(0,1);lcd_putsf("h.unique");delay_ms(1000);lcd_clear();
do{
sprintf(time,"H:%d M:%d S:%d",h,m,s);lcd_gotoxy(0,0);lcd_puts(time);
sprintf(day,"Y:%d M:%d D:%d",y,mo,d);lcd_gotoxy(0,1);lcd_puts(day);

if(s>59){s=0;m++;lcd_clear();}
if(m>59){s=0;m=0;h++;}
if(h>23){s=0;m=0;h=0;d++;}

if(d>31&&mo>0&&mo<7){mo++;d=1;lcd_clear();}
if(d>30&&mo>6&&mo<9){mo++;d=1;lcd_clear();}
if(d>29&&mo==12){y++;mo=1;d=1;lcd_clear();}
if(mo>12){y++;mo=1;d=1;lcd_clear();}

if(PINC.0==1){s++;do{if(PINC.0==0)break;}while(1);}
if(PINC.1==1){m++;do{if(PINC.1==0)break;}while(1);}
if(PINC.2==1){h++;do{if(PINC.2==0)break;}while(1);}

if(PINC.3==1){d++;do{if(PINC.3==0)break;}while(1);}
if(PINC.4==1){mo++;do{if(PINC.4==0)break;}while(1);}
if(PINC.5==1){y++;do{if(PINC.5==0)break;}while(1);}
}while(1);
}

شبیه ساز:
[تصویر:  Watch_data_simu_pic.jpg]

توضیحات کلی:
تایمر چیه؟تو میکرو های AVR تایمر اگه 16 بیتی باشه تا 65535 تا میشموره بعده اینکه تا 65535 شمورد پرچم سرریز خودشو 1 میکنه و از نو شروع به شموردن میکنه و اگه تایمر 8 بیتی باشه تا 255 تا میشموره بده اینکه تا 255 شمورد پرچم سرریز خودشو 1 میکنه و از نو شروع به شموردن میکنه.
با این امکان میشه وصیله های زیادی رو درست کرد و در کل خیلی کاربرد داره.
یکی از این کاربرد هاشم در ساخت ساعت هستش.

توضیحات برنامه بیسیک:
1.پیکر بندی تایمر/کانتر 2 در مد تایمر:
این تایمر 8 بیتی هستش و میتونه فرکانس خودش رو هم از پایه های TOSC1,TOSC2 دریافت کنه.
فرم کلی دستور به شکل زیر هستش:
کد:
CONFIG TIMER2 = TIMER | PWM , ASYNC=ON |OFF,
PRESCALE = 1 | 8 | 32 | 64 | 128 | 256 | 1024 ,
COMPARE = CLEAR | SET | TOGGLE | DISCONNECT ,
PWM = ON | OFF ,
COMPARE_PWM = CLEAR_UP| CLEAR_DOWN | DISCONNECT ,
CLEAR_TIMER = 1|0
[,CONFIGURATION=NAME]
در بالا با انتخاب ASYNC=ON تایمر فرکانس خودشو از پایه های TOSC1,TOSC2 دریافت میکنه و اگه ما یک کریستال ساعت که فرکانسش(32768Hz)هستش رو روی این پایه ها قرار بدیم و Prescale = 128 انتخاب کنیم به صورت دقیق هر 1ثانیه یکبار پرچم سریز شدن تایمر 1 میشه.
مثال:
کد:
Config Timer2 = Timer , Async = On , Prescale = 128

2.برای اینکه تایمر شروع به شمردن کنه از دستور:
کد:
Start TimerX
استفاده میشه که بجای X شماره تایمر مورد نظر رو قرار میدیم.

3.برای اینکه هر موقع پرچم سرریز تایمر 1شد ما متوجه شیم میشه از 1وقفه استفاده کرد.
مثال:
کد:
On Timer2 Timee
Enable Interrupts
Enable Timer2
در این مثال هر موقع تایمر 2 سرریز شد برنامه به لیبل Timee پرش میکنه.

4.دستور های Incr و Decr:
دستور Incr یک واحد به یک متغیر اضافه میکنه.
دستور Decr یک واحد از یک متغیر کم میکنه.
مثال:
کد:
Incr A
Decr B

5.دستور Bitwait:
فرم کلی این دستور:
کد:
BITWAIT x , SET/RESET
با این دستور تا X یکی از شرایط Set/Reset را پیدا نکنه اجرای برنامه متوقف میشود.
مثال:
کد:
Bitwait Pinc.3 , Reset
در این مثال تا Pinc.3 برابر با 0 منطقی نشه اجرای برنامه متوقف میشه.

توضیحات برنامه سی:
در این کامپایلر دستوراتی همانند دستورات بیسکام وجود نداره و باید ریجستر هارو دستی مقدار دهی کنیم که اگه من بخوام ریجیستر ها و مقدار دهی اونارو توضیح بدم خیلی خیلی حجم مطالب زیاد میشه لذا از توضیح دادن این مطالب خوداری میکنم و به شما عزیزان توصیه میکنم که حتما یک کتاب مانند مرجع کامل میکرو کنترل های AVR تهیه کنید.اگر بازم کسی سوالی در این مورد داشت حتما با من در میون بزاره.

ساخت کد ها با استفاده از کدویزاد در کدویژن:
1.بر روی گزینه ی CodeWizard کلیک کنید.با کلیک بر روی این گزینه صفحه ی زیر باز میشه و بعد از انتخاب گزینه ی اول برروی ok کلیک کنید.
[تصویر:  Dc_Voltmetr_220V_CodeWizard_1_.jpg]

با انجام عملیات های بالا صفحه ی زیر باز میشه.
[تصویر:  Untit2led_1.jpg]
در صفحه ی بالا گزینه ی Timers رو انتخاب کنید و در همون صفحه تایمر 2 رو هم انتخاب کنید.
در قسمت Clock Source گزینه ی TOCS1 Pin رو انتخاب کنید.
در قسمت Clock Value گزینه ی 128 رو انتخاب کنید.
و مطابق شکل تیک گزینه ی Overflow Interrupt رو انتخاب کنید تا وقفه ی مربوط به تایمر 2 هم فعال شه.
بعد از انجام تمامی کارهای بالا بر روی گزینه ی 8 که Preview هستش رو انتخاب کنید.
بعد از انتخاب این گزینه کد های شما در صفحه ی Program Preview نمایش داده میشه.اون کد هارو مارک آل کنید و درون برنامه اصلی قرار بدین.

نـکـتـه1:برای مقدار دهی ریجستر تایمر 2 ریجسترشو برابر یک مقدار قرار میدیم.
مثال:
کد:
TCNT2=51;

نـکـتـه2:برای خواندن مقدار ریجستر تایمر 2 یک متغیر رو برابر ریجسترش قرار میدیم.
مثال:
کد:
TCNT2=a;

تــــــــــوجه:اگه این مطلب به دردتون خورد یا هرچیز دیگه ای تشکر کردن(البته با استفاده از گزبنه ی تشکر)رو فراموش نکنید.
توجه:تمامی فایل های بیسیک و سی و شبیه ساز رو پیوست کردم.

امید وارم که توضیحات من و این پروژه بهتون کمکی کرده باشه.
موفق باشید.....Heart
سلام
ميشه مدار دماسنجو هم توي اين پروژه قرار داد اگه اره لطفا برنامشو اينجا بزارين
اگه برق ميكرو قطع بشه بايد تاريخ و ساعتو دوباره تنظيم كنيم ؟
ممنونم
نقل قول: سلام
درورد برشما.
نقل قول: ميشه مدار دماسنجو هم توي اين پروژه قرار داد اگه اره لطفا برنامشو اينجا بزارين
آره میشه ولی وقتش رو ندارم که انجامش بدم.
نقل قول: اگه برق ميكرو قطع بشه بايد تاريخ و ساعتو دوباره تنظيم كنيم ؟
بله.
نقل قول: ممنونم
خواهش میشه دوسته من.
با سلام و وقت بخیر
اقا حسین دستتون درد نکنه.تاپیک فوق العاده خوبی هستLaugh. خیلی کمکم کرد
البته از همه دوستان هم تشکر میکنم.
میشه بگین که مشکل این برنامه چی هستش؟
و شبیه سازیش رو واسم رسم کنین؟
بازم مرسی از همگی
موفق باشین[/align]

$regfile = "m16def.dat"
$crystal = 8000000
Config Kbd = Porta
Dim A As Byte
Ali:
Do
A = Getkbd
If A < 16 Then Goto Kerman
Loop
End
Kerman:
Cls
Lcd A
Do
Loop Until A = 16
Goto Ali

راستش نمیدونم خط هفت پرانتز رو داخل متغییر a
بذارم.هرکار میکنم اروور میدهSad
و در رسم پروتئوسم مشکل دارم
ممنون میشم کمکم کنین
برنامه چندتا مشکل داره؛
lcd تعریف نشده

کد:
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcd = 16 * 2

Cursor Off
Cls
واسه کی پد، case تعریف نشده
کد:
A = Getkbd
Select Case A
.
.
.
end select

اون حلقه do و loop رو هم نذارید بهتره، به جاش از زیربرنامه استفاده کنید؛
مثلا
کد:
declare sub x
do
call x
.
.
.
loop

x:
.
.
end sub
return

در مورد مدارم اگه بگید می خواهید دقیقا چی کار کنه، تو شبیه ساز کمکتون می کنم
تا اینجا که به یه میکرو مگا16 و یه lcd و یه کی پد نیاز داریم که lcd و به یه پورت مثلا c و کی پد و به پورت دیگه ای مثل a وصل کنیم.
من تعریف ال سی دی رو توی برنامه نمیگم.از جای دیگه تعریفش میکنم
option/compile/lcd
من می خوام زمانی روی صفحه کلید ماتریسی میزنم عدد زده شده رو روی ال سی دی نشون بده.
واسه این کار باید مثل کدی که گذاشتم واسه کی پد case تعریف کنید
کد:
Dim B As Byte

B = Getkbd()
Select Case B
Case 1:
Locate 1 , 2 : Lcd "*"
.
.
.
End Select
می تونید به روش date و از طریق جدول هم کی پد و راه اندازی کنید؛
کد:
Dim B As Byte
Dim a As String * 10

a = Lookupstr(b , key)

key:
Data "7" , "4" , "1" , "On" , "8" , "5" , "2" , "0" , "9" , "6" , "3" , "="
Data "/" , "*" , "-" , "+" , " "
صفحه‌ها: 1 2 3 4 5 6 7 8 9 10