mikrocontroller.net

Forum: Compiler & IDEs 2 ICs 74HCT595 an MEGA8


Autor: Udo S. (Firma: allround) (1udo1)
Datum:

Bewertung
0 lesenswert
nicht 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:

// Porterweiterung 2 ICs 74HCT595 am MEGA8

// es sollen 16 LEDs voneinander unabhängig an den Ausgängen der 75HCT595 angehen

#define F_CPU 12000000UL

#include <avr/io.h>
#include <inttypes.h>

#define storepd1 PD1  // Speichertakt
#define shiftpd3 PD3  // Schiebetakt
#define datapd0 PD0  // Datenausgang

volatile uint8_t muster= 0x03;      

void HC595Init()
{
  DDRB=0x3f;
  PORTB=0x3f;
  
  DDRC=0x3f;
  PORTC=0xff;
  
  DDRD=0xfb; //Ausgang für Shift-PD1, Store-PD3  Data-D0
  
  PORTD=0xfb;
  
}

//#######################################################################

int main (void)
{
  HC595Init();
  
// 2 ICs 74HCT595 sind am MEGA8 angeschlossen, Datenausgang von IC1 geht direkt an den Dateneingang von IC2
  
// ************** nur zu Demozwecken vor der while-Schleife **************
    
// ** die for-Schleife soll wirklich nur einmal von i=0 bis i=7 durchlaufen ******
    
// 2 Fehler zeigen sich: 
    
// a.)  beim ersten 74HCT595 sind die Nibbles gegenüber der Anzeige an PORTC vertauscht, Hardware auf der Platine ist o.k., Layout stimmt
    
// b.)  im zweiten 74HCT595 gehen ebenfalls irgendwelche LEDs an, obwohl laut Programm der Shift nur 7 mal erfolgt, 
    
//      es sollten doch nur "Nullen" an den Ausgängen von IC2 sein
    
    
PORTC=~muster;// Kontrolle des auszugebenden Bytes, wird an PORTC richtig angezeigt
    
PORTD &=~ 1<<shiftpd3;  // PD3 Shift  
PORTD &=~ 1<<storepd1;  // PD1 Store  
        
  for(int i=0;i<=7;i++)
  {
    if(bit_is_set(muster,i))
     {
       PORTD|= 1<<datapd0;  // wenn Bit i HIGH ist
     }
      else
      {
       PORTD &= ~ 1<<datapd0;  // wenn Bit i LOW ist
      }
      
      PORTD |= 1<<shiftpd3;  // Takt für Shift HIGH
      PORTD &= ~ 1<<shiftpd3;  // Takt für Shift LOW
    }
    PORTD |=1<<storepd1;  // wenn alle 8 Bit im Shiftzregister sind, dann Store
    
//*********************************************************************        
    
    while(1)
    {  
    
    }
}// Ende main




Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dennis H. (t1w2i3s4t5e6r)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: udo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: cc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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... ;-)

Autor: udo (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.