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.
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...
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?
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 :-)
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?
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?
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?
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.
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.
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?
> 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.
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.
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."
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.
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?
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.