mikrocontroller.net

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


Autor: Bayernjung (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
 }

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 )
   while( Taste gedrückt )
     mache nichts;

   Zahl = 0;
   while( nicht Taste gedrückt ) {
     Zahl = Zahl + 1;
     if( Zahl == 6 )
       Zahl = 0;
   }

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

Autor: Bayernjung (Gast)
Datum:

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

Autor: Benedikt Zimmermann (benezi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian Foss (sebastian_foss)
Datum:

Bewertung
0 lesenswert
nicht 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/msp4...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.