Guten Tag, Ich habe ein Projekt begonnen wobei es darum geht, dass eine Plastik Figur geschlagen wird und je nach dem wie hart diese geschlagen wird, gibt ein Speaker andere Ausdrücke aus. Beschreibung zum Problem: Ich will das ganze mit einem Beschleunigungssensor und SPI realisieren. Dazu habe ich bereits zwei Leiterplatten welche mit einem Flachbandkabel verbunden sind. Auf der Hauptplatine ist ein PIC16F1787 und ein Header worauf ich SPI verbunden habe (natürlich noch weiter Bauteile). Auf der Messplatine ist wie gesagt ein Beschleunigungssensor und wiederum ein Header worauf ich SPI gezogen habe. Jetzt versuche ich schon eine Weile das Signal richtig zu übertragen. Ich habe leider nur wenig SPI Vorkenntnisse und das Datenblatt des Sensors hilft mir auch nicht gerade weiter. Das Ziel ist: Ich möchte auf einem LCD Display den einen Wert zwischen 1 und 8 (1 schwache Bewegung, 8 sehr starke Bewegung) ausgeben. Ps: Schemaauszüge sind im Anhang. Ich wäre sehr dankbar wenn mir jemand dabei helfen könnte. Für Fragen oder Unklarheiten einfach fragen. Datenblatt Beschleunigunssensor : http://www.mouser.com/ds/2/609/ADXL345-879145.pdf Datenblatt Mikrocontroller: http://www.mouser.com/ds/2/268/40001637C-1066570.pdf
Das Datenblatt des Sensors hast du gelesen und verstanden ? Also musst du einfach mal diese Signal so bringen. Allenfalls benoetigst du dazu ein Oszilloskop. Ich wuerd's zu Beginn ohne die SPI funktionalitaet des Controllers machen, erst mal nur mit Portpins hoch-tief setzen. Die SPI funktinalitaet, die automatisieren kann kommt spaeter, wenn's man's begriffen hat.
Dean Tschanz schrieb: > je nach dem wie hart diese geschlagen wird Die Frage ist, willst du den Schlag messen oder die Bewegung der Figur danach? Für den Schlag ist nach meinem Gefühl der Messbereich von 16 g zu gering. Georg
Ich bin auch der Meinung, dass für den Schlag der Messbereich von 16 g zu gering ist.
Martin W. schrieb: > Ich bin auch der Meinung, dass für den Schlag der Messbereich von 16 g > zu gering ist. Das kommt doch völlig drauf an, wie hart das Plastik ist, d.h. in welcher Zeit der Impuls übertragen wird. Dean Tschanz schrieb: > Jetzt versuche ich schon eine Weile das Signal richtig zu übertragen. > Ich habe leider nur wenig SPI Vorkenntnisse und das Datenblatt des > Sensors hilft mir auch nicht gerade weiter. Verstehst du das Datenblatt nicht, oder tust du dich beim Programmieren schwer? Gibt es für den Pic keine Community und keine Bibliotheken, wie für die AVRs mit Arduino?
Georg schrieb: > Die Frage ist, willst du den Schlag messen oder die Bewegung der Figur > danach? Wie willst du mit einem Bescheunigungssensor die (gleichförmige) Bewegung nach dem Schlag messen?
Wolfgang schrieb: > Gibt es für den Pic keine Community und keine Bibliotheken, wie > für die AVRs mit Arduino? Es gibt fast für alles Bibliotheken und auch Communities mit mehr oder weniger vielen Ahnungslosen ;-) Dean Tschanz schrieb: > Jetzt versuche ich schon eine Weile das Signal richtig zu übertragen... Dann zeig doch mal und versuche zu beschreiben, was dabei rauskommt...
Volker S. schrieb: > Es gibt fast für alles Bibliotheken und auch Communities mit mehr oder > weniger vielen Ahnungslosen ;-) Für den ADXL345 gibt es doch nun wirklich genug Beispiele im Netz, aber es gibt natürlich auch fast beliebig viele exotische Programmiersprachen.
So Guten Morgen allerseits, Georg schrieb: > Die Frage ist, willst du den Schlag messen oder die Bewegung der Figur > danach? Für den Schlag ist nach meinem Gefühl der Messbereich von 16 g > zu gering. Ich will die Bewegung der Figur messen und nicht die Schlagkraft. Wolfgang schrieb: > Verstehst du das Datenblatt nicht, oder tust du dich beim Programmieren > schwer? Es geht darum das ich nicht verstehe was ich dem Sensor schicken muss, damit dieser mir einen Wert zurück gibt. Also fällt mir beides schwer. Wolfgang schrieb: > Gibt es für den Pic keine Community und keine Bibliotheken, wie > für die AVRs mit Arduino? Communitys habe ich leider keine zu dem Pic gefunden, da dieser schon etwas älter ist. Ich habe aber mit einem Codeconfigurator eine SPI Biblithek erstellt. Wolfgang schrieb: > Wie willst du mit einem Bescheunigungssensor die (gleichförmige) > Bewegung nach dem Schlag messen? Ja, so in etwa. Ich will einfach unterscheiden, wie schnell sich die Figur bewegt hat. Volker S. schrieb: > Dann zeig doch mal und versuche zu beschreiben, was dabei rauskommt... Also, ich programmiere das ganze in MPLAP X IDE v3.35. Meine SPI Bibliothek:
1 | /**
|
2 | MSSP Generated Driver File
|
3 | |
4 | @Company
|
5 | Microchip Technology Inc.
|
6 | |
7 | @File Name
|
8 | spi.c
|
9 | |
10 | @Summary
|
11 | This is the generated driver implementation file for the MSSP driver using MPLAB(c) Code Configurator
|
12 | |
13 | @Description
|
14 | This source file provides APIs for MSSP.
|
15 | Generation Information :
|
16 | Product Revision : MPLAB(c) Code Configurator - 4.15
|
17 | Device : PIC16F1787
|
18 | Driver Version : 2.00
|
19 | The generated drivers are tested against the following:
|
20 | Compiler : XC8 1.35
|
21 | MPLAB : MPLAB X 3.40
|
22 | */
|
23 | |
24 | /*
|
25 | (c) 2016 Microchip Technology Inc. and its subsidiaries. You may use this
|
26 | software and any derivatives exclusively with Microchip products.
|
27 | |
28 | THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
|
29 | EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED
|
30 | WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A
|
31 | PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION
|
32 | WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION.
|
33 | |
34 | IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
|
35 | INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
|
36 | WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS
|
37 | BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE
|
38 | FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN
|
39 | ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
40 | THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
41 | |
42 | MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE
|
43 | TERMS.
|
44 | */
|
45 | |
46 | /**
|
47 | Section: Included Files
|
48 | */
|
49 | |
50 | #include <xc.h> |
51 | #include "../Include/spi.h" |
52 | |
53 | /**
|
54 | Section: Macro Declarations
|
55 | */
|
56 | |
57 | #define SPI_RX_IN_PROGRESS 0x0
|
58 | |
59 | /**
|
60 | Section: Module APIs
|
61 | */
|
62 | |
63 | void SPI_Initialize(void) |
64 | {
|
65 | // Set the SPI module to the options selected in the User Interface
|
66 | |
67 | // R_nW write_noTX; P stopbit_notdetected; S startbit_notdetected; BF RCinprocess_TXcomplete; SMP Middle; UA dontupdate; CKE Idle to Active; D_nA lastbyte_address;
|
68 | SSP1STAT = 0x00; |
69 | |
70 | // SSPEN enabled; WCOL no_collision; CKP Idle:Low, Active:High; SSPM FOSC/4; SSPOV no_overflow;
|
71 | SSP1CON1 = 0x20; |
72 | |
73 | // SSP1ADD 0;
|
74 | SSP1ADD = 0x00; |
75 | |
76 | }
|
77 | |
78 | uint8_t SPI_Exchange8bit(uint8_t data) |
79 | {
|
80 | // Clear the Write Collision flag, to allow writing
|
81 | SSP1CON1bits.WCOL = 0; |
82 | |
83 | SSPBUF = data; |
84 | |
85 | while(SSP1STATbits.BF == SPI_RX_IN_PROGRESS) |
86 | {
|
87 | }
|
88 | |
89 | return (SSPBUF); |
90 | }
|
91 | |
92 | uint8_t SPI_Exchange8bitBuffer(uint8_t *dataIn, uint8_t bufLen, uint8_t *dataOut) |
93 | {
|
94 | uint8_t bytesWritten = 0; |
95 | |
96 | if(bufLen != 0) |
97 | {
|
98 | if(dataIn != NULL) |
99 | {
|
100 | while(bytesWritten < bufLen) |
101 | {
|
102 | if(dataOut == NULL) |
103 | {
|
104 | SPI_Exchange8bit(dataIn[bytesWritten]); |
105 | }
|
106 | else
|
107 | {
|
108 | dataOut[bytesWritten] = SPI_Exchange8bit(dataIn[bytesWritten]); |
109 | }
|
110 | |
111 | bytesWritten++; |
112 | }
|
113 | }
|
114 | else
|
115 | {
|
116 | if(dataOut != NULL) |
117 | {
|
118 | while(bytesWritten < bufLen ) |
119 | {
|
120 | dataOut[bytesWritten] = SPI_Exchange8bit(DUMMY_DATA); |
121 | |
122 | bytesWritten++; |
123 | }
|
124 | }
|
125 | }
|
126 | }
|
127 | |
128 | return bytesWritten; |
129 | }
|
130 | |
131 | bool SPI_IsBufferFull(void) |
132 | {
|
133 | return (SSP1STATbits.BF); |
134 | }
|
135 | |
136 | bool SPI_HasWriteCollisionOccured(void) |
137 | {
|
138 | return (SSP1CON1bits.WCOL); |
139 | }
|
140 | |
141 | void SPI_ClearWriteCollisionStatus(void) |
142 | {
|
143 | SSP1CON1bits.WCOL = 0; |
144 | }
|
145 | /**
|
146 | End of File
|
147 | */
|
Und mein Bisheriger Versuch :
1 | uint8_t sensor = 0; |
2 | SPI_Exchange8bit(0b10110110); |
3 | __delay_ms(10); |
4 | sensor = SPI_Exchange8bit(0b10110110); |
5 | printf("Bewegung :%u", sensor); |
Ein Beschleunigungssensor misst die Beschleunigung, und nicht die Geschwindigkeit. Die Beschleunigung aufzuintegrieren ist nicht wirklich trivial. Auch ein Frage des Sampleintervalls. Zum Code. Ich hab's zuwenig betrachtet um zu sehen, ob's fuer das SPI Interface reicht. Der Chip scheint etwas mehr zu wollen. Der hat Duzende von Registern. Mindestens ein paar wird man initialisieren wollen. Wie soll der Sensorchip initialisiert werden ? Was ich sehe ist etwas HAL.
Sapperlot W. schrieb: > Ein Beschleunigungssensor misst die Beschleunigung, und nicht die > Geschwindigkeit. Die Beschleunigung aufzuintegrieren ist nicht wirklich > trivial. Auch ein Frage des Sampleintervalls. > > Zum Code. Ich hab's zuwenig betrachtet um zu sehen, ob's fuer das SPI > Interface reicht. Der Chip scheint etwas mehr zu wollen. Der hat Duzende > von Registern. Mindestens ein paar wird man initialisieren wollen. Wie > soll der Sensorchip initialisiert werden ? > > Was ich sehe ist etwas HAL. Wie gesagt habe ich nur wenig SPI Vorkenntnisse und wäre dankbar wenn mir jemand bei der Initialisierung/Ansteuerung helfen könnte.
Dean T. schrieb: > Communitys habe ich leider keine zu dem Pic gefunden, da dieser schon > etwas älter ist. Ich habe aber mit einem Codeconfigurator eine SPI > Biblithek erstellt Nur die neueren PICs sind im MCC implementiert ;-) Warum nimmst du nicht die von AD angebotene und im Datenblatt des Sensors verlinkte Bibliothek. https://wiki.analog.com/resources/tools-software/uc-drivers/microchip/adxl345#supported_devices So wie ich das sehe, brauchst du dann nur drei Funktionen SPI_Init(), SPI_Write() und SPI_Read() bereit zu stellen und kannst alle Funktionen benutzen. Die Beispiele sind zwar nicht für PIC16, aber das sollte eigentlich kein riesiges Problem sein. Du müsstest den Inhalt der Funktionen in Communication.c und die GPIO Definitions im Header anpassen.
Ja, steht im Manual, ab Seite 16. Wie man die Befehle rueberschiebt ist das Sache des SPI. Welche Register des Sensors muessen wie initialisiert werden ? Geh mal durch die Liste durch und ueberlege dir was noetig ist. Selftest p16 Register p23 Application p28 Formats p32
Allenfalls weicht das Analog Devices Timing etwas vom vorgegebenen SPI Timing des Controllers ab... Daher bitte die Timings vorher genau anhand der Datenblaetter studieren und allenfalls einen Tag oder so sparen. Dieses scheint zu passen.
:
Bearbeitet durch User
Ich habe das Gefühl die meisten hier denken, dass ich bereits eine Datenübertragung via SPI hergestellt habe, aber diese nicht richtig funktioniert. Aber das habe ich nicht. Mein Problem ist, dass ich überhaupt keine Verbindung herstelle kann. Ich kann keine Daten übertragen. Kennt sich hier jemand mit MPLAB und dem dazugehörigen Codeconfigurator aus?
Nein.. Die Datenuebertragung ist eine Sache, und was zu uebertragen ist die andere Sache. Beides ist interessant zu tun. Das doofe ist, dass Etwas zu senden ist mit dem Oszilloskop ueberpruefbar. Es kommt aber nichts zurueck .. ausser man sendet das Richtige. Deswegen muss man erst mal durch die Materie duch, was denn zu kommunizieren ist. Und wenn du glaubst sicher zu sein, was denn zu kommunizieren ist, kannst du das auch probieren. Das wirst du auch mit dem Oszilloskop verifizieren muessen. Und erst dann machen die Daten einen Sinn. Irgendwas wirst du dann noch mit den erhaltenen Daten anstellen muessen.
Sapperlot W. schrieb: > Das doofe ist, dass Etwas zu senden ist mit dem Oszilloskop ueberpruefbar. > ... > dem Oszilloskop verifizieren muessen. Ein Oszilloskop ist dafür nur bedingt das passende Werkzeug. Viel nützlicher wäre ein kleiner Logikanalysator, mit dem man nicht nur die Signale sehen, sondern auch gleich dekodieren kann - und das minutenlang. So ein Ding gibt es, im Gegensatz zu einem Oszilloskop, für wenige Euro. (bspw. ebay 201541710029)
Dean T. schrieb: > Mein Problem ist, dass ich überhaupt keine Verbindung herstelle kann. > Ich kann keine Daten übertragen. Kennt sich hier jemand mit MPLAB und > dem dazugehörigen Codeconfigurator aus? Ich glaube, dein Hauptproblem ist nicht die IDE. Du musst zuerst wenigstens die die Grundlegende Funktionsweise des SPI verstanden haben. Ich sehe z.B. kein CS Signal in deinem Code. SPI ist nun wirklich keine Raketenwissenschaft und es gibt genügend Info im Netz. Dann holst du dir den Beispielcode von AD und versucht mit dem Datenblatt des Sensors zu verstehen, warum....
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.