#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
评论4
最新资源