|
发表于 2006-9-19 12:50:20
|
显示全部楼层
搂主你的程序有很多错误:atmega88串口中断向量的宏与atmega8的只差一个字符,你用的是atmega8的宏,因此串口中断向量并没有指向你所期望的函数而是空函数,它将使系统复位,看看*.lss就知道了;其它接口函数也有问题,就不指出了。
以下是我在你的程序上作了修改:
/************************************************
**** Atmega88 AT24C04 TWI,USART???? ***
**** ????UART ???? ***
**** ***
**** ??: Fantasy zx ***
**** ???:WinAVR-20050214-install ***
**** ***
************************************************/
#include <avr/io.h>
#include <avr/interrupt.h>
//#include <avr/signal.h>
#include <util/delay.h>
#define uchar unsigned char
#define uint unsigned int
#if defined(__AVR_ATmega8__)
#define UBRR0H UBRRH
#define UBRR0L UBRRL
#define UCSR0B UCSRB
#define UCSR0C UCSRC
#define UDR0 UDR
#define RXCIE0 RXCIE
#define TXCIE0 TXCIE
#define RXEN0 RXEN
#define TXEN0 TXEN
#define UCSZ00 UCSZ0
#define UCSZ01 UCSZ1
#elif defined(__AVR_ATmega48__)||defined(__AVR_ATmega88__)||defined(__AVR_ATmega168__)
#define SIG_UART_RECV SIG_USART_RECV
#define SIG_UART_TRANS SIG_USART_TRANS
#endif
volatile uchar g_bTxdPos=0; //???????
volatile uchar g_bTxdLen=0; //???????
volatile uchar g_bRxdPos=0; //???????
volatile uchar g_bRxdLen=0; //???????
uchar g_aSendBuf[32]; //???????
uchar g_aRecvBuf[32]; //???????
void PORT_Init(void)
{
PORTB = 0xFF;
DDRB = 0x00;
PORTC = 0xFF; //m103 output only
DDRC = 0x00;
PORTD = 0xFF;
DDRD = 0x00;
}
/***********uart ???**************************/
// ???? : 8.0MHz
// ????: 8 Data, 1 Stop, No Parity
// ???:
// UBRR0L= 0x0C 19200;
// UBRR0L= 0x19 9600;
// UBRR0L= 0x33 4800;
// UBRR0L= 0x67 2400
void USART_Init(void )
{
/* ?????*/
UBRR0H = 0x00;
UBRR0L = 0x33;//9600 baud 8MHz:51 u2x0=0 103 u2x0=1
//???????????????????????
UCSR0B = (1<<RXCIE0)|(1<<TXCIE0)|(1<<RXEN0)|(1<<TXEN0);
#if defined(__AVR_ATmega8__)
UCSRC|=(1<<URSEL) | (1<<UCSZ1)|(1<<UCSZ0); //8????+1????,????
#elif defined(__AVR_ATmega48__)||defined(__AVR_ATmega88__)||defined(__AVR_ATmega168__)
UCSR0C|= (1<<UCSZ01)|(1<<UCSZ00); //8????+1????,????
#endif
}
/***********????*****************************/
SIGNAL(SIG_UART_RECV)
{
uchar c=UDR0;
if(g_bRxdLen)
{
g_aRecvBuf[g_bRxdPos++]=c;
g_bRxdLen--;
}
else g_bTxdPos=0;
}
/***********????*****************************/
SIGNAL (SIG_UART_TRANS)
{
if(g_bTxdLen)
{
UDR0=g_aSendBuf[++g_bTxdPos];
g_bTxdLen--;
}
else g_bTxdPos=0;
}
//??????
uchar RecvComplete(void)
{
return (g_bRxdLen==0);
}
/***********??????????????**********/
void SendToUart(uchar size)
{
g_bTxdPos=0;
g_bTxdLen=size-1;
UDR0=g_aSendBuf[0];
while(g_bTxdLen>0);
}
/***********??????????????**********/
void RecvFromUart(uchar size,uchar bwait)
{
g_bRxdPos=0;
g_bRxdLen=size;
if(bwait)
while(g_bRxdLen>0);
}
int main( void )
{
uchar i;
cli();
PORT_Init();
USART_Init();
sei();//?????
while(1)
{
//????16 ????
RecvFromUart(32,0);
//??????
while(!RecvComplete());
//???????????????
for(i=0;i<32;i++)
g_aSendBuf=g_aRecvBuf;
//?????????
SendToUart(32);
}
}
PN2对中文显示不好,将就看吧。
用atmega8 再proteus仿真结果:
![](http://cache.amobbs.com/bbs_upload782111/files_6/armok01129067.JPG) |
|