Forum: Mikrocontroller und Digitale Elektronik Daten vom Max6675 über SPI am Master empfangen


von Max6675 (Gast)


Lesenswert?

Hallo,

ich versuche gerade die Temperatur eines Thermoelements über den Max6675 
(Slave)(SPI-Schnittstelle) auf dem atmega8 (Master) zu empfangen.
In vielen Beiträgen wird immer geschrieben, dass zuerst etwas vom Master 
an den Slave gesendet werden muss, bevor der Master etwas empfangen 
kann.
Jedoch besitzt der Max6675 keinen MOSI Anschluss, weshalb ich ziemlich 
überfragt bin, wie ich das programmieren soll.

Um die Daten lesen zu können, soll das ganze über USART an den PC 
gesendet werden.

Ich hoffe jemand kann mir weiter helfen!

Vielen Dank.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Weißt du, wie SPI funktioniert: das sind hintereinandergeschaltete 
Schieberegister. Dort das mittlere Bild:
http://www.lothar-miller.de/s9y/archives/15-SPI.html

Mit jedem Bit, das du sendest, empängst du auch eines. Denk mal zwei 
Minuten drüber nach, dann kommst du drauf, was du machen musst, wenn du 
etwas empfangen willst...

Beitrag #5448421 wurde von einem Moderator gelöscht.
von Max6675 (Gast)


Lesenswert?

Ich bin mir nicht sicher, ob ich das richtig verstanden habe.
Du schreibst in deinem Artikel, dass der Slave die gesendeten Daten über 
MOSI einfach ignorieren kann. Muss ich sie trotzdem senden oder können 
sie weggelassen werden?
Verstehe ich das richtig, dass die Bits einfach "weitergeschoben" werden 
müssen, um vom Slave zum Master zu gelangen?

von stm32 (Gast)


Lesenswert?

Hallo Max,
was Dir keiner der vorigen sagen will:
Die SPI-Schnittstelle in der üblichen Konfiguration in einem µC sendet 
automatisch (mit Clock und Darten), sobald man in das Senderegister 
reinschreibt. Gleichzeitig empfängt der Controller auf der MISO-Leitung.
Also ganz einfach: MISO und Clock anschliessen, irgendwas auf die 
Schittstelle schreiben und dann das SPI-Register auslesen. Voila :-)

von Einer K. (Gast)


Lesenswert?

Max6675 schrieb:
> Muss ich sie trotzdem senden oder können
> sie weggelassen werden?

Dir wurde schon gesagt, dass du dich über SPI kundig machen solltest!
Der Wikipedia Artikel ist da schon mal ein Anfang.


Oder anders rum gefragt:
Wie würdest du die SendeDaten weg lassen wollen?


Alternative Frage:
Wie kommst du auf die lustige Idee, dass das weg lassen einer 
Verbindung, Auswirkungen auf deine Programmierung haben MUSS?

von Max6675 (Gast)


Lesenswert?

stm32 schrieb:

> Die SPI-Schnittstelle in der üblichen Konfiguration in einem µC sendet
> automatisch (mit Clock und Darten), sobald man in das Senderegister
> reinschreibt. Gleichzeitig empfängt der Controller auf der MISO-Leitung.
> Also ganz einfach: MISO und Clock anschliessen, irgendwas auf die
> Schittstelle schreiben und dann das SPI-Register auslesen. Voila :-)

Das habe versucht..leider ohne Erfolg.
Ich bin mir allerdings nicht sicher, wie ich das SPI-Register auslesen 
kann.
Das müsste doch das SPDR Register sein oder? Wie sieht so ein Befehl 
aus?

von stm32 (Gast)


Lesenswert?

Max6675 schrieb:
> Das habe versucht..leider ohne Erfolg.
> Ich bin mir allerdings nicht sicher, wie ich das SPI-Register auslesen
> kann.
> Das müsste doch das SPDR Register sein oder? Wie sieht so ein Befehl
> aus?

