Guten Abend,
ich wende mich mit zwei Fragen an euch.
Im Moment experimentiere ich mit dem ATmega1284p herum. Nun möchte ich
einen ADS7816p via SPI anbinden.
Erste Frage:
Soweit ich SPI verstanden habe, kann man an einen Master-Mikrochip
mehrere Slave-Mikrochips hängen. Neben dem normalen SS-Pin (bei mir
PORTB4) brauche dafür doch eigentlich nur weitere Pins dafür
bereitstellen.
Im Moment hängt eine 7-Segmen-Anzeige (MAX7219) an meinem ATmega. Die
funktioniert auch über die Standard-SPI-Schnittstelle. Jetzt habe ich
mal versucht, die Schnittstelle statt mit PORTB4 mit PORTB0 umzusetzen.
Leider hat es nicht geklappt. Habe ich da zu einfach gedacht?
Zweite Frage:
Da ich mit dem ADS7816p einen zweiten SLAVE hätte, müsste ich die
SPI-Schnittstelle ja anders intilisiieren. Leider stehe ich, was die
Kommunikation mit dem ADS7816p angeht gerade wie der Ochse vor dem Berg.
Meine SPI-Initialisierung:
Hallo Tom M.,
für den ADS7816p gibt es doch ein Timing und die Angabe der zu lesenden
Bits. Alles schön in Bildern gefasst.
Daran musst Du dich halten und nicht nur 8 Bit aus dem Datensalat
nehmen.
Ok?
Tom M. schrieb:> Soweit ich SPI verstanden habe, kann man an einen Master-Mikrochip> mehrere Slave-Mikrochips hängen. Neben dem normalen SS-Pin (bei mir> PORTB4) brauche dafür doch eigentlich nur weitere Pins dafür> bereitstellen.
Nein. Du musst sie natürlich auch entsprechend steuern.
> Im Moment hängt eine 7-Segmen-Anzeige (MAX7219) an meinem ATmega. Die> funktioniert auch über die Standard-SPI-Schnittstelle. Jetzt habe ich> mal versucht, die Schnittstelle statt mit PORTB4 mit PORTB0 umzusetzen.> Leider hat es nicht geklappt. Habe ich da zu einfach gedacht?
Irgendeinen anderen Pin "statt" des designierten SS-Pin zu verwenden,
geht nur eingeschränkt. Dieser Pin muss trotzdem entweder auf Ausgang
konfiguriert werden oder, wenn man ihn als Eingang konfiguriert, muss
zumindest von außen dauerhaft High anliegen.
Und natürlich musst du nun den alternative SS-Pin zusätzlich
konfigurieren und auch benutzen, um den Slave anzusprechen. Dieser Teil
kommt in deinem Programm überhaupt nicht vor, was soll der Unsinn, Code
zu posten, in dem genau der Teil nicht vorkommt, in dem offensichtlich
das Problem stecken muss?
> Da ich mit dem ADS7816p einen zweiten SLAVE hätte, müsste ich die> SPI-Schnittstelle ja anders intilisiieren.
Sagt wer? Solange beide Slaves den gleichen SPI-Modus verwenden,
brauchst du an der SPI-Schnittstelle selber überhaupt nichts anders zu
initialisieren, sondern immer nur lustig im richtigen Moment mit dem
richtigen SS-Pin wackeln, nämlich mit dem, an dem der Slave hängt, mit
dem du gerade reden willst.
Aber ob es eine gute Idee ist, Display und AD-Wandler an den gleichen
SPI-Bus zu hängen, würde ich nach Lektüre des DB des ADS7816 sowieso mal
bezweifeln.
Karl M. schrieb:> für den ADS7816p gibt es doch ein Timing und die Angabe der zu lesenden> Bits. Alles schön in Bildern gefasst.
Wo? Jedenfalls nicht im Datenblatt von TI. Das Thema SPI-Timing ist da
alles andere als erschöpfend behandelt.
Das SPI-SS auf einen anderen Pin zu legen habe ich mittlerweile
hinbekommen.
Wenn ich nun für meinen ADS7816 das Arduino-Beispiel nehme, dann muss
ich den DOUT-Pin des ADS7816 an den MISO-Pin meines ATmegas hängen und
das via SPI auslesen oder?
Hallo Tom M. ,
SPI ist nicht geeignet, schau dir bitte das Diagramm der
Datenübertragung des ADS7816p an.
http://www.ti.com/lit/ds/symlink/ads7816.pdf
/FIGURE 1. ADS7816 Basic Timing Diagrams/
Seite 9
Ich würde mir eine Klasse ADS7816 schreiben und die 3 Pins frei
definieren.
Man setzt CS auf 1, taktet DCLK x2, man er liest das Startbit = 0 - 1->0
Wechesl - und danach taktet man DCLK x12 und liest jeweils MSB-LSB D11
bis D0 aus. CS geht wieder auf 0.
Das in groben.
Karl M. schrieb:> http://www.ti.com/lit/ds/symlink/ads7816.pdf
Aha, cool, es gibt also auch ein vollständiges Datenblatt. Damit kann
man schon eher was anfangen.
> SPI ist nicht geeignet, schau dir bitte das Diagramm der> Datenübertragung des ADS7816p an.
Also ich lese da eher heraus, dass das wunderbar gehen müsste.
Schlimmstenfalls müßte das gelesene Ergebnis um ein Bit nach rechts
geschoben werden (wenn man SPI-Mode0 verwendet). Das sind zwei Takte
Rechenaufwand für einen AVR, fällt also überhaupt nicht in's Gewicht.
Und vermutlich liesse sich auch das noch einsparen, indem man SPI-Mode3
verwendet, dann müssten die Bits eigentlich sogar passend aligned im
Schieberegister landen. Wäre auszuprobieren, ob das tatsächlich geht.
Also ich habe es fürs Erste so hinbekommen, vielen Dank. Also ich habe
ja quasi meine eigene Schnittstelle geschaffen. Theoretisch könnte ich
so weitere ADS7816P an meinem ATmega betreiben. In kommenden Schritten
werde ich vielleicht mal versuchen den ADS übde die SPI laufen zu
lassen, wie c-hater es anführt. Laufen andere ADS über SPI oder brauchen
die auch ihre eigene Schnittstelle?
Nachtrag:
Ich muss die for-Schleife von 12 bis 0, statt von 11 bis 0 laufen
lassen. Weiß jemand warum?