ايران ويج

نسخه‌ی کامل: ارتباط سريال بين دو ميكرو و نمايش روي lcd با codevision
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
سلام
دوستان من ميخوام يه ارتباط سريال بين دو ميكرو avr برقرار كنم به اين صورت كه يه ميكرو يه كاراكتر يا يه متن يا عددي رو ارسال كنه و ميكرو ديگر همون داده ها رو بگيره و روي lcd نمايش بده
من خودم از usart استفاده كردم و اين برنامه رو نوشتم ولي نميدونم چرا كاراكتري كه ميگيره با كاراكتري كه ميفرسته فرق ميكنه:(برنامه با codevision است)
برنامه‌ي فرستنده:
کد:
#include <mega16.h>

// Standard Input/Output functions
#include <stdio.h>
#include <delay.h>

// Declare your global variables here

void main(void)
{
bit a=0;
// Declare your local variables here
char message[13]="Its a test!!";
int i;

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
delay_ms(2000);

while (1)
{
// Place your code here
if ( a==0 )
{
for (i=0;i<13;i++)
{
putchar(message[i]);
delay_ms(300);
}
a=1;
}
};
}
برنامه گيرنده:
کد:
#include <mega32.h>

// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>

// Standard Input/Output functions
#include <stdio.h>
#include <delay.h>

// Declare your global variables here
char code;

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: Off
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x10;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization
lcd_init(16);

while (1)
{
// Place your code here

code=getchar();
if (code != '')
{
lcd_putchar(code);
code='';
}

};
}
كسي ميدونه مشكل چيه؟ يا از چه كدي بايد استفاده كنم؟
من پیشنهاد می کنم وقفه recieve رو فعال کن. اگه درست نشد میام کدت رو می بینم ...
(۲۸-مهر-۱۳۸۸, ۱۰:۵۳:۴۵)Sp!d3rm4n نوشته است: [ -> ]من پیشنهاد می کنم وقفه recieve رو فعال کن. اگه درست نشد میام کدت رو می بینم ...
این کار رو هم کردم ولی فرقی نکرد
مشکل اینجاست که روی lcd فقط کاراکتر ۲۵۵ رو نشون میده (یعنی کاراکتر پر)
شما یه نگاه به کد ما بنداز ببین مشکل چیه. البته لطفا!!Tongue
بنظر نمیرسه تو کد مشکلی باشه!! من الان رو پروتیوس امتجان کردم جواب داد!

شما تو کدویزارد کریستال میکرو رو چند انتخاب کردی؟ باید یک باشه ها. آخه کدویژن پیش فرض 4 میذاره و تازه کارایی مثل اوایل بهش اهمیت نمیدن. منم همچین مشکلی تو ارتباط بین کامپیوتر و میکرو داشتم آخرش فهمیدم مشکل از هماهنگ نبودن کریستال بود.
هر مداری که در پروتیوس جواب داد دلیلی بر درست عمل کردن 100 در 100 مدار نیست چون پروتیوس از شبیه سازی استفاده میکنه و خیلی از عوامل دخیل در نظر گرفته نمیشه ...
اما برای رفع مشکل شما باید در هر دو مدارت از کریستال 11.059200 استفاده کنی . همچنین تنظیم فیوز بیت های مربوطه را هم فراموش نکنید.
كريستال رو عوض كردم يعني حالا از كريستال داخلي يك مگاهرتز استفاده ميكنم تنها فرقي كه كرد اينه كه كاراكتري كه روي lcd نمايش داده مي‌شد عوض شد ولي باز هم اون چيزي كه ميكروي فرستنده ارسال ميكنه رو نمايش نميده
نقل قول: اما برای رفع مشکل شما باید در هر دو مدارت از کریستال 11.059200 استفاده کنی . همچنین تنظیم فیوز بیت های مربوطه را هم فراموش نکنید.
من فعلا كريستال 11.059200 رو ندارم ولي به محض اينكه تهيه كردم اين رو هم تست ميكنم ولي شما مطمئنيد كه مشكل از كريستاله؟
کریستال 11.0592 فقط به درد کار برای ارسال به کامپیوتر اونم تو باوودهای بالا می خوره !

چون خطا تو ارسالش صفره !

ولی تو باوودهای پایین نیازی نیست ! ( باشه بهتره ولی من شخصا هیچ وقت تو باوودهای زیر 4800 نذاشتم )

و اینجا هر دو میکرو هستن و نباید مشکلی وجود داشته باشه ! ( چون فرکانس هر دو میکرو ثابته )


به نظر من چند تا مشکل ممکنه داشته باشین !
اشتباه وصل کردین : Tx میکروی اول به Rx میکروی دووم وصل می شه و برعکس !
فرکانس دو میکرو متفاوته : که خوب تو فیوز بیت ها نگاه کنید
(۲۹-مهر-۱۳۸۸, ۲۲:۳۸:۴۷)t3r!p3000 نوشته است: [ -> ]به نظر من چند تا مشکل ممکنه داشته باشین !
اشتباه وصل کردین : Tx میکروی اول به Rx میکروی دووم وصل می شه و برعکس !
فرکانس دو میکرو متفاوته : که خوب تو فیوز بیت ها نگاه کنید

تایید میشه به شدتBiggrin
مخصوصاً در مورد :
اشتباه وصل کردین : Tx میکروی اول به Rx میکروی دووم وصل می شه و برعکس !
(۲۹-مهر-۱۳۸۸, ۲۲:۳۸:۴۷)t3r!p3000 نوشته است: [ -> ]به نظر من چند تا مشکل ممکنه داشته باشین !
اشتباه وصل کردین : Tx میکروی اول به Rx میکروی دووم وصل می شه و برعکس !
فرکانس دو میکرو متفاوته : که خوب تو فیوز بیت ها نگاه کنید

فیوزبیت ها رو نگاه کردم درست بود‍ پایه ها رو هم که درست وصل کردم خودمم موندم مشکل از کجاست!!!! حالا من میخوام با بسکام امتحان کنم ببینم با اون میتونم یا نه اگه نشد میرم سراغ pic!
مهندس ارسال سریال کاری نداره تو بسکام !

می تونی این کتاب رو بخونی : http://forum.iranled.com/showthread.php?tid=10869

اینم یه مثال از کتاب آقای یه نفر ( سعید جون ) :


ارتباط سریال rs232 :


در این ارتباط از دوسیم به نام های rxd و txd استفاده میشود که خط txd وسیله اول دیتا را از ان به بیرون منتقل میکندو خط خروجی دیتا است و به ورودی دیتا دستگاه دوم ( txd ) متصل میشود و خط rxd ورودی دیتا است که به خروجی دیتای دستگاه دیگر (rxd ) متصل میشود.


در این روش میتوان نهایتا تا دووسیله را به هم متصل کرد .(از طریق یک پورت)

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

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

تعیین نرخ انتقال دیتا:
کد php:
$BAUD=VAR 
این دستور میزان انتقال دیتا در ثانیه را مشخص میکند وباید در هر دو وسیله ای که به هم متصل میشوند یکی باشد (در غیر این صورت ارتباط کار نمیکند) بهتر است نرخ انتقال دیتا در مناطق دارای نویز کمتر انتخاب شود.

دستور PRINT :
کد php:
PRINT  VAR 
توسط این دستور میتوان داده یا متغیری را به پورت سریال ارسال کرد. VAR یم متغیر از جنس متغیرهای گفته شده میباشد.

دستور PRINTBIN :
کد php:
PRINTBIN VAR 
توسط این دستور متغیر VAR به باینر تبدیل شده سپس به پورت سریال ارسال میشود.

دستور WAITKEY :
کد php:
VAR=WAITKEY() 
این دستور تا زمانی که متغییر توسط دستگاه دیگر به پورت سریال ارسال شود منتظر میماند و پس از دریافت متغیر برنامه از خط بعد ادامه می یابد.

دستور INKEY :
کد php:
VAR=INKEY() 
این دستور مقدار اسکی کاراکتر دریافت شده از پورت سریال را برمیگرداند.

دستور INPUTBIN :
کد php:
INPUTBIN  VAR 
این دستور داده باینری را از پورت سریال میگیرد و در متغیر VAR قرار میدهد.

دستور INPUTHEX :
کد php:
INPUTHEX  VAR 
این دستور داده هگز رااز پورت سریال دریافت میکند و در متغیر VAR قرارمیدهد. مانند:

در مثال زیر با استفاده از ارتباط سریال ، یک ارتباط دوطرفه بین دو میکرو برقرار کرده ایم ،

کد php:
$regfile "m32def.dat" $crystal 1000000
$baud 
9600
Config Portb 
Input Config Porta Output
Dim A 
As Byte As Byte
W
:
Pinb Printbin Q
Inkey() : Porta A
Goto W
End
میکرو 2
:
$regfile "m32def.dat" $crystal 1000000
$baud 
9600
Config Portb 
Input Config Porta Output
Dim A 
As Byte Dim Q As Byte
W
:
Pinb Printbin Q
Inkey() : Porta A
Goto W
End 

از انجا که ارتباط دو طرفه میباشد ( هر دو میکرو دقیقا مانند هم هستند ) برنامه دو میکرو مشابه است ،

درخط اول میکرو و کریستال معرفی شده است که میکرو مگا 32 و کریستال مورد استفاده 10 مگا هرتز میباشد .

در خط دوم نرخ انتقال دیتا مشخص گردیده است ، مقدار ان 9600 است . نرخ انتقال دیتا باید در هر دو میکرو یکسان باشد .

در خط سوم پورت b به عنوان ورودی ( برای اتصال کلید ) و پورت a به عنوان خروجی (برای اتصال led) معرفی شده اند .

در خط چهارم دو متغیر از جنس بایت برای ذخیره مقادیر معرفی شده است .

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

در خط ششم مقدار موجود بر روی پورت b در متغیر q ریخته میشود و سپس با دستور Printbin Q به پورت سریال فرستاده میشود.

در خط هفتم مقدار گرفته شده از پروت سریال در متغیر a ریخته میشود و بعد متغیر a بر روی پورت a ریخته میشود.

خط هفتم پایان حلقه میباشد ، هنگامی که cpu میکرو به این خط رسید به برچسب w پرش میکند.

خط هشتم پایان برنامه است.


در حالتی که هیچ یک از کلید ها یک نشده اند ، مقدار q صفر دسیمال و &b00000000 باینری است ، حال اگر هر یک از کلید ها فشرده شود مقدار q تغیر میکند.

دو پایه txd و rxd میکرو نقش دریافت و ارسال داده را در حالت پیشفرض برعهده دارند ، با دستور زیر شما میتوانید این دو پایه را به پایه های دلخواه تغییر دهید:

کد php:
Open "comx.y:$baud,8,n,1" For Output/input As #q 

comx.y : نام پورت و پایه ای است که باید به عنوان txd یا rxd جدید عمل کند.

:$baud نرخ داده عبوری از پایه را نشان میدهد ، این مقدار باید با نرخ انتقال دیتا ی اصلی برابر باشد.

Output/input : پایه میتواند وردی داده( rxd) یا خروجی داده( txd ) باشد.

Q : شماره کانال را مشخص میکند.
مانند:

کد php:
Open "comd.1:19200,8,n,1" For Output As #1
Open "comd.0:19200,8,n,1" For Input As #2 

در مورد بالا portd.1 به عنوان txd و portd.0 به عنوان rxd در نظر گرفته شده است ، همچنین نرخ انتقال داده برابر با 19200 است.
سلام ali313
من چیزی توی برنامه دیدم که به نظر من میتونه مشکلزا باشه؟؟
ببین , متغیر message حاوی اطلاعاتی از نوع استرینگ چون متن روبروش در بین این علامتها" " قرار داره . ولی توی گیرنده از دستوری استفاده کردی که مخصوص دریافت اطلاعات به صورت کارکتریه و این کارکتر ها باید در زمان ارسال در بین ' ' قرار داشته باشند.
ممکن مشکل از اینجا باشه!!!
صفحه‌ها: 1 2