سوال در مورد برنامه نویسی میکرو avr

mmolah

عضو جدید
سلام
کسی میتونه برنامه ای بنویسه(برای atmega8) که 8 تا LED رو بصورت ستاره دنباله دار روشن خاموش کنه (یعنی:: از چپ به راست روشن بشن و از همون چپ به راست خاموش بشن البته کم کم کم نور بشن و بعد خاموش شن) ؟؟؟؟؟؟؟؟
 

scienceaddict

عضو جدید
سلام دوست عزیز
بله چرا که نتونه ، قسمت اول سوالتون ساده است قسمت دومش نیاز به یه کم فعالیت مضاعف داره، برای کم کم ، کم نور شدنش باید با تاخیر ، یه PWM رو همه هشت پایه ایجاد کنیم، تنها نکتش اینه که فرکانس حتما باید ثابت باشه، 10 کیلوهرتز خوبه، من سعی میکنم روش فکر کنم شما هم تلاش کنید

Good Luck
 

mmolah

عضو جدید
من خیلی روش کار کردم و تا یه جاهایی تونستم پیش برم.... البته یه برنامه (به زبان بیسیک) پیدا کردم که همه ی 8 تا LED رو با هم کم کم پر نور میکنه و روشن میشن و بعدشم کم کم هم کم نور میشن و خاموش میشن ، البته هر کاری روش کردم نتونستم به ترتیب اینکارو بکنم(یعنی ledها به ترتیب با همون حالت روشن و خاموش بشن)..... اگه شما میخواین برنامه شو براتون بدم ببینید میشه کاری باهاش کرد؟؟؟؟
 

faz123

عضو جدید
سلام میخواستم بدونم چطور از ماژول در پورت موازی میکرو استفاده کنم حتما باید در پورت موازی استفاده کنم ؟ اگر این کار رو بکنم چطور باید باود ریتش رو با ماژول گیرنده ام یکی کنم؟ لطفا راهنماییم کنید

با دستور open در بسکام میشه پورت سری ساخت اما با کد ویژن چطور بسازم؟
خواهش میکنم کمکم کنید
 

scienceaddict

عضو جدید
سلام دوست عزیز
امروز رفته بودم واکسن خدمت بزنم یهو به ذهنم رسید اینو چه جوری حل کنیم، فرض کردم میخوام یه pwm با فرکانس 10 کیلو هرتز درست کنم، اومدم دیوتی سایکل رو 10 پله 10 پله جدا کردم، یعنی دیوتی سایکل 12% ندارم، فقط 0و10و20و30و... خب، بعد گفتم تایمرو طوری تنظیم میکنم که هر 1 میلی ثانیه (1 کیلو هرتز) اور فلو کنه یا کامپیر مچ رخ بده بالاخره یه وقفه ای بخوره. گفتم برای هر کانال یه متغیر در نظر میگیرم، یه کانتر هم در نظر میگیرم، اول کار کانتر رو صفر میکنم، تو ده اورفلوی اول اتفاقی نمیوفته فقط کانتر 10 تا 10 تا زیاد میشه ، وقتی به 110 رسید، کانتر صفر میشه و همه کانال های خروجی رو یک میشه، بعد در عرض چند میکرو ثانیه، میام کانتر رو با متغیر هر کانال مقایسه میکنم، اگر برابر بودن اون کانالو صفر میکنم، حالا یه مثال عملی، فرض کن متغیر کانال یک 10 و متغیر کانال دو 60 هست، کانتر هم صفر، وقفه رخ میده ، بعد از ده بار هیچ اتفاقی نمیوفته کانتر میشه 110 ، کانتر صفر میشه همه خروجی ها یک میشن ، کانتر صفر با متغیر همه کانال ها مقایسه میشه، چون متغیر همه کانالها غیر از 1و2 صفره، پس همه کانال ها غیر از این دو کانال صفر میشن(فقط چند میکرو ثانیه یک بودن) حالا میکرو میره تو یه لوپ گیر میکنه، دوباره وقفه رخ میده، کانتر میشه 10 ، با متغیر کانال یک مقایسه میشه، برابره، کانال یک صفر میشه، تا زمانی که 9 تا اورفلوی دیگه رخ بده، کانال یک صفره، یعنی دیوتی سایکلش 10 درصد شد، کانال دو هم بعد از 5 اور فلوی دیگه که کانتر به 60 میرسه، صفر میشه، و 4 اورفو صفر میمونه تا کانتر 110 بشه، پس دیوتی سایکلش میشه 60 درصد
برای این ستاره ای که شما گفتید کافیه متغیر همه کانال ها رو صفر کنیم، کانال یک رو ده ، تاخیر ، کانال یک بیست کانال دو ده ، تاخیر ، کانال یک سی کانال دو بیست کانال سه ده ، تاخیر و ...
من این کارو کردم رفیق ، جواب هم گرفتم، ببین واکسن خدمت چقدر مفیده :) ، اصل برنامشو فهمیدی و میتونی با سی یا بیسیک بنویسی، من هم اینو برای 12 کانال به اسمبلی نوشتم، همین چیزی که شما گفتید، البته تو پروتیوس جواب نگرفتم، اما در عمل گرفتم ، شاید از برنامش سر در نیاری اما از این عقده ای بازی ها خوشم نمیاد که ملت فایل هگز برنامه هاشونو میذارن، البته فرکانس موج 10 کیلوهرتز نیست ها کمتره ، همینجوری بی دقتی زدم رفت ولی بد نبود کار کرد، من در خدمتم ، تو فیلم ، کریستال اخریه که گذاشتم 20 مگ بود

