2017-05-06 4 views
1

Arduinosで使用されるシフトアウト機能の詳細を知りたいし、ATMEGA328pで実装を使用しました。ATMEGA328pを使用するシフトレジスタ

セットアップ

#define F_CPU 1000000UL 
#define BAUD 9600UL 
#define LSBFIRST 0 
#define MSBFIRST 1 
#define HIGH 0x1 
#define LOW 0x0 
#define INPUT 0x0 
#define OUTPUT 0x1 

#include <avr/io.h> 
#include <util/delay.h> 
#include <USART.h> 
#include <pinDefines.h> 

#define DATA PD7 
#define LATCH PB2 
#define CLOCK PB0 

uint8_t leds = 0; 

void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val) 
{ 
    for (uint8_t i = 0; i < 8; ++i) { 
     if (bitOrder == LSBFIRST) { 
      PORTD |= (!!(val & (HIGH << i)) << DATA); 
     } else { 
      PORTD |= (!!(val & (HIGH << (7 - i))) << DATA); 
     } 

     PORTB |= (HIGH << clockPin); 
     PORTB |= (LOW << clockPin); 
    } 
} 

void updateShiftRegister() { 
    PORTB |= (LOW << LATCH); 
    shiftOut(DATA, CLOCK, LSBFIRST, leds); 
    PORTB |= (HIGH << LATCH); 
} 

void setupRegisters() { 
    DDRD = 0xff; 
    DDRB = 0xff; 
} 


int main(void) 
{ 
    setupRegisters(); 
    leds = 1; 
    updateShiftRegister(); 
    _delay_ms(2000); 
    leds = 0; 
    updateShiftRegister(); 

    return (0); 
} 

私は、関数の詳細を理解するための例を作成したが、結果は私が見て期待したものまで追加されません。

私の例では、LED1が2秒後にオン/オフすることを期待しています。それはオンになりますが、その後はオフになりません。私は何かが欠けていたか?私は2時間、私のコードでエラーを探しています。

答えて

0

DDRDは、 "データ方向レジスタD"です。ポートD全体を出力として使用する場合は、0xFFに設定する必要があります。そうでない場合は、その一部が入力として使用されます。

私はチェックしませんでしたが、ポートDは、PORTDの設定を上書きする汎用デジタルI/O(JTAGなど)以外のものによって使用される可能性があります。ただthe datasheetを読んでください。ところで、いくつかのサンプルプログラムもあります。

+0

こんにちは!私は試みましたが、それは変わりませんでした。ここでは、上記の私の適応コードは、少しきれいにすることです。なぜLEDが消灯しないのですか? – sesc360

+0

コードをデバッグしようとします。最初に、出力ピンを正しく設定できるかどうかを確認してください(たとえば、 'DDRD = 0xFF; PORTD = 0xAA')。その場合は、コマンドで残りのコマンドをチェックしてください。 ところで、 'PORTB | =(LOW << clockPin)'は間違っています。あなたが望むのは 'PORTB&=〜(1 << clockPin)'です – yar

+0

ところで、あなたは間違ったフォーラムにいます。 Thryがhttps://embdev.net/forum/microcontrollersに投稿しました – yar

関連する問題