Verzögerungsproblem MEMS Accelerometer

Gast #2846215
Lesenswert?

Hi,

ich lese per SPI ein MEMS Accelerometer aus und sende im Anschluss die 
Daten per UART.

Das hat bis jetzt alles bestens geklappt.

Jetzt wollte ich gern zum Stromsparen den Sensor nach 10000Werten die 
Möglichkeit geben sich schlafen zu legen geben, falls er nicht mehr 
angeregt wird.

Leider verlangsamt sich dadurch mein Programm total.
Die Sensorwerte werden überschrieben.
Das weiß ich daher, da er in die if() mit den 2000ms delay reinspringt.

Verliere ich durch die if(zaehler == 1) am Anfang denn soviel Zeit?
Wie könnte man das Programm sonst noch schreiben?
Angehängte Dateien:
#2847162
Lesenswert?

Wenn du noch kein Oszi hast wird es höchste Zeit. Sonst wirst du ständig 
an solchen Problemen hängen bleiben.

Naja, also zum Thema. Man sieht leider die Definition und Deklaration 
deiner Variablen im code nicht. Außerdem musst du mal den Typ deines 
Sensors rüberwachsen lassen.

Außerdem wird das Warten auf neue Daten nur ein mal klappen. Danch hat 
status_reg bereits vor dem erneuten einlesen innerhalb der Schleifen den 
passenden Wert. Das wird auch der Grund sein, waum der 2s delay jedes 
mal ausgeführt wird.

Thor
Gast #2847268
Lesenswert?

Alex S. schrieb:

> Naja, also zum Thema. Man sieht leider die Definition und Deklaration
> deiner Variablen im code nicht. Außerdem musst du mal den Typ deines
> Sensors rüberwachsen lassen.
>
> Außerdem wird das Warten auf neue Daten nur ein mal klappen. Danch hat
> status_reg bereits vor dem erneuten einlesen innerhalb der Schleifen den
> passenden Wert. Das wird auch der Grund sein, waum der 2s delay jedes
> mal ausgeführt wird.
>
> Thor


Es handelt sich um folgenden Sensor:
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/APPLICATION_NOTE/CD00229883.pdf

Hab jetzt die vollständige main() und die wakeup_init beigefügt.

Die anderen Funktionen nicht, da ich weiss das sie einwandfrei 
funktionieren.(Kumpel der Ahnung hat, hatte schon kontrolliert).
Ausserdem hab ich schon getestet und es läuft Fehlerfrei.

Wie schon gesagt. Es läuft alles ohne die wakeup Sensor Geschichte.
Angehängte Dateien:
#2847412
Lesenswert?

Ich meinte das ernst. Das Warten auf ZYXDA wird nur beim ersten mal 
klappen. Danach ändert sich status_reg nicht mehr und die Warteschleife 
wird beim nächsten mal sofort abgebrochen. Mir ist nicht so ganz klar 
warum du bei einem overrun von Z 2s wartes aber ich würde fast vermuten, 
dass das deine Verzögerung verursacht.

Thor
Gast #2847416
Lesenswert?

Du hast recht.

Der overrun verursacht die Verzögerung.
Ohne das wakeup feature habe ich keinen overrun und somit auch keine 
Verzögerung.

Warum kommt es zu einem overrun?

Ich habe die 2s eingebaut um zu sehn, dass ich einen overrun habe.
Ich schaue mir die Uart daten mit einem Terminalprogramm an.
Gast #2847448
Lesenswert?

Alex S. schrieb:
> Ich meinte das ernst. Das Warten auf ZYXDA wird nur beim ersten mal
> klappen. Danach ändert sich status_reg nicht mehr und die Warteschleife
> wird beim nächsten mal sofort abgebrochen.

Ich frage nur ZDA ab, welcher jedesmal nach dem lesen von OutZ 
zurückgesetzt wird.
Gast #2847480
Lesenswert?

Vielleicht wäre es sinnvoll diesen Teil:
1
while( !(status_reg & 0x08) ){
2
   status_reg = SPI_MasterRead(STATUS_REG);
3
}

besser so zu schreiben:
1
do {
2
   status_reg = SPI_MasterRead(STATUS_REG);
3
} while( !(status_reg & 0x08) );

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren