PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : مشکل usart در atmega128



mahdi20
07-12-2014, 11:27
با سلام

من با توابع getchar() و Putchar() توی میکرو ATMEGA32 ارتباط سریال بین میکرو با میکروی دیگه و حتی ارتباط RS485 با یه PLC به صورت 16 بیتی برقرار کردم. بدون هیچ مشکلی دیتا ارسال و دریافت می شد.

اما الان برای اولین بار اومدم از میکروی ATMEGA128 اسافاده کردم که از USART0 اطلاعات را از یه میکرو ATMEGA128 دیگه دریافت کنم و با USART1 توسط ارتباط RS485 به یه PLC انتقال بدم، امکان نداره . یعنی بین دو میکرو هم مگا 128 هم نمیتونم ارتباط USART برقرار کنم.

این را هم میدونم که توابع getchar() و putchar() در مگا128 به صورت putchar و getchar برای USART0 و putchar1 و getchar1 برای USAR1 استفاده می شود.


حالا سوالم اینه که آیا نکته خاصی داره که باید رعایت کنم؟ مگر همه چیز شبه همون میکرو مگا32 نیست؟ با یه سری تفاوت اسمی؟ پس چرا دیتا چرت و پرت ارسال و دریافت میشه؟

mstkmn
07-12-2014, 11:52
برای استفاده از usart1 باید jtag و atmega103 رو غیر فعال کنی.

mahdi20
07-12-2014, 13:02
این مطلب که شما گفتی را نمیدونستم ، اما من با Usart0 هم مشکل دارم

از مگا 128 به مگا 128 با Usart0 میفرستم ، نمیدونم دیتا اشتباه ارسال میشه یا اشتباه دریافت میشه!! به هر حال جواب نمیده!!!


اما با مگا 32 به مگا32 نتیجه گرفتم حتی با RS485 و ارسال و دریافت دیتا با PLC !!!!!

mj.vb.net
08-12-2014, 03:30
با سلام

من با توابع getchar() و Putchar() توی میکرو ATMEGA32 ارتباط سریال بین میکرو با میکروی دیگه و حتی ارتباط RS485 با یه PLC به صورت 16 بیتی برقرار کردم. بدون هیچ مشکلی دیتا ارسال و دریافت می شد.

اما الان برای اولین بار اومدم از میکروی ATMEGA128 اسافاده کردم که از USART0 اطلاعات را از یه میکرو ATMEGA128 دیگه دریافت کنم و با USART1 توسط ارتباط RS485 به یه PLC انتقال بدم، امکان نداره . یعنی بین دو میکرو هم مگا 128 هم نمیتونم ارتباط USART برقرار کنم.

این را هم میدونم که توابع getchar() و putchar() در مگا128 به صورت putchar و getchar برای USART0 و putchar1 و getchar1 برای USAR1 استفاده می شود.


حالا سوالم اینه که آیا نکته خاصی داره که باید رعایت کنم؟ مگر همه چیز شبه همون میکرو مگا32 نیست؟ با یه سری تفاوت اسمی؟ پس چرا دیتا چرت و پرت ارسال و دریافت میشه؟

اگه اطلاعات ارسال میشه ولی صحیح نیست یا بقول خودتون چرت و پرته فقط مشکل از تنظیمات BuadRate وکلاک میکرو باید باشه.

mahdi20
08-12-2014, 08:29
کریستال میکرو روی کریستال خارجی تنظیم شده و مقدار کریستال خارجی 11059200 هرتز هستش!! مقداری هم که توی رجیستر UBRRL میریزم طبق دیتا شیت و فورمول محاسبه Baud Rate برابر 71 هست که مقدار Baud Rate برابر 9600 بشه!!!


من توی میکرو فرستنده به یک متغیر Char را با Delay یک عدد اضافه میکنم (a++) و سپس برای میکروی گیرنده ارسال میکنم و در میکروی گیرنده روی LCD نمایش میدم.

مشکل اول اینجاست که اولا به جای اینکه دیتا از 0 شروع به شمردن کنه و تا 255 بالا بره و دوباره 0 بشه و .... از 102 اقدام به شمردن میکنه و تا 129 و گاهی تا 132 بالا میره و دوباره 102 میشه و ....

و نکته اینجاست که اطلاعاتی که قراره ارسال بشه در میکروی فرستنده هم روی LCD نمایش داده میشه ولی در آنجا دیتا طبق انتظار از 0 تا 255 شمارش شده و ...

دوباره هم یادآور بشم که برنامه ای شبیه به این با مگا32 هیچ مشکلی نداشته و دقیقا کار میکنه!!! ولی با USART0 میکرو مگا128 این انتظار براورده نمیشود.

مشکل این ارتباط کجاست؟؟ من کجای کار دارم اشتباه میکنم؟؟ تفاوتی در USART مگا128 با مگا32 هست؟

ممنونم از اینکه وقت میذارید و به سوال من پاسخ میدید!!

mj.vb.net
08-12-2014, 14:27
کریستال میکرو روی کریستال خارجی تنظیم شده و مقدار کریستال خارجی 11059200 هرتز هستش!! مقداری هم که توی رجیستر UBRRL میریزم طبق دیتا شیت و فورمول محاسبه Baud Rate برابر 71 هست که مقدار Baud Rate برابر 9600 بشه!!!


من توی میکرو فرستنده به یک متغیر Char را با Delay یک عدد اضافه میکنم (a++) و سپس برای میکروی گیرنده ارسال میکنم و در میکروی گیرنده روی LCD نمایش میدم.

مشکل اول اینجاست که اولا به جای اینکه دیتا از 0 شروع به شمردن کنه و تا 255 بالا بره و دوباره 0 بشه و .... از 102 اقدام به شمردن میکنه و تا 129 و گاهی تا 132 بالا میره و دوباره 102 میشه و ....

و نکته اینجاست که اطلاعاتی که قراره ارسال بشه در میکروی فرستنده هم روی LCD نمایش داده میشه ولی در آنجا دیتا طبق انتظار از 0 تا 255 شمارش شده و ...

دوباره هم یادآور بشم که برنامه ای شبیه به این با مگا32 هیچ مشکلی نداشته و دقیقا کار میکنه!!! ولی با USART0 میکرو مگا128 این انتظار براورده نمیشود.

مشکل این ارتباط کجاست؟؟ من کجای کار دارم اشتباه میکنم؟؟ تفاوتی در USART مگا128 با مگا32 هست؟

ممنونم از اینکه وقت میذارید و به سوال من پاسخ میدید!!

دوست عزیز اولا برنامه رو تو پروتئوس تست کن
(تنظیمات BuadRate میکرو و شبیه ساز ترمینال رو به درستی انجام بدی)
اگه اونجا هم مشکل داشت که برنامت ایراد داره
ولی اگر اونجا مشکلی نداشت مشکل از مدار یا خوده میکروکنترلر هست

اگه تونستی یه برنامه ساده که اطلاعاتd روی پورت ارسال میکنه HEX رو بده برات تست کنم
من تو AVR از c استفاده نمیکنم.
با بسکام خیلی زیاد تو MEGA128 استفاده کردم و تا حالا هیچ مشکلی نداشتم!

mstkmn
08-12-2014, 22:51
سلام
توی atmega128 پین های uasart0 و پروگرم مشترک هست و در صورت متصل بودن پروگرمر ممکنه باعث خطا بشه.

mahdi20
09-12-2014, 17:18
سلام

این کد گیرنده


#include <mega128.h>#include <alcd.h>
#include <delay.h>
//#include <stdio.h>
#define F_CPU 11059200UL

#define BaudRate(x) (F_CPU/16ul/(x)-1)


void putchar10(char c)
{
while ((UCSR0A & (1<<UDRE0))==0);
UDR0=c;
}

void putchar11(char c)
{
while ((UCSR1A & (1<<UDRE1))==0);
UDR1=c;
}

void puts10(char*s)
{
while(*s)putchar10(*s++);
}

void puts11(char*s)
{
while(*s)putchar11(*s++);
}


char getchar10(void)
{
while ((UCSR0A & (1<<RXC0))==0);
return UDR0;
}

char getchar11(void)
{
while ((UCSR1A & (1<<RXC1))==0);
return UDR1;
}

