Forum: Mikrocontroller und Digitale Elektronik SPI mit Beschleunigunssensor


von Dean Tschanz (Gast)


Angehängte Dateien:

Lesenswert?

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

von Pandur S. (jetztnicht)


Lesenswert?

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.

von Georg (Gast)


Lesenswert?

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

von Martin W. (martin-wi)


Lesenswert?

Ich bin auch der Meinung, dass für den Schlag der Messbereich von 16 g
zu gering ist.

von Wolfgang (Gast)


Lesenswert?

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?

von Wolfgang (Gast)


Lesenswert?

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?

von Volker S. (vloki)


Lesenswert?

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...

von Wolfgang (Gast)


Lesenswert?

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.

von Dean T. (Firma: FastLog) (deantschanz)


Lesenswert?

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);

von Pandur S. (jetztnicht)


Lesenswert?

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.

von Dean T. (Firma: FastLog) (deantschanz)


Lesenswert?

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.

von Volker S. (vloki)


Lesenswert?

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.

von Pandur S. (jetztnicht)


Lesenswert?

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

von Pandur S. (jetztnicht)


Lesenswert?

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
von Dean T. (Firma: FastLog) (deantschanz)


Lesenswert?

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?

von Pandur S. (jetztnicht)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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)

von Volker S. (vloki)


Lesenswert?

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
Noch kein Account? Hier anmelden.