Em làm mạch giao tiếp mega8 với PC (laptop):
+Dùng IC chuyển mức áp RS232
+do laptop ko có COM nên phải xài USB to RS232 cable
+không có thạch anh 7.3728 nên dùng tạm 8Mhz nội của mega8
Em thử truyền nhận giữa hai con mega8 hoặc mega8 với mega16 thì bình thường, tự mỗi con truyền nhận cũng bình thường, đang hứng thú đem cắm vô PC là oooc eei....e dùng COMport monitor nó toàn nhận 0x00, gửi xuống VDK cũng ko nhận được. code của e bên dưới mấy huynh có kinh nghiệm sửa lỗi giùm e phát:
CHO EM HỎI THÊM : trong mạch chuyển mức áp của con MAX232 trong giao tiếp USART với PC em thấy thường dùng tụ 10uF, một số thiết kế lại chỉ dùng tụ 0.1uF là sao vậy,có phải để thay đổi độ lớn áp ra trên bus RS232.
Code:
+Dùng IC chuyển mức áp RS232
+do laptop ko có COM nên phải xài USB to RS232 cable
+không có thạch anh 7.3728 nên dùng tạm 8Mhz nội của mega8
Em thử truyền nhận giữa hai con mega8 hoặc mega8 với mega16 thì bình thường, tự mỗi con truyền nhận cũng bình thường, đang hứng thú đem cắm vô PC là oooc eei....e dùng COMport monitor nó toàn nhận 0x00, gửi xuống VDK cũng ko nhận được. code của e bên dưới mấy huynh có kinh nghiệm sửa lỗi giùm e phát:
CHO EM HỎI THÊM : trong mạch chuyển mức áp của con MAX232 trong giao tiếp USART với PC em thấy thường dùng tụ 10uF, một số thiết kế lại chỉ dùng tụ 0.1uF là sao vậy,có phải để thay đổi độ lớn áp ra trên bus RS232.
Code:
#include <avr/io.h>
#include <avr/iom8.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#define FOSC 8000000//clock speed
#define BAUD 9600
#define MYUBRR ((FOSC/(16*BAUD))-1)
unsigned char data_in;
unsigned char data_out;
void main(void)
{
DDRB=0xff
USART_init(MYUBRR);
sei();
while(1)
{
data_out=0X0F;
_delay_ms(1000);
USART_transmit(data_out);
data_out=0Xf0;
_delay_ms(1000);
USART_transmit(data_out);
};
while(1)
{};
};
//*******************************************
void USART_init(unsigned int ubrr)
{
/*Tao toc do BAUD*/
UBRRH=(unsigned char) (ubrr>>8);
UBRRL=(unsigned char) ubrr;
/*Kich hoat module thu va phat*/
UCSRB|=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
/*Chon khung du lieu: 8bit, no parity, 2 stop bit*/
UCSRC|=(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
};
//*******************************************
void USART_transmit(unsigned char data)
{
/*cho cho thanh ghi dem phat rong*/
while(!(UCSRA&(1<<UDRE)))
{};
UDR=data;
};
//*******************************************
//*******************************************
ISR(USART_RXC_vect)
{
data_in=UDR;
PORTB=data_in;
};
//*******************************************
#include <avr/iom8.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#define FOSC 8000000//clock speed
#define BAUD 9600
#define MYUBRR ((FOSC/(16*BAUD))-1)
unsigned char data_in;
unsigned char data_out;
void main(void)
{
DDRB=0xff
USART_init(MYUBRR);
sei();
while(1)
{
data_out=0X0F;
_delay_ms(1000);
USART_transmit(data_out);
data_out=0Xf0;
_delay_ms(1000);
USART_transmit(data_out);
};
while(1)
{};
};
//*******************************************
void USART_init(unsigned int ubrr)
{
/*Tao toc do BAUD*/
UBRRH=(unsigned char) (ubrr>>8);
UBRRL=(unsigned char) ubrr;
/*Kich hoat module thu va phat*/
UCSRB|=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
/*Chon khung du lieu: 8bit, no parity, 2 stop bit*/
UCSRC|=(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
};
//*******************************************
void USART_transmit(unsigned char data)
{
/*cho cho thanh ghi dem phat rong*/
while(!(UCSRA&(1<<UDRE)))
{};
UDR=data;
};
//*******************************************
//*******************************************
ISR(USART_RXC_vect)
{
data_in=UDR;
PORTB=data_in;
};
//*******************************************
Comment