Hallo, ich muss folgende Aufgabe in C bewältigen und bräuchte eure Hilfe: Und zwar möchte ich einen Reaktionszeitmesser bauen. Zu Beginn, wird ein Taster betätigt. Dadurch wird ein Timer aktiviert der eine bestimmte Zeitspanne durchläuft (zufällig 1-6 Sekunden warten). Nach der abgelaufenen Zeit beginnen die LEDs zu leuchten und ein zweiter Timer läuft an. Durch erneute Betätigung des Tasters wird der Timer wieder angehalten und die gemessene Reaktionszeit kann ausgegeben werden. Zuerst beschäftige ich mich mit dem Zufallsgenerator. Ich habe mir gedacht, ich nutze einen Timer, der bis zu einem gewissen Wert (CCR0) zählt. Jetzt muss ich aber zuerst überlegen wie lange der Timer zum zählen braucht, also mit welcher Frequenz er arbeitet, oder? Da die SMCLK mit 5MHz arbeitet, ist die zu schnell, somit hab ich BCSCTL gewählt, die im low-mode mit 32kHz arbeitet. Ist das bis dahin richtig/eine gute Lösung? Jetzt teile ich die Frequenz noch und rechne aus, dass der Timer innerhalb einer Sekunde bis 8192 zählt. Wenn ich jetzt dem CCR0-Wert noch eine Zufallszahl in dem Bereich 0-48000 anhänge, müsste der doch zufällig von 1-6 Sekunden zählen, oder? Kann man das so machen? Evtl. bessere Idee, Verbesserungen? Vielen Dank, viele Grüße Phil So sieht mein bisherhiger Programmcode aus: WDTCTL = WDTPW + WDTHOLD; P1DIR = 0xFF; BCSCTL1 = DIVA_2; // XTS; BCSCTL3 = LFXT1S0; TACTL = TASSEL_1 + TAIE; // SMCLK, Interrupt Enable CCTL0 = CCIE; // CCR0 = 8192; TACTL |= MC_1; // Timer im Up Mode // wenn CCR0 erreicht wird #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A0 (void) { P1OUT = 0x00; // LED an CCTL0 &= ~CCIFG; TACTL &= ~TAIFG; }
Bayernjung schrieb: > Da die SMCLK mit 5MHz arbeitet, ist die zu schnell, somit hab ich BCSCTL > gewählt, die im low-mode mit 32kHz arbeitet. BCSCTL gibt es nicht, das ist ein Register, kein Clock. Du meinst vielleicht den DCO, der sollte aber so bei 700kHz liegen. Der arbeitet auch immer gleich schnell, egal welcher LPM (falls noch aktiv).
Bayernjung schrieb: > Zuerst beschäftige ich mich mit dem Zufallsgenerator. Ich habe mir > gedacht, ich nutze einen Timer, der bis zu einem gewissen Wert (CCR0) > zählt. Jetzt muss ich aber zuerst überlegen wie lange der Timer zum > zählen braucht, also mit welcher Frequenz er arbeitet, oder? Da die > SMCLK mit 5MHz arbeitet, ist die zu schnell, somit hab ich BCSCTL > gewählt, die im low-mode mit 32kHz arbeitet. Ist das bis dahin > richtig/eine gute Lösung? Kann man so machen. Ist in meinen Augen aber ehrlich gesagt zu kompliziert für nichts. <Zitat> Zu Beginn, wird ein Taster betätigt. </Zitat> ... und während der Prozessor darauf wartet, dess endlich irgendjemand eine Taste drückt, zählt er ständig vor sich hin: 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, .... Wird die Taste betätigt, hast du deine Zufallszahl im Bereich 0 bis 5 (noch 1 dazu und du hast 1 bis 6 )
1 | while( Taste gedrückt ) |
2 | mache nichts; |
3 | |
4 | Zahl = 0; |
5 | while( nicht Taste gedrückt ) { |
6 | Zahl = Zahl + 1; |
7 | if( Zahl == 6 ) |
8 | Zahl = 0; |
9 | }
|
10 | |
11 | // Taste gedrückt und in Zahl steht die zufällige Zeitdauer
|
dein Prozessor arbeitet das so schnell ab, dass kein Mensch in der Lage ist, diese Generierung irgendwie aktiv zu beeinflussen. Die erste while Schleife (Taste gedrückt) soll nur verhindern, dass irgendein Schlaumeier auf die Idee kommt, die Taste zu drücken und erst dann das Gerät einzuschalten und so Zahl immer auf 0 bringt. So muss er die Taste in diesem Fall loslassen und tatsächlich drücken, wenn das Programm schon läuft.
Okay, dann werde ich das erstmal so probieren. Vielen Dank für die Hilfe.
Tach Bayernjung! Einen guten Lösungsansatz findest du im Anhang. Er ist für ein Entwicklungsboard von Elektor geschrieben. Den Schaltplan ist einfach: an P1 hängt an BIT1 eine LED, an BIT2 ein Summer, an BIT3 und BIT 4 ebenfalls LEDs, die aus sind, wenn man sie auf logisch TRUE zieht. An 1.6, 1.7 und 1.8 sind Schalter gegen Masse. Viel Glück, vielleicht hilftss. Wenn nicht schau dir die Kommentare an, damit kann man auch einiges anfangen... VLG Benzi P.S.: Ach ja, hätt ich fast vergessen: es ist auch ein Display im Spiel.
Hi, falls noch interessant - hier ein fertiger C-Code für einen Reaktionszeitmesser mit MSP430. Hier: G2553. http://sebastian-foss-ee.blogspot.com/2013/07/msp430-reaktionszeitmesser-in-c-mit-iar.html
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.