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時間、私のコードでエラーを探しています。
こんにちは!私は試みましたが、それは変わりませんでした。ここでは、上記の私の適応コードは、少しきれいにすることです。なぜLEDが消灯しないのですか? – sesc360
コードをデバッグしようとします。最初に、出力ピンを正しく設定できるかどうかを確認してください(たとえば、 'DDRD = 0xFF; PORTD = 0xAA')。その場合は、コマンドで残りのコマンドをチェックしてください。 ところで、 'PORTB | =(LOW << clockPin)'は間違っています。あなたが望むのは 'PORTB&=〜(1 << clockPin)'です – yar
ところで、あなたは間違ったフォーラムにいます。 Thryがhttps://embdev.net/forum/microcontrollersに投稿しました – yar