http://s4.picofile.com/file/7823924408/Video0193.zip.html

Good Luck
 

scienceaddict

عضو جدید
سلام میخواستم بدونم چطور از ماژول در پورت موازی میکرو استفاده کنم حتما باید در پورت موازی استفاده کنم ؟ اگر این کار رو بکنم چطور باید باود ریتش رو با ماژول گیرنده ام یکی کنم؟ لطفا راهنماییم کنید

با دستور open در بسکام میشه پورت سری ساخت اما با کد ویژن چطور بسازم؟
خواهش میکنم کمکم کنید
سلام دوست عزیز
کدوم ماژول؟ پورت موازی برای چه کاری؟ اگه ارتباط بین دومیکرو هست یه خط کلاک هم بکشید که slave بفهمه master دیتا رو رو باس گذاشته ، واضح تر بپرسید دوست عزیز

Good Luck
 

faz123

عضو جدید
سلام دوست عزیز
کدوم ماژول؟ پورت موازی برای چه کاری؟ اگه ارتباط بین دومیکرو هست یه خط کلاک هم بکشید که slave بفهمه master دیتا رو رو باس گذاشته ، واضح تر بپرسید دوست عزیز

Good Luck
جواب سوالم رو فهمیدم اما ایراد دارم بزارید واضح تر بپرسم
برنامه من اسمش تایپ از راه دوره با کیبورد یک کلمه رو تایپ میکنیم از طریق فرستنده میفرستیم ازون ور گیرنده میگیره رو ال سی دی نشون میده .برنامه فرستنده رو نوشتم مشکل نداشت اما رو ال سی دی هیچی نشون نداد واسه همین میخوام برام ببینید این برنامه چیش ایراد داره؟چون به سبب کیبورد از پورت سریال میکرو استفاده کردیم و فرستنده ما هم ارتباط سریال داره پس باید یک پورت سریال نرم افزاری با نوشتن برنامه بنویسیم توی اینترنت کتابخانه ارتباط سریال ایجاد شده و کار ماراحت تر میشود حالا ما این برنامه رو نوشتیم
این برنامه فرستندست بنظرتون ایرادش چیه؟
#include <mega16.h>
#include <stdio.h>
#include "uart2.h"
#include <delay.h>


unsigned char Scan_Code;
void main(void)
{
PORTB=0x00;
DDRB=0x00;
PORTD=0x00;
DDRD=0x00;
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0xF6;
initUART2();
#asm("sei");
while(1)
{
putchar2(Scan_Code);
delay_ms(300);
}
}
interrupt [USART_RXC]void usart_rx_isr(void)
{
unsigned char buffer;
buffer=UDR;
switch(buffer)
{
case 0xF0:
break;
case 0xE0:
break;
default:
Scan_Code=buffer;
}
}

و اینم مال کتابخونش که من کپی میکنم واستون

/* Software UART Library */
/* Author: Reza Sepas Yar */
/* Version: 1.0 */


#include <delay.h>