Registername müsste stimmen, das hab ich jetzt auch nicht so im Kopf. 
Aber die Chipselectleitung bedienst Du?

von Einer K. (Gast)


Lesenswert?

Max6675 schrieb:
> Das habe versucht..leider ohne Erfolg.
> Ich bin mir allerdings nicht sicher, wie ich das SPI-Register auslesen
> kann.
> Das müsste doch das SPDR Register sein oder? Wie sieht so ein Befehl
> aus?

In deinem Datenblatt zu deinem µC findet sich ein ausführlichen Kapitel 
zur eingebauten SPI Hardware.

Im Datenblatt zum Sensor steht, wie man es ihm legen muss, damit er dich 
bedient.

Was verstehst du daran nicht, wenn du die beiden Datenblätter 
aufeinander legst?

Tipp:
/CS per Pullup hoch zu ziehen, ist meist eine gute Idee.
Dann kann der Sensor dir nicht bei der ICSP dazwischen quatschen.

von Max6675 (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> In deinem Datenblatt zu deinem µC findet sich ein ausführlichen Kapitel
> zur eingebauten SPI Hardware.
>
> Im Datenblatt zum Sensor steht, wie man es ihm legen muss, damit er dich
> bedient.
>
> Was verstehst du daran nicht, wenn du die beiden Datenblätter
> aufeinander legst?
>
> Tipp:
> /CS per Pullup hoch zu ziehen, ist meist eine gute Idee.
> Dann kann der Sensor dir nicht bei der ICSP dazwischen quatschen.

Genau die beiden Datenblätter habe ich kombiniert, jedoch kann ich auf 
der MISO-Leitung nichts erkennen, wenn ich es mit dem Oszi messe.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Max6675 schrieb:
> jedoch kann ich auf der MISO-Leitung nichts erkennen, wenn ich es mit
> dem Oszi messe.
Und was erkennst du währendessen an den anderen Leitungen der 
SPI-Schnitte?

von Olaf (Gast)


Lesenswert?

> Ich bin mir allerdings nicht sicher, wie ich das SPI-Register auslesen
> kann.

Hab ich doch gesagt. :-) Da fehlen einfach Grundlagen ueber Flipflops, 
Register, Takt usw...

SPI funktionioniert nur wenn man gleichzeitig mit demselben Takt etwas 
sendet und liesst. Deshalb musst du im Mikrocontroller immer etwas 
senden. Du veranlasst also den Mikrocontroller z.B 0x0000, 0x4711 oder 
0xDEAD zu senden.

Der MAX6675 ist nun so schrecklich doof das er gar nichts empfangen 
kann. Also verbindest du einfach den Datenausgang des Microcontroller 
nicht mit ihm.

Und weil der MAX so unglaublich doof ist sendet er bei jedem Byte was er 
nicht empfaengt einfach seine Daten. Er braucht also nur Clocks und CS.
Genauer gesagt sieht der MAX die fallende Flanke von CS als Befehl an 
den Messwert in sein Register zu kopieren und jedesmal wenn du dann mit 
CLK rumwedelst kommt ein Bit raus.

Und weil die Daten die der Microcontroller sendet gar nicht gebraucht 
werden, ausser fuer seine interne Statemachine, kannst du vielleicht 
sogar den Ausgangsport nicht fuer SPI konfigurieren und anderweitig 
verwenden. (haengt vom Controller ab)

Wenn du etwas lernen willst dann programmiere SPI einfach mal von Hand. 
Also mit Portleitungen rumwackeln. Das ganze machst du total langsam und 
haengst ein paar Led an die drei Leitungen. Dann siehst du was passiert.

von Max6675 (Gast)


Angehängte Dateien:

Lesenswert?

Lothar M. schrieb:

> Und was erkennst du währendessen an den anderen Leitungen der
> SPI-Schnitte?

