Forum: Compiler & IDEs 2 ICs 74HCT595 an MEGA8


von Udo S. (Firma: allround) (1udo1)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

Warum schiebst du die Daten nicht über die SPI-Hardware raus?

Vertauschen der Nibbles [1] hilft nicht gegen falsche Bitreihenfolge.
Im übrigen sind Namen nur Schall und Rauch. Nur weil der Hersteller 
deines 74HCT595 die Ausgänge Q0..Q7 genannt hat, ist es nicht verboten 
eine eigene umgekehrte Nummerierung z.B. Y7..Y0 zuverwenden.

[1] http://de.wikipedia.org/wiki/Nibble

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Ich habe es auch mit der SPI Hardware im Mega 8 gemacht. Geht wunderbar. 
Hier der Artikel dazu:

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister#Porterweiterung_f.C3.BCr_Ausg.C3.A4nge


Dennis

von udo (Gast)


Lesenswert?

Vielen Dank Euch Beiden.

Habe die Leiterbahnen schon geändert auf SPI Betrieb. Ist wirklich 
einfacher, als meine bisherige Programmierung.

Ich verfolge meine bisherige Frage nicht mehr, sie ist Schnee von 
gestern.

Den Thread schließe ich.

von cc (Gast)


Lesenswert?

Hallo,

nur als ergänzung zur ursprünglichen Frage, der fehler lag scheinbar 
hier:

for(i=7;i<=0;i--)
müsste wohl eher so lauten:
for(i=7;i>=0;i--)
sonst wird die schleife nie durchlaufen... ;-)

von udo (Gast)


Lesenswert?

Stimmt! Danke für den Hinweis. Kann ich für spätere Programme mir hinter 
die Ohren schreiben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.