PDA

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



Niloufar.Male
22-11-2013, 14:36
سلام دوستان
من ميخوام دو تا sam7x256 رو با usart به هم وصل کنم ولي هر کاري ميکنم جواب نميده
برنامه ام رو ميذارم لطفا کمکم کنيد
برنامه به اين شکله که هر دوتا ميکرو 0x55 رو بايد براي هم بفرستند و اونا بايد ديتاي دريافتي رو روي tft نمايش بدن
راستی از برد های آرم اتمل کویر استفاده میکنم
دو تا برد رو با usart به هم وصل کنم
لطفا کمکم کنيد
#include <AT91SAM7X256.h>
#include <delay.h>
#include "TFTLCD.h"
#include "nature.h"
char PORTRAIT = 0;
char data;
//char q = 'B';
int main(){
tftlcd_init();
*AT91C_PMC_PCER = 1<<6;//Enable pmc for usart
*AT91C_PIOA_PDR =(1<<0|1<<1);//Disable pin0 pin 1 for usart0
*AT91C_PIOA_ASR =(1<<0|1<<1);//duty a for usart
//Usart configuration
*AT91C_US0_CR = 0X88;
*AT91C_US0_MR = 0x80;
*AT91C_US0_BRGR = 0x4E0;
*AT91C_US0_CR = 1<<6;

while(1){
// while (!(*AT91C_US0_CSR & 1<<1));
*AT91C_US0_THR = 0x55;
delay_ms(50);
*AT91C_US0_RHR = data;
tftlcd_putchar(data ,RED,GREEN,1);
delay_ms(50);
//tftlcd_putchar(q ,RED,GREEN,1);
tftlcd_gotoxy(0,0);

}
}

1nafar
22-11-2013, 23:29
سلام
بهتره برای پیکربندی بخش های مختلف میکروکنترلر از کد های استاندارد استفاده کنید ، این کد ها در فایل هدر میکروکنترلر وجود داره ، مثلا به جای :

*AT91C_PIOA_PDR =(1<<0|1<<1);//Disable pin0 pin 1 for usart0
میتونید بنویسید :

*AT91C_PIOA_PDR|=(AT91C_PA0_RXD0 | AT91C_PA1_TXD0|AT91C_PA3_RTS0);
در زیر پیکربندی صحیح واحد USART1 رو مشاهده میکنید :( شما متونید این پیکربندی رو با تغییر دادن شماره ی واحد به یک و همچنین شماره پایه ها به یوزارت 0 تغییر بدید )

//*AT91C_PMC_PCER : (PMC) Peripheral Clock Enable Register for USART0
*AT91C_PMC_PCER|=(1<<AT91C_ID_US1); // Enable Clock for USART0
*AT91C_PIOA_PDR|=(AT91C_PA5_RXD1 | AT91C_PA6_TXD1|AT91C_PA8_RTS1|AT91C_PA9_CTS1); //Disable I/O,PA5_RXD1,PA6_TXD1,PA8_RTS1,PA9_CTS1
*AT91C_PIOA_ASR|=(AT91C_PIO_PA5 | AT91C_PIO_PA6|AT91C_PIO_PA8|AT91C_PIO_PA9); // define peripheral A select regidtry
//*AT91C_US0_CR:USART Control Register
*AT91C_US1_CR=(AT91C_US_RSTRX|AT91C_US_RSTTX|AT91C _US_RXEN|AT91C_US_TXEN);//RESET UART, Enable Receiver & Transmitter
//*AT91C_US1_IDR:USART Interrupt Disable Register
*AT91C_US1_IDR = 0xFFFF; // all usart0 interrupts disabled
//*AT91C_US1_RTOR:USART Receiver Time-out Register
*AT91C_US1_RTOR = 0; // receiver time-out (disabled)
//*AT91C_US1_TTGR : USART Transmitter Timeguard Register
*AT91C_US1_TTGR = 0; // transmitter timeguard (disabled)
//*AT91C_US1_MR:USART Mode Register
*AT91C_US1_MR = (AT91C_US_USMODE_NORMAL | AT91C_US_CLKS_FDIV1 | // 8-bit characters
//USART Mode Register=(NORMAL MODE , Clock Selection= MCK/DIV (DIV = 8),
AT91C_US_CHRL_8_BITS | AT91C_US_NBSTOP_1_BIT);
//Character Length: 8 bits , 1 stop bit ) Echo,Local Loopback, Remote Loopback. is disable
// attention :in This mode if USCLKS does not select the external clock SCK the USART drives the SCK pin (CLKO bit in US0_MR)
//Oversampling Mode=8 , The NACK is not generated , The USART does not filter the receive line ,
//if you use other Selected Clock , this line is true:
//*AT91C_US0_BRGR=(((M_crystal*73/14)/2)/usart0_Baud0); //BARD RATE
*AT91C_US1_FIDI = 0; // FI over DI Ratio Value (disabled)
*AT91C_US1_IF = 0; // IrDA Filter value (disabled)
*AT91C_US1_BRGR=(((18432000*73/14)/2)/16/9600) ; //BARD RATE
این پیکربندی رو با کد های خودتون مقایسه کنید تا ببنید پیکربندی به درستی انجام شده یا نه .

