Entendiendo el código c del microcontrolador

-2

Estoy tratando de construir un sistema automático de riego de plantas con ATmega16. El siguiente es el fragmento de código que utilizamos:

#include<avr/io.h>
int adc(void);
void pump(void);
int adc_value;
int main(void)
 {
  DDRC=0x01;                          //Defining PC0 as output
  ADCSRA=0x87;                    //Setting the mode of operation
  ADMUX=0x00;                     //Selection of channel and bit alignment
  while(1)
   {
     adc_value=adc();                //reading moisture level
     pump();                               //Pump activator routine
   }
   return 0;
 }

int adc(void)
{
   int lower_bits,higher_bits,result; 
   ADCSRA |= (1 << ADSC)|(1 << ADIF);  //what is the meaning of this line? 
   while(ADCSRA & (1 << ADIF) == 0);  //what is the meaning of this line? 
   lower_bits=ADCL;
   higher_bits=ADCH;
   result=lower_bits|(higher_bits<<8);         //what is the meaning of this line?  
   return result;
 }

void pump(void)
 {
  if(adc_value>=700)                                //Pump ON trigger point
   {
     PORTC|=(1<<0);
   }
  else if(adc_value<=600)                        //Pump Off trigger point
   {
     PORTC&=~(1<<0);
   }
 }

En el código anterior, no he entendido algunas líneas que he comentado. ¿Puede alguien explicar el significado de esas líneas y por qué se han utilizado?

    
pregunta user5411115

2 respuestas

2

La línea

ADCSRA |= (1 << ADSC)|(1 << ADIF);  //what is the meaning of this line? 

Está configurando dos bits en el registro ADCSRA (Registro de estado ADC A). Esos dos bits son: ADSC (Iniciar conversión) y ADIF (Indicador de interrupción de ADC, establecido (se lee como 1) cuando se completa la conversión). El bit de inicio de conversión inicia una conversión (obviamente), pero el bit ADIF es un poco extraño. Es un indicador de interrupción que se establece (escrito en 1) cuando se completa una conversión. Para volver a establecerlo en 0, se debe escribir un "1" (esto se denomina "escribir para borrar"). Al establecer este bit en el registro, la marca se convierte en 0.

Esta línea:

while(ADCSRA & (1 << ADIF) == 0);

Espera a que el bit ADIF se establezca de nuevo. En la línea anterior, restableces la bandera. Cuando se complete la conversión, el indicador se establecerá en 1. Este bucle while continuará preguntando "hey, ¿está establecido el bit ADIF?" Una y otra vez hasta que se haga realidad. En ese momento, el bucle while se detendrá y las siguientes cosas pueden suceder ya que los registros de resultados de ADC (ADCL y ADCH) se llenan con el resultado de la conversión.

Las siguientes líneas deben considerarse como un bloque:

lower_bits=ADCL;
higher_bits=ADCH;
result=lower_bits|(higher_bits<<8); 

ADCL y ADCH son los bytes superior e inferior del resultado de ADC. El AVR es un microcontrolador de 8 bits, pero el resultado es 12 bits. La forma en que manejan esto es tener dos registros: uno para representar los bits superiores (bit 8 y superior) y otro para representar los bits inferiores (bits 0 a 7). La última línea simplemente toma el registro superior, lo desplaza en 8 lugares para que se encuentre en su lugar adecuado y lo pega junto con los bits inferiores. La función luego devuelve este resultado de 16 bits (dos registros de 8 bits juntos = 16 bits).

Ah, y aquí está la hoja de datos: enlace

Las hojas de datos son tus amigos.

    
respondido por el Los Frijoles
1

Las líneas que ha mencionado son algunos bits para ADC.

ADCSRA |= (1 << ADSC)|(1 << ADIF); 

La línea anterior activa ADC para la conversión. Es posible que desee buscar en la hoja de datos los bits específicos ADSC y ADIF .

while(ADCSRA & (1 << ADIF) == 0);

La línea anterior espera a que el ADC convierta la tensión analógica en forma digital; que son 8/10/16 bits dependiendo de la resolución de ADC.

result=lower_bits|(higher_bits<<8);

La línea anterior combina los 8 bits inferiores y los 8 bits superiores para formar una palabra (16 bits) donde (higher_bits<<8) significa que está IZQUIERDO cambiando los bits para que adquieran 8 bits superiores de media palabra y luego O con bits inferiores.

Ahora, es tu turno. A ti.

    
respondido por el ammar.cma

Lea otras preguntas en las etiquetas