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?
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
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
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.
Habe den wakeup Code aus der Application Note Seite 35. Das Auslesen der Daten habe ich von Seite 32 übernommen.
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
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.
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.
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) ); |
Das fehlende Komma spendiert bitte einer, der's übrig hat ;-)
, 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.