Xin chào mọi người trên diễn đàn, hi vọng mọi người không bỏ qua vấn đề mà mình trình bày trên tiêu đề vì nghĩ rằng nó quá đơn giản.
Mình code avr được hơn 1 năm rồi, nhưng đến hôm nay mới gặp một hiện tượng lạ không thể chịu được.
Bài toán rất đơn giản như sau, atmega16 gửi kí tự a (ascii=65) cho atmega168 trong chu kì là 10ms, nhiệm vụ của atmega168 chỉ là hiển thị kí tự đó lên terminal ngay trong proteus thôi.
Mình giải quyết bằng cách khi có ngắt nhận hoàn thành ở atmega168 thì nó gửi dữ liệu nhận được lên luôn terminal, đây chỉ là phép thử của mình thôi, còn bài toán thật phải truyền một khung gồm 10byte dữ liệu.
Điều kì lạ là khi bật sei() thì cả chương trình của atmega168 đơ luôn, còn khi không bât sei() thì nó không đơ nữa (test bằng cách cho nhấp nháy portC). MÌnh đã code điều tương tự như vậy với at16 mà không gặp vấn đề như trên.
Mong mọi người cho nhận xét về hiện tượng này, mình xin cảm ơn rất nhiều !
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
#include <vk1.6/usart.h>
unsigned char jst_receive_vl[10];
unsigned char start,i,rx_data,j;
unsigned char Status;
int main(void)
{
CLKPR=0x80;
CLKPR=0x00;
//------------------------------------
_delay_ms(100);
usart_init();
sei();
_delay_ms(100);
//------------------------------------
start=1;
//------------------------------------
while(1)
{
DDRC=0xff;
PORTC^=0xff;
_delay_ms(100);
}
}
ISR(USART_RX_vect)
{
rx_data=UDR0;
usart_transmit(rx_data);
}
Còn đây là cái init của usart:
/************************************************** **********************/
/* USART INIT
1. do not use multiprocessors mode
2. use 8 data bits, 1 start bt and 1 stop bit
3. Baud rate =9600 */
/************************************************** **********************/
void usart_init(void)
{
UBRR0=103;//baudrate= 9600
UCSR0A=0;
UCSR0C|=(1<<UCSZ01)|(1<<UCSZ00);//asynchronous usart, diasbled parity mode, 1 stop bit, charactor size: 8 bits
UCSR0B|=(1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);//cho phep ngat nhan, cho phep truyen, nhan
}
PS: cả atmega328 ,48,88 và 168 đều gặp phải hiện tượng khó hiểu này, 4 con này có chung datasheet !
Mình code avr được hơn 1 năm rồi, nhưng đến hôm nay mới gặp một hiện tượng lạ không thể chịu được.
Bài toán rất đơn giản như sau, atmega16 gửi kí tự a (ascii=65) cho atmega168 trong chu kì là 10ms, nhiệm vụ của atmega168 chỉ là hiển thị kí tự đó lên terminal ngay trong proteus thôi.
Mình giải quyết bằng cách khi có ngắt nhận hoàn thành ở atmega168 thì nó gửi dữ liệu nhận được lên luôn terminal, đây chỉ là phép thử của mình thôi, còn bài toán thật phải truyền một khung gồm 10byte dữ liệu.
Điều kì lạ là khi bật sei() thì cả chương trình của atmega168 đơ luôn, còn khi không bât sei() thì nó không đơ nữa (test bằng cách cho nhấp nháy portC). MÌnh đã code điều tương tự như vậy với at16 mà không gặp vấn đề như trên.
Mong mọi người cho nhận xét về hiện tượng này, mình xin cảm ơn rất nhiều !
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
#include <vk1.6/usart.h>
unsigned char jst_receive_vl[10];
unsigned char start,i,rx_data,j;
unsigned char Status;
int main(void)
{
CLKPR=0x80;
CLKPR=0x00;
//------------------------------------
_delay_ms(100);
usart_init();
sei();
_delay_ms(100);
//------------------------------------
start=1;
//------------------------------------
while(1)
{
DDRC=0xff;
PORTC^=0xff;
_delay_ms(100);
}
}
ISR(USART_RX_vect)
{
rx_data=UDR0;
usart_transmit(rx_data);
}
Còn đây là cái init của usart:
/************************************************** **********************/
/* USART INIT
1. do not use multiprocessors mode
2. use 8 data bits, 1 start bt and 1 stop bit
3. Baud rate =9600 */
/************************************************** **********************/
void usart_init(void)
{
UBRR0=103;//baudrate= 9600
UCSR0A=0;
UCSR0C|=(1<<UCSZ01)|(1<<UCSZ00);//asynchronous usart, diasbled parity mode, 1 stop bit, charactor size: 8 bits
UCSR0B|=(1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);//cho phep ngat nhan, cho phep truyen, nhan
}
PS: cả atmega328 ,48,88 và 168 đều gặp phải hiện tượng khó hiểu này, 4 con này có chung datasheet !