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.
1 | #define F_CPU 8000000UL
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <portbits.h>
|
5 | #include <util/delay.h>
|
6 |
|
7 | #define D_SDATA DDRD_0
|
8 | #define D_SSCLK DDRD_1
|
9 | #define P_SDATA PORTD_0
|
10 | #define P_SSCLK PORTD_1
|
11 |
|
12 | #define NOP asm volatile("nop")
|
13 |
|
14 | void ShiftByte(uint8_t byte);
|
15 | void ClearSRGs();
|
16 |
|
17 | int main()
|
18 | {
|
19 | D_SDATA = 1;
|
20 | D_SSCLK = 1;
|
21 | P_SSCLK = 0;
|
22 | P_SDATA = 0;
|
23 |
|
24 | ClearSRGs();
|
25 |
|
26 | while(1)
|
27 | {
|
28 | //ClearSRGs();
|
29 | ShiftByte(0b11111111);
|
30 | ShiftByte(0b00000000);
|
31 | _delay_ms(30);
|
32 | }
|
33 |
|
34 | while(1)
|
35 | {
|
36 | NOP;
|
37 | }
|
38 | }
|
39 |
|
40 | void ShiftByte(uint8_t byte)
|
41 | {
|
42 | P_SDATA = 0;
|
43 | for(uint8_t i = 0; i < 8; i++)
|
44 | {
|
45 | if(byte & 1)
|
46 | {
|
47 | P_SDATA = 1;
|
48 | }else{
|
49 | P_SDATA = 0;
|
50 | }
|
51 | P_SSCLK = 1;
|
52 | P_SSCLK = 0;
|
53 | byte >>= 1;
|
54 | }
|
55 | }
|
56 |
|
57 | void ClearSRGs()
|
58 | {
|
59 | P_SDATA = 0;
|
60 | for(uint8_t i = 0; i < 16; i++)
|
61 | {
|
62 |
|
63 | P_SSCLK = 1;
|
64 | P_SSCLK = 0;
|
65 | }
|
66 | }
|
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
1 | ShiftByte(0b11111111);
|
2 | ShiftByte(0b00000000);
|
durch
1 | ShiftByte(0b01111111);
|
2 | 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.