Guten Tag die Damen und Herren,
habe jetzt lange genug probiert und ich suche mir jetzt Hilfe :)
Ich steuere den SCA100T-D02 mit SPI über einen LPC 936 an. Leider ist es
mir nicht wirklich gelungen von diesem Sensor eine Antwort zu bekommen.
Meiner Meinung nach ist mein Code auch in Ordnung.
Code ist im Anhang.
Datenblatt zu diesem Sensor auch im Anhang.
Nachdem ich Kontakt aufgenommen habe zu VTI , haben die mir noch mal ein
Datenblatt geschickt über SPI, aber leider für AVR .... auch im Anhang.
Habe meine Signale mit dem Oszi gemessen, SS, SCLK und MOSI sind top,
aber bekomme nichts rein. Im SPDAT ist immer ein 0xFF.....
Zunächst versuche ich erst das Temperaturregister auszulesen, aber
selbst dies klappt nicht....
Meine Vermutungen...
Delay Zeiten fehlen?
Muss ich den Sensor irgendwie noch mal enable?
Vielleicht hat irgendeiner mit dem Sensor schon Erfahrung gemacht, oder
weiss mir irgendwie zu helfen!
Wäre sehr genial !
Hoffe auf kompetente Hilfe !
Gruß
Arbeite unter anderem auch mit einem MEMS von VTI. Ist glaub ich ein
etwas anderer Typ. Aber der den ich verwende hat eine Art enable PIN.
Genaueres kann ich dir aber erst morgen sagen wenn ich wieder am
Arbeitsplatz bin.
Hi,
okay das wäre gut !
Also ist gibt keinen enable pin...
Wie steuerste du denn SEnsor an ? über einen AVR ? oder gar mit einem
LPC ???
Ich mein den AVR Code habe ich ja, aber den zu verstehen ist nicht so
einfach ...
Die Datei im Anhang ist der Code , einfach mit Acro REader öffnen
Die Schaltung und die Software ist von einem meiner Vorgänger. Ich
befasse mich momentan nur mit der Auswertung der Signale.
Pandora Iii schrieb:> ich mein enablen tue ich ihn ja damit den ich den CSB auf Maße sprich> auf Low setze.
Wenn du mit CSB den Chip-Select meinst müsste das richtig sein.
Ich melde mich morgen nochmal mit der Beschaltung und evtl mit ein
bisschen Code für den MEMS. Wenn ich mich richtig erinnere gibts da eine
Funktion InitMEMS(). Kann aber auch daran liegen das der Chip bei mir an
einer Software SPI hängt.
Beste Grüße
Zur Zeit mache ich meine Technikerarbeit, und brauch diesen Sensor für
eine Neigungsmesssung an meine Motorrad.
3D ?
Der Sensor miest ja in 2 Axen.. x und y .
Wenn du auf der Arbeit was findest was mir hilft, wäre super.
Steht ja da, ...bassiert auf einem 3D- microelectromechanical system
...
Beim SCA100TD02 wurde die dritte Achse hald einfach weggelassen oder
einfach nur nicht angeschlossen.
Hallo,
der von mir verwendete Typ ist SCA3000D1. Datenblatt gibts bei VTI.
Anbei zwei Funktionen um mit dem MEMS zu komunizieren. Delays sind dort
mit eingebaut. Hoffe das hilft dir.
Hi,
Vielen Dank für dein Nachschauen und den Beitrag.
Habe noch paar Fragen zu dem Code ...
Andreas G. schrieb:> UINT8 SPIwrite(UINT8 adress, UINT8 data) // Ist das einfach nur Deklarierung und
Inizialisierung Variablen oder eine Funktion? ist doch auch eine Funktion oder?
Wenn ja , was macht sie ?
> {> UINT8 i;> UINT16 output=0, input=0;> output = (adress <<(10))+ data; //10 = 2+8 correct output> output |= 0x0200; //set write bit>> CSTILT = LOW; //CS to zero> SNOP(); //Wie lange ist hier die Delay Zeit???//some nops for nicer timing>> for(i=0;i<16;i++)> {> if (output&0x8000)MOSI = HIGH; //out data (MOSI) - set> else MOSI = LOW; //delete> output <<= 1;> SNOP(); //clk generation> SPICLK = HIGH; //rising edge of clk> SNOP();>> if (MISO)input |= 0x0001; //in data (MISO)> else input &= ~0x0001;> input <<= 1;> SNOP(); //clk generation> SPICLK = LOW; //falling edge of clk> SNOP();> }>> SNOP();> CSTILT = HIGH; //CS to one> input >>= 1; //correct shifting> return (UINT8)(input&0x00FF); ???? //return only value (parity> } //and frame error doesnt matter)
Die Delay Zeiten sind denke mal immer so 1us? Wie machst du die ? Gibst
da bei Atmel oder sowas eine Funktion, bei dem LPC gibt es dann nicht,
denke ich muss das ausproiberen und da mit For schleifen arbeiten und
das mit dem Oszi anschauen!!!? oder?
Du machst das ja jetzt Bit weise, du überträgst jedes Bit einzeln und
setzt ganz genau das Timing. Ich habe das bisher nicht so gemacht, weil
auch aus dem einen Beispiel von meinem LPC das anders ist. Aber
vielleicht sollte ich das auch mal so machen.
Was mir noch aufgefallen ist, das du 2 Zylken hast, wenn du schaust bei
dem PDF von meine Sensor, auf Seite 11 ,bei Figure 10. Es ist ein
Zylkus. CS geht einmal runter, schickt den Command und dann wird dummy
wert gesendet und dabei ausgelesen.
Read temperature data register (RWTR) reads temperature data register
during normal
operation without affecting the operation. The temperature data register
is updated every 150 μs.
The load operation is disabled whenever the CSB signal is low, hence CSB
must stay high at least
150 μs prior to the RWTR command in order to guarantee correct data. The
data transfer is
presented in Figure 10 below. The data is transferred MSB first. In
normal operation, it does not
matter what data is written into temperature data register during the
RWTR command and hence
writing all zeros is recommended.
hence CSB must stay high at least
150 μs prior to the RWTR command in order to guarantee correct data. <<<
Ist denke auch ein wichtiger Punkt.
Werde mal versuchen ein neuen Code zuschreiben und dann noch mal zu
probieren...
Gruß
Daniel
> Ist das einfach nur Deklarierung und> Inizialisierung Variablen oder eine Funktion? ist doch auch eine Funktion oder?> Wenn ja , was macht sie ?
Funktion in der übersichtshalber die Datentypen der Variablen stehen.
Datentypen kannst natürlich auch weglassen da es sich nicht um den
Prototypen der Fuktion handelt.
>> SNOP(); //Wie lange ist hier die Delay Zeit???
Keine ahnung müsste ich mit dem Oszi ausmessen. Sind hald einfach ein
paar Taktzyklen.
>> return (UINT8)(input&0x00FF); ????
Der Rückgabewert wird maskiert und wird auf UINT8 gecastet.
Kurz: Überflüssige Bits wegschneiden.
> Die Delay Zeiten sind denke mal immer so 1us? Wie machst du die ? Gibst> da bei Atmel oder sowas eine Funktion, bei dem LPC gibt es dann nicht,> denke ich muss das ausproiberen und da mit For schleifen arbeiten und> das mit dem Oszi anschauen!!!? oder?
Atmel gibts mit Sicherheit eine odere sogar mehrere Funktionen. Vom LPC
hab ich keine Ahnung aber die gibts meiner Vermutung nach 100&ig.
Schau mal im Assembler für die µC Familie nach.
> Du machst das ja jetzt Bit weise, du überträgst jedes Bit einzeln und> setzt ganz genau das Timing. Ich habe das bisher nicht so gemacht, weil> auch aus dem einen Beispiel von meinem LPC das anders ist. Aber> vielleicht sollte ich das auch mal so machen.>> Was mir noch aufgefallen ist, das du 2 Zylken hast, wenn du schaust bei> dem PDF von meine Sensor, auf Seite 11 ,bei Figure 10. Es ist ein> Zylkus. CS geht einmal runter, schickt den Command und dann wird dummy> wert gesendet und dabei ausgelesen.
Versteh nicht was du damit meinst.
> 150 μs prior to the RWTR command in order to guarantee correct data. <<<> Ist denke auch ein wichtiger Punkt.
Ja
Um jetzt hier einen Vernünftige nAbschluss zu bekommen, fasse ich kurz
mal zusammen.
Im Code von mir ist SPI per Software realisiert. Das hat den Grund, dass
dein MEMS u. meiner mit mehr als 8 Bit auf eine Anfrage antworten. Die
SPI von meinem und wahrscheinlich auch deinem µC kann aber nur mit 8 Bit
arbeiten. Also ist der SPI-Bus von µC nicht bzw. nur über umwege
geeignet.
Den Code den ich dir gepostet hab kannst du fast komplett übernehmen. Du
musst nur die PINs für CLK, MISO, MOSI anpassen usw. Die defines für
LOW, HIGH usw. anpassen. Un den NOP Befehl für deinen µC rausfinden.
Dein MEMS ist etwas einfacher Aufgebaut. Er hat z.B. keine Register.
D.h, Code kann vereinfacht werden. Zum beachten ist noch MSB-Bit muss
bei den VTI ICs als erstes gesendet werden.
1
voidSPIwrite(UINT8data)
2
{
3
UINT8i;// 8 Bit weil nur maximal 8 Bit gesendet werden
Jetzt hast du zwei einfache Funktionen um mal ein bisschen zu testen.
Laut Datenblatt:
RWTR 00001000 Read and write temperature data register
Ein SPIwrite(0x08);
mit folgendem SPIread();
müsste dir nun Werte liefern.
Moiin,
also den Temperatur Wert auszulesen klappt jetzt, allerdings habe ich
eine Temperatur von 15 Grad....
Der Gibt mir den Wert 0xB5 was 181 ist , nach der Formal aus dem
Dattenblatt
(181-197)/ -1.083 = ergibt 14,77 Grad...
Habe hier in der Bude ca 20-23 grad denk ich mal. aber keine 15 grad....
KÖnnte man davon ausgehen das der Sensor defekt ist ?
Kann man den neu calibrieren?
gruß
Such mal im Datenblatt vom Sensor nach den Toleranzen.
Ich hab schon mit einem anderen Mems von VTI gearbeitet und bei dem sind
bei der Temperatur Toleranzen von +-20°C völlig normal.
Muss dann in software auf dem µC kalibriert werden.
UHH,
ich meine ich hätte was von plus minus 1 Grad gelesen. Aber ich guck
noch mal durch ! danke !
Aber kann es sein, das die Neigungswerte der Temp werte angepasst wird ?
Ich weiß jetzt nicht wie das bei diesem Sensor ist.
Kann sein das der Sensor intern diese Korrektur macht, kann aber auch
sein das du die Korrektur in software machen musst.
==> Datenblatt / Application Nodes