#define TX2_PIN PORTC.0 // UART2 TX pin
#define TX2_DDR DDRC.0 // UART2 TX Direction Register

// TX & RX levels
#define HIGH 1
#define LOW 0

// UART2 specific
#define DATA_BIT_LENGTH 1040 // ((1/BAUD)*10000000)


// put a character DIRECTLY to the UART2
void putchar2(unsigned char c)
{

unsigned char i;

TX2_PIN = LOW; // clear output (start bit)
delay_us(DATA_BIT_LENGTH);

for(i=0; i<8; i++)
{
TX2_PIN = (c & 0x01);
delay_us(DATA_BIT_LENGTH);
c >>= 1; // next bit, please !
}

TX2_PIN = HIGH; // stop bit (bit #8)
delay_us(DATA_BIT_LENGTH);

}

void puts2(char* str)
{
while( *str != '\0' )
{
putchar2((unsigned char) *str++);
}
}

// UART2 initialization function (we MUST call this function BEFORE using UART2)
void initUART2(void)
{
TX2_PIN = 1; // logic 1 (high level = STOP TX)
TX2_DDR = 1; // output
}

اگر ایرادشو بگین ممنون میشم
 

scienceaddict

عضو جدید
سلام دوست عزیز
احتمالا اشتباه تایپی کردی ، یه جا گفتی فرستنده مشکلی نداشت یه جا گفتی این برنامه فرستنده است مشکلش چیه، و این برنامه ای که گذاشتی برنامه گیرنده است
رجیستر UCSRB رو 98 هگز قرار دادی، 9 که درسته، برای کانفیگ کردن گیرنده، اما 8 نیبل پایینی بیت TXEN هست که فرستنده رو فعال میکنه، حالا نگفتی میخوای هم گیرنده هم فرستنده باشه یا فقط ارتباط یه طرفه ، صفحه 163 دیتاشیت مگا16
بله ، از اونجایی که رجیستر UCSRC رو برای سریال سنکرون تنظیم کردی یعنی ماژول سریالو دادی به کیبورد، پس ترنسمیت چرا فعاله؟ ، از طرفی رجیستر رو برابر F6 قرار دادی، یعنی تو بیت 5و4 پریتی رو فعال کردی و پریتی فرد رو انتخاب کردی، پریتی هم که مال فرستنده است!!!!!!!!!! بیت صفرم این رجیستر که صفر نوشتی کاملا درسته چون کیبورد تو لبه پایین رونده دیتا میده
کتابخونه رو دیدم، اصلا بهش اعتباری نیست مخصوصا تو باود های زیاد، نوکر رضا سپاس یار هم هستم ولی با یه تاخیر که نمیشه ماژول سریال ساخت، کم کمش باید از یه تایمر استفاده میکرد که دقییق باشه، یه نمه باود کمتر بیشتر بشه دیتا غلط میره
اما من به شما پیشنهاد میدم، باز تصمیم با خود شماست، اول اینکه شما داری با میکروکنترلر فرستنده کیبورد رو با یوزارت میخونی، خیلی هم خوب، برای اینکه دیتا رو به میکروی گیرنده بدی چرا از SPI استفاده نمیکنی؟ چرا از TWI استفاده نمیکنی؟ چرا اصلا پارالل نمیفرستی با یه کلاک؟ بقول اونا همه گزینه ها روی میزه، اما اگه حتما میخوای سریال باشه، خب سنکرونش کن دوست عزیز من، دوتا سیم از فرستنده بده به گیرنده، یکی از این سیم ها رو وصل کن به کلاک خارجی گیرنده، حالا همه چی دست خودته، بیت هفتم رو بذار رو سیم اول سیم وقفه خارجی رو یه بالا رونده ای پایین رونده ای بده، گیرنده وقفه خارجی میخوره دیتا رو برمیداره، شیفت میده به چپ، همینجوری هشت تا رو بفرست ، اگر هم خواستی حتما یوارت باشه خب از یه تایمر استفاده کن، سه تا تایمر افتاده تو میکروت بیکار، برای یه باود یه محاسبه کن تایمرتو تنظیم کن بذار رو CTC که دقیق باشه، پروتکل سریال رو خودت پیاده کن و به این کتابخونه اعتبار نکن
شما وقتی کیبوردو اسکن میکنی، بهتره کدت رو همینجا تبدیل به اسکی کنی بفرستی به اون میکرو، اونم مستقیم نشونش بده، شما فقط دوتا سویچ کیس گذاشتی، بازم تصمیم با خودته ما در خدمتیم

