Ayuda a entender un código C simple para un proyecto atmega16 [cerrado]

0

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;

}

    
pregunta ramona ray

1 respuesta

2

Realmente no puedo responder muchas de las preguntas específicas sobre lo que hacen las partes de su código, pero explicaré el cambio de bits (las líneas 1 << n ).

Puede representar 1 como el número binario de 8 bits 0000 0001 . El operador << toma todos los bits y los mueve 1 puntos a la derecha, arrojando el MSB y poniendo un 0 en el LSB. Eso significa que 1 << 3 = 0000 1000 . Si etiqueta los bits del 0 al 7, ahora tenemos un número donde el único bit alto está en la posición 3.

Esto es útil para trabajar con los 8 pines separados en sus registros PORTA, PORTB, etc. Por ejemplo, si desea establecer los pines 0, 2 y 5 en alto, desea escribir

PORTD = 0010 0101

pero es mucho más fácil leer y editar rápidamente una línea que utiliza el operador OR | , lo que hace que su código se vea como

PORTD = 1<<5 | 1<<2 | 1<<0

que dice claramente "establecer los bits 0, 2 y 5 en alto".

(PD: ¡arregla tu sangría! ¡puaj!)

    
respondido por el Greg d'Eon

Lea otras preguntas en las etiquetas