Atmega8:バイナリカウンタとして導かれる

私はatmega8コントローラのバイナリカウンタとしてLED用のプログラムを書くことを試みています。

最初の2ビット(MSB)はportdに接続され、最後の6ビットはport cに接続されています。

これが私のコードです:

#define F_CPU 10000000UL//clock frequency
#include 
#include //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;
    }
}

  }
}

コードが適切な方法で書かれているかどうか、またそれが機能するかどうかを教えてください。

1
nl ru de
なぜあなたはそれをテストして見ないのですか?
追加された 著者 JRE,
こんにちは私は私のデバイスを接続するためのドライバソフトウェアをインストールしようとしていました。そのため、当面の間は、コードとその背後にあるアイデアを使用しました。
追加された 著者 Big Ticket,

4 答え

/* 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);
}
0
追加された
うん私は知っているが、私はポイントを作っている、unsignedとcharは言語の一部ですが、uint8_tは実際にはヘッダファイルに含まれるtypedefです。
追加された 著者 Frode Lillerud,
はい、私は同意します、私はいつもstdint.h defsを使用しがちです。しかし、私の答えのポイントは、8ビット数を定義する方法ではなく、それを使用する方法です。
追加された 著者 Frode Lillerud,
符号なし8ビット整数が必要なことがわかっているなら、 uint8_t を使ってください。そのタイプはまさにあなたが欲しいものを言います。
追加された 著者 Michael Kjörling,
言語の実装定義部分。
追加された 著者 Michael Kjörling,
/* 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);
}
0
追加された
うん私は知っているが、私はポイントを作っている、unsignedとcharは言語の一部ですが、uint8_tは実際にはヘッダファイルに含まれるtypedefです。
追加された 著者 Frode Lillerud,
はい、私は同意します、私はいつもstdint.h defsを使用しがちです。しかし、私の答えのポイントは、8ビット数を定義する方法ではなく、それを使用する方法です。
追加された 著者 Frode Lillerud,
符号なし8ビット整数が必要なことがわかっているなら、 uint8_t を使ってください。そのタイプはまさにあなたが欲しいものを言います。
追加された 著者 Michael Kjörling,
言語の実装定義部分。
追加された 著者 Michael Kjörling,

うーん、最初に私たちにあなたが正確に何をしようとしているのか教えてください?

私はあなたのコードの背後にあるアイデアが正しいことを認めなければなりません(xはカウンターです。aとbとcはヘルパー変数です。そうです)。しかし、絶対に上記のコードは機能せず、最適な方法ではありません。

  1. whileループでは、X変数を継続的にゼロにしています。
  2. Xが経過した期間(64カウント)の数を記録するには、a、b、cを導入します。あなたはそれを 'a'だけで済ませたかもしれません。
  3. このコードは、「繰り返してはいけない」というプログラミングの原則の恩恵を受けません(このWikipediaを参照)。あるポートに6ビット、別のポートに10ビットの16ビットの数値を格納する必要がある場合はどうなりますか?:D

私の考え: (1)次のコードでは、ビットごとのAND演算子を使用して、最初の6ビットと残りの2ビットを区切ります。


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);
}

My friend, if you are going to learn Microcontroller programming, BE SURE TO LEARN what &, |, ^, ~, <<, >>, etc. will do. Otherwise you will be stuck in every part of coding on microcontrollers.

アイデア(2):もしこれらのビット演算子を使うのが簡単でなければ、モジュロ(%)と除算(/)演算子を使うことができます。 。


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);
}

あなたがBITWISEオペレータの経験を積むにつれて、あなたはこれをするためのもっとたくさんの方法があることを知るでしょう! :D

0
追加された
返信に感謝します:)私は2つの異なるポートを持つバイナリカウンタとしてledを実装しようとしていました。実際、私は自分のデバイスに接続するためのispドライバを見つけようとしていたので、その間にコードを書いてみました。だから私の懸念は、接続に2つの異なるポートを使うことがうまくいくかどうかということでした。
追加された 著者 Big Ticket,

うーん、最初に私たちにあなたが正確に何をしようとしているのか教えてください?

私はあなたのコードの背後にあるアイデアが正しいことを認めなければなりません(xはカウンターです。aとbとcはヘルパー変数です。そうです)。しかし、絶対に上記のコードは機能せず、最適な方法ではありません。

  1. whileループでは、X変数を継続的にゼロにしています。
  2. Xが経過した期間(64カウント)の数を記録するには、a、b、cを導入します。あなたはそれを 'a'だけで済ませたかもしれません。
  3. このコードは、「繰り返してはいけない」というプログラミングの原則の恩恵を受けません(このWikipediaを参照)。あるポートに6ビット、別のポートに10ビットの16ビットの数値を格納する必要がある場合はどうなりますか?:D

私の考え: (1)次のコードでは、ビットごとのAND演算子を使用して、最初の6ビットと残りの2ビットを区切ります。


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);
}

My friend, if you are going to learn Microcontroller programming, BE SURE TO LEARN what &, |, ^, ~, <<, >>, etc. will do. Otherwise you will be stuck in every part of coding on microcontrollers.

アイデア(2):もしこれらのビット演算子を使うのが簡単でなければ、モジュロ(%)と除算(/)演算子を使うことができます。 。


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);
}

あなたがBITWISEオペレータの経験を積むにつれて、あなたはこれをするためのもっとたくさんの方法があることを知るでしょう! :D

0
追加された
返信に感謝します:)私は2つの異なるポートを持つバイナリカウンタとしてledを実装しようとしていました。実際、私は自分のデバイスに接続するためのispドライバを見つけようとしていたので、その間にコードを書いてみました。だから私の懸念は、接続に2つの異なるポートを使うことがうまくいくかどうかということでした。
追加された 著者 Big Ticket,