0

私はマイクロコントローラーとしてAVRを使用し、プロセッサーとしてATMEGA8を使用しています(マイクロコントローラー内)。マイクロコントローラーを搭載したボードには4つのLEDがあります。プログラムを焼き、LEDを点灯させることができます。しかし、私は特定のことを達成することができません。

L1 L2  L3 L4

これらは4つのLEDです。最初のラウンドでは、各LEDが3秒後に点灯します。最後のLED(L4)は、最初のラウンドの後も点灯し続けます。3番目のラウンドが開始すると、各LEDは3秒のギャップで点灯し、L3はL4も点灯し続けます。点灯し、それは続きます....L1まで。

L1 L2 L3 L4
         On
      On On
   On On On
On On On On

しかし、私はこれを達成することができません。1つのLEDをオンに設定すると、他のLEDがオフになるためです。10ミリ秒という小さな時間差を追加してみました。これを行うにはどうすればよいですか?これが私が今まで持っているものです:

    #include<avr/io.h>
    #include<util/delay.h>
    DDRB = 0xFF; // input
 //PORTB = 0xFF;

    // ob00011110 --> on all --> binary

    int i=0;

    while(i<1) {
      PORTB = 0b00010000; // first led on
      _delay_ms(3000);
      PORTB = 0b00001000; // second led on
      _delay_ms(3000);
      PORTB = 0b00000100; // third on
      _delay_ms(3000);
      PORTB = 0b00000010; // fourth on
      _delay_ms(3000);
      i += 1;
    }

    PORTB = 0b00000010; // keep the 4th on and start all over again and reach til 3rd LED
4

2 に答える 2

5

シーケンスが間違っているようです。2番目のLEDをオンにすると、最初のLEDがオフになります。シーケンスは次のようになります。

  PORTB = 0b00010000; // first led only
  _delay_ms(3000);
  PORTB = 0b00011000; // first and second led on
  _delay_ms(3000);
  PORTB = 0b00011100; // first, second, and third on
  _delay_ms(3000);
  PORTB = 0b00011110; // first, second, third, and fourth on
  _delay_ms(3000);
于 2012-09-22T18:45:36.723 に答える
2

次のようなものを使用できます。

while (1){
  PORTB = 0b00010000;
  _delay_ms(3000);
  PORTB |= 0b00001000;
  _delay_ms(3000);
  PORTB |= 0b00000100;
  _delay_ms(3000);
  PORTB |= 0b0000010;
  _delay_ms(3000);

ループの開始ごとにすべてのLEDがオフになり、次に1つずつオンになります...

于 2012-09-23T21:26:35.777 に答える