PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Stopwatch auslesen



Roboman93
13.01.2008, 12:29
Hallo,
ich würde gerne mit einem programm die stopuhr aus dem rp6 lesen.
ich habe jetzt ein kleinen program geschrieben, dass folgendes tun soll:
1.:stopwatch starten.
2.:ausgeben, dass die stopwatch gelesen wird, was mit laufenden punkten gezeigt wird.
3.:den aktuellen wert der stopuhr angeben
und 4.: eine pause machen.


#include "RP6RobotBaseLib.h"
int main(void)
{
initRobotBase();
startStopwatch1();

while (true)
{
static uint16_t stopwatch1;
if(getStopwatch1() > 1000)
{
writeString_P("Stopuhr wird gelesen.");
mSleep(400);
writeString_P(".");
mSleep(400);
writeString_P(".");
mSleep(400);
writeString_P("\n");
writeInteger(stopwatch1, DEC);
writeChar('\n');
mSleep(1458);
}
}
return 0;
}

wenn ich das jetzt starte, kommt die schrift mit den punkten, aber als wert der stopuhr wird immer 0 angegeben!

kann mir jemand sagen, was da falsch sein könnte?

danke schonmal im voraus

roboman

radbruch
13.01.2008, 12:41
writeInteger(getStopwatch1(), DEC);

und mit setStopwatch1(wert); wird die StopWatch gestellt.

Roboman93
13.01.2008, 12:47
ist es normal, dass die nur bis ca 30 sec zählt?
und kann man den wert auf dem rp6 speichern, um ihn später auszulesen?

Dirk
13.01.2008, 13:24
Hallo Roboman93,

wenn du mit ...
if(getStopwatch1() > 1000) {
'machwas'}
... etwas tun willst, dann bedeutet das, dass du etwa alle 1000ms, also etwa jede Sekunde, 'machwas' ausführst.

Ist es das, was du wolltest?

Auf jeden Fall must du dann noch am Ende setStopwatch1(0) einfügen, um die Stopwatch zurückzusetzen:
if(getStopwatch1() > 1000) {
'machwas'
setStopwatch1(0);}

Gruß Dirk

Roboman93
13.01.2008, 13:38
ne, ich wollte nur, dass der am anfang eine sekunde wartet und dann die zeit ausgibt. die ungerade zahl unten ist nur dafür da, damit net immer das gleiche rauskommt

radbruch
13.01.2008, 15:05
So vielleicht?

#include "RP6RobotBaseLib.h"
int main(void)
{
initRobotBase();
startStopwatch1();

while (true)
{
if(getStopwatch1() > 1000)
{
while(1)
{
writeString_P("Stopuhr wird gelesen.");
mSleep(400);
writeString_P(".");
mSleep(400);
writeString_P(".");
mSleep(400);
writeString_P("\n");
writeInteger((uint16_t)getStopwatch1(), DEC);
writeChar('\n');
mSleep(1458);
}
}
}
return 0;
}

Dirk
13.01.2008, 15:19
... ich wollte nur, dass der am anfang eine sekunde wartet und dann die zeit ausgibt.

Am Anfang wird wirklich 1000ms gewartet, zumindest, wenn man einen Stand von Null für die Stopwatch1 annimmt (du setzt sie anfangs nicht auf Null).

Wenn dann der Stopwatch1-Wert größer als 1000 ist, also 1001 bis 32767, dann werden die Punkte bei jedem Schleifendurchlauf ausgegeben und Stopwatch1 gelesen (wenn du die Änderungen von radbruch machst).

Das geschieht bei jedem Schleifendurchlauf.
Frage ist, was da ausgegeben werden soll? Das geht so schnell, dass man da nichts rechtes lesen kann.

Was willst du also ausgeben? Eine Zahl jede Sekunde oder jede 0,1s? Überleg noch mal, was dein Programm machen soll.

Gruß Dirk

