Acabo de comenzar con AVR y estoy creando un comprobador de LAN para un proyecto
Mi parte de hardware está terminada, básicamente para los pines de envío que usé en el puerto A, de A0 a A7 y para el puerto C del Receptor, cuando se inserta el cable en el conector RJ, se debe enviar una señal y compararla con algunos vectores existentes. el resultado de la comparación de vectores se envía al puerto B y se enciende un led correspondiente al tipo de cable
aquí está el código, comenté las partes que no puedo entender, por favor ayúdenme con ellas la mayor parte de lo que me confunde es "> >" Sé que cambia, pero qué es exactamente ¿Por qué devolvemos 0 luego 1 o lo contrario? ¿Y por qué el estado = 0?
#define DSEND DDRA
#define DRECEIVE DDRC
#define DLED DDRD
#define ISEND PINA
#define IRECEIVE PINC
#define ILED PIND
#define OSEND PORTA
#define ORECEIVE PORTC
#define OLED PORTD
// the cabels types vectors
int STRAIGHT[8]= {1, 2, 3, 4, 5, 6, 7, 8 };
int CROSS_T568A[8]= {3, 6, 1, 7, 8, 2, 4, 5 };
int CROSS_T568B[8]= {3, 6, 1, 4, 5, 2, 7, 8 };
int ROLLOVER[8]= {8, 7, 6, 5, 4, 3, 2, 1 };
// why do we need to start with zeros ? and why is the status 0 ?
int TEST[8]= {0, 0, 0, 0, 0, 0, 0, 0 };
int status = 0;
//why retrun i+1?
int getActiveBit(int x) {
int i;
for(i=0; i<8; i++)
if(bit_is_set(x, i))
return i + 1;
return 0;
}
// comparing the two vectors
// but why return 0 this time ?
int compare(int *a, int *b) {
int i;
for(i=0; i<8; i++)
if(a[i]!=b[i])
return 0;
return 1;
}
//setting the status, what status exactly
void setStatus(int value) {
status = value;
}
//get the status
int getStatus() {
return status;
}
//display the cable type with a corresponding led each type with a led
// what is this << I know it shift but what
void displayMessage() {
if(compare(TEST, STRAIGHT))
OLED |= 1<<1;
else if(compare(TEST, CROSS_T568A))
OLED |= 1<<4;
else if(compare(TEST, CROSS_T568B))
OLED |= 1<<5;
else if(compare(TEST, ROLLOVER))
OLED |= 1<<6;
else
OLED |= 1<<0;
}
//check if the cable is inserted
int isCableInserted() {
int i, r;
for(i=0; i<8; i++) {
OSEND = 1<<i;
r = IRECEIVE;
if(getActiveBit(r) != 0) {
OSEND=0x00;
return 1;
}
}
OSEND = 0x00;
return 0;
}
int main() {
//why so many variables
int i, r, k;
DSEND = 0xFF;
DRECEIVE = 0x00;
DLED = 0xFF;
do {
if(isCableInserted()) {
OLED = 0x00;
OLED |= (1<<6);
OLED |= (1<<5);
OLED |= (1<<4);
OLED |= (1<<1);
for(i=0; i<8; i++) {
OSEND = 1<<(7-i);
for(k=0;k<10;k++)
_delay_ms(100);
//_delay_ms(1000);
// what is this exactly ?
r = IRECEIVE;
// memorise
TEST[i] = 8-getActiveBit(r)+1;
if(TEST[i] != 0) {
//if at least one wire is connected the cable is connected
if(getStatus() == 0)
setStatus(1);
}
for(k=0;k<2;k++)
_delay_ms(100);
//_delay_ms(200);
}
OSEND=0x00;
if(getStatus() == 1) {
OLED=0x00;
displayMessage();
for(k=0;k<30;k++)
_delay_ms(100);
//_delay_ms(3000);
setStatus(0);
}
}
else{
//the error led not insterted or defected
OLED = 0x01;
for(k=0;k<30;k++)
_delay_ms(100);
//_delay_ms(3000);
}
} while(1);
return 0;
}