Forum: Mikrocontroller und Digitale Elektronik Problem Schieberegister 595er ud 597er


von J. W. (ontheway)



Lesenswert?

Hallo,

ich wurschtel hier herum und irgendwie funktioniert es nicht. Ich möchte 
über SPI ein 595er und 597 benutzen. Angehangen der Schaltplan, wobei 
noch fehlt, dass alle Eingänge des 597er über 1k Ohm auf Masse liegen 
als pulldown.

Es funktioniert einwandfrei, bei der Schaltung den 595er zu steuern, da 
hängen getreiberte LEDs dran.

Wenn ich aber den Code ausführe, der vom 597er lesen soll, und das Datum 
an den 595er weitergibt, dann geht nix mehr. Die Idee ist simpel: Auf 
die Inputs des 597er Spannung legen, dann erwarte ich, dass dies 
weitergegeben wird an den 595 als Output.

Der Schaltplan sollte passen, ich benutze ein Pollin-Board, deshalb habe 
ich extra die Pinbelegungen des Atmega32 hinzugefügt.

Ich bin nicht erfahren im Debugging über Studio und Dragon, aber so wie 
es ausschaut, hängt sich der Debugger beim Input über den 597er fest...

Habt ihr nen Tipp?







Viele Grüße,

Jens

von Thomas E. (thomase)


Lesenswert?

Du hast keinen Takt zum Lesen. Entweder du schreibst sinnvolle Daten und 
liest gleichzeitig oder du gibst ein Dummybyte aus. Sonst kannst du bis 
in alle Ewigkeit warten.
1
uint8_t SPI_SlaveReceive(void)
2
{
3
  SPDR = 255;   // Dummybyte
4
  /* Wait for reception complete */
5
  while(!(SPSR & (1<<SPIF)))
6
  ;
7
  /* Return data register */
8
  return SPDR;
9
}


mfg.

von Karl H. (kbuchegg)


Lesenswert?

Thomas Eckmann schrieb:
> Du hast keinen Takt zum Lesen. Entweder du schreibst sinnvolle Daten und
> liest gleichzeitig


Das scheint überhaupt eines der größten Missverständnisse beim SPI zu 
sein.

SPI unterscheidet nur zwischen Master und Slave. Aber eigentlich sind 
Senden und Empfangen dasselbe. Denn SPI ist in Wirklichkeit ein 
Austausch von Bytes. Der Master übergibt 1 Byte auf der MOSI Leitung an 
den Slave und zur selben Zeit übergibt der Slave auf der MISO Leitung 1 
Byte an den Master.

Da der Master zu jedem Zeitpunkt die volle Kontrolle über die 
Taktleitung hat, kann ein Slave nur dann an den Master übertragen, wenn 
der Master den Vorgang anleiert und zu diesem Zwecke 1 Byte an den Slave 
übergibt. Der Slave kann von sich aus da überhaupt nichts tun.

D.h. die Funktionen

> uint8_t SPI_SlaveReceive(void)
und
> void SPI_MasterTransmitOut (uint8_t data) {

sind eigentlich dasselbe und können zu einer einzigen Funktion 
zusammengefasst werden, die 1 Byte austauscht.
1
uint8_t SPI_Exchange( uint8_t data )
2
{
3
  SPDR = data;
4
5
  while(!(SPSR & (1<<SPIF)))
6
  ;
7
8
  return SPDR;

Ja nachdem, woran man interessiert ist, benutzt man dann einfach den 
Returnwert nicht bzw. übergibt einfach irgendeinen Wert als 
data-Argument, weil man am Returnwert interessiert ist.

: Bearbeitet durch User
von J. W. (ontheway)


Angehängte Dateien:

Lesenswert?

Karl Heinz schrieb:
> Thomas Eckmann schrieb:
>> Du hast keinen Takt zum Lesen. Entweder du schreibst sinnvolle Daten und
>> liest gleichzeitig
>
>
> Das scheint überhaupt eines der größten Missverständnisse beim SPI zu
> sein.
>
>
Hallo Karl Heinz und Thomas,

vielen Dank! Ich möchte mich echt bedanken für dieses hervorragende 
Forum, macht Spaß!

Ja, das war mir absolut nicht bewusst!

Leider stehe ich immer noch auf dem Schlauch, angehangen der neue Code 
und ein Bild von meinem Oszi. Ich kann beliebige Werte an SPI_Exchange 
schreiben, genau diese werden auf den Leds angezeigt, also im 
Code-Beispiel die 233.
Der Austausch der Daten mit dem 597er funktioniert aber nicht. Mit 
meinem kleinen Oszi habe ich ein Bild vom Pin 14 des 597er aufgenommen, 
also der DS der auf MISO liegt. Die Spannung passt wohl kaum, um dem 
Atmega ein Signal zu geben!
Irgendwo muss die Spannung doch bleiben... habt ihr eine Idee?


Liebe Grüße,
Jens

von Bernhard S. (b_spitzer)


Lesenswert?

Zum Oszi-Bild: AC-Modus ist eingestellt, Tastkopf 1:10 verwendet bzw. 
konfiguriert?

von J. W. (ontheway)


Lesenswert?

Bernhard Spitzer schrieb:
> Zum Oszi-Bild: AC-Modus ist eingestellt, Tastkopf 1:10 verwendet bzw.
> konfiguriert?

Ja, ich checke jetzt noch mal die Hardware. Ich möchte mich hier nicht 
blamieren. Nicht, dass da irgendwo was nicht passt, danke aber. Wichtig 
wäre mir: Ist das Schaltbild okay? Das sollte eigentlich so sein.

LG,
Jens

von spess53 (Gast)


Lesenswert?

Hi

>Zum Oszi-Bild: AC-Modus ist eingestellt,

Dann stell mal auf DC.

MfG Spess

von Thomas E. (thomase)


Lesenswert?

J. W. schrieb:

> Leider stehe ich immer noch auf dem Schlauch, angehangen der neue Code
> und ein Bild von meinem Oszi. Ich kann beliebige Werte an SPI_Exchange
> schreiben, genau diese werden auf den Leds angezeigt, also im
> Code-Beispiel die 233.
1
    PORTC &= ~(1<<DD_SS_i); 
2
    PORTC |= (1<<DD_SS_i);
3
    PORTC &= ~(1<<DD_SS_i);
4
    PORTC |= (1<<DD_p597);
5
    PORTC &= ~(1<<DD_p597);
6
    PORTC |= (1<<DD_p597);

Ich steig durch deine Bezeichnungen zwar nicht durch, aber das sieht 
irgendwie falsch aus. Denn der Load muß bei PL = 0 und das Auslesen bei 
PL = 1 erfolgen.

PL(13) = 0
STCP(12) = 1   Lo..
STCP(12) = 0       ..ad
PL(13) = 1

SPDR = Daten oder Dummy
while(!(SPSR & (1 << SPIF)));
input = SPDR;

mfg.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Das hier
1
    //output verarbeiten
2
    PORTB &= ~(1<<DD_SS_o);
3
    PORTB |= (1<<DD_SS_o);
4
    PORTB &= ~(1<<DD_SS_o);
5
    dummy = SPI_Exchange(zahl); //return wert nicht wichtig
kann so nicht stimmen.

Denn um am 595 auszugeben musst du erst das Byte eintakten und erst dann 
einmal mit dem RCK des 595 wackeln, damit er es auf den Ausgang 
durchschaltet.

PS: wenn dich ein Returnwert nicht interessiert, dann brauchst du ihn 
auch nicht in einer Variablen auffangen
1
    //output verarbeiten
2
    SPI_Exchange(zahl);           // 595 laden
3
    PORTB &= ~(1<<DD_SS_o);       // und mittels RCK auf die Ausgänge durchschalten
4
    PORTB |= (1<<DD_SS_o);
5
    PORTB &= ~(1<<DD_SS_o);

: Bearbeitet durch User
von Mr. X (Gast)


Lesenswert?

J. W. schrieb:
> Wichtig wäre mir: Ist das Schaltbild okay?

Wenn man jetzt wüßte, was da für Signale auf J1 liegen (sollen), ohne 
erstmal tieferes Datenblatt- und Pinbelegungsstudium zu treiben und zu 
rätseln, auf welches Package du dich mit deinen Nummern beziehst ...

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.