Roboman93
13.01.2008, 17:43
mein programm soll einfach nur alle 1,458 sec den wert der stopwatch ausspucken! funktioniert jetzt auch super, dank radbruchs hilfe!
aber wie kann man diese werte auf dem rp6 speichern? bitte um hilfe

roboman

Dirk
13.01.2008, 18:08
Hallo roboman,

... mein programm soll einfach nur alle 1,458 sec den wert der stopwatch ausspucken! funktioniert jetzt auch super, dank radbruchs hilfe!

Das macht das Programm von radbruch nicht. Für mich ist nicht erkennbar, wie alle 1,458 s die Stopwatch ausgelesen wird. Nach dem "Warum" wage ich gar nicht zu fragen.

Gruß Dirk

Roboman93
13.01.2008, 18:40
guck mal mein prog an: da fängt die schleife an, wenn 1000 ms verganden sind
dann sagt er: "stopuhr wird gelesen."
dann noch 2 punkte.

dann ein zeilenumbruch und dann den wert der stopuhr in dezimal.
dann noch ein zeilenumbruch und jetzt, pass auf:
dann kommt eine pause von 1,458 sec, nach der die schleife von vorne beginnt!

ausgegeben wird dann folgendes:

Stopuhr wird gelesen...
1863
Stopuhr wird gelesen...
4285
Stopuhr wird gelesen...
6707
Stopuhr wird gelesen...
9128
Stopuhr wird gelesen...
11550
Stopuhr wird gelesen...
13972
Stopuhr wird gelesen...
16394
Stopuhr wird gelesen...
18817
Stopuhr wird gelesen.

Dirk
13.01.2008, 18:48
Hallo roboman,

... dann kommt eine pause von 1,458 sec, nach der die schleife von vorne beginnt!

ok, habe ich gesehen.
Du hast damit eine Schleife, die jeweils nach ca. 2,422 s wieder die Stopwatch liest.

Ok, verstanden! :-s

Gruß Dirk

radbruch
13.01.2008, 20:19
Hallo


aber wie kann man diese werte auf dem rp6 speichern?Wie lange sollen die Daten gespeichert werden. Bis zum nächsten Ausschalten oder für "ewig". Das erste wäre dann ein gewöhnliches Array:


uint16_t daten[512], n;

n=0;
daten[n]=getStopwatch1();
writeInteger(daten[n], DEC);

Ewig würde es imEEProm gespeichert werden:


#include <avr/eeprom.h>

eeprom_write_word (uint16_t *addr,uint16_t value);
eeprom_read_word (const uint16_t *addr);

Wie das genau funktioniert habe ich noch nicht getestet, mit 8bit-Werten mache ich es so:


#include "asuro.h"

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE))
;
/* Set up address and data registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);
}
unsigned char EEPROM_read(unsigned int uiAddress)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE))
;
/* Set up address register */
EEAR = uiAddress;
/* Start eeprom read by writing EERE */
EECR |= (1<<EERE);
/* Return data from data register */
return EEDR;
}
int main(void) {
unsigned i;
unsigned char c;
Init();
/*
EEPROM_write(509,'m');
EEPROM_write(510,'i');
EEPROM_write(511,'c');
*/
SerWrite("\n\n\rInhalt des EEPROMS\n\r10.3.2007 (code by dalmator)\n\n\r",54);
for (i=0;i<512;i++) {
StatusLED(RED);
c=EEPROM_read(i);
StatusLED(GREEN);
SerWrite(&c,1);
}
while (1);
return 0;
}
(Beim zweiten Start den auskommentierten Code nach Init() einmalig auch ausführen!)

Gruß

mic

Roboman93
14.01.2008, 15:14
ich habe jetzt ein bisschen getüftelt! wie muss ich den code mit der stopuhr verändern, damit der wert der stopuhr für immer gespeichert bleibt(kann man ihn auch wieder löschen). und wie lade ich ihn dann auf den pc?