برای دریافت و ارسال اطلاعات هم دو رجیستر مجزا وجود داره که نشون میده بافر ارسال / دریافت داده پر هست یا خالی ، ارسال داده :


while (!((*AT91C_US0_CSR) & AT91C_US_TXRDY)); // Wait for Empty Tx Buffer
*AT91C_US0_THR = ch;
برای دریافت داده :


while (!((*AT91C_US0_CSR) & AT91C_US_RXRDY)); // Wait for Empty Rx Buffer
ch=*AT91C_US0_RHR ;

شما چرا از کتابخونه ها استفاده نمیکنید ؟

Niloufar.Male
23-11-2013, 04:48
ممنون
من کد جدیدمو رو میذارم اگه میشه نگاش کنید ببینید مشکلش کجاست؟
توی شبیه ساز هم بهم جواب نمیده

#include <AT91SAM7X256.h>
#include <delay.h>
#include "TFTLCD.h"
#include "nature.h"
char PORTRAIT = 0;
char data;
char q='a';
/////////////////////////////////
int main(){
tftlcd_init();
*AT91C_PMC_PCER|=(1<<AT91C_ID_US0);//Enable pmc for usart
*AT91C_PIOA_PDR|=(AT91C_PA0_RXD0 | AT91C_PA1_TXD0);//Disable pin0 pin 1 for usart0
*AT91C_PIOA_ASR =(AT91C_PIO_PA0 | AT91C_PIO_PA1);//duty a for usart
//Usart configuration
// *AT91C_US1_CR = 0x88;
*AT91C_US0_MR = 0x80;
*AT91C_US1_BRGR=0x4E0; //BAURD RATE
//*AT91C_US1_CR = 1<<6;
*AT91C_US0_CR=(AT91C_US_RSTRX|AT91C_US_RSTTX|AT91C _US_RXEN|AT91C_US_TXEN);//RESET UART, Enable Receiver & Transmitter
while(1){
//while (!(*AT91C_US1_CSR & 1<<1));
while (!((*AT91C_US0_CSR) & AT91C_US_TXRDY));// Wait for Empty Tx Buffer
*AT91C_US0_THR = 0x10;
while (!((*AT91C_US0_CSR) & AT91C_US_RXRDY)); // Wait for Empty Rx Buffer
data=*AT91C_US0_RHR ;
delay_ms(50);
tftlcd_putchar(q ,RED,GREEN,1);
delay_ms(50);
}
}
////////////////////////////////////////

1nafar
23-11-2013, 07:20
سلام
کد جدید :

#include <AT91SAM7X256.h>
#include "delay.h"
//#include "TFTLCD.h"
//#include "nature.h"
//char PORTRAIT = 0;
char data;
//char q='a';
/////////////////////////////////
int main(){
//tftlcd_init();
*AT91C_PMC_PCER|=(1<<AT91C_ID_US0);//Enable pmc for usart
*AT91C_PIOA_PDR|=(AT91C_PA0_RXD0 | AT91C_PA1_TXD0);//Disable pin0 pin 1 for usart0
*AT91C_PIOA_ASR =(AT91C_PIO_PA0 | AT91C_PIO_PA1);//duty a for usart
//Usart configuration
// *AT91C_US1_CR = 0x88;
*AT91C_US0_CR=(AT91C_US_RSTRX|AT91C_US_RSTTX|AT91C _US_RXEN|AT91C_US_TXEN);//RESET UART, Enable Receiver & Transmitter
*AT91C_US0_MR = (AT91C_US_USMODE_NORMAL | AT91C_US_CLKS_FDIV1 | // 8-bit characters
//USART Mode Register=(NORMAL MODE , Clock Selection= MCK/DIV (DIV = 8),
AT91C_US_CHRL_8_BITS | AT91C_US_NBSTOP_1_BIT);
*AT91C_US0_BRGR=0x4E0; //BAURD RATE
//*AT91C_US1_CR = 1<<6;


while(1){
//while (!(*AT91C_US1_CSR & 1<<1));
while (!((*AT91C_US0_CSR) & AT91C_US_TXRDY)); // Wait for Empty Tx Buffer
*AT91C_US0_THR = data;
while (!((*AT91C_US0_CSR) & AT91C_US_RXRDY)); // Wait for Empty Rx Buffer
data=*AT91C_US0_RHR ;
delay_ms(50);
// tftlcd_putchar(q ,RED,GREEN,1);
delay_ms(50);
}
}
////////////////////////////////////////
توی خطوط زیر مشکل وجود داشت :

