PDA

View Full Version : Không Kết nối 89C51 với PC qua LAN (nhờ ENC28j60 - Pic16F) dc!


nhphuduc
09-08-2008, 11:32 PM
Do mình kg rành lập trình với con PIC để điều khiển bảng Matrix Led trong khi mình muốn kết nối 89C51 với PC qua cổng LAN nên mình đã ráp nối với 1 bộ Mini Ethenet Board (ENC28J60) gắn với con Pic16F877a, khi kết nối 1 "bộ" này thẳng với PC (cable bấm chéo) thì kết nối tốt, thay IP tốt, gửi nhận dữ liệu tốt. Nhưng khi gắn cùng lúc 3 "bộ" này qua Hub/Switch thì nó bị.. khùng tứ tung, lúc Ping tới được, lúc kg. Nếu ping tới dc 1 thằng, thì 2 thằng kia..mất tiêu. Dưới đây là chương trình. CÁC BÁC GIÚP MÌNH VỚI... HU HU... NHỨC ĐẦU WA XA!!!
***************************
#define SPI_Ethernet_HALFDUPLEX 0
#define SPI_Ethernet_FULLDUPLEX 1

unsigned char myMacAddr[6] = {0x00, 0x14, 0xA5, 0x76, 0x20, 0x3F} ; // my MAC address
unsigned char myIpAddr[4] = {10, 20, 215, 48} ; // my IP address
unsigned char SetIpAddr[4];
unsigned char *myDataIP;
unsigned char getRequest[30] ;
unsigned char *ptr ; // pointer to the dynamic buffer
unsigned char dyna[30] ; // pointer to the dynamic buffer

unsigned int SPI_Ethernet_UserTCP(unsigned char *remoteHost, unsigned int remotePort, unsigned int localPort, unsigned int reqLength)
{
return 0 ; // return to the library with the number of bytes to transmit
}

unsigned int SPI_Ethernet_UserUDP(unsigned char *remoteHost, unsigned int remotePort, unsigned int destPort, unsigned int reqLength)
{
unsigned int len = 0;
unsigned short data;
unsigned int i=0,j=3 ;
unsigned short checksum =0 ;

len = reqLength;

while(reqLength--)
{
if ((dyna[0] =='O') & (dyna[1] =='K'))
{
dyna[2] =(0x20);
dyna[3] =(0x20);
ptr = dyna ;
while(*ptr) Spi_Ethernet_putByte(*ptr++) ;
}
if ((dyna[0] =='N') & (dyna[1] =='O'))
{
dyna[2] =(0x20);
dyna[3] =(0x20);
ptr = dyna ;
while(*ptr) Spi_Ethernet_putByte(*ptr++) ;
}

getRequest[i] = Spi_Ethernet_getByte() ;
// Usart_Write(getRequest[i]);
if (i>1)
{
checksum = checksum ^ getRequest[i] ;
}
i=i+1;
if ((getRequest[0] == 0x5) & (i==len))
{

EEprom_Write(0x40,getRequest[1]);
EEprom_Write(0x41,getRequest[2]);
EEprom_Write(0x42,getRequest[3]);
EEprom_Write(0x43,getRequest[4]);
dyna [0] = 'O';
dyna [1] = 'K';
}

else if ((checksum == getRequest[1]) & (i==len) )

{
for (j = 2; j < len ; j++) Usart_Write(getRequest[j]);
dyna [0] = 'O';
dyna [1] = 'K';

}
else
{
dyna [0] = 'N';
dyna [1] = 'O';
}
PORTB=LEN;
}

return (len); // back to the library with the length of the UDP reply
}

/*
* main entry
*/
void main()
{
ADCON1 |= 0x0F ; // turn off ADC convertors
CMCON |= 0x07 ; // turn off comparators

PORTB=0;
TRISB=0;
PORTD=0xFF;
TRISD=0;

Usart_Init(9600);
Delay_100ms();

if (Button(&PORTD, 0, 1, 0))
{
EEprom_Write(0x40,10);
EEprom_Write(0x41,20);
EEprom_Write(0x42,215);
EEprom_Write(0x43,99);
}

delay_ms(500);
myIpAddr[0] = Eeprom_Read(0x40);
myIpAddr[1] = Eeprom_Read(0x41);
myIpAddr[2] = Eeprom_Read(0x42);
myIpAddr[3] = Eeprom_Read(0x43);
PORTB=Eeprom_Read(0x43);

Spi_Init();
SPI_Ethernet_Init(&PORTC, 0, &PORTC, 1, myMacAddr, myIpAddr, SPI_Ethernet_FULLDUPLEX) ;
do {

Spi_Ethernet_doPacket() ; // process incoming Ethernet packets

} while(1);
}

*********************
Luu Y dia chi IP cua may:
IP: 10.20.202.254 (theo Sever, kg thay doi dc)
Sub net mask: 255.255.255.0
Default gateway: 10.20.202.1

Mình đang thắc mắc liệu nó có thuộc 1 trong 2 lỗi sau:
- Chưa đặt Subnet mask cho chuong trinh PIC nen no kg ket noi voi PC dc
- Cac dia chi MAC cua cac LAN nay deu giong het nhu nhau (0x00, 0x14, 0xA5, 0x76, 0x20, 0x3F), kg biet co bi anh huong gi kg!!
MUON VAN BIET ON DA DOC BAI DAI THE NAY!