PDA

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



mahanb
20-09-2011, 15:09
سلام آقایون خسته نباشید!
من یه مشکل دارم در برنامه زیر:
avrmp.ir/USART sample.rar
بعد از اینکه میکرو داده داد با کامپیوتر بهش داده می دم بعد این داده رو ال سی دی می نویسه!
ولی مشکل اصلی اینکه داده قبلی که به کامپیوتر داده رو هم می چسبونه به همون داده ای که بهش دادی می نویسه رو lcd!
نمی دونم منظورم رو متوجه شدید یا نه!
ولی برنامه رو تست کنید خودتون می فهمید!cry::
آخه چراا؟/
کمکککک!:x

agape
20-09-2011, 15:48
اقا لینکی برای دانلود برنامه شما نیست !
احتمالا فایل شما آپلود نشده

mahanb
20-09-2011, 16:03
درست آپلود شده بود چون رو هسته خودمه ولی من اسمشو عوض کردم که بهترشه:
You can see links before reply
ممنون از توجهتون!:018:

agape
20-09-2011, 16:47
خوب مشکل اول شما سطر 13 برنامه هست این سطر

char havij[]=0;
شما متغییر هویج! رو تعریف کردید ولی طول آرایه به اون ندادید و در ضمن مقدار دهی صحیح رو هم انجام ندادید!
این سطر رو به این صورت تغییر بدید:

char havij[10]={0};

خوب نکته نه ایراد:
سطر 38 و تابع USART_ReadBuffer همان طور که قبلا گفتم این تابع برای دریافت رشته به صورت سخت افزاری عمل می کند نه نرم افزاری ، پس این تابع قسمت USART رو برای دریافت یه رشته اماده میکنه و منتظر دریافت کامل داده نمیشه {به خاطر این که وقت CPU گرفته نشه} شما باید برای استفاده بعد از این تابع Flag دریافت داده رو با While چک کنید که مطمئن بشید 10 کارکتر دریافت شده یا این که از مد اینتراپت استفده کنید.
راه ساده تر این که از تابع USART_Read و یک حلقه برای دریافت دیتا استفاده کنید

mahanb
20-09-2011, 16:54
آقا ممنون از جوابتون مشکل با گفته شما حل شد ولی یه سوال دیگه!
می خواهم بهش بگم که وقتی enter زده شد به معنی دریافت کامل havij است!
و تعداد رقم ها رو هم رقم همون داده دریافتی قرار دهم ولی مشکل اینکه کاراکتر enter چیست؟؟؟
میشه یه برنامه نمونه برام همینجا بگذارید( لازم نیست فایلشو بگذارید فقط بنویسید)
ممنون میشم!:o

mahanb
20-09-2011, 16:56
روی ال سی دی کاراکتر اینتر رو 4 تا خط فاصله روی هم نشون میده!!:unh:

agape
20-09-2011, 17:09
کد Enter عدد 13 هست !
میتونی از این کد استفاده کنی:

i=0;
while(*(havij+i)!=13 && i<10)
*(havij+i++)=USART_Read(USART1,0);
این کد وقتی که شما Enter رو فشار میدی از حلقه خارج میشه و مقدار کارکتر دریافتی در متغییر i ذخیره میشه!
در ضمن اگه تعداد کارکتر دریافتی از 10 بیشتر شد نیز از حلقه خارج میشه{برای جلو گیری از آورفلو شدن متغییر}

mahanb
20-09-2011, 17:33
آقا این کل برنامه منه:
#include <at91sam7s64.h>
#include <lib_at91sam7s64.h>
#include "usart.h"
#include "lcd4bit.h"
#include "delay.h"
#define BOAR_CLK 48000000

int main(void){
char buf[]="\r\nhello, world";
char buf1[]="\r\nThis Program Write By Mahan - Bastani.";
char buf2[]="\r\nThis Sample Publish In AVRMP.IR\n\r";
char i;
char havij[10]={0};
char buf4[]="please enter your password:\n\r";
// Activ Power USART 1
AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_US1); // OR AT91C_ID_US0
USART_Configure_PIO(USART1_PORT,TXD1);// SET TXD0 T1 USART
USART_Configure_PIO(USART1_PORT,RXD1);// SET RXD0 T1 USART



USART_Configure(USART1,USART_MODE_ASYNCHRONOUS,384 00, BOAR_CLK); // Config Usart1
USART_SetTransmitterEnabled(USART1, 1); // ENABLE Transmitter
USART_SetReceiverEnabled(USART1, 1); // Enable Receiver

USART_Write(USART1,65,0);
USART_WriteBuffer(USART1,buf,sizeof(buf));
USART_WriteBuffer(USART1,buf1,sizeof(buf1));
USART_Write(USART1,'T',0);
delay_ms(3000);
USART_WriteBuffer(USART1,buf2,sizeof(buf2));
USART_WriteBuffer(USART1,buf4,sizeof(buf4));


lcd_pin (1,0,1,2,3,4,5);

i=0;
do
{
*(havij+i++)=USART_Read(USART1,0);
}while(*(havij+i)!=13 && i<10);
lcd_gotoxy(1,1);
lcd_clear();
lcd_putsf(havij);
delay_ms(200);





}

ولی کراراکتر اینتر رو متوجه نمیشه!!
یعنی تا 10 تا نشه رو ال سی دی چیزی نمی نویسه!
فکر می کنم کاراکتر اینتر را اشتباه گفتید!
باز هم ممنون!

agape
20-09-2011, 18:56
نه دوست من شما کد رو اشتباه نوشتی !lov:
الان میگم اشتباه شما کجاست
این کدی که شما نوشتی :

do
{
*(havij+i++)=USART_Read(USART1,0);
}while(*(havij+i)!=13 && i<10);
برسی کد:
در لحظه اول که i=0 هست مقدار خوانده شده در خانه صفر از آرایه هویج قرار میگیرد و بلافاطصله یکی به مقدار i اضافه میشود و در سطر بعد که دستور While هست خانه 1 {چون در خط قبل یکی به مقدار i اضافه شده است } که هم اکنون مقدار دهی نشده است با مقدار 13 مقایسه میشود پس در نهایت همیشه مقدار 0 با 13 مقایسه میشه، امیدوارم متوجه اشتباه کد شده باشید و اما راه حل :
راه اول:{توصیه نمی کنم}

do
{
*(havij+i++)=USART_Read(USART1,0);
}while(*(havij+i-1)!=13 && i<10);

راه دوم:{استاندارد هست}

do
{
*(havij+i)=USART_Read(USART1,0);
}while(*(havij+i++)!=13 && i<10);

mahanb
20-09-2011, 19:59
خیلی ممنون من خودم متوجه اشتباهم شدم و درستش کردم ولی الان یه مشکل دارم!
میشه دستور های زیر رو برام توضیح بدید:
1- چگونگی جدا کردن n کارکتر از سمت چپ یا راست رشته x
2-چگونگی ترکیب 2 رشته از سمت چپ یا راست
3- چگونگی اضافه کردن کاراکتر n به سمت چپ یا راست کراکتر x
همین
خیلی ممنون میشم توضیح بدید اشکال اصلی من توی زبان هست!

mahanb
20-09-2011, 20:26
کمممکک!!

agape
22-09-2011, 23:06
الان کمک دقیقا در چه زمینه باید باشه؟:018: