پاسخ : آموزش زبان c و نرم افزار کدویژن
نقل قول:
نوشته اصلی توسط
مخفی
[nishkhand]
#include <stdio.h>
#include <delay.h>
int main()
{
while{
led=1;
delay_ms(1000);
led=0;
delay_ms(1000);
}
returno;
}
خب برای شروع بد نیست
فقط چنتا نکته وجود داره
1- تو برنامه ریزی ای سی فایل stdio وجود نداره
2- تابع به صورت viod نوشته میشه
3- return نداریم تو ای سی
4- از همه مهمتر اینکه شما متغیرتو تعریف نکردی
اینجا حتما برنامه ارور میده که متغیر led تعریف نشده هست
5- نکته اخر هم اینکه قرار بود دو تا led رو خلاف هم روشن و خاموش کنیم
حالا من درستش رو میگم شما اصلاح کن
پاسخ : آموزش زبان c و نرم افزار کدویژن
نقل قول:
نوشته اصلی توسط
hadi elec
خب الان اطلاعاتمون برای برامه نویسی خوبه
خب میخوایم شروع کنیم
الان برنامه نویسی رو با همین اطلاعات موجود انجام میذیم و تنظیمات میکرو و کد ویژن رو کاری نداریم
ما اول باید برنامه نویسی یاد بگیریم بعد بریم سراغ تنظیمات
ما یه برنامه میخوایم بنویسیم که یه led با فرکانس 1 هرتز چشمک بزنه و یک led هم همواره بر خلاف led اولی عمل کنه و با اون not باشه
نظرتون چیه؟
ایده بدید تا ببینیم چنتا ایده میشه جمع کرد
برنامه رو کامل از اول تا اخر بنویسید
اینو میتونید به عنوان تمرین هم در نظر داشته باشید
این اولین نوع برنامه هست با یه متغیر کمکی#include<mega16.h>
#include<delay.h>
bit x=0;
void main(){
while(){
led1=x;
x=!x;
led2=x;
delay_ms(1000);
{{
این دومین نوع برنامه بدون متغیر کمکی و با استفاده کمی پیچیده ای از منطق برنامه و دستورات
#include<mega16.h>
#include<delay.h>
void main(){
while(){
led1=!led1;
led2=!led1;
delay_ms(1000);
{{
خی اینم سومین نوع نوشتن هست که ساده ترین هست
#include<mega16.h>
#include<delay.h>
void main(){
while(){
led1=1;
led2=0;
delay_ms(1000);
led1=0;
led2=1
delay_ms(1000);
{{
اینجا چون led متغیر نیست و در واقع یه پورت خروجی از میکرو هست نمیشه به صورت متغیر تعریفش کرد بعدا درباره تعریف پورت به عنوان خروجی و یا ورودی صحبت میکنیم
پاسخ : آموزش زبان c و نرم افزار کدویژن
این برنامه ها رو از نظر تعداد خطوط با هم مقایشه کنید
فکر میکنید تو کدوم دستمون باز تره؟
شما فرض کنید این قسمت ممکنه 10 بار توی یه برنامه پیچیده تر بخواد به انواع مختلف تجرا بشه
کدوم بیشتر قابلیت تغییر داره؟
خب مسلما اولی
چون درواقع ما led هامون به وسیله یه منغیر دارن کنترل میشن نه بصورت مستقیم
در نظر داشته باشید که این متغیر میتونه خروجی یه قسمت دیگه ای از برنامه باشه
(بصورت پیش فرض ما این برنامه ها رو برای ای سی ATMEGA16 از سری میکروی های AVR نوشتیم)
اگر هم صرفا هدف روشن خاموش شدن مهم باشه برامون برنامه دومی ایده آل هست
سومی فقط جنبه اموزشی و تفهیم منطق و چگونگی عمل برنامه برای روشن و خاموش کردن LED ها داره
پاسخ : آموزش زبان c و نرم افزار کدویژن
تحلیل برنامه ها بصورت خط به خط:
(خیلی خیلی مهم)
برنامه اول
#include<mega16.h>
#include<delay.h>
bit x=0;
void main(){
while(){
led1=x;
x=!x;
led2=x;
delay_ms(1000
);
{{
خب اینجا ما به نرم افزار میگیم که میخوایم از at,ega16 استفاده کنیم تا خودش تنظیمات خاصی رو اتومات انجام بده
اینجا به برنامه میگیم که میخواییم از تابع تاخیری استفاده کنیم و اونو باید برامون تنظیم کنه
اینجا یه متغیری از نوع بیت و با مقدار اولیه 0 تعریف میکنیم یادتون هست که بیت فقط دو حالت داشت یا صفره یا یکه
اینجا تابع اصلی برنامه شروع میشه
اینجا یه حلقه بینهاست رو برای اجرای همواره دستورات ایجاد میکنیم
اینجا یکی از پورتهای میکرو رو که اسمشو بصورت قراردادی گذاشتیمled1 رو از نظر مقداری مساوی با متغیر x قرار میدیم یعنی اگر x یک هست اونم بشه 1 و اگر 0 هست اونم بشه 0
اینجا با استفاده از دستور not مقدار متغیر x رو not میکنیم اگر 0 بوده بشه 1 و اگر 1 بوده بشه 0 اینجا یه نکته ای هست توجه کنید چون نوع متغیر bit هست ما میتونیم از این دستور استفاده کنیم چون این متغیر دو حالت کلا میتونه داشته باشه اگر بیشتر از دو حالت میتونست داشته باشه دیگه not معنی نداشت
خب الان که مقدار متغیر x عوض شده و not شده میتونیم led2 رو با اون مقدار دهی کنیم و اینجوری مینویسیم
اینجا هم یه تاخیر یک ثانیه ای ایجاد میکنیم تا این حالت به وجود اومده یک ثانیه ثابت بشه و و ما نتیجه اتفاقات رو ببینیم بعد زا اجرای این دستور برنامه به خط بنفش قبلی میره و اونو اجرا میکنه اگر دقت کنید میبینید که مقدار متغیر الان دیگع 0 نیست و شده 1 پس الان برنامه کلا با یه مقدار دیگه شروع به کار میکنه و باز در انتهای برنامه متغیر مقدارش میشه 0 به خاطر اینکه دستورات ما انعطاف پذیری دارن و ورودیشون رو هم خودمون در اخر برنامه داریم تغییر میدیم میتونیم فقط یه تاخیر بنویسیو در صورتی که اگر به برنامه سوم ناه کنید میبینید که دو تا تاخیر وجود داره یکی برای روشن موندن ها و یکی هم برای خاموش موندن های لامپها خی ما با یه روش ساده برنامه رو خیلی خلاصه کردیم
اخر سر هم به تعداد اکولا های باز شده اکولاد میبیندیم تا مرز حلقه ها مشخص بشه
پاسخ : آموزش زبان c و نرم افزار کدویژن
در راستای اموزشی که داریم دو تا کتاب معرفی میکنم که خالی از لطف نیستن و واقعا به عنوان مرجعی قوی میشه بهشون نگاه کرد
اموزش avr به زبان c
نویسنده حمید بادامی نجات
انتشارات ایلار
خ انقلاب پاساژ فروزنده
اموزش میکروکنتلرهای avr
نویسنده جابر الوندی
انتشارات نص
من خودم شخصا با این دو تا کتاب یاد گرفتم
هر دوشو هم بخریدو بخونید[golrooz]
پاسخ : آموزش زبان c و نرم افزار کدویژن
خب تا اینجا اطلاعاتمون فکر کنم به حدی رسیده باشه که بتونیم بریم سراغ نرم افزار
از این بعد در مورد خود نرم افزار صحبت میکنیم و نکاتی که احیانا درباره برنامه نویسی اولیه جا مونده باشه رو میگیم و یواش یواش شروع به ساخت پروژه تو نرم افزار میکنیم
خب برنامه code vision avr رو میتئنید از اینجا دانلود کنید این تقریبا اخرین نسخه هست
البته تو گوگل اگر سرچ کنید سایتهای زیادی پیدا میکنید که از همشون میتونید این برنامه رو رایگان دانلود کنید
ورژن های این برنامه تفاوت زیادی با هم ندارن
در واقع هرچی میریم جلو تر امکانات برنامه بیشتر میشه که ما با توضیح مسایل اولیه مطالعه درباره امکانات اضافی رو به خودتون واگذار میکنیم کما اینکه اگر سوالی بود هم حتما جواب میدیم
وقتی برنامه رو دانلود کردید نصب کنید و حتما کارهای مربوط به لایسنس رو انجام بدید(پیچیده نیست)
کتاب ها رو هم اگر تهیه کنید خوبه
فکر کنم یه مثال دیگه برای برنامه حل کنیم بعد بریم سراغ نرم افزار بهتر باشه
خب درباره این برنامه هم فکر کنید تا من مقدمات نرم افزار رو اماده کنم
میخوایم یه برنامه بنویسیم که اگر قدار متغیر a که در واقع مقدار یکی از پورتهای ورودی هست 1 شد
اونوقت پایه portb.0 صد میکرو ثانیه 1 بشه و دوباره 0 بشه
و بعدش یک led با فرکانس 2 هرتز چشمک بزنه
و وقتی که مقدار متغیرa صفر شد
اونوقت پایه portb.1 صد میکرو ثانیه 1 بشه و دوباره صفر بشه
و بعدش همون led با فرکانس نیم هرتز چشمک بزنه
نکته: به مقدار اولیه ورودی ها و خروجی ها توجه کنید خیلی مهم هستن و کاملا کنترل شده باید مقدار دهی شوند
اصلا سخت نیست فقط کمی دقت میخواد
شما یک شرط ورودی دارید که کلا دو حالت میتونه داشته باشه
حالا ما میخوایم توی هرحالتی از ورودی دو خروجی خاص داشته باشیم
فرض کنید شما با سرعت چشمک زدن لامپ میخواید وضعیت ورودی رو بدونید خب اونوقت همچین برنامه ای براتون کاربردی میشه
و از طرفی از طریق پایه های portb.0 و portb.1 میخواهیم این اطلاعات رو به یه مدار دیگه بدیم
خب شروع کنید
پاسخ : آموزش زبان c و نرم افزار کدویژن
سلامhttp://uc-njavan.ir/images/wm23aau3m7xovpj0jyhx.gif
با صد بار ویراشhttp://uc-njavan.ir/images/cfi56afdnv2b8l93vn3.gif
خودمم نفهمیدم چی نوشتم:http://uc-njavan.ir/images/zx4js7ltv04jqeikqd.gif
be name khoda
http://uc-njavan.ir/images/cfi56afdnv2b8l93vn3.gif
#include <mega16.h>
#include <stdio.h>
#include <delay.h>
bit a;
bit b.0=0;
bit b.1=0;
bit led;
void main();{
if(a=1){
b.0=1;
delay_us(100);
b.0=0;
led=1;
delay_ms(500);
led=0;
delay_ms(500);}
if(a=0){
b.1=1;
delay_us(100);
b.1=0;
led=1;
delay_ms(2000);
led=0;
delay_ms(2000);
}}
پاسخ : آموزش زبان c و نرم افزار کدویژن
نقل قول:
نوشته اصلی توسط
مخفی
سلام[esteghbal]
با صد بار ویراش[nishkhand]
خودمم نفهمیدم چی نوشتم:[golrooz]
be name khoda[nishkhand]
#include <mega16.h>
#include <stdio.h>
#include <delay.h>
bit a;
bit b.0=0;
bit b.1=0;
bit led;
void main();{
if(a=1){
b.0=1;
delay_us(100);
b.0=0;
led=1;
delay_ms(500);
led=0;
delay_ms(500);}
if(a=0){
b.1=1;
delay_us(100);
b.1=0;
led=1;
delay_ms(2000);
led=0;
delay_ms(2000);
}}
خب خوبه
استعدادشو داری
ولی چنتا نکته::::::::::::
ما اصلا همچین دستور برای ic نداریم تو برنامه قبلی هم بهت گفته بودیم کلا اینو حذف کن
متغیر بیت برای زمانیه که میدونیم متغیرمون فقط دوحالت پیدا میکنه دقت کردی ؟ متغیر
پایه های ورودی و خروجی متغیر حساب نمیشن و اینجوری تعریف نمیشن
و اما برنامه....
خب ما اینا وقتی که ورودیمون تغییر میکنه باید دو تا عمل انجام بدیم
هم تغییر 100 میکرو ثانیه ایه یه پورت
و هم چشمک زدن یه پورت دیگه
خب م چجوری باید اینکارو بکنیم؟
بینید وقتی ما یه دستوری رو که فقط یه بار میخواد انجام بشه میخوایم انجام بدیم کار راحته
ولی بعد از اون یه دستور دیگه ای باید بصورت مداوم انجام بشه
ما این تداوم رو چجوری ایجاد کنیم؟؟؟؟؟
( با رنگها سعی میکنم نقاط مختلف رو تو صحبنهام به هم مربوط کنم- جمله های همرنگ به هم مربوط میشن)
من برنامه رو مینویسم شما دقت کنید
#include<mega16.h>
#include<delay.h>
#define led PORTB.2
bit a=0;
bit b=0;
void main(){
while(1){
if ( a==1){
PORTB.0=1;
delay_us(100);
PORTB.0=0;
while(a==1){
led = b;
delay_ms(2000);
b=!b;
}
}
if(a==0){
PORTB.1=1;
delau_us(100);
PORTB.1=0;
while(a==0){
led=b;
delay_ms(500);
b=!b;
}
}
}}
payan
خب فکر کنم مشخص باشه درسته؟
بازم من خط به خط توضیح میدم چون ایجا یه دستور جدید رو هم میبینید که البته صرفا برای معرفی هست و محاسبه ای نداره
خودتون یه دور بخونید ببینید چجوریه
عرفان جان میتونی برنامه رو توضیح بدی؟
ممنون
پاسخ : آموزش زبان c و نرم افزار کدویژن
نقل قول:
نوشته اصلی توسط
hadi elec
#include<mega16.h>
#include<delay.h>
#define led PORTB.2
bit a=0;
bit b=0;
void main(){
while(1){
if ( a==1){
PORTB.0=1;
delay_us(100);
PORTB.0=0;
while(a==1){
led = b;
delay_ms(2000);
b=!b;
}
}
if(a==0){
PORTB.1=1;
delau_us(100);
PORTB.1=0;
while(a==0){
led=b;
delay_ms(500);
b=!b;
}
}
}}
payan
معرفی ای سی
معرفی تاخیر زمان
ال ای دی به صورت ثابت در تمام برنامه پورت بی 2 باشه
متغییر a که فقط دو حالت هم داره 0 باشه
b هم همینطور
تابع void
یه حلقه بینهایت
خیلی سخت شد[negaran]
پاسخ : آموزش زبان c و نرم افزار کدویژن
نقل قول:
نوشته اصلی توسط
مخفی
[/LEFT]
معرفی ای سی
معرفی تاخیر زمان
ال ای دی به صورت ثابت در تمام برنامه پورت بی 2 باشه
متغییر a که فقط دو حالت هم داره 0 باشه
b هم همینطور
تابع void
یه حلقه بینهایت
خیلی سخت شد[negaran]
خب خوبه
خوب گفتی
اما اصلا سخت نیست
نقل قول:
نوشته اصلی توسط
hadi elec
( با رنگها سعی میکنم نقاط مختلف رو تو صحبنهام به هم مربوط کنم- جمله های همرنگ به هم مربوط میشن)
#include<mega16.h>
#include<delay.h>
#define led PORTB.2
bit a=0;
bit b=0;
void main(){
while(1){
if ( a==1){
PORTB.0=1;
delay_us(100);
PORTB.0=0;
while(a==1){
led = b;
delay_ms(2000);
b=!b;
}
}
if(a==0){
PORTB.1=1;
delau_us(100);
PORTB.1=0;
while(a==0){
led=b;
delay_ms(500);
b=!b;
}
}
}}
payan
ممنون
ببین ما اینجا همونطور که گفتم کلا دو حالت یا داریم
یا ورودیمون مقدار 0 داره یا 1
پس با یه شرط این دو حالت رو از هم سوا میکنیم و شروع میکنیم به تشریح اتفاقات هر بخش
این دو بخش با هم حالت or دارن یعنی به هیچ عنوان همزمان پیش نمیان
پس تداخلی هم ندارن
حالا برای حالت اول:
خب اول باید اون پورتی رو که معرفی کرده بودیم رو 100 میکرو ثانیه ست کنیم و بعدش ریست اینم که معلومه
اما بعدش
خب اینجا ما باید یه برنامه چشمک زن بنویسیم که تا زمانی که وردی ثابت هست برنامه اجرا بشه از if نمیشه استفاده کرد چون فقط یک بار اجرا میشه و برای اجرای بعدیش بقیه خطوط رو هی بررسی میکنه
پس میایم از دستور while استفاده میکنیم که خیلی راحت بی نهایت بار(تا زمانی که شرط نقض نشده باشه) کاری رو که میخوایم انجام بده
اما چرا دستور while رو داخل دستور if نوشتیم؟
اینجا مهمه
برای این ما توی if نوشتیمش که کلا تحت کنترل دستور if باشه و اگر if اجرا نشد اون هم اجرا نشه
وقتی شرط if درست میشه برنامه واردش میشه و بعد از اجرای دستورات ست و ریست کردن 100 میکرو ثانیه ای
میره سراغ while و درستوراتشو اجرا میکنه و وقتی که شرط while نقض شد خود به خود شرطif هم نقض شده پس برنامه کلا از این در میاد و میره به بررسی شرط دوم if میپردازه
فرق این حالت با حالتی که while داخل if نباشه اینه که اینجا سرعت اجرای برنامه بیشتره
به طرز نوشته شدن اسم پورتها دقت کنید
با حروف بزرگ نوشته میشن دقیقا مثل بالا
به تعداد اکولاد ها هم توجه کنید