Go Down

Topic: Kicker Tore anzeigen mit SN74595 (Read 3861 times) previous topic - next topic

Woina

Hallo Welt,

nachdem ich seit ner Woche alle möglichen Tuorials über die Scheiberegister 74595 gemacht habe bin ich nun leider gezwungen hier um Hilfe anzufragen.

Ich möchte das mit Hilfe eines Schieberegisters 9LED´s nacheinander aufsteigend zu leuchten beginnen. Wird das 10 Tor geschossen soll die erste anzeige auf 0 zurückgehen und eine weitere soll bei 1 also 10 beginnen. Im Grunde ist es das selbe wie diese Dezimaluhren nur eben für einen Kicker als Toranzeige.

Mein Problem ist das ich trotz diverser Tutorials nicht im Stande bin diese Routine zu programmieren. egal welche Programmschnipsel ich probiere ich komme entweder nur bis 8  oder der zweite 74595 wird nicht in der Richtigen Reihenfolge angesprochen. Auch werden die LEds duchgetaktet eigentlich solten sie dauerhaft leuchten.Mittlerweile hab ich echt ne Blockade....

Hat hier schon mal jemand so was gemacht bzw ein paar Tipps diesbezüglich.

Bin noch relativ neu in der Arduino Welt und kämpfe bisweilen mit der Sprachumgebung...

Eisebaer

hi, woina,

willkommen im forum.

für die schaltung gibt es im playground das shiftout-beispiel.
http://www.arduino.cc/en/Tutorial/ShiftOut

und stell' Deinen sketch, der nicht fünktioniert, hier rein.

gruß stefan

volvodani

Das ist eigentlich gamz einfach Die SHiftregister sind nix anderes als darstellung eines Bytes (8Bit)
Als Beispiel mit einen Register
           Reg 1
   X X X X   X X X X
B0 0 0 0  0 0 0 0
Dann wäre das erste Tor B1000 0000 also Dezimal 128
Das zweite Tor B1100 0000 also Dezimal 192
Das Dritte Tor B1110 0000 also Dezimal 224

Du musst dann Im Sketch dir die Bytes zusammenbauen die du rausschiebst


Zehner
|   Register  3    |  Register 2
X X X X  X X X X   X

Einer
| Register 2  |   Register 1
X X X  X X X X  X X


Das Register zwei wäre "geteilt" also das 7 Bit wäre die 9 Zehner Stelle und die Bit 6-0 Die LED 1-7.  8 und 9 sinde vom Ersten Register.
Das Problem hier wäre das umdenken, da man von rechst nach Links Duchscheibt
also

R3 <= R2 <= R1

Man baut sich jetzt 3 Anzeige Bytes die man mit http://arduino.cc/en/Reference/BitWrite  manipuliert.
Am Ende muss man die 3 Bytes mit dem Shiftout (siehe Post vorher) an die 3 Registe übergeben. Dann kommst man auf das Ergebniss.
Gruß
DerDani
"Komm wir essen Opa!" - Satzzeichen retten Leben!

Woina

Danke für die Antwort.

Wie meinst du man baut drei Bytes:

in meinem Fall?

Register 3: byte1 = 11111111;
Register 2: byte2 =  11111111
Register 1: byte3 =  11000000;

und dann das ganze mit

bitWrite(2,5,1);

ausgeben dann sollte die zweite  Led leuchten von Register 2??

und anschleissend bitWrite(2,5,0);

wieder ausschalten.

Nur wie takte ich das durch die 595

Ach ja bekommt man hier keine auto benachrichtigung wenn jemand schreibt???


Woina

Das ist mein Code:

int latchPin = 8;
int clockPin = 11;
int dataPin = 12;

byte leds = 0;

void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}

void loop()
{
leds = 0;
updateShiftRegister();
delay(500);
for (int i = 0; i < 8; i++)
{
bitSet(leds, i);
updateShiftRegister();
delay(500);
}
}

void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}



Kann mir irgendwer sagen warum ich das zweite Register nicht ansprechen kann das es nach 8 weiterzählt bis 9 und dann die zehnerstelle setzt.

Rabenauge

Wozu überhaupt nen zweites??
Wenn es nur eine LED mehr sein soll als das eine Register ansteuern kann, klemm ich die an nen anderen Pin und fertig...
------------
Grüssle, Sly

nix_mehr_frei

Hallo,

kannst aber auch einen BCD zu 16 Decoder verwenden. Das Teil heißt 74HC154 oder auch 74LS154 oder 74154. Der hat 4 Eingänge BCD, wo du eine Dualzahl anlegst und bekommst dann auf dem enstprechenden Ausgang ein Signal. Das ist genau das, was du willst. Früher, in der Zeit vor den µC, hat man nur so gearbeitet  ;)
Preislich unterscheidet sich der kaum von 2x 595'ern.

Gruß Gerald
rot ist blau und Plus ist Minus

Woina

@ Rabenauge: Du hst schon recht aber wennich fertig bin möchte ich ca 40 LEd´s ansprechen da reicht mir dann eben das Uno Board nicht. die elgantere Lösung wäre eben mit 74595 ern.

@nix mehr frei: Das löst leider mein Problem nicht das ich es mit den 74595 ern nicht hinbekomme einen LED Balken aufzubauen. Ich denke dann wirds mit den von dir beschreiben auch nicht klappen. Das Problem ist nicht die richtigen Chips zu besorgen sosnern wie ich Softwaretechnisch anstellen muss.

nix_mehr_frei

Bis jetzt war nur von 16 die Rede, jetzt sollen es plötzlich 40 sein  :smiley-eek:
Aber auch das wäre zu schaffen. Der 74154 hat zwei Freigabeeingänge. Wenn die nicht beide L-Pegel haben, machen die Ausgänge "dicht". Somit kann man dann mit 2 Invertern 74xx00 o.ä. mit 2 Pins binär 4 Zustände ausgeben und damit dann 4x 74154 ansteuern. 3 werden verriegelt und einer wird durchgeschaltet. Mit 3en hast du bereits 48 Ausgänge.
Aber es geht noch eleganter  :)
Guck dir mal den MAX7219 an. Der kann 64 LED's multiplexen. Entwickelt wurde der ursprünglich mal um 8 Stellige 7 Segmentanzeigen plus Dezimalpunkt anzusteuern. Eine 8x8 Punktmatrix kann er auch. Nur, die 8x8 LED's müssen ja nicht zwingend auch geometrisch als 8x8 angeordnet werden, linear geht auch - nur die Verdahtung erfolgt al Matrix  ;)
Praktischerweise gibt es bei den Ansteuerungsbefehlen auch noch einen Befehl mit reduzierter Stellenazahl zu arbeiten. Bei 5 statt 8 Stellen hast du dann 5x8  - genau die gewünschten 40 LED's  :D
Ich habe sowas ne Nummer größer geplant. 3x MAX7219 kaskadiert und 192 LED's zu einer überdimensionalen Thermometerskala aufgereiht  :D

Gruß Gerald
rot ist blau und Plus ist Minus

Woina

Den 7219 kenn ich schon. Aber ich will einfach nur wissen wie ein Sketch aussieht der das kann was ich brauche. Ich hab schon soviel versucht aber einen hintereinander Schaltung ging nie.

Liebt aber vermutlich auch daran das ich etwas wie du bin  , in deinem Profilbin- nämlich Jahrelange Elektronikbastelei aber null Ahnung von Prgrammierung. Is bei mir auch so aber ich taste mich langsam ran. Is zwar immer nett wenn sich Leute Ihre Projekte darstellen und man die nachbaut aber wenn man dann selber was machen will dann steht man wie vor ner Wand.

Und mein Fabel sind halt Uhren oder alles was LED beinhaltet.

Rabenauge

Kann es sein, dass du einfach keine Lust hast, das selber zu programmieren??

So kompliziert ists nun wirklich nicht, ich hab das seinerzeit auf Anhieb hinbekommen, ohne vorher je mit so nem Ding zu tun gehabt zu haben. Kannst du auch...
------------
Grüssle, Sly

nix_mehr_frei

Also mir hat das Buch von Erik Bartmann "Die elektronische Welt mit Arduino entdecken" bei den ersten Gehversuchen (die mache ich immer noch) sehr geholfen. Dort ist auch die Geschichte mit der Kaskadierung der 595'er beschrieben. Der beispielsketch für Zweie davon lautet:
Code: [Select]
/*
Author:        Erik Bartmann
Website:       http://www.erik-bartmann.de
Blog:          http://www.tumblr.com/tumblelog/arduino-processing
Twitter:       https://twitter.com/#!/ErikBartmann
Flickr:        http://www.flickr.com/photos/erikbartmann/6312130270 (Schaltplan)
Scope:         Porterweiterung mal 2
Version:       1.0
Date:          03.10.2011
Last modified:
Description:   Dieser Sketch steuert zwei Schieberegister 74HC595 an
Referenz:     http://arduino.cc/en/Reference/PinMode
              http://arduino.cc/en/Reference/Constants
              http://arduino.cc/en/Reference/DigitalWrite
              http://arduino.cc/en/Reference/ShiftOut
*/
int taktPin = 8;     // SH_CP
int speicherPin = 9; // ST_CP
int datenPin = 10;   // DS

void setup(){
  pinMode(taktPin, OUTPUT);
  pinMode(speicherPin, OUTPUT);
  pinMode(datenPin, OUTPUT);
}

void loop(){
  sendeBytes(0B0110011001000101); // Zu übertragene Binärzahl = 26181(dez)
}

// Funktion zum Übertragen der Informationen
void sendeBytes(int wert){
  digitalWrite(speicherPin, LOW);
  shiftOut(datenPin, taktPin, MSBFIRST, wert >> 8);
  shiftOut(datenPin, taktPin, MSBFIRST, wert & 255);
  digitalWrite(speicherPin, HIGH);
}


Bei mir hat sowas und Codeschnipsel aus dem Netz, immer gut geklappt.

Gruß Gerald
rot ist blau und Plus ist Minus

Woina

@ Rabenauge: So ist es nun auch nicht. Und nicht jeder fühlt sich in der C+ oder wie auch immer Welt gleich daheim. für mich ist das wirklich schwierig bin da mehr der praktische Typ.Ich hab wie schon gesagt das Shift Out Tut und auch andere Beispiele probiert nur versteh ich immer noch nicht wie ich es dem blöden Teil sagen kann das es jetzt in den zweiten 74595 weitertakten soll. Übrigens das Beispeil runterladen und uploaden das funzt bei mir auch, nur seh ich halt nirgend das entscheidene "ah so gehts".


@ Gerald: das hab ich auch schon gefunden: Geht ja auch.Nur zum Verständnis.

shiftOut(datenPin, taktPin, MSBFIRST, wert >> 8);

Alles was kleiner wie 8 ist bleibt im Register 1 und alle was größer ist geht nach Regeister 2? oder?
Gut - Warum ist es dann in der ersten Zeile eine 8(ich nehme an ein Byte) und in der zweiten 255??? könnte doch auch ... wert <<8); heißen oder.

shiftOut(datenPin, taktPin, MSBFIRST, wert & 255);

Wenn ich jetzt noch fage wie ich das dann schaffe das eine LEd nach der anderen anfängt zu leuchten mit diesem Verfarhen dann wird mir noch sonst was vorgeworfen. Hätte eigentlich noch viele Fragen - was solls.






nix_mehr_frei

Was aus den ersten SRG rauskommt, sind automatisch die Daten fürs 2. Register. Eine LED nach der anderen angehen zu lassen, ist theoretisch die Basisfunktion eines Schieberegisters. Ein Takt und die Daten wandern eine Stelle weiter - so wie beim guten alten Lichtschlauch, den man aus TTL zu Fuß aufgebaut hat. Nur hier, mit µC wirds etwas komplizierter und du erreichst den Efekt nur mit "um die Ecke denken". Du fütterst das Register mit N Bytes bei N Schieberegistern. Der nächste Schritt zum Weiterrücken sind wieder N Bytes - desmal mit einem Muster, das rein optisch einen Stelle weitergewandert ist. Du füllst bei jedem Schritt die ganze Registerkette rasend schnell. davon siehst du nur nichts, weil die Schiebeopration unsichtbar bleibt und erst ST_CP (Storage Clock?) vom eigentlichen Schieberegister in ein weiteres Latch oder Datenregister innerhalb des 595 übernommen wird. Wärend des Schiebens siehst du noch die alten Daten.
Ich hoffe, ich konnte dir das jetzt halbwegs verständlich rüberbringen  ;)
rot ist blau und Plus ist Minus

Woina

Naja lass gut sein ich Spiel mich noch mal ein bisschen. einen kleinen Teilerfolg hab ich schon allerdings ohne Schieberegister.

Go Up