دوستان من در تلاش برای راه اندازی پورت سریال ATXMEGA128A1AU توسط ASF در محیط atmel studio هستم.
برای انجام این کار کلاک CPU میکرو کنترلر را توسط PLL از 8MHz به 32MHz افزایش داده ام و همچنین از کریستال خارجی 8MHz استفاده می کنم.
در سایت خود اتمل یک Quick start جهت راه اندازی پورت سریال توسط این کتابخانه ها قرار داده شده است. در مرحله اول بنده قصد داشتم از اون نمونه کدها کمک بگیرم.
مشکل در این قسمت هست که توسط مقدار دهی به رجیسترهای میکروکنترلر به صورت مستقیم پورت سریال به راحتی راه اندازی می شود ولی با استفاده از توابع این کتابخانه راه اندازی نمی شود.
[code=c]#include <asf.h>
#define F_CPU 32000000UL
#include <util/delay.h>
#include "UART.h"
#define USART_SERIAL &USARTD0
#define USART_SERIAL_BAUDRATE 9600
#define USART_SERIAL_CHAR_LENGTH USART_CHSIZE_8BIT_gc
#define USART_SERIAL_PARITY USART_PMODE_DISABLED_gc
#define USART_SERIAL_STOP_BIT false
static usart_rs232_options_t USART_SERIAL_OPTIONS = {
.baudrate = USART_SERIAL_BAUDRATE,
.charlength = USART_SERIAL_CHAR_LENGTH,
.paritytype = USART_SERIAL_PARITY,
.stopbits = USART_SERIAL_STOP_BIT
};
int main (void)
{
sysclk_init();
board_init();
sysclk_enable_module(SYSCLK_PORT_D, PR_USART0_bm);
usart_init_rs232(USART_SERIAL, &USART_SERIAL_OPTIONS);
while(1)
{
usart_putchar(USART_SERIAL,'h'
;
}
}
[/code]
مشکل دقیقا از این تابع می باشد:
[code=c]usart_init_rs232(USART_SERIAL, &USART_SERIAL_OPTIONS);
[/code]
اگر به جای تابع بالا، تابعی را که خودم برای راه اندازی پورت سریال نوشته ام را قرار بدهم برنامه به صورت کامل و دقیق کار خواهد کرد!
[code=c]void UART_D0_init_9600(void)
{
PORTD_DIRSET = PIN3_bm; //TXD0 output
PORTD_PIN2CTRL = PORT_OPC_PULLUP_gc; //Pullup RXD
USARTD0_BAUDCTRLB = 0;
USARTD0_BAUDCTRLA = 0xCF; // Baud = 9600 bps
USARTD0_CTRLC = USART_CHSIZE_8BIT_gc; // Frame size 8 bit
USARTD0_CTRLC |= USART_CMODE_ASYNCHRONOUS_gc; // Uart Asynchron mode
USARTD0_CTRLB = USART_TXEN_bm | USART_RXEN_bm; //TX Enable RX Enable
//USARTD0_CTRLA |= USART_RXCINTLVL_HI_gc; //Enable Receive interrupt in High level
USARTD0_CTRLA |= USART_RXCINTLVL_LO_gc; //Enable Receive interrupt in Low level
//PMIC_CTRL = PMIC_HILVLEN_bm; //Enable High level interrupt
PMIC_CTRL = PMIC_LOLVLEN_bm; //Enable Low level interrupt
}
[/code]
دانلود کل فایل پروژه:
کامپایلر Atmel studio 7
http://uplod.ir/h5c57jthk2ke/UART_1.rar.htm
به نظر شما مشکل کار من از کجا هست؟
برای انجام این کار کلاک CPU میکرو کنترلر را توسط PLL از 8MHz به 32MHz افزایش داده ام و همچنین از کریستال خارجی 8MHz استفاده می کنم.
در سایت خود اتمل یک Quick start جهت راه اندازی پورت سریال توسط این کتابخانه ها قرار داده شده است. در مرحله اول بنده قصد داشتم از اون نمونه کدها کمک بگیرم.
مشکل در این قسمت هست که توسط مقدار دهی به رجیسترهای میکروکنترلر به صورت مستقیم پورت سریال به راحتی راه اندازی می شود ولی با استفاده از توابع این کتابخانه راه اندازی نمی شود.
[code=c]#include <asf.h>
#define F_CPU 32000000UL
#include <util/delay.h>
#include "UART.h"
#define USART_SERIAL &USARTD0
#define USART_SERIAL_BAUDRATE 9600
#define USART_SERIAL_CHAR_LENGTH USART_CHSIZE_8BIT_gc
#define USART_SERIAL_PARITY USART_PMODE_DISABLED_gc
#define USART_SERIAL_STOP_BIT false
static usart_rs232_options_t USART_SERIAL_OPTIONS = {
.baudrate = USART_SERIAL_BAUDRATE,
.charlength = USART_SERIAL_CHAR_LENGTH,
.paritytype = USART_SERIAL_PARITY,
.stopbits = USART_SERIAL_STOP_BIT
};
int main (void)
{
sysclk_init();
board_init();
sysclk_enable_module(SYSCLK_PORT_D, PR_USART0_bm);
usart_init_rs232(USART_SERIAL, &USART_SERIAL_OPTIONS);
while(1)
{
usart_putchar(USART_SERIAL,'h'

}
}
[/code]
مشکل دقیقا از این تابع می باشد:
[code=c]usart_init_rs232(USART_SERIAL, &USART_SERIAL_OPTIONS);
[/code]
اگر به جای تابع بالا، تابعی را که خودم برای راه اندازی پورت سریال نوشته ام را قرار بدهم برنامه به صورت کامل و دقیق کار خواهد کرد!
[code=c]void UART_D0_init_9600(void)
{
PORTD_DIRSET = PIN3_bm; //TXD0 output
PORTD_PIN2CTRL = PORT_OPC_PULLUP_gc; //Pullup RXD
USARTD0_BAUDCTRLB = 0;
USARTD0_BAUDCTRLA = 0xCF; // Baud = 9600 bps
USARTD0_CTRLC = USART_CHSIZE_8BIT_gc; // Frame size 8 bit
USARTD0_CTRLC |= USART_CMODE_ASYNCHRONOUS_gc; // Uart Asynchron mode
USARTD0_CTRLB = USART_TXEN_bm | USART_RXEN_bm; //TX Enable RX Enable
//USARTD0_CTRLA |= USART_RXCINTLVL_HI_gc; //Enable Receive interrupt in High level
USARTD0_CTRLA |= USART_RXCINTLVL_LO_gc; //Enable Receive interrupt in Low level
//PMIC_CTRL = PMIC_HILVLEN_bm; //Enable High level interrupt
PMIC_CTRL = PMIC_LOLVLEN_bm; //Enable Low level interrupt
}
[/code]
دانلود کل فایل پروژه:
کامپایلر Atmel studio 7
http://uplod.ir/h5c57jthk2ke/UART_1.rar.htm
به نظر شما مشکل کار من از کجا هست؟
دیدگاه