char a;
unsigned char buff[16];





void main(void)
{


lcd_init(16);


lcd_puts("hello");
delay_ms(300);


DDRA=0x00;
DDRC=0xFF;

UCSR0A=0x00;
UCSR0B=(1<<TXEN0)|(1<<RXEN0);
UCSR0C=(1<<UCSZ01)|(1<<RXB80);
UBRR0H=BaudRate(9600UL) / 256;
UBRR0L=BaudRate(9600UL) & 0xff;

UCSR1A=0x00;
UCSR1B=(1<<RXEN1)|(1<<TXEN1);
UCSR1C=(1<<UCSZ11)|(1<<RXB81);
UBRR1H=BaudRate(9600UL) / 256;
UBRR1L=BaudRate(9600UL) & 0xff;
//puts0 ("Mahdi\r");
//puts1 ("UART Sample\r");
//puts0 ("Mega128 UART0 Test");
//puts1 ("Mega128 UART1 Test");
while(1)
{
a=getchar10();
//sprintf(buff, "%d",a);
PORTC=a;
lcd_clear();
lcd_putchar(a);
delay_ms(300);
//putchar0(2);
//PORTC = getchar1();
}

}






و این هم کد فرستنده



#include <mega128.h>#include <delay.h>
#define F_CPU 11059200UL

#define BaudRate(x) (F_CPU/16ul/(x)-1)


void putchar0(char c)
{
while ((UCSR0A & (1<<UDRE0))==0);
UDR0=c;
}

void putchar1(char c)
{
while ((UCSR1A & (1<<UDRE1))==0);
UDR1=c;
}

void puts0(char*s)
{
while(*s)putchar0(*s++);
}

void puts1(char*s)
{
while(*s)putchar1(*s++);
}


char getchar0(void)
{
while ((UCSR0A & (1<<RXC0))==0);
return UDR0;
}

char getchar1(void)
{
while ((UCSR1A & (1<<RXC1))==0);
return UDR1;
}


void main(void)
{
char a;


DDRA=DDRC=0xFF;

UCSR0A=0x00;
UCSR0B=(1<<TXEN0)|(1<<RXEN0);
UCSR0C=(1<<UCSZ01)|(1<<RXB80);
UBRR0H=BaudRate(9600UL) / 256;
UBRR0L=BaudRate(9600UL) & 0xff;

UCSR1A=0x00;
UCSR1B=(1<<RXEN1)|(1<<TXEN1);
UCSR1C=(1<<UCSZ11)|(1<<RXB81);
UBRR1H=BaudRate(9600UL) / 256;
UBRR1L=BaudRate(9600UL) & 0xff;
//puts0 ("Mahdi\r");
//puts1 ("UART Sample\r");
//puts0 ("Mega128 UART0 Test");
//puts1 ("Mega128 UART1 Test");
while(1)
{
a++;
putchar0(a);
delay_ms(300);
//PORTA = getchar0();
//PORTC = getchar1();
}

}

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

میشه ببینین مشکل کجاست؟؟؟ :(

mj.vb.net
09-12-2014, 21:31
برنامه ارسالت که تو پروتئوس درست کار میکنه
فقط تاخیرت یکم زیاد بود
بقیشو تست میکنم خبر میدم

نمیشد با بسکام بنویسی
چرا زندگیو به خودت سخت میکنی آخه :mrgreen:

اون آخر برنامه گیرنده رو که جا انداختی !

mahdi20
10-12-2014, 08:23
ممنونم از لطفتون

قبلا با بسکام کار میکردم (5 سال پیش)
اما از اونجایی که خیلی باگ داشت سوئیچ شدم روی کدویژن. حالاهم کم کم میخوام سوئیچ بشم روی winavr

دوتا آکولاد جا مونده بود که گذاشتم!!

بازم تشکر

mahdi20
11-12-2014, 08:31
سلام من منتظر بقیش هستما!!!! (شکلک خجالت)

mj.vb.net
13-12-2014, 20:00
سلام من منتظر بقیش هستما!!!! (شکلک خجالت)

دوست عزیز من هر دو رو تو پروتئوس چک کردم و هیچ مشکلی از بابت ارتباطات سریال نبود
تنظیمات فیوز بیت های مربوط به کلاک میکرو
سلامت قطعات و البته ال سی دی (من با ال سی دی تست نکردم)

تغییراتی که تو برنامه برای تست دادم به این شکل هست




#include <mega128.h>
#include <delay.h>
#define F_CPU 11059200UL

#define BaudRate(x) (F_CPU/16ul/(x)-1)


void putchar0(char c)
{
while ((UCSR0A & (1<<UDRE0))==0);
UDR0=c;
}

void putchar1(char c)
{
while ((UCSR1A & (1<<UDRE1))==0);
UDR1=c;
}

void puts0(char*s)
{
while(*s)putchar0(*s++);
}

void puts1(char*s)
{
while(*s)putchar1(*s++);
}


char getchar0(void)
{
while ((UCSR0A & (1<<RXC0))==0);
return UDR0;
}

char getchar1(void)
{
while ((UCSR1A & (1<<RXC1))==0);
return UDR1;
}


void main(void)
{
char a;




DDRA=DDRC=0xFF;

UCSR0A=0x00;
UCSR0B=(1<<TXEN0)|(1<<RXEN0);
UCSR0C=(1<<UCSZ01)|(1<<RXB80);
UBRR0H=BaudRate(9600UL) / 256;
UBRR0L=BaudRate(9600UL) & 0xff;

UCSR1A=0x00;
UCSR1B=(1<<RXEN1)|(1<<TXEN1);
UCSR1C=(1<<UCSZ11)|(1<<RXB81);
UBRR1H=BaudRate(9600UL) / 256;
UBRR1L=BaudRate(9600UL) & 0xff;
//puts0 ("Abbas Sarami\r");
//puts1 ("UART Sample\r");
//puts0 ("Mega128 UART0 Test");
//puts1 ("Mega128 UART1 Test");
puts0 ("Abbas Sarami\r");


while(1)
{
a++;
putchar0(a);
delay_ms(1);
//PORTA = getchar0();
//PORTC = getchar1();
}

}





#include <mega128.h>#include <alcd.h>
#include <delay.h>
//#include <stdio.h>
#define F_CPU 11059200UL

#define BaudRate(x) (F_CPU/16ul/(x)-1)


void putchar10(char c)
{
while ((UCSR0A & (1<<UDRE0))==0);
UDR0=c;
}

void putchar11(char c)
{
while ((UCSR1A & (1<<UDRE1))==0);
UDR1=c;
}

void puts10(char*s)
{
while(*s)putchar10(*s++);
}

void puts11(char*s)
{
while(*s)putchar11(*s++);
}


char getchar10(void)
{
while ((UCSR0A & (1<<RXC0))==0);
return UDR0;
}

char getchar11(void)
{
while ((UCSR1A & (1<<RXC1))==0);
return UDR1;
}

char a;
unsigned char buff[16];









void main(void)
{




//lcd_init(16);




//lcd_puts("hello");
delay_ms(300);




DDRA=0x00;
DDRC=0xFF;

UCSR0A=0x00;
UCSR0B=(1<<TXEN0)|(1<<RXEN0);
UCSR0C=(1<<UCSZ01)|(1<<RXB80);
UBRR0H=BaudRate(9600UL) / 256;
UBRR0L=BaudRate(9600UL) & 0xff;

UCSR1A=0x00;
UCSR1B=(1<<RXEN1)|(1<<TXEN1);
UCSR1C=(1<<UCSZ11)|(1<<RXB81);
UBRR1H=BaudRate(9600UL) / 256;
UBRR1L=BaudRate(9600UL) & 0xff;


putchar10(65);
//puts0 ("Mahdi\r");
//puts1 ("UART Sample\r");
//puts0 ("Mega128 UART0 Test");
//puts1 ("Mega128 UART1 Test");
while(1)
{
a=getchar10();
if (a!=0) putchar10(a);
//sprintf(buff, "%d",a);
PORTC=a;
//lcd_clear();
//lcd_putchar(a);
delay_ms(300);
//putchar0(2);
//PORTC = getchar1();
}

}


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

اگه میتونید شماتیکت رو بزار ببینم