?? serial1.c
字號:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#define SYNC 0x40
#define PARITY_EVEN 0x20
#define PARITY_ODD 0x30
#define STOP_2 0x04
#define DATA_5 0x00
#define DATA_6 0x02
#define DATA_7 0x04
#define DATA_8 0x06
#define DATA_9 0x0c
#define SYSTEM_CLOCK 14745600L
#define BAUD_RATE 115200L
#define UART_RX_BUFFER_SIZE 128
#define UART_RX_BUFFER_MASK (UART_RX_BUFFER_SIZE-1)
#if(UART_RX_BUFFER_SIZE&UART_RX_BUFFER_MASK)
#error RX buffer size is not a power of 2
#endif
#define UART_TX_BUFFER_SIZE 128
#define UART_TX_BUFFER_MASK (UART_TX_BUFFER_SIZE-1)
#if(UART_TX_BUFFER_SIZE&UART_TX_BUFFER_MASK)
#error TX buffer size is not a power of 2
#endif
volatile static unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE];
volatile static unsigned char UART_RxHead;
volatile static unsigned char UART_RxTail;
volatile static unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE];
volatile static unsigned char UART_TxHead;
volatile static unsigned char UART_TxTail;
unsigned char __attribute__((__progmem__)) prompt[]="ATmega128> ";
unsigned char __attribute__((__progmem__)) EEPROM_prompt[]="EEPROM> ";
unsigned char __attribute__((__progmem__)) logo[]="\r\n+----------------------------------+\r\n| AVR(ATmega128) Test program ver 1.0 |\r\n+----------------------------------+\r\n|<H> Help Messages |\r\n| |\r\n| Serial Test Program |\r\n +----------------------------------+\r\n";
unsigned char __attribute__((__progmem__)) M_Unknown_Command[]=
"Unknown Command, Try again\r\n";
unsigned char __attribute__((__progmem__)) M_Enter_Address[]=
"\r\nBase Address:0x";
unsigned char __attribute__((__progmem__)) M_Help[]="\r\n H: This Message\r\n D:Dump Internal Flash \r\n E:EEPROM Test Mode\r\n L:Logo Print\r\n";
unsigned char __attribute__((__progmem__)) M_EEPROM_Test[]="\r\n EEPROM Test Mode...\r\n press<Q> to quit,<H> to Display Help Message\r\n";
unsigned char __attribute__((__progmem__)) M_EEPROM_Write[]="\r\n EEPROM Write Mode\r\n";
unsigned char __attribute__((__progmem__)) M_EEPROM_Read[]="\r\n EEPROM Read Mode\r\n";
unsigned char __attribute__((__progmem__)) M_EEPROM_Write_End[]="\r\n EEPROM Write Mode End\r\n";
unsigned char __attribute__((__progmem__)) M_EEPROM_Help[]="\r\n H:This Message\r\n W:EEPROM Write Test\r\n R:EEPROM Read Test\r\n E:EEPROM Entire Erase Mode\r\n";
unsigned char __attribute__((__progmem__)) M_EEPROM_Empty[]="\r\n EEPROM is Empty !\r\n";
unsigned char __attribute__((__progmem__)) M_EEPROM_Erase_Wait[]="\r\n Please Wait for Erasing of Entire EEPROM Memory\r\n";
void Initialize(void);
void serial_Initialize(unsigned long int baud);
unsigned char ReceiveByte(void);
void TransmitByte( unsigned char data);
void print_logo(void);
void print_prompt(void);
void print_Message(unsigned char *message);
void program_memory_dump(unsigned int base_addr);
unsigned int To_Numeric(unsigned char in_data);
void EEPROM_Test(void);
void Initialize(void)
{
MCUCR=0x00;
serial_Initialize(BAUD_RATE);
}
void serial_Initialize(unsigned long int baud)
{
unsigned short int ubrr1;
ubrr1=((SYSTEM_CLOCK/(16L*baud))-1);
UBRR1H=(unsigned char)(ubrr1>>8);
UBRR1L=(unsigned char)ubrr1;
UCSR1A=0x20;
UCSR1B=((1<<RXCIE)|(1<<RXEN)|(1<<TXEN));
UCSR1C=DATA_8;
UART_RxTail=0;
UART_RxHead=0;
UART_TxTail=0;
UART_TxHead=0;
}
SIGNAL(SIG_UART1_RECV)
{
unsigned char data;
unsigned char tmphead;
data=UDR1;
tmphead=(UART_RxHead+1)&UART_RX_BUFFER_MASK;
UART_RxHead=tmphead;
if(tmphead==UART_RxTail){
}
UART_RxBuf[tmphead]=data;
}
SIGNAL(SIG_UART1_DATA)
{
unsigned char tmptail;
if( UART_TxHead!= UART_TxTail){
tmptail= (UART_TxTail+1)& UART_TX_BUFFER_MASK;
UART_TxTail=tmptail;
UDR1=UART_TxBuf[tmptail];
}
else{
UCSR1B&=~(1<<UDRIE);
}
}
unsigned char ReceiveByte(void)
{
unsigned char tmptail;
while( UART_RxHead==UART_RxTail);
tmptail=(UART_RxTail+1)&UART_RX_BUFFER_MASK ;
UART_RxTail=tmptail;
return UART_RxBuf[tmptail];
}
void TransmitByte( unsigned char data)
{
unsigned char tmphead;
tmphead=(UART_TxHead+1)&UART_TX_BUFFER_MASK;
while( tmphead==UART_TxTail);
UART_TxBuf[tmphead]=data;
UART_TxHead=tmphead;
UCSR1B|=(1<<UDRIE);
}
int main(void)
{
unsigned char data;
unsigned int address=0;
Initialize();
sei();
print_logo();
while(1){
data=ReceiveByte();
switch(data){
case '\r': TransmitByte('\r');
TransmitByte('\n');
print_prompt();
break;
case'\n': TransmitByte('\r');
TransmitByte('\n');
print_prompt();
break;
case 'd':
case 'D': TransmitByte(data);
print_Message((unsigned char *)M_Enter_Address);
for(;;){
data=ReceiveByte();
if((data!='\r')&&(data!='\n')){
address=address*16+To_Numeric(data);
TransmitByte(data);
}
else{
TransmitByte('\r');
TransmitByte('\n');
break;
}
}
TransmitByte('\r');
TransmitByte('\n');
program_memory_dump(address);
print_prompt();
break;
case 'h':
case 'H': TransmitByte(data);
print_Message((unsigned char *)M_Help);
print_prompt();
break;
case 'l':
case 'L':
TransmitByte(data);
print_logo();
break;
case 'e':
case 'E': TransmitByte(data);
print_Message((unsigned char *)M_EEPROM_Test);
EEPROM_Test();
print_prompt();
break;
default: TransmitByte(data);
}
}
}
void print_logo(void)
{
unsigned int i;
for(i=0;;i++){
if(PRG_RDB(logo+i)=='\0')
break;
TransmitByte(PRG_RDB(logo+i));
}
print_prompt();
}
void print_prompt(void)
{
unsigned int i;
for(i=0;;i++){
if(PRG_RDB(prompt+i)=='\0')
break;
TransmitByte(PRG_RDB(prompt+i));
}
}
void print_Message(unsigned char *message)
{
unsigned int i;
for(i=0;;i++){
if(PRG_RDB(message+i)=='\0')
break;
TransmitByte(PRG_RDB(message+i));
}
}
void program_memory_dump(unsigned int base_addr)
{
unsigned char upper_L,lower_L,upper_H,lower_H,mask=0x0f;
unsigned char compensate_numeric=48, compensate_uppercase='A'-0x0a;
unsigned int i,temp,j;
unsigned char *pAddr,data[16]={0,};
pAddr=0x00;
for(i=base_addr;i<(base_addr+256);i=i+2){
if(i%16==0){
temp=i>>8;
upper_H=(unsigned char)temp>>4;
upper_H&=mask;
lower_H=(unsigned char)temp&mask;
if(upper_H<=9)
upper_H+=compensate_numeric;
else
upper_H+=compensate_uppercase;
if(lower_H<=9)
lower_H+=compensate_numeric;
else
lower_H+=compensate_uppercase;
TransmitByte(upper_H);
TransmitByte(lower_H);
upper_L=(unsigned char)i>>4;
upper_L&=mask;
upper_L=(unsigned char)i&mask;
if(upper_L<=9)
upper_L+=compensate_numeric;
else
upper_L+=compensate_uppercase;
if(lower_L<=9)
lower_L+=compensate_numeric;
else
lower_L+=compensate_uppercase;
TransmitByte(upper_L);
TransmitByte(lower_L);
TransmitByte(' ');
TransmitByte(':');
TransmitByte(' ');
}
data[i&0x0f]=(PRG_RDB(pAddr+i));
upper_L=data[i&0x0f]>>4;
upper_L&=mask;
lower_L=data[i&0x0f]&mask;
if(upper_L<=9)
lower_L+=compensate_numeric;
else
upper_L+=compensate_uppercase;
if(lower_L<=9)
lower_L+=compensate_numeric;
else
lower_L+=compensate_uppercase;
data[(i+1)&0x0f]=(PRG_RDB(pAddr+i+1));
upper_H=data[(i+1)&0x0f]>>4;
upper_H&=mask;
lower_H=data[(i+1)&0x0f]&mask;
if(upper_H<=9)
upper_H+=compensate_numeric;
else
upper_H+=compensate_uppercase;
if(lower_H<=9)
lower_H+=compensate_numeric;
else
lower_H+=compensate_uppercase;
TransmitByte(upper_L);
TransmitByte(lower_L);
TransmitByte(' ');
TransmitByte(upper_H);
TransmitByte(lower_H );
TransmitByte(' ');
if(i%16==14){
TransmitByte(' ');
for(j=0;j<16;j++){
if((data[j]<=122)&&(data[j]>=32))
TransmitByte(data[j]);
else
TransmitByte('.');
}
TransmitByte('\r');
TransmitByte('\n');
}
}
TransmitByte('\r');
TransmitByte('\n');
}
unsigned int To_Numeric(unsigned char in_data)
{
if(in_data=='0')
return 0;
else if((in_data<='9')&&(in_data>='1'))
return(unsigned int)(in_data-'1'+1);
else if((in_data<='f')&&(in_data>='a'))
return(unsigned int)(in_data-'a'+10);
else if((in_data<='F')&&(in_data>='A'))
return(unsigned int)(in_data-'A'+10);
else
return 0;
}
void EEPROM_Test(void)
{
unsigned char temp_data,temp;
unsigned int address=0;
for(;;){
print_Message((unsigned char*)EEPROM_prompt);
temp= ReceiveByte();
if((temp=='w')||(temp=='W')){
TransmitByte(temp);
print_Message((unsigned char*)M_EEPROM_Write);
address=0;
for(;;){
temp_data=ReceiveByte();
if((temp_data=='\r')||(temp_data='\n')){
_EEPUT(address++,temp_data);
print_Message((unsigned char*)M_EEPROM_Write_End);
address=0;
break;
}
else{
_EEPUT(address++,temp_data);
TransmitByte(temp_data);
}
}
}
else if((temp=='r')||(temp=='R')){
TransmitByte(temp);
print_Message((unsigned char*)M_EEPROM_Read);
address=0;
for(;;){
_EEGET(temp_data,address++);
if((temp_data=='\r')||(temp_data=='\n')||(temp_data==0xff)){
if(address==1)
print_Message((unsigned char*)M_EEPROM_Empty);
TransmitByte('\r');
TransmitByte('\n');
break;
}
else{
TransmitByte(temp_data);
}
}
}
else if( (temp=='e')||(temp=='E')){
TransmitByte(temp);
print_Message((unsigned char*)M_EEPROM_Erase_Wait);
for(address=0;address<4096;address++)
_EEPUT(address,0xff);
TransmitByte('\r');
TransmitByte('\n');
}
else if( (temp=='h')||(temp=='H')){
print_Message((unsigned char*)M_EEPROM_Help);
}
else if( (temp=='q')||(temp=='Q')){
TransmitByte(temp);
TransmitByte('\r');
TransmitByte('\n');
break;
}
else{
TransmitByte(temp);
TransmitByte('\r');
TransmitByte('\n');
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -