Hallo,
ich möchte zunächst nur ein einziges Byte an den ersten 74HCT595
übertragen.
Die forschleife habe ich zum Testen vor die while-schleife gesetzt,
damit sie wirklich nur einmal durchlaufen wird, und nicht ständig die
Bits nachgeschoben werden.
Ich erwarte, dass mein Byte am ersten 74HCT595 genauso angezeigt wird
wie an PORTC. Es wird zwar angezeigt, aber mit vertauschten Nibbles.
Bit0 erscheint an Q7 des 74HCT595. Normalerweise soll Bit7 zuerst
reingeschoben werden, damit es letzendlich an Q7 steht. Mein Programm
befördert aber Bit0 an Q7. Die Hardware, also das Layout ist o.k. Habe
es hinreichend noch mal geprüft.
Die forschleife mit for(i=0;i<=7;i++) liefert die vertauschten Nibbles.
Der 74HCT595 will Bit7 zuerst haben, so steht es geschrieben.
Also habe ich die forschleife auf for(i=7;i<=0;i--) gesetzt. Danach kam
an den Anzeigen des 74HCT595 nur noch Unsinn heraus.
Frage:
Ist in meinem Programm ein kapitaler Fehler? Ich weiss keinen Rat mehr,
woran es liegen könnte, dass die Anzeige am 74HCT595 nicht mit der des
PORTC übereinstimmt.
Hier das Programm:
1 | // Porterweiterung 2 ICs 74HCT595 am MEGA8
|
2 |
|
3 | // es sollen 16 LEDs voneinander unabhängig an den Ausgängen der 75HCT595 angehen
|
4 |
|
5 | #define F_CPU 12000000UL
|
6 |
|
7 | #include <avr/io.h>
|
8 | #include <inttypes.h>
|
9 |
|
10 | #define storepd1 PD1 // Speichertakt
|
11 | #define shiftpd3 PD3 // Schiebetakt
|
12 | #define datapd0 PD0 // Datenausgang
|
13 |
|
14 | volatile uint8_t muster= 0x03;
|
15 |
|
16 | void HC595Init()
|
17 | {
|
18 | DDRB=0x3f;
|
19 | PORTB=0x3f;
|
20 |
|
21 | DDRC=0x3f;
|
22 | PORTC=0xff;
|
23 |
|
24 | DDRD=0xfb; //Ausgang für Shift-PD1, Store-PD3 Data-D0
|
25 |
|
26 | PORTD=0xfb;
|
27 |
|
28 | }
|
29 |
|
30 | //#######################################################################
|
31 |
|
32 | int main (void)
|
33 | {
|
34 | HC595Init();
|
35 |
|
36 | // 2 ICs 74HCT595 sind am MEGA8 angeschlossen, Datenausgang von IC1 geht direkt an den Dateneingang von IC2
|
37 |
|
38 | // ************** nur zu Demozwecken vor der while-Schleife **************
|
39 |
|
40 | // ** die for-Schleife soll wirklich nur einmal von i=0 bis i=7 durchlaufen ******
|
41 |
|
42 | // 2 Fehler zeigen sich:
|
43 |
|
44 | // a.) beim ersten 74HCT595 sind die Nibbles gegenüber der Anzeige an PORTC vertauscht, Hardware auf der Platine ist o.k., Layout stimmt
|
45 |
|
46 | // b.) im zweiten 74HCT595 gehen ebenfalls irgendwelche LEDs an, obwohl laut Programm der Shift nur 7 mal erfolgt,
|
47 |
|
48 | // es sollten doch nur "Nullen" an den Ausgängen von IC2 sein
|
49 |
|
50 |
|
51 | PORTC=~muster;// Kontrolle des auszugebenden Bytes, wird an PORTC richtig angezeigt
|
52 |
|
53 | PORTD &=~ 1<<shiftpd3; // PD3 Shift
|
54 | PORTD &=~ 1<<storepd1; // PD1 Store
|
55 |
|
56 | for(int i=0;i<=7;i++)
|
57 | {
|
58 | if(bit_is_set(muster,i))
|
59 | {
|
60 | PORTD|= 1<<datapd0; // wenn Bit i HIGH ist
|
61 | }
|
62 | else
|
63 | {
|
64 | PORTD &= ~ 1<<datapd0; // wenn Bit i LOW ist
|
65 | }
|
66 |
|
67 | PORTD |= 1<<shiftpd3; // Takt für Shift HIGH
|
68 | PORTD &= ~ 1<<shiftpd3; // Takt für Shift LOW
|
69 | }
|
70 | PORTD |=1<<storepd1; // wenn alle 8 Bit im Shiftzregister sind, dann Store
|
71 |
|
72 | //*********************************************************************
|
73 |
|
74 | while(1)
|
75 | {
|
76 |
|
77 | }
|
78 | }// Ende main
|