2016-12-06 10 views
0

私はArduinoの上の私のプログラムを実装し、それは私のコードである。ここも 作品7セグメントに表示される40の値(40個の部品74HC595カスケードリンク enter image description hereSPI 74HC595カスケードatmega64

表示に問題があります:

を。
static const byte Pattern[] = { 
    B00010100, // 0 
    B00111111, // 1 
    B10011000, // 2 
    B00011010, // 3 
    B00110011, // 4 
    B01010010, // 5  
    B01010000, // 6 
    B00011111, // 7 
    B00010000, // 8 
    B00010010, // 9 
    B00010000}; // BLANK 


byte HC595_DS_POS = 2;  //Data pin (DS) pin location 

byte HC595_SH_CP_POS = 3; //Shift Clock (SH_CP) pin location 
byte HC595_ST_CP_POS = 4; //Store Clock (ST_CP) pin location 



void IE74595_Out(uint8_t *p, unsigned char n) 
{ 
    unsigned char i, j; 
    uint8_t b; 


    digitalWrite(HC595_ST_CP_POS,0); 
    digitalWrite(HC595_SH_CP_POS,0); 


    for(j=0;j<n;j++) 
    { 
    b = Pattern[*(p+n-j-1)]; // Lay byte cao nhat truoc 

    for(i=0;i<8;i++) 
    { 

     digitalWrite(HC595_SH_CP_POS,0); 

     if(b & 0b00000001) 
     { 

     digitalWrite(HC595_DS_POS,1); 

     } 
     else 
     { 

     digitalWrite(HC595_DS_POS,0); 

     } 

     digitalWrite(HC595_SH_CP_POS,1); 

     b=b>>1; //Now bring next bit at MSB position 

    } 
    } 


digitalWrite(HC595_ST_CP_POS,1); 

} 



void setup() 
{ 
    // put your setup code here, to run once: 
    pinMode(HC595_ST_CP_POS, OUTPUT); 
    pinMode(HC595_SH_CP_POS, OUTPUT); 
    pinMode(HC595_DS_POS, OUTPUT); 

} 

void loop() { 

    uint8_t Data[40]={2,5,1,3,2,1,3,6,1,9,4,8,1,7,0,5,1,2,5,6,5,4,1,4,1,8,1,3,1,9,5,6,4,5,6,2,6,1,0,2}; 


      IE74595_Out(Data,40); 


} 

そして、私はアトメルのスタジオで別のプログラムをリメイクし、私はここに私のカード にEXTREMバーナーとUsbaspを経由してそれを読み込むには、私のコードです:

#define F_CPU 8000000UL 
#include <avr/io.h> 
#include <util/delay.h> 

static const uint8_t Pattern[] = { 
    0b00010100, // 0 
    0b00111111, // 1 
    0b10011000, // 2 
    0b00011010, // 3 
    0b00110011, // 4 
    0b01010010, // 5 
    0b01010000, // 6 
    0b00011111, // 7 
    0b00010000, // 8 
    0b00010010, // 9 
     0b00010000}; // BLANK 

#define output_low(port,pin) port &= ~(1<<pin) 
#define output_high(port,pin) port |= (1<<pin) 
#define set_input(portdir,pin) portdir &= ~(1<<pin) 
#define set_output(portdir,pin) portdir |= (1<<pin) 

#define HC595_DS_POS PC4 //Data pin (DS) pin location 
#define HC595_SH_CP_POS PC5 //Shift Clock (SH_CP) pin location 
#define HC595_ST_CP_POS PC6 //Store Clock (ST_CP) pin location 



#define HC595_PORT PORTC 
#define HC595_DDR DDRC 


void IE74595_Out(uint8_t *p, unsigned char n) 
{ 
    unsigned char i, j; 
    uint8_t b; 

    output_low(HC595_PORT,HC595_ST_CP_POS); 
    output_low(HC595_PORT,HC595_SH_CP_POS); 


    for(j=0;j<n;j++) 
    { 
     b = Pattern[*(p+n-j-1)];// Lay byte cao nhat truoc 


     for(i=0;i<8;i++) 
     { 
      output_low(HC595_PORT,HC595_SH_CP_POS); 

      if(b & 0b00000001) 
      { 

       output_high(HC595_PORT,HC595_DS_POS); 

      } 
      else 
      { 

       output_low(HC595_PORT,HC595_DS_POS); 

      } 

      output_high(HC595_PORT,HC595_SH_CP_POS); 
      b=b>>1; 

     } 
    } 


    output_high(HC595_PORT,HC595_ST_CP_POS); 
} 

int main(void) 
{ 
    set_output(DDRC,HC595_DS_POS); 
    set_output(DDRC,HC595_SH_CP_POS); 
    set_output(DDRC,HC595_ST_CP_POS); 

    uint8_t Data[40]={5,9,1,6,1,1,0,9,1,7,1,5,4,2,6,2,8,7,0,7,1,2,3,5,1,5,4,2,1,7,5,9,1,9,4,8,1,5,2,9}; 


while (1) 
{ 


    IE74595_Out(Data,40); 
     return 1; 


} 


} 

は、ここに私のカード enter image description here

ディスプレイは、私は最後の値だけが、私は中国での私の電子カードを開発した

を表示しているArduinoの のもののようではないです。

材料の問題ですか?

二つのプログラム間の唯一の違いは次のとおりです。 DigitalWrite()Arduinoの とOutput_High(上)またはoutput_Lowアトメル

にはDigitalWrite == Output_high()またはoutput_Low(の実装である)????

必須i最後の命令を書き込むReturn 1;後で? SS(スレーブセレクト)の

感謝の

+0

あなたは、各シフトレジスタのための適切なデカップリング・コンデンサを持っていますか?また、 'digitalWrite'は' sbi'/'cbi'命令よりも約80倍遅いため、デカップリングの問題が問題になります。特にそのような電流(全セグメントの半分は@ 20mA => 3.2A、すべてのセグメントは= 6.4A)。 – KIIV

+0

いいえ私は中国で開発した電子カードを使用しています – khaloud1980

+0

解決方法を見つける – khaloud1980

答えて

-1

10Kプルダウン抵抗は、メインプロセッサの起動中にビットでクロッキングからのレジスタを保つように設計されており、SSラインは「フローティング」とでされる可能性があります不確定状態ここ

the date sheet of 74hc595

SPI.transfer(の呼び出し)レジスタ(時のビット)に1バイトを送信し、(そうでなければSS又はSTとしても知られる)LATCHをもたらす高いラインはデータを引き起こしますレジスタの内部メモリから出力ピンに転送されます。

ピン接続宇野と同様のため

ピン接続: