Em muốn sử dụng ngắt để nhận một ký tự từ PC. Sau khi nhận được thì gửi lại ký tự đó trở lại PC. Nhưng không thực hiện được. Dưới đây là chương trình viết trên AvrStadio 4 mong các bác chỉ bảo:
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/signal.h>
// Declare
void Init_COM(unsigned short) ;
unsigned char *c;
unsigned char Flag_Rs232=0;
SIGNAL(USART1_TX_vect)
{
if(Flag_Rs232==1)
{
UDR1=*c;
UCSR1A = (1<<TXC1); // TXC1 = 0
*c=0;
Flag_Rs232=0;
};
}
SIGNAL(USART1_UDRE_vect)
{
*c=UDR1;
UCSR1A = (1<<RXC1); // RXC1 = 0
if(*c==11) Flag_Rs232=1;
UCSR1A |= (1<<TXC1); // TXC1 = 1
}
//-------------------------------
int main(void)
{
Init_COM(9600); // init USART
sei();
while(1);
return 0;
}
//------------------------------
//UBRR: USART Baud Rate Register
//------------------------------
void Init_COM(unsigned short BaudRate)
{
//-----------------------------------
// set baud rate
// F_CPU=8MHz
// BaudRate=9600
//-----------------------------------
//UBRR1H = (uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8) ;
//UBRR1L = (uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);
UBRR1H = (uint8_t)(((F_CPU/(BaudRate * 161))-1)>>8);
UBRR1L = (uint8_t)((F_CPU/(BaudRate * 161))-1);
//-----------------------------------
// Enable receiver and transmitter; enable RX interrupt
// RXEN1=1
// TXEN1=1
// RXCIE1=1
// TXCIE1=1
// TXB81=1
// RXB81=1
// UCSZ12=1
//-----------------------------------
UCSR1B =0xDF;//0xDF
//-----------------------------------
//asynchronous 8N1
// USBS1=1
// UCSZ11=1
// UCSZ10=1
// UMSEL1=0
//-----------------------------------
UCSR1C =0x0E;//0x0E;
}
Mail: works2000@yahoo.com
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/signal.h>
// Declare
void Init_COM(unsigned short) ;
unsigned char *c;
unsigned char Flag_Rs232=0;
SIGNAL(USART1_TX_vect)
{
if(Flag_Rs232==1)
{
UDR1=*c;
UCSR1A = (1<<TXC1); // TXC1 = 0
*c=0;
Flag_Rs232=0;
};
}
SIGNAL(USART1_UDRE_vect)
{
*c=UDR1;
UCSR1A = (1<<RXC1); // RXC1 = 0
if(*c==11) Flag_Rs232=1;
UCSR1A |= (1<<TXC1); // TXC1 = 1
}
//-------------------------------
int main(void)
{
Init_COM(9600); // init USART
sei();
while(1);
return 0;
}
//------------------------------
//UBRR: USART Baud Rate Register
//------------------------------
void Init_COM(unsigned short BaudRate)
{
//-----------------------------------
// set baud rate
// F_CPU=8MHz
// BaudRate=9600
//-----------------------------------
//UBRR1H = (uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8) ;
//UBRR1L = (uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);
UBRR1H = (uint8_t)(((F_CPU/(BaudRate * 161))-1)>>8);
UBRR1L = (uint8_t)((F_CPU/(BaudRate * 161))-1);
//-----------------------------------
// Enable receiver and transmitter; enable RX interrupt
// RXEN1=1
// TXEN1=1
// RXCIE1=1
// TXCIE1=1
// TXB81=1
// RXB81=1
// UCSZ12=1
//-----------------------------------
UCSR1B =0xDF;//0xDF
//-----------------------------------
//asynchronous 8N1
// USBS1=1
// UCSZ11=1
// UCSZ10=1
// UMSEL1=0
//-----------------------------------
UCSR1C =0x0E;//0x0E;
}
Mail: works2000@yahoo.com
Comment