*AT91C_US1_BRGR=0x4E0; //BAURD RATE
توی شبیه سازی مقدار نرخ انتقال داده برابر با 300 هست ، ظاهرا یه جای توی محاسبات اشتباه کردید . US0_BRGR با مقدار صحیح مقدار دهی نشده ( البته شاید شما به نرخ 300 نیاز داشته باشید ) .

Niloufar.Male
23-11-2013, 11:30
ممنون
نه اشتباه محاسباتی کرده بودم
واقعا ممنون

Niloufar.Male
24-11-2013, 00:00
دو تا سوال دیگه
با کدوم دستور میشه عدد دریافت و ارسال کرد و روی tft نمایش داد؟
توی شبیه ساز کیل هم برنامه رو run میکنم برای من حدود 20 ثانیه طول میکشه تا برنامه کامل جواب بده و
bude rate به مقدار 9600 برسه؟ در حالی که از زمان شبیه سازی کمتر از یک ثانیه گذشته.(کلا زمان شبیه سازی توی کیل من خیلی کند پیش میره
مشکل کجاشه؟
بازم ممنون

Niloufar.Male
24-11-2013, 00:53
برنامه جدید رو نوشتم
اگه میشه یه نگاه بهش بندازید
ببینید مشکلی داره یا نه
من از برد های آرم اتمل کویر استفاده میکنم
از برنامم جواب نگرفتم

#include <AT91SAM7X256.h>
#include <delay.h>
#include "TFTLCD.h"
#include "nature.h"
char PORTRAIT = 0;
char data;
/////////////////////////////////
int main(){
tftlcd_init();
*AT91C_PMC_PCER|=(1<<AT91C_ID_US0);//Enable pmc for usart
*AT91C_PIOA_PDR|=(AT91C_PA0_RXD0 | AT91C_PA1_TXD0);//Disable pin0 pin 1 for usart0
*AT91C_PIOA_ASR =(AT91C_PIO_PA0 | AT91C_PIO_PA1);//duty a for usart
//Usart configuration
*AT91C_US0_CR=(AT91C_US_RSTRX|AT91C_US_RSTTX|AT91C _US_RXEN|AT91C_US_TXEN);//RESET UART, Enable Receiver & Transmitter
*AT91C_US0_MR = (AT91C_US_USMODE_NORMAL | AT91C_US_CLKS_FDIV1 | // 8-bit characters
//USART Mode Register=(NORMAL MODE , Clock Selection= MCK/DIV (DIV = 8),
AT91C_US_CHRL_8_BITS | AT91C_US_NBSTOP_1_BIT);
*AT91C_US0_BRGR=0x27; //BAURD RATE
while(1){
//while (!(*AT91C_US1_CSR & 1<<1));

while (!((*AT91C_US0_CSR) & AT91C_US_RXRDY)); // Wait for Empty Rx Buffer
data=*AT91C_US0_RHR ;
delay_ms(50);
while (!((*AT91C_US0_CSR) & AT91C_US_TXRDY));// Wait for Empty Tx Buffer
*AT91C_US0_THR = 0x55;
}
}
////////////////////////////////////////

1nafar
24-11-2013, 07:29
سلام
برنامه برای من بدون هیچ مشکلی کار میکه و سریع جواب میده . بهتره کل پروژه رو ارسال کنید ، من فایل های TFTLCD.h و nature.h رو ندارم و اونا رو از سورس حذف میکنم ، شاید توی این فایل ها دستوراتی باشه که سرعت اجرا رو کم میکنه ، شاید هم سرعت کامپیوترتون پایینه .
چرا شما از کتابخونه ی USART.H استفاده نمیکنید ؟

Niloufar.Male
24-11-2013, 17:25
اول ممنون از جواب
فایل ها رو ضمیمه میکنم
ولی برای خیلی از برنامه ها که دیدم سرعت usart خیلی خوب و منطقی هست
دلم میخوا از tft استفاده کنم تا بفهمم برنامه داره درست اجرا میشه و اون عبارت های ارسالی دقیقاا همون ها هستند
اگه میشه به اون برنامه tft رو هم اضافه کنید
شاید مشکل از خطوط tft هست
یه سوال دیگه هم دارم
شما از کجا میدونید برنامه تون درست اجرا میشه؟من از طریق tft این کار رو میکنم
اگه راه ساده تری هم وجود داره
ممنون میشم اگه بهم بگید

Niloufar.Male
24-11-2013, 17:39
آقای 1nafar توی آپلود فایل ها بهم ارور میگیره
اون کتابخونه ها داخل سیدی کتاب ارم شرکت کویر بود
یه برنامه دیکه هم نوشتم اگه میشه یه نگاه بهش بندازید ببینید مشکل داره یانه

#include <AT91SAM7X256.h>
#include <delay.h>
#include "TFTLCD.h"
#include "nature.h"
char PORTRAIT = 0;
char data;
/////////////////////////////////
int main(){
tftlcd_init();
*AT91C_PMC_PCER|=(1<<AT91C_ID_US0);//Enable pmc for usart
*AT91C_PIOA_PDR|=(AT91C_PA0_RXD0 | AT91C_PA1_TXD0);//Disable pin0 pin 1 for usart0
*AT91C_PIOA_ASR =(AT91C_PIO_PA0 | AT91C_PIO_PA1);//duty a for usart
//Usart configuration
*AT91C_US0_CR=(AT91C_US_RSTRX|AT91C_US_RSTTX|AT91C _US_RXEN|AT91C_US_TXEN);//RESET UART, Enable Receiver & Transmitter
*AT91C_US0_MR = (AT91C_US_USMODE_NORMAL | AT91C_US_CLKS_FDIV1 | // 8-bit characters
//USART Mode Register=(NORMAL MODE , Clock Selection= MCK/DIV (DIV = 8),
AT91C_US_CHRL_8_BITS | AT91C_US_NBSTOP_1_BIT);
*AT91C_US0_BRGR=0x27; //BAURD RATE
while(1){
// while (!(*AT91C_US1_CSR & 1<<1));

while (!((*AT91C_US0_CSR) & AT91C_US_RXRDY)); // Wait for Empty Rx Buffer
data=*AT91C_US0_RHR ;
tftlcd_putchar(data,BLUE,GREEN,1);
delay_ms(50);
while (!((*AT91C_US0_CSR) & AT91C_US_TXRDY));// Wait for Empty Tx Buffer
*AT91C_US0_THR = 0x55;
}
}
////////////////////////////////////////

1nafar
25-11-2013, 07:24
سلام
همون طور که قبلا هم گفتم من به سخت افزار و فایل های TFTLCD.h و nature.h دسترسی ندارم .

ولی برای خیلی از برنامه ها که دیدم سرعت usart خیلی خوب و منطقی هست
دلم میخوا از tft استفاده کنم تا بفهمم برنامه داره درست اجرا میشه و اون عبارت های ارسالی دقیقاا همون ها هستند
اگه میشه به اون برنامه tft رو هم اضافه کنید
شاید مشکل از خطوط tft هست
یه سوال دیگه هم دارم
شما از کجا میدونید برنامه تون درست اجرا میشه؟من از طریق tft این کار رو میکنم
اگه راه ساده تری هم وجود داره
ممنون میشم اگه بهم بگید
من از شبیه ساز keil استفاده میکنم ، برای کسب اطلاعات بیشتر مجله ی شماره ی6-7 رو دانلود کنید :
دانلود : مجله تخصصی میکروکنترلر شماره 6-7 - ایـــــــــران میـــــــکرو ™ (You can see links before reply)
در ضمن بهتره فعلا از کتابخونه برای راه اندازی بخش های مختلف میکروکنترلر استفاده کنید و بعد از یادگیری نحوه ی کار به سراغ استفاده ی مستقیم از رجیستر ها برید .

Niloufar.Male
25-11-2013, 13:06
من اون کتابخونه رو راه اندازی کردم و هیچ مشکلیی نداشتم
همون بار اول هم ازش جواب گرفتم
توی اون برنامه اصلی هم توی شبیه سازی جواب میگیرم
ولی توی واقعیت نه.