Forum: Mikrocontroller und Digitale Elektronik MSP430/27222: Reaktionszeitmesser (C)


von Bayernjung (Gast)


Lesenswert?

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

von Jörg S. (joerg-s)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Bayernjung (Gast)


Lesenswert?

Okay, dann werde ich das erstmal so probieren. Vielen Dank für die 
Hilfe.

von Benedikt Z. (benezi)


Angehängte Dateien:

Lesenswert?

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.

von Sebastian F. (sebastian_foss)


Lesenswert?

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
Noch kein Account? Hier anmelden.