📄 debugatmega128.h
字号:
#ifndef _DEBUG_ATMEGA128_H_
#define _DEBUG_ATMEGA128_H_
#define STX 0x02
#define ETX 0x03
unsigned char gAtEmulCmd;
unsigned int gAtEmulAddr;
unsigned char gAtEmulData[4];
char gAtEmulDataPos;
unsigned char gAtEmulRwSize;
unsigned char gAtEmulChkSum;
void AtMg128DebugInit()
{
/*
SPCR = 0x00;
SPCR |= 0x80; // B7:SPI Interrupt Enable
SPCR |= 0x40; // B6:SPI Enable
SPCR |= 0x03; // Clock / 128
DDRE |= 0x03;
*/
UCSR0A = 0x00;
UCSR0B = 0x00;
UCSR0B |= 0x80; // B7:RX Interrupt Enable
UCSR0B |= 0x40; // B7:TX Interrupt Enable
UCSR0B |= 0x10; // B4:RX Enable
UCSR0B |= 0x08; // B3:TX Enable
UCSR0C = 0x00;
UCSR0C |= 0x40; // B6:0:Async,1:Sync
UCSR0C |= 0x06; // B2,1:11:8Bit
gAtEmulCmd = 'Y'; // <-- Ready
gAtEmulAddr = 0x0000; // Address
gAtEmulRwSize = 1; // 佬扁 静扁 Size
gAtEmulChkSum = 0x00; //Checksum
gAtEmulDataPos = 0; // Tx Data Pos
}
#pragma vector = USART0_RXC_vect
__interrupt void Usart0RxIsr()
{
static int nERxPos = 0;
unsigned char nRxDat;
nRxDat = UDR0;
switch(nERxPos)
{
case 0: gAtEmulChkSum = nRxDat; if(nRxDat != STX) nERxPos = 0; else nERxPos = 1; break;
case 1: gAtEmulChkSum += nRxDat; gAtEmulCmd = nRxDat; nERxPos = 2; break;
case 2: gAtEmulChkSum += nRxDat; gAtEmulAddr = nRxDat; nERxPos = 3; break;
case 3: gAtEmulChkSum += nRxDat; gAtEmulAddr = (gAtEmulAddr<<8) | (nRxDat&0xFF); nERxPos = 4; break;
case 4: gAtEmulChkSum += nRxDat; gAtEmulAddr = (gAtEmulAddr<<8) | (nRxDat&0xFF); nERxPos = 5; break;
case 5: gAtEmulChkSum += nRxDat; gAtEmulRwSize = nRxDat; nERxPos = 6; break;
case 6: gAtEmulChkSum += nRxDat; gAtEmulData[0] = nRxDat; nERxPos = 7; break;
case 7: gAtEmulChkSum += nRxDat; gAtEmulData[1] = nRxDat; nERxPos = 8; break;
case 8: gAtEmulChkSum += nRxDat; gAtEmulData[2] = nRxDat; nERxPos = 9; break;
case 9: gAtEmulChkSum += nRxDat; gAtEmulData[3] = nRxDat; nERxPos = 10; break;
case 10: gAtEmulChkSum += nRxDat; if(nRxDat != ETX) nERxPos = 0; else nERxPos = 11; break;
case 11:
if(gAtEmulChkSum == nRxDat)
{
switch(gAtEmulCmd)
{
case 'R':
switch(gAtEmulRwSize)
{
default:
gAtEmulRwSize = 1;
case 1: gAtEmulData[0] = *(unsigned char *)(gAtEmulAddr);break;
case 2:
gAtEmulData[0] = *(unsigned char *)(gAtEmulAddr+1);
gAtEmulData[1] = *(unsigned char *)(gAtEmulAddr+0);
break;
case 4:
gAtEmulData[0] = *(unsigned char *)(gAtEmulAddr+3);
gAtEmulData[1] = *(unsigned char *)(gAtEmulAddr+2);
gAtEmulData[2] = *(unsigned char *)(gAtEmulAddr+1);
gAtEmulData[3] = *(unsigned char *)(gAtEmulAddr+0);
break;
}
UDR0 = gAtEmulData[0];
gAtEmulDataPos = 1;
break;
case 'W':
switch(gAtEmulRwSize)
{
default:
gAtEmulRwSize = 1;
case 1:
*(unsigned char *)(gAtEmulAddr) = gAtEmulData[3];
break;
case 2:
*(unsigned char *)(gAtEmulAddr+1) = gAtEmulData[2];
*(unsigned char *)(gAtEmulAddr) = gAtEmulData[3];
break;
case 4:
*(unsigned char *)(gAtEmulAddr+3) = gAtEmulData[0];
*(unsigned char *)(gAtEmulAddr+2) = gAtEmulData[1];
*(unsigned char *)(gAtEmulAddr+1) = gAtEmulData[2];
*(unsigned char *)(gAtEmulAddr) = gAtEmulData[3];
break;
}
break;
}
}
nERxPos = 0;
break;
}
}
#pragma vector = USART0_TXC_vect
__interrupt void Usart0TxIsr()
{
if(gAtEmulDataPos < gAtEmulRwSize) UDR0 = gAtEmulData[gAtEmulDataPos];
gAtEmulDataPos++;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -