Guten Tag,
ich möchte den 12Bit 4-Kanal ADC MCP3204 (siehe Reichelt) über SPI mit
Hilfe eines ATXMegas256A3 an Port C auslesen. Prinzipiell möchte ich den
unten umgesetzten/gefundenen Code auf dem ATX umsetzen. Hierfür bietet
mir die Bibilothek von Atmel verschiedenste fertige Funktionen.
Runterladen kann man die Bibliothek unter:
http://www.atmel.com/devices/atxmega192a3.aspx?tab=documents Beispiel:
AVR1309
Zu Beginn geht es mir um den Befehl CS_LOW();, den es gilt mit einer
Bibliotheksfunktion zu ersetzen. Es soll der Slave-Select Kanal auf Null
gezogen werden, damit die Übertragung starten kann. Hierfür würde ich
gerne den angebotenen Befehl "SPI_MasterSSLow(spi->dataPacket->ssPort,
ssPinMask);" verwenden. Vielleicht hilft die Definition noch weiter:
#define SPI_MasterSSLow(_port, _pinBM) ( (_port)->OUTCLR = (_pinBM) )
Mir ist der Aufruf der Funktion nicht klar. Der Aufruf mit:
SPI_MasterSSLow(PORTC, 0b00001000); ergibt die Fehlermeldung: invalid
type of argument of '->' (have 'Port_t'). Irgendwie kriege ich nicht das
richtige Argument konstruiert für die Funktion. Eigentlich muss doch nur
der Port und eine Bitmaske übergeben werden oder nicht? Ich bin für
jeden Hinweis dankbar.
So ganz sicher bin ich mir da auch nicht, in der letzten Zeile bin ich
noch nicht so 100%ig angekommen ;). Mir ging es primär erst einmal um
den Programmablauf zum Auslesen des ADC über die Bibliotheksbefehle. Die
Bitmanipulation am Schluss würde ich dann debuggen, falls es überhaupt
falsch ist. Das kann man im laufenden Programm dann am besten
nachvollziehen glaube ich. Aber danke für den interssanten Hinweis,
eventuell hast Du mir viel Zeit bei der Fehlersuche am Schluss erspart.
Hallo G.G.,
danke für den Link, das hat schonmal viel zum Verständins beigetragen.
Wenn ich das richtig verstanden habe, so werden eigene Funktionen
geschrieben, um auf bestimmte Bausteine zuzugreifen, z.B. bei der
Übertragung der 24 Bit.
Ich würde gerne versuchen auf die vorgefertigten Funktionen von Atmel
zurückgreifen, bevor ich anfange alles selber zu programmieren. Die
ersten Schritte sind unten zu sehen.
Ich würde gerne über den Befehl SPI_MasterTransceiveByte ein Byte über
PIN5 MOSI ausgeben. Das scheint aber so noch nicht zu funktionieren.
Kann man hier einen offensichtlichen Fehlaufruf des Befehls erkennen?
Compilieren lässt sich das Programm soweit fehlerfrei. Oder ist es von
Vorteil eher alles selber zu programmieren?
HAHAHA, Moment, der Fühler des Oszis hatte sich leicht gelöst... es wird
en Byte übertragen. Tja, wieder mal ein zwei Stunden fehlersuche
umsonst... Ich werde bestimmt bald weitere Fragen zu diesem Thema haben
und dann auch in diesem Thread posten. Danke erstmal.
Die Kommunikation mit dem MCP3204 funkioniert soweit. Ich kann eine
analoge Spannung auf Kanal 0 geben und der Wert in der Testvariable
gintI variiert zwischen 0 und 4095, 12Bit halt. Das Auslesen des ADCs
läuft mit ca. 2,7kHz, das ist mir ein wenig zu langsam und ich hoffe es
gibt noch eine Menge Optimierungsbedarf/Möglichkeiten. Der komplette
Code ist unten gepostet.
Auf dem angehängten Bild ist gelb markiert die Masterclock zu sehen.
Diese läuft mit ca. 130kHz, gibt es eine Möglichkeit die noch zu
verschnellern? Dazwischen sind auch noch sehr lange Pausen,
wahrscheinlich durch meinen Code erzeugt. Ohne diese könnte man glaube
ich schon auf 5kHz Messzyklus kommen, wo ich hinmöchte. Ich kenne mich
nicht sehr gut aus mit dem SPI-Bus, aber komme ich hier schon annähernd
an das Maximum was möglich ist?
Ich bin für alle Optimierungshinweise dankbar!
Hinweis: Ändert man die Zeile im Code zu:
CLK.PSCTRL = (CLK_PSADIV_1_gc | CLK_PSBCDIV_1_1_gc); (alt)
CLK.PSCTRL = (CLK_PSADIV_2_gc | CLK_PSBCDIV_1_1_gc); (neu)
läufts nun mit ca. 200kHz. Beste Optimierung -O2 nicht vergessen.
Grüße,
Jan