2016-12-06 6 views
0

Ich habe ein Problem mit 40 Werten auf dem 7-Segment (40 Komponenten Link 74HC595 Kaskade angezeigt Anzeige enter image description herespi 74HC595 Cascading ATmega64

ich mein Programm auf Arduino implementieren und es funktioniert gut Hier ist mein Code:.

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


} 

und dann neu gemacht ich ein anderes Programm auf atmel Studio und ich es über extrem Brenner und USBASP Hier in meiner Karte laden ist mein Code:

#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; 


} 


} 

Hier ist meine Karte enter image description here

Das Display ist nicht wie die der Arduino Ich habe nur der letzte Wert

angezeigt

ich meine elektronische Karte in China entwickelt haben.

Ist das Problem des Materials ???

Der einzige Unterschied zwischen den beiden Programmen ist: digital() auf Arduino Und Output_High() oder output_Low auf Atmel

ist die Implementierung von digital == Output_high() oder output_Low() ????

Muss ich die letzte Anweisung schreiben Return 1; nach der Weile ????

des Dank

+0

Haben Sie für jedes Schieberegister richtigen Entkopplungskondensator haben? Auch 'digitalWrite' ist etwa 80 mal langsamer als' sbi'/'cbi' Anweisungen, daher könnte eine fehlende Entkopplung ein Problem darstellen. Speziell für solche Ströme (die Hälfte aller Segmente On @ 20mA => 3.2A und alle Segmente On => 6.4A). – KIIV

+0

nein ich benutze elektronische karte, die ich entwickelt in china – khaloud1980

+0

ich finde die lösung – khaloud1980

Antwort

-1

Der 10K-Pull-down-Widerstand auf der SS (Slave Select) ist so konzipiert, von Takten in Bits der Register zu halten, während sich der Hauptprozessor bootet, und die SS Linie könnte „schwimmend“ sein und in ein unbestimmter Staat.

Hier the date sheet of 74hc595

Der Aufruf von SPI.transfer() sendet ein Byte an das Register (ein Bit auf einmal) und dann die LATCH zu bringen (auch als SS oder ST bekannt) Leitung hoch bewirkt, dass die Daten aus dem internen Speicher des Registers an die Ausgangspins übertragen werden.

Pin Anschlüsse

Pin-Verbindungen für Uno und ähnliche: