www.mikrocontroller.net

Forum: Compiler & IDEs 2x 74HC595 + 7-Segment-Display + GCC -> merkwürdiges Verhalten


Autor: Jonas F. (wuschelkuchen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich bin dabei, vier 7-Segment-Displays über zwei kaskadierte 
Schieberegister HC595 anzusteuern. An dem ersten hängen die Segmente 
a-dp, das zweite steuert die Transistoren (BC548C) für die 4 Anzeigen 
(niedrigste 4 Bit) an und zwei LED-Punkte zwischen den Anzeigen (höchste 
2 Bit). Um das erste nicht zu überlasten, habe ich für die Segmente 
jeweils einen BC558C zur Ansteuerung, dadurch ist alles auf dem 1. SRG 
active low und auf dem 2. SRG alles active high. RCK und SCK sind 
zusammengeschaltet.

Nur leider haut es mit der Ansteuerung nicht ganz hin. Ich habe mal ein 
kleines Testprogramm für einen Tiny2313 geschrieben und poste auch hier, 
weil ich vermute, dass es an der Software liegt.
#define F_CPU 8000000UL

#include <avr/io.h>
#include <portbits.h>
#include <util/delay.h>

#define D_SDATA DDRD_0
#define D_SSCLK DDRD_1
#define P_SDATA PORTD_0
#define P_SSCLK PORTD_1

#define NOP asm volatile("nop")

void ShiftByte(uint8_t byte);
void ClearSRGs();

int main()
{
  D_SDATA = 1;
  D_SSCLK = 1;
  P_SSCLK = 0;
  P_SDATA = 0;

  ClearSRGs();

  while(1)
  {
    //ClearSRGs();
    ShiftByte(0b11111111);
    ShiftByte(0b00000000);
    _delay_ms(30);
  }

  while(1)
  {
    NOP;
  }
}

void ShiftByte(uint8_t byte)
{
  P_SDATA = 0;
  for(uint8_t i = 0; i < 8; i++)
  {
    if(byte & 1)
    {
      P_SDATA = 1;
    }else{
      P_SDATA = 0;
    }
    P_SSCLK = 1;
    P_SSCLK = 0;
    byte >>= 1;
  }
}

void ClearSRGs()
{
  P_SDATA = 0;
  for(uint8_t i = 0; i < 16; i++)
  {
    
    P_SSCLK = 1;
    P_SSCLK = 0;
  }
}

Ich verwende Benedikts portbits.h (hier gleich mal ein kräftiges Danke 
an Benedikt, die Datei erspart einem einiges an Arbeit).

Die zweite while-Schleife ist nur dazu da, falls ich die erste 
auskommentiere...

Nun zum Verhalten: Eigentlich sollte mit dem Code alles leuchten, jedoch 
bleiben das "dp-Segment" (höchstes Bit des 1. SRGs) und die erste 
Anzeige (höchstes Bit des 2. SRGs) dunkel.

Ersetze ich aber
ShiftByte(0b11111111);
ShiftByte(0b00000000);

durch
ShiftByte(0b01111111);
ShiftByte(0b10000000);

leuchtet alles wunderbar. Es sieht also so aus, als würden die beiden 
Schieberegister ihr 7. Bit untereinander tauschen? Wie kann das sein? 
Liegt es wirklich an der Software oder kann es nur ein Hardwareproblem 
sein?

Ich hoffe, dass ich nicht im komplett falschen Forum bin...


grüssse
w.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo steuerst du RCK aktiv an?

Autor: Jonas F. (wuschelkuchen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nirgends. RCK und SCK sind zusammengeschaltet (steht oben :D), da mir 
sonst später die Pins knapp werden.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es sieht also so aus, als würden die beiden
> Schieberegister ihr 7. Bit untereinander tauschen?
Es sieht eher so aus, als ob dein Protokoll um 1 Bit verschoben ist...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
J. R. schrieb:
> Nirgends. RCK und SCK sind zusammengeschaltet (steht oben :D), da mir
> sonst später die Pins knapp werden.

Ah. Noch mal nachgelesen. Stimmt.
Hmm. Keine gute Idee.
Trenn das mal auf und steuere RCK extra an.

Die Frage ist: wenn beide Pulse gleichzeitig kommen, was macht dann der 
595? Welcher Zustand der Schiebekette wird ins Augangsregister 
übernommen? Der der vorlag, ehe er gleichzeitig stattfindende SCK Puls 
weiterschiebt oder der der danach vorliegt oder überhaupt eine 
Mischform?

Müsste man jetzt im Datenblatt nachlesen, was in so einem Fall passiert 
bzw. ob das überhaupt erlaubt ist.
Normal benutzt man das Ding so:
Mit SCK wird die Schiebekette befüllt. Ist jedes Bit an seinem Platz, 
schaltet ein RCK den Inhalt der Schiebekette auf die Ausgänge durch. Das 
hat dann auch den Vorteil, dass alle Ausgänge gleichzeitig auf einen 
neuen Zustand wechseln und man den Vorgang des Reintaktens in die 
Schiebekette an den Ausgängen nicht sieht.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Es sieht eher so aus, als ob dein Protokoll um 1 Bit verschoben ist...
Und da haben wir auch schon den Grund dafür:
> RCK und SCK sind zusammengeschaltet
Darusch wird erst einen Takt später das eingetaktete Bitmuster in den 
Ausgangsregistern gespeichert   :-o

Autor: Jonas F. (wuschelkuchen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut. Ich werds mal auftrennen, mal schaun, obs dann besser wird.

Autor: Jonas F. (wuschelkuchen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt läuft alles perfekt!
Hätte nicht gedacht, dass es daran liegt.

Danke!

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.