Gerade merkwürdigerweise nicht sinnvolles. Gestern erhielt ich das Bild 
im Anhang.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Max6675 schrieb:
> Gestern erhielt ich das Bild im Anhang.
Was ist da zu sehen? Der Takt und ...?

von Max6675 (Gast)


Lesenswert?

Lothar M. schrieb:

> Was ist da zu sehen? Der Takt und ...?

Oh entschuldigt. Das habe ich vergessen dazu zuschreiben.
Rot: SCK
Blau: /CS

von Einer K. (Gast)


Lesenswert?

Max6675 schrieb:
> Gerade merkwürdigerweise nicht sinnvolles.

Es ist eine gute Idee, den Code geheim zu halten.

Warum?

Das bringt die besondere Würze in die Diskussion, weil alle frustriert 
sind.
Die Helfer, weil sie keine Chance bekommen, und der Fragesteller, weil 
er keine brauchbare Antwort bekommt, außer: "Du machst was falsch!"
Und: "Mache dich selber kundig! Du Geheimniskrämer."

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Max6675 schrieb:
> Oh entschuldigt. Das habe ich vergessen dazu zuschreiben. Rot: SCK
> Blau: /CS
Dan passt es. Da wird dann schon was zurückkommen...

von Max6675 (Gast)


Angehängte Dateien:

Lesenswert?

Arduino Fanboy D. schrieb:

> Es ist eine gute Idee, den Code geheim zu halten.

Hier nun mein Code für die SPI-Schnittstelle.
Vielleicht kann mir ja jemand so helfen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Max6675 schrieb:
> mein Code
Bitte in *.c anhängen. Dann gibts Syntax-Highlighting gratis...

von Max6675 (Gast)


Angehängte Dateien:

Lesenswert?

Lothar M. schrieb:
> Max6675 schrieb:
>> mein Code
> Bitte in *.c anhängen. Dann gibts Syntax-Highlighting gratis...

Bitteschön :)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Du könntest da was abkürzen:
1
char SPI_MasterTransmitAndReceive (char cdata)
2
{     PORTB &= ~(1<<DD_SS);
3
  _delay_ms(1);
4
  PORTB &= ~(1<<CS);
5
  
6
  // Start transmission
7
  SPDR = cdata;
8
  
9
  // Wait for transmission complete
10
  while(!(SPSR & (1<<SPIF)));
11
  
12
  PORTB |= (1<<DD_SS);
13
  PORTB |= (1<<CS);
14
//}
15
//
16
//char SPI_MasterReceive(void)
17
//{
18
//  /* Wait for reception complete */
19
//  while(!(SPSR & (1<<SPIF)))
20
//  ;
21
  /* Return data register */
22
  return SPDR;
23
:
24
:
25
:
26
    result = SPI_MasterTransmitAndReceive(0x03);
27
:
28
}

: Bearbeitet durch Moderator
von Max6675 (Gast)


Lesenswert?

Lothar M. schrieb:
> Du könntest da was abkürzen:char SPI_MasterTransmitAndReceive

Super Danke!
Spielt es eine Rolle, welche Hex-Zahl ich in die Klammern schreibe?
und sieht der Code ansonsten Ok aus?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Max6675 schrieb:
> Spielt es eine Rolle, welche Hex-Zahl ich in die Klammern schreibe?
Nein, der MOSI Pin wird ja eh' nicht angeschlossen...

> und sieht der Code ansonsten Ok aus?
Das was du mit dem Oszi misst, muss eben zum Datenblatt passen. 
Diesbezüglich musst du jetzt also pro Aktivieren (= low setzen) des 
Chip-Selects 2 Bytes (16 Bits) absenden und 2 Bytes einlesen. Das tut 
dein Code derzeit noch nicht, denn du brichst nach der Hälfte des 
Protokolls (8 Bits) die Übertragung ab.

: Bearbeitet durch Moderator
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.