Good Luck
 

scienceaddict

عضو جدید
شما یه حرکتی کن دوست عزیز
یه متغیر تعریف کن هر چی، این کتابخونه رو هم اینکلود کن، تو پروتیوس برنامه رو لود کن تو میکرو، سمت چپ از منوی virtual instruments یه دونه ویرچوال ترمینال بردار، پایه سی.0 میکروتو بزن به پایه rx ویرچوال ترمینال، باود رو تو ترمینال تنظیم کن برنامه رو ران کن، ببین همون متغیره رو درست به سریال میفرسته یا نه نتیجه رو بگو تا ببینیم چقدر کتابخونت درست کار میکنه

Good Luck
 

faz123

عضو جدید
سلام دوست عزیز
احتمالا اشتباه تایپی کردی ، یه جا گفتی فرستنده مشکلی نداشت یه جا گفتی این برنامه فرستنده است مشکلش چیه، و این برنامه ای که گذاشتی برنامه گیرنده است
رجیستر UCSRB رو 98 هگز قرار دادی، 9 که درسته، برای کانفیگ کردن گیرنده، اما 8 نیبل پایینی بیت TXEN هست که فرستنده رو فعال میکنه، حالا نگفتی میخوای هم گیرنده هم فرستنده باشه یا فقط ارتباط یه طرفه ، صفحه 163 دیتاشیت مگا16
بله ، از اونجایی که رجیستر UCSRC رو برای سریال سنکرون تنظیم کردی یعنی ماژول سریالو دادی به کیبورد، پس ترنسمیت چرا فعاله؟ ، از طرفی رجیستر رو برابر F6 قرار دادی، یعنی تو بیت 5و4 پریتی رو فعال کردی و پریتی فرد رو انتخاب کردی، پریتی هم که مال فرستنده است!!!!!!!!!! بیت صفرم این رجیستر که صفر نوشتی کاملا درسته چون کیبورد تو لبه پایین رونده دیتا میده
کتابخونه رو دیدم، اصلا بهش اعتباری نیست مخصوصا تو باود های زیاد، نوکر رضا سپاس یار هم هستم ولی با یه تاخیر که نمیشه ماژول سریال ساخت، کم کمش باید از یه تایمر استفاده میکرد که دقییق باشه، یه نمه باود کمتر بیشتر بشه دیتا غلط میره
اما من به شما پیشنهاد میدم، باز تصمیم با خود شماست، اول اینکه شما داری با میکروکنترلر فرستنده کیبورد رو با یوزارت میخونی، خیلی هم خوب، برای اینکه دیتا رو به میکروی گیرنده بدی چرا از SPI استفاده نمیکنی؟ چرا از TWI استفاده نمیکنی؟ چرا اصلا پارالل نمیفرستی با یه کلاک؟ بقول اونا همه گزینه ها روی میزه، اما اگه حتما میخوای سریال باشه، خب سنکرونش کن دوست عزیز من، دوتا سیم از فرستنده بده به گیرنده، یکی از این سیم ها رو وصل کن به کلاک خارجی گیرنده، حالا همه چی دست خودته، بیت هفتم رو بذار رو سیم اول سیم وقفه خارجی رو یه بالا رونده ای پایین رونده ای بده، گیرنده وقفه خارجی میخوره دیتا رو برمیداره، شیفت میده به چپ، همینجوری هشت تا رو بفرست ، اگر هم خواستی حتما یوارت باشه خب از یه تایمر استفاده کن، سه تا تایمر افتاده تو میکروت بیکار، برای یه باود یه محاسبه کن تایمرتو تنظیم کن بذار رو CTC که دقیق باشه، پروتکل سریال رو خودت پیاده کن و به این کتابخونه اعتبار نکن
شما وقتی کیبوردو اسکن میکنی، بهتره کدت رو همینجا تبدیل به اسکی کنی بفرستی به اون میکرو، اونم مستقیم نشونش بده، شما فقط دوتا سویچ کیس گذاشتی، بازم تصمیم با خودته ما در خدمتیم

Good Luck
بله برنامه که نوشتم برنامه فرستندست اشتباه تایپ کردم.
منظور شما از عبارت
برای اینکه دیتا رو به میکروی گیرنده بدی چرا از SPI استفاده نمیکنی؟
چیه؟
یعنی اتصال ماژول های ما از طریق uart نباشه از راه psi باشه؟
یک طرفست از ماژول های hmt و hmr استفاده کردم.در مورد سنکرون کردن واسه ماژول ایراد نداره ؟ یعنی تو این حالت درست کار میکنه؟میشه دقیق تر بهم توضیح بدید این قسمت رو ؟ یادتون نره ارتباط بیسیمه
و درست میگید این برنامه من کد حروف رو میده نه خود حرف رو باید کد تبدیل به اسکی رو از تو نت در بیارم بهش اضافه کنم ؟با این کار درست میشه؟
[h=3]ممنون که جوابمو میدید[/h]
 

scienceaddict

عضو جدید
سلام دوست عزیز
نگفته بودی ارتباط بی سیمه منم هرچی با سیم به ذهنم میرسید ریختم رو دایره، :biggrin: پس بی خیال همه اونا
من به شما پیشنهاد میکنم ماژول سریالو بدی به این hmt hmr ، و کلاک کیبوردو بدی به وقفه خارجی میکروت و همون کاری که گفتم رو انجام بدی، بیت به بیت بخونی ماژول سریال هم کار خودشو میکنه، این سریالشو که همه بلدیم، اون سنکرونه رو که میخوای نرم افزاری کیبوردو بخونی من یه نمونه ساده واست میذارم در برنامه گیرنده بسی تامل کنی همونو پیاده کنی ان شا ا... نتیجه خوبی میگیری، من نه کانکتور پی اس 2 دارم نه اچ ام تی که واست تست کنم، ولی این برنامه که میذارم کار میکنه ، شما تامل کن روش موفق باشی ما در خدمتیم

http://s3.picofile.com/file/7827822682/syn_tx_rx_simplex.rar.html

Good Luck
 

faz123

عضو جدید
سلام دوست عزیز
نگفته بودی ارتباط بی سیمه منم هرچی با سیم به ذهنم میرسید ریختم رو دایره، :biggrin: پس بی خیال همه اونا
من به شما پیشنهاد میکنم ماژول سریالو بدی به این hmt hmr ، و کلاک کیبوردو بدی به وقفه خارجی میکروت و همون کاری که گفتم رو انجام بدی، بیت به بیت بخونی ماژول سریال هم کار خودشو میکنه، این سریالشو که همه بلدیم، اون سنکرونه رو که میخوای نرم افزاری کیبوردو بخونی من یه نمونه ساده واست میذارم در برنامه گیرنده بسی تامل کنی همونو پیاده کنی ان شا ا... نتیجه خوبی میگیری، من نه کانکتور پی اس 2 دارم نه اچ ام تی که واست تست کنم، ولی این برنامه که میذارم کار میکنه ، شما تامل کن روش موفق باشی ما در خدمتیم

http://s3.picofile.com/file/7827822682/syn_tx_rx_simplex.rar.html

Good Luck
واستون یک پیام خصوصی گذاشتم لطف کنید بررسی کنید
 

samieh-n

عضو جدید
سلام دوستان .
من تازه وارد هستم و قصد دارم برنامه نویسی AVR با زبان C رو یاد بگیرم.
میخوام یک برنامه ی ساده نویسم، به این صورت که میکرو (ATmega16) اطلاعات رو از پورت B بگیره و به پورت Cمنتقل کنه ...
کسی میتونه کمکم کنه ؟
 

yoosef_1362

عضو جدید
پاسخ

پاسخ

سلام دوست من , برای این کار باید اول ورودی و خروجی های میکرو رو با دستور DDR معرفی کنید . برای سوال شما DDRB=0 یعنی پورت B ورودی باشه و DDRC=1 یعنی پورت C خروجی باشه . بعد پینهای ورودی رو با یک یا چند شرط به خروجی ها متصل میکنی , مثلا IF (PINB.0==1) PORTC.0=1 و به همین ترتیب برای پینهای بعدی ... البته این یک دستور ساده و پایه است. (البته ورودی و خروجی ها رو میتونی تو مرحله اول ساخت پروژه تو کدویژن تعریف کنی)
 
بالا