mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 7219 funzt nicht mit Atmega8


Autor: Jens (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bin jetzt schon seit Tagen damit beschäftigt vier 7-Segment-Anzeigen mit 
einem Atmega8 und dem Maxim7219 Softwaremäßig anzusteuern.

Das gelingt aber nicht.

Wenn ich den µC starte gehen alle Segment-Led´s voll an und fallen dann 
in eine schwächere Anzeige zurück(die Initialisierung?). Allerdings regt 
sich dann nichts mehr. Egal wie viele Digits ich angebe, es gehen immer 
alle an und das wars.

Die Daten- CLK- und Load-Leitungen sind nicht länger als 10cm, die 
Digtit-Leitungen max. 5cm. Der V+ Pin ist nach Datenblatt mit 10µF und 
0.1µF gegen GND abgeblockt. Für den ISET Pin habe ich 12KOhm gewählt.

Die DIN Leitung kommt vom PB1, Load von PB2 und CLK von PC4.

Programmiert wird in C.

Vielleicht findet jemand etwas im Code oder kann mir Hardwaretips geben.

Gruß Jens

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> kann mir Hardwaretips

Schaltplan?

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,

hab leider keinen digitalisierten Schaltplan am Start.Hilft ein Foto?

Die Beschaltung ist wie beschrieben, alle SEG sind angeschlossen sowie 
DIG 0-3. Beide GND sind auf Ground der Schaltung(Steckbrett).

Frage mich zum Bsp. was ich mit den freien DIG-Pins (4-7) machen soll?

Oder ist es möglich das durch die getrente Übertragung der adresse und 
der Daten etwas schief geht?

Jens

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tu Dir nen Gefallen und nenne Programme *.c.
Leerzeilen sollte man nicht unnütz einfügen.
Du schiebst immer nur 1-Bits rein.

void shift_7219(uint8_t data)
{
  for (uint8_t i = 8;i > 0; i--)
  {
  CLK_OFF();
    DIN_PORT |= (1<<DIN_PIN);
                if((data & 0x80) == 0)
    {
      DIN_PORT &= ~(1<<DIN_PIN);  
    }
    data <<= 1;
  CLK_ON();    
  }
}


Peter

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen Peter,

freut mich sehr das gerade Du antwortest. Ich weis das Du den 7219 
warscheinlich schon lange hinter dir gelassen hast, habe mir auch Deinen 
Code aus dem DCF77 Projekt angeschaut...zu hoch für mich, würde ja gern 
erst einmal wenigstens eine Digit-Led gezielt ansprechen können.

Habe den Code entsprechend Deinem Vorschlag geändert, kein Erfolg.

Schiebe ich falsch? Ziel soll sein das immer das 8te Bit (ganz links)auf 
1 geprüft werden soll und bei "wahr" der DIN-Pin high geschaltet wird.

Habe in deinem Code gesehen das Du in Hex-Schreibweise manchmal die Null 
weglässt z.B. 0xC statt 0x0C. Kann man das immer so machen?

Was meinst Du zu meinen Vermutungen weiter oben (getrennte Adr/Dat, 
freie DIG-Pins)?

Jens

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Frage mich zum Bsp. was ich mit den freien DIG-Pins (4-7) machen soll?

offen lassen.

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast doch 4 Stück 7-Segment-Anzeigen angeschlossen. Warum schaltest 
du dann die Decodierung in deiner Initalisierung aus?
> send_7219(0x09, 0x00 );//decode mode: off
hier müsste es heißen:
send_7219(0x09, 0x0F );//decode mode digit 3-0: on

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

möchte ja die einzelnen Digit-Leds ansprechen, benötige also keinen 
Decode-Mode.

Noch einmal zum Schieben:
Möchte "data" immer um ein Bit weiter nach links schieben um auf dem 
8ten Bit der Maske(0x80) auf 1 zu prüfen. Ist das in meinem Code richtig 
gelöst?

Danke Jens

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Die DIN Leitung kommt vom PB1, Load von PB2 und CLK von PC4.

Warum nutzt du nicht die SPI-Einheit des ATmega8?

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die SPI Pins werden vom Programieradapter benutzt. Habe mir ausserdem 
vorgestellt das es ja nicht so schwer sein kann den MAX via Software 
anzusprechen.
Was sagst Du im übrigen zu der Software?

Jens

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du sendest immer 1 Bit und schaltest dann die LOAD-Leitung high. Das ist 
falsch.
Du must immer 16 Bit in einem Stück senden, in der Form B0,B1,B2...B15 
und dann erst die LOAD-Leitung auf high ziehen.

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Die SPI Pins werden vom Programieradapter benutzt.

Da könntest du in den Zuleitungen zum 7219 einen Tri-State-Buffer 
einbauen, der durch die Reset-Leitung gesteuert wird.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey,
meiner Meinung nach schalte ich in der Funktion send_7219 den Load_pin 
auf low, sende dann in shift_7219 ein  Bit, schalte die CLK-Flanke high 
und schalte die CLK wieder low bevor ich das nächste Bit hole. Nach 
2x8Bit schalte ich in send_7219 Load wieder high.

Macht mein Code etwas anderes?

Jens

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du sendest in deiner Main eigentlich auch immer nur an das Register mit 
der Adresse 0x00
und das ist das "no op" Register:

send_7219(0x00, i );
  i++;

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, das habe ich inzwischen auch festgestellt und geändert.
Trotzdem läuft es nicht, nach dem brennen leuchten zwar manchmal ein par 
Leds aber wenn ich aus und einschalte zeigt sich alles wie zuvor, 
nämlich nur sehr gedimmte Anzeigen mit allem an. Was kann ich probieren?
Jens

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> meiner Meinung nach schalte ich in der Funktion send_7219 den Load_pin
> auf low, sende dann in shift_7219 ein  Bit, schalte die CLK-Flanke high
> und schalte die CLK wieder low bevor ich das nächste Bit hole. Nach
> 2x8Bit schalte ich in send_7219 Load wieder high.
>
> Macht mein Code etwas anderes?

Ich habe mal einrn Kommentare eingefügt:
void shift_7219(uint8_t data)
{
uint8_t i = 0;

  for (i = 8;i > 0; i--)
  {
  CLK_OFF();
                if((data & 0x80) == 0)
    {
      DIN_PORT &= ~(1<<DIN_PIN);  
    }
    //bis hierher alles ok!!
    //hiernach setzt Du DIN_PIN direkt wieder auf high, falsch!
    //DIN_PIN sollte erst, nachdem der 7219 den Zustand
    //gelesen hat wieder high gesetzt werden! 
    //Am besten also direkt vor dem nächsten CLK_OFF
    data <<= 1;
    DIN_PORT |= (1<<DIN_PIN);
  CLK_ON();    
  }

return;
}

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat Peter übrigens schon heute morgen genauso erkannt!
Ich dachte auch erst, er mein ein Bit und nicht Einser-Bits ;)

Autor: Jens (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hey Mike,

danke für die nochmalige Klarstellung. Habe den Code auch heut morgen 
schon entsprechend umgeschrieben und inzwischen auch noch einmal 
ausgedünnt.
Im Anhang also noch einmal neu.

Trotzdem läuft es nicht, als würde die Datenübertragung nicht einmal ein 
bisschen, also fehlerhaft laufen. Load setze ich in der send_7219 
Funktion low/high, ich denke an der richtigen Stelle.

Wäre es vielleicht sinnvoll eine Pause vor dem Abschalten des CLK-Pins 
einzubauen?

Jens

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Möchte "data" immer um ein Bit weiter nach links schieben um auf dem
>
> 8ten Bit der Maske(0x80) auf 1 zu prüfen. Ist das in meinem Code richtig
>
> gelöst?

War das nicht so, dass man von Bit 0 aus zählt? D.h. wenn du 8 Bit 
übergeben willst musst du auf 0x70 abfragen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> habe mir auch Deinen
> Code aus dem DCF77 Projekt angeschaut...zu hoch für mich

Die sollten aber funktionieren.
Hier die Init:

void display_write( uint16_t dc )
{
  MAX7219_DDR |= 1<<MAX7219_DO;
  MAX7219_DDR |= 1<<MAX7219_SCK;
  MAX7219_DDR |= 1<<MAX7219_STB;
  MAX7219_PORT &= ~(1<<MAX7219_STB);

  for( uint8_t i = 12; i; i-- ){
    MAX7219_PORT &= ~(1<<MAX7219_SCK);
    MAX7219_PORT |= 1<<MAX7219_DO;
    if( (dc & 0x0800) == 0 )
      MAX7219_PORT &= ~(1<<MAX7219_DO);
    dc <<= 1;
    MAX7219_PORT |= 1<<MAX7219_SCK;
  }

  MAX7219_PORT |= 1<<MAX7219_STB;
}


void display_init( void )
{
  display_write( 0xF00 );               // Testmode off
  display_write( 0x900 );               // Decode off
  display_write( 0xB07 );               // 8 Digits
  display_write( 0xC01 );               // Display on
  display_write( 0xA00 | brightness );  // Brightness
}


Peter

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, jetzt muss ich etwas ganz peinliches gestehen:

An meiner freifliegenden Spannungsversorgung waren die Kabel vertauscht 
(+ & - , blau & rot). So habe ich die 7-Segmentanzeige ausprobiert und 
eine gemeinsame Kathode festgestellt. Wenn die Kabel richtig stecken ist 
das Ding natürlich plötzlich mit gem. Anode. Der Max und auch meine 
Schaltung waren aber für gem. Kathode gedacht. So lief also nix bis ich 
mich heute entschlossen habe bim Händler eine Anzeige mit gem. Kathode 
zu kaufen. Beim "durchklingeln" der Pins ist mir dann der Fehler mit den 
vertauschten Kabeln aufgefallen.

Das ist natürlich auch ein großes Glück denn der Max LÄUFT 1A !!

Der Code ist also durchaus verwendbar und sicherlich leicht 
verständlich. Wünsche also allen viel Glück und Erfolg mit dem Max7219 
und bedanke mich für die Hilfe in diesem Forum.

Jens

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.