Forum: Mikrocontroller und Digitale Elektronik Verzögerungsproblem MEMS Accelerometer


von tomaz (Gast)


Angehängte Dateien:

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?

von Alex S. (thor368)


Lesenswert?

Tach tomaz,

wähle mal irgend einen freien Pin als debugpin. Setze ihn dann vor dem 
Eintritt in eine Funktion auf hi und danach wieder auf low. Mit ein 
bischen ausprobieren kannst du so raus finden welcher Teil deines 
Programms wie viel Zeit benötigt.

Thor

von tomaz (Gast)


Lesenswert?

Habe leider kein Oszi.

von tomaz (Gast)


Lesenswert?

Vielleicht noch eine Alternative?

von Alex S. (thor368)


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

von tomaz (Gast)


Angehängte Dateien:

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.

von tomaz (Gast)


Lesenswert?

Habe den wakeup Code aus der Application Note Seite 35.
Das Auslesen der Daten habe ich von Seite 32 übernommen.

von Alex S. (thor368)


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

von tomaz (Gast)


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.

von tomaz (Gast)


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.

von Miška (Gast)


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

von Miška (Gast)


Lesenswert?

Das fehlende Komma spendiert bitte einer, der's übrig hat ;-)

von tomaz (Gast)


Lesenswert?

,
Danke, hab den Fehler echt nicht bemerkt.
Der MC kann ja ohne Auslesen den Status nicht kennen.

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.