Atmega8: Led como contador binario

-1

Estoy intentando escribir un programa para LED como un contador binario en el controlador atmega8.

Los primeros 2 bits (MSB) están conectados a portd y los últimos 6 bits están conectados al puerto c:

Aquí está mi código:

#define F_CPU 10000000UL//clock frequency
#include <avr/io.h>
#include <util/delay.h>//header for the delay


int main(void)
{
    /* main function */
    DDRC=0b11111111;//to make all the port in C as output
    DDRD =0b11111111;//to make all the port in D as output
    int x=0,a=64,b=128,c=192;//input variables
    while (1) 
    {
        //for nos from 0 to 64
        if(x<64)
        {
        PORTC = x;
        PORTD = 0b00000000;
        _delay_ms(200);
        x++;
        }//if no is equal to 64 then the if condition breaks

        //for nos from 64 to 128
        x=0;//initializing to 0

        if((a<128) && (x<64))
        {
                PORTC = x;
                PORTD = 0b01000000;
                _delay_ms(200);
                x++;
                a++;
        }//if no is equal to 128 then the if condition breaks

        //for nos from 128 to 192
        x=0;//initializing to 0

        if((b<192) && (x<64))
        {
                PORTC = x;
                PORTD = 0b10000000;
                _delay_ms(200);
                x++;
                b++;
        }//if no is equal to 192 then the if condition breaks

        //for nos from 192 to 256
        x=0;//initializing to 0

        if((c<256) && (x<64))
        {
                PORTC = x;
                PORTD = 0b11000000;
                _delay_ms(200);
                x++;
                c++;
        }//if no is equal to 256 then the if condition breaks

        //initializing the variables to keep the while loop running
        x=0;
        a=64;
        b=128;
        c=192;
    }
}

  }
}

¿Podría, por favor, hacerme saber si el código está escrito de manera adecuada y si funciona o no?

    
pregunta truerams

2 respuestas

0

Umm, primero dinos qué intentas hacer exactamente?

Debo admitir que la idea detrás de tu código es correcta (x es el contador. a y b y c son variables de ayuda. Eso es correcto). PERO, absolutamente, el código anterior no funcionará y no es la mejor manera:

  1. En el bucle while, estás poniendo a cero continuamente la variable X.
  2. Para mantener el registro de cuántos períodos (64 recuentos) pasó X, está introduciendo a y b y c. Podrías haberlo hecho solo con 'a'.
  3. El código no se beneficia de la regla de programación "No te repitas" (consulta esta página de Wikipedia . Has hecho todo 4 veces. ¡¡Y si tuvieras que almacenar un número de 16 bits con 6 bits en un puerto y 10 bits en otro puerto !!: D

Mi idea: (1) El siguiente código utiliza el operador AND a nivel de bits para separar los primeros 6 bits y los 2 bits restantes


int x;
while (1)
{
   x = x + 1;
   if (x >= 256) x = 0;
   PORTC = x & (0x3F); //or: x & (1 + 2 + 4 + 8 + 16 + 32)
   PORTD = x & (0xC0); //or: x & (64 + 128)
   delay_ms(200);
}

Mi amigo, si va a aprender la programación de microcontroladores, ASEGÚRESE DE APRENDER qué & , | , ^ , ~ , < < , > > , etc. será suficiente. De lo contrario, quedará atascado en cada parte de la codificación de los microcontroladores.

Idea (2): si no es fácil con estos operadores bitwise, puede usar el operador de módulo (%) y de división (/) (realmente no sugiero esto. Algunos compiladores son realmente estúpidos en la optimización de los códigos que requieren% y /).


int x;
while (1)
{
   x = x + 1;
   if (x >= 256) x = 0;
   PORTC = x % (64); //result is 0 to 63.
   PORTD = (x / (64)) * 64; //this will essentially strip lower 6 bits of x.
   delay_ms(200);
}

A medida que adquiera experiencia en los operadores de BITWISE, ¡descubrirá que hay millones de formas más de hacerlo! : D

    
respondido por el Ali Nakisaee
0
/* using an unsigned char data type means the variable is 8 bit and therefore
   will only count from 0 to 255
   initialising to zero gives it a definate value to start at

*/
unsigned char x = 0; 

while (1)
{
   x++; //C short hand
   PORTC = x & (0x3F); //or: x & (1 + 2 + 4 + 8 + 16 + 32)
   PORTD = x & (0xC0); //or: x & (64 + 128)
   delay_ms(200);
}
    
respondido por el crowie

Lea otras preguntas en las etiquetas