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ß
wow eine Antwort:) Hallo Andreas, ich mein enablen tue ich ihn ja damit den ich den CSB auf Maße sprich auf Low setze. Richtig ?
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
Pandora Iii schrieb: > Wie steuerste du denn SEnsor an ? über einen AVR ? oder gar mit einem > LPC ??? CC2511
Rein interesse halber, könntest du mir grob beschreiben für was du den MEMS verwenden möchtest?
1 | The SCA100T Series is a 3D-MEMS-based dual axis inclinometer family that provides instrumentation grade |
2 | performance for leveling applications. |
Ja der SCA100TD02.
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.
1 | UINT8 SPIwrite(UINT8 adress, UINT8 data) |
2 | {
|
3 | UINT8 i; |
4 | UINT16 output=0, input=0; |
5 | output = (adress <<(10))+ data; //10 = 2+8 correct output |
6 | output |= 0x0200; //set write bit |
7 | |
8 | CSTILT = LOW; //CS to zero |
9 | SNOP(); //some nops for nicer timing |
10 | |
11 | for(i=0;i<16;i++) |
12 | {
|
13 | if (output&0x8000)MOSI = HIGH; //out data (MOSI) - set |
14 | else MOSI = LOW; //delete |
15 | output <<= 1; |
16 | SNOP(); //clk generation |
17 | SPICLK = HIGH; //rising edge of clk |
18 | SNOP(); |
19 | |
20 | if (MISO)input |= 0x0001; //in data (MISO) |
21 | else input &= ~0x0001; |
22 | input <<= 1; |
23 | SNOP(); //clk generation |
24 | SPICLK = LOW; //falling edge of clk |
25 | SNOP(); |
26 | }
|
27 | |
28 | SNOP(); |
29 | CSTILT = HIGH; //CS to one |
30 | input >>= 1; //correct shifting |
31 | return (UINT8)(input&0x00FF); //return only value (parity |
32 | } //and frame error doesnt matter) |
1 | //adresses vti and reads answear
|
2 | UINT8 SPIread(UINT8 adress) |
3 | {
|
4 | UINT8 i; |
5 | UINT16 output=0, input=0; |
6 | output = (adress <<(10))+ 0x00; //10 = 2+8 correct output |
7 | |
8 | CSTILT = LOW; //CS to zero |
9 | SNOP(); //some nops for nicer timing |
10 | |
11 | for(i=0;i<16;i++) |
12 | {
|
13 | if (output&0x8000)MOSI = HIGH; //out data (MOSI) - set |
14 | else MOSI = LOW; //delete |
15 | output <<= 1; |
16 | SNOP(); //clk generation |
17 | SPICLK = HIGH; //rising edge of clk |
18 | SNOP(); |
19 | |
20 | if (MISO)input |= 0x0001; //in data (MISO) |
21 | else input &= ~0x0001; |
22 | input <<= 1; |
23 | SNOP(); //clk generation |
24 | SPICLK = LOW; //falling edge of clk |
25 | SNOP(); |
26 | }
|
27 | |
28 | SNOP(); |
29 | CSTILT = HIGH; //CS to one |
30 | input >>= 1; //correct shifting |
31 | return (UINT8)(input&0x00FF); //return only value (parity |
32 | } //and frame error doesnt matter) |
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
Hallo. Pandora Iii schrieb: >>
1 | 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 ? 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 | void SPIwrite(UINT8 data) |
2 | {
|
3 | UINT8 i; // 8 Bit weil nur maximal 8 Bit gesendet werden |
4 | UINT8 output=0; |
5 | |
6 | output = data; |
7 | |
8 | CSTILT = LOW; //CS to zero |
9 | SNOP(); //<==== den Befehl musst du noch ändern |
10 | |
11 | for(i=0;i<8;i++) |
12 | {
|
13 | if (output&0x80)MOSI = HIGH; |
14 | else MOSI = LOW; |
15 | output <<= 1; |
16 | SNOP(); //<==== |
17 | SPICLK = HIGH; |
18 | SNOP(); //<=== |
19 | }
|
20 | |
21 | SNOP(); //<=== |
22 | CSTILT = HIGH; |
23 | |
24 | }
|
25 | |
26 | |
27 | UINT8 SPIread(void) |
28 | {
|
29 | UINT8 i; |
30 | UINT16 input=0; |
31 | |
32 | CSTILT = LOW; |
33 | SNOP(); |
34 | |
35 | for(i=0;i<16;i++) |
36 | {
|
37 | if (MISO)input |= 0x0001; |
38 | else input &= ~0x0001; |
39 | input <<= 1; |
40 | SNOP(); |
41 | SPICLK = LOW; |
42 | SNOP(); |
43 | }
|
44 | |
45 | SNOP(); |
46 | CSTILT = HIGH; |
47 | input >>= 1; |
48 | return (UINT8)(input&0x00FF); //Hier evtl. änderungen |
49 | }
|
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.