emil schrieb:
> Ich schaffe es schon nicht eine beliebige 8bit breite Bitmaske rüber zu
> schieben, also meine
.
Dann musst du da eben damit anfangen.
Du brauchst eine Funktion, der du einen uint16_t übergibst und die die
16 Bit eines nach dem anderen raustaktet.
Warum willst du eigentlich die beiden Bytes erst mal zu einem 16 Bit
Wert zusammensetzen nur um sie dann in dieser Funktion wieder
auseinander zu dröseln? Übergib halt die beiden Teile getrennt an die
Funktion oder mach dir eine Funktion der du die beiden 8 Bit Einheiten
nacheinander geben kannst, dann braucht sich die Funktion auch nicht die
Finger dabei brechen um das wieder in leicht verdauliche 8 Bit Einheiten
zu zerlegen :-)
Alles was du brauchst ist eine Schleife, die die 8 Bit eines nach dem
anderen an den Ausgabeport legt. D.h eigentlich: die am Ausgabeport den
Pin auf 0 oder auf 1 setzt, je nachdem ob das Bit welches gerade drann
ist 0 oder 1 ist. Und dazwischen wird mit der Clock Leitung einmal
gewackelt. Ein Bit fragt man ab, indem man die Bitposition mit einer
Maske 'freimaskiert' und sich ansieht, ob das Ergebnis 0 oder nicht 0
ist. Genau wie man es beim Abfragen von Tastern auch macht. Dort fragst
du ab, ob ein Bit im PINx Register 0 oder 1 ist und hier ist es halt
anstelle eines PINx Registers eine 8 Bit Variable. Aber der Vorgang ist
genau der Gleiche bis auf den Umstand, dass man die Sache mit der Maske
ein wenig intelligenter macht:
1 | void Send( uint8_t value )
|
2 | {
|
3 | uint8_t Maske = 0x01;
|
4 | uint8_t i;
|
5 |
|
6 | Maske = 0x01;
|
7 | for( i = 0; i < 8; i++ )
|
8 | {
|
9 | if( value & Maske )
|
10 | Setze Ausgabepin auf 1
|
11 | else
|
12 | Setze Ausgabepin auf 0
|
13 |
|
14 | Clock Pin auf 1
|
15 | Clock Pin auf 0
|
16 |
|
17 | Maske = Maske << 1;
|
18 | }
|
19 | }
|
Und schon hast du eine Funktion, die einen 8 Bit Wert an das
Schieberegister rausgibt. Um 16 Bit ruaszugeben rufst du die halt 2 mal
auf. Denn 2 mal 8 Bit sind auch 16 Bit
1 | Send( LED );
|
2 | Send( Segment );
|
Und damit das 595 dann die reingetakteten Daten auch auf den Ausgang
legt, musst du noch, nachdem die Daten reingetaktet sind, einmalig mit
dem RCLK Ausgang wackeln. Das bringt den 595 dazu, die Daten dann auch
auf die Ausgänge zu schalten.
1 | Send( LED );
|
2 | Send( Segment );
|
3 |
|
4 | Setze RCLK auf 1
|
5 | Setze RCLK auf 0
|
und das wars.
Die 16 Bit sind in die, hoffentlich kaskadierten, Schieberegister
geladen und die SR wurden angewiesen ihre Ausgänge entsprechend der
Daten durchzuschalten.
WEnn jetzt in LED bzw. Segment noch das richtige drinnen steht, kannst
du gezielt jedes einzelne Segment ein/ausschalten, indem du jeweils
wieder eine komplett neue Belegung in die SR lädst.