Forum: Mikrocontroller und Digitale Elektronik SPI mit ATMega162 und 74HC595


von Mike (Gast)


Lesenswert?

Hallo zusammen,

ich möchte über ein Schieberegister eine LED-Zeile steuern. Leider tut 
sich da aktuell gar nichts...

Folgende Verbindungen von Prozessor zu Schieberegister hab ich gelötet:

PB7(SCK)  --> SH_CP
PB5(MOSI) --> DS
PB4(SS)   --> ST_CP

Und folgendes kleine Programm geschrieben:

// Init Port
DDRB = (1<<PB4) | (1<<PB5) | (1<<PB7);
PORTB = (1<<PB4);

// Init SPI
SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);

output = 1;

// Sende Output
SPDR = output;
while (!(SPSR & (1<<SPIF)));

// Daten von Schieberegister in Latches
PORTB &= ~(1<<PB4);
PORTB |= (1<<PB4);

Wie gesagt leuchtet keine LED in der Zeile...

Ist an den Verbindungen und/oder am Coding etwas grundlegend 
falsch/vergessen? Muss ich den MR-Pin vom Schieberegister zwingend mit 
VCC verbinden (hab ich irgendwo als empfehlenswert gelesen, aber noch 
nicht gemacht)?

Vielen Dank!

von Andreas W. (geier99)


Lesenswert?

Mike schrieb:
> Ist an den Verbindungen und/oder am Coding etwas grundlegend
> falsch/vergessen? Muss ich den MR-Pin vom Schieberegister zwingend mit
> VCC verbinden (hab ich irgendwo als empfehlenswert gelesen, aber noch
> nicht gemacht)?

ja, das solltest Du aber tun (!MR = Master Reset für das 
Schieberegister).
Somit wäre das Schieberegister immer zurückgesetzt.
Und wie hast Du !OE beschaltet?

von Mike (Gast)


Lesenswert?

Andreas W. schrieb:
> ja, das solltest Du aber tun (!MR = Master Reset für das
>
> Schieberegister).

ok, mach ich - dachte wäre "optional" ;-)

Andreas W. schrieb:
> Und wie hast Du !OE beschaltet?

auch gar nicht, hängt in der Luft... muss das an GND?

Vielen Dank!

von Eumel (Gast)


Lesenswert?

Mike schrieb:
> auch gar nicht, hängt in der Luft... muss das an GND?

Hat dein Bauteil kein Datenblatt?

von Holzknüppel (Gast)


Lesenswert?

Eumel schrieb:
> Hat dein Bauteil kein Datenblatt?

Lieber Eumel,
eigentlich hast du nichts zu sagen, also halt die Klappe.
Schreib mal ein Datenblatt über dich selbst und verschone uns mit deinem 
Spam hier und anderswo.

von Kurt H. (Firma: KHTronik) (kurtharders)


Lesenswert?

Hallo Holzknüppel,

der Hinweis auf ein Datenblatt ist sicher hilfreich, denn wenn man nicht 
lernt Datenblätter zu lesen wird man nie eine Schaltung so entwerfen 
können, dass man das geplante Ergebnis ohne endloses Fummeln erreicht. 
Selbst mit guten Datenblättern bleibt, gerade bei SPI u.ä., noch genug 
Raum für klärende Schaltungsanalyse. Drei Signale mit verschiedenen 
Phasenbeziehungen und Polaritäten reichen schon für 1-2 Tage Fehlersuche 
aus :-).
Es ist also ein guter Rat, wenn man Mike das Studium der Datenblätter 
nahelegt.
Grüße, Kurt

von Kurt H. (Firma: KHTronik) (kurtharders)


Lesenswert?

Hallo Mike,
der Code ist OK. Schau mal die Anmerkungen von Andreas nach und lies in 
Ruhe die Datenblätter :-). Je nach Flankenverhalten des Latches musst Du 
noch CPHASE und CPOL anschauen und evetuell entsprechend setzen.
Grüße, Kurt

von T.Roll (Gast)


Lesenswert?

Mike schrieb:
> auch gar nicht, hängt in der Luft... muss das an GND?

Manchmal fragt man sich, wofür die Hersteller in ihren Datenblättern 
sinntragende Pin-Bezeichnungen verwenden, Logik-Diagramme zeigen und 
Pin-Beschreibungen aufnehmen.

Was ist an dem Satz "Data in the storage register appears at the output 
whenever the output enable input (\OE) is LOW" so schwer zu verstehen?

von Bernd T. (bastelmensch)


Lesenswert?

T.Roll schrieb:
> Mike schrieb:
>> auch gar nicht, hängt in der Luft... muss das an GND?
>
> Manchmal fragt man sich, wofür die Hersteller in ihren Datenblättern
> sinntragende Pin-Bezeichnungen verwenden, Logik-Diagramme zeigen und
> Pin-Beschreibungen aufnehmen.
>
> Was ist an dem Satz "Data in the storage register appears at the output
> whenever the output enable input (\OE) is LOW" so schwer zu verstehen?

Naja, eben ob es wirklich muss. Wegrenn ;-)

von Mike (Gast)


Lesenswert?

Danke für die Tips. Mit den beiden zusätzlichen Verbindungen 
funktioniert es prinzipiell - sorry, da hätte ich durch etwas 
sorgfältigere Recherche im Datenblatt sicher selbst drauf kommen können.

Aber ein kleines Problem gibt es noch: also ich habe zwei 
Schieberegister kaskadiert und daran zwei 8er-LED-Zeilen gehängt (also 
insgesamt 16 LEDs). Jetzt habe ich das Phänomen, dass bei der 
Ansteuerung die LEDs immer eine Stelle "zu weit rechts" reagieren - z. 
B. ich möchte mit folgendem Code LED 8 und LED 16 zum Leuchten bringen, 
aber es sind LED 7 und LED 15 an.
Ist da noch ein Fehler im Coding, oder gibt es einen "Trick"?

int main(void)
{
  uint8_t output = 0;

  // Init Port
  DDRB = (1<<PB4) | (1<<PB5) | (1<<PB7);

  // Init SPI
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPI2X) | (1<<SPR1) | (1<<SPR0);

  output = 0b01111111;
  sendOutput(output);
  output = 0b01111111;
  sendOutput(output);

  activateOutput(output);
}

void sendOutput(uint16_t output)
{
  // Send output
  SPDR = output;
  while (!(SPSR & (1<<SPIF)));
}

void activateOutput()
{
  // Daten von Schieberegister in Latches
  PORTB &= ~(1<<PB4);
  PORTB |= (1<<PB4);
}

Thx.

von Mike (Gast)


Lesenswert?

hat sich erledigt...

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.