Forum: Mikrocontroller und Digitale Elektronik Randomzahl via Timer


von Danny R. (skid)


Lesenswert?

Hallo,

ich muss zu Beginn sagen, dass ich nicht wirklich gut vertraut mit 
Assemblerprogrammierung bin, da ich mich mit den Mechanismen im 
allgemeinen noch nicht recht identifizieren kann.

Um auf den Punkt zu kommen:
Ich arbeite mit zwei anderen an einem Projekt, welches ein Reaktionstest 
reagiert, was bedeutet, dass eine Taste erscheint (auf einen LCD 
Display) diese sehr schnell gedrückt werden muss und die Reaktionszeit 
wird im Endeffekt ausgegeben.

Leider ist das Projekt doch recht schwierig zu realisieren, wie sich 
rausgestellt hat und uns fehlen eigentlich nur noch zwei Knackpunkte, um 
unsere Projekt fertigzustellen.

Eigentlich bin ich dagegen in Foren zu fragen, aber wenn man in einem 
Projekt nicht sonderlich weiterkommt und Assembler ja nun nicht mehr so 
präsent ist, wie C++/C# etc. gestaltet es sich auch recht schwierig im 
Internet das zu finden, was man sucht.
Suchmaschinen sind zwar eine gute Allzweckwaffe, aber für manche Dinge 
wissen selbst diese keinen vernümpftigen Rat, wie ich leider die letzten 
Tage vestellen musste.

Die Punkte wo es harpert:
Ich zähle, wärend ich einen Timer in kleinen Zeitabständen hochzähle 
(10-100ms), ein Register hoch, damit ich im Endeffekt die Zahl des 
Registers mit der Anzahl der Millisekunden multiplizieren kann um die 
Reaktionszeit rauszubekommen.

Problem hierbei ist allerdings, dass ich es nicht schaffe den Wert des 
Registers vernümpftig auf dem LCD-Display (vorerst ohne Multiplikation 
-nur zum Test-) ausgeben kann.
Jetzt weiss ich leider nicht, ob das bei jedem Mikrocontroller gleich 
ist, deswegen nenne ich einfach erstmal den Mikrocontroller den wir zur 
Verfügung haben: Dallas DS87C520 (ein 8051er inwieweit das relevant sein 
sollte)

Ich habe die Adresse im DPTR gespeichert (die Adr. des LCD-Diisplays) um 
ggf. darauf zugreifen zu können, Strings kann ich ausgeben, jedoch weiss 
ich nicht weiter bei dem Wert eines Registers.

Der zweite Punkt:
Meiner Meinung nach der schwierigere der es für mich in sich hat, denn 
auch in CPP war dies nicht gerade einfach zu lösen :-)

Ich muss einige Zufallszahlen aus einen LAUFENDEN Timer rauslesen um 
zufällige Zahlen, bzw. zufällige Buttonpositionen zu erstellen.
Ich kann die Werte in 4 Registern speichern, dass ist nicht das Thema, 
mein Problem ist eben das aus einen laufenden Timer rauszulesen.

Mein Timer:
-----------------------------------------
delay:
mov  r0, #100d
mov  tmod, #01h  ; Timer Mode 1 (16bit)

loop:
mov  th0, #0beh  ; Nachladewerte
mov  tl0, #0e5h  ; für 10 ms
setb  tr0        ; Start Timer

wait:
jnb  tf0, wait   ; Warte auf Timer
clr  tr0
clr  tf0         ; Timer rücksetzen
djnz  r0, loop   ; 100 x ausführen
ret
-----------------------------------------

Schön und gut, dass ich den habe, ich bin schon Stolz auf mich, dass der 
seine Arbeit verrichtet, aber im laufenden Timer da irgendwie was 
rauszulesen ist meine derzeitige Grenze :-))

Ich hoffe ihr könnt mir da etwas weiterhelfen, damit ich da wieder etwas 
Land sehe :-)
Würde mich jedenfalls über diese freuen!

Liebe Grüße,
Danny.

von Carsten (Gast)


Lesenswert?

>, ich bin schon Stolz auf mich

kannst DU auch sein ... (Du  kennst einen der der lesen kann)

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Uhr

von Tim R. (vref)


Lesenswert?

Die Zahlen aus einem laufenden Timer werden nicht besonders zufällig 
sein...
Es gibt bessere Mechanismen um Pseudo-Zufallszahlen zu erzeugen:

http://en.wikipedia.org/wiki/Linear_feedback_shift_register

Den Seed kannst du ja aus dem Timer beim ersten Tastendruck beziehen.

von Simon K. (simon) Benutzerseite


Lesenswert?

Tim R. wrote:
> Die Zahlen aus einem laufenden Timer werden nicht besonders zufällig
> sein...
> Es gibt bessere Mechanismen um Pseudo-Zufallszahlen zu erzeugen:
>
> http://en.wikipedia.org/wiki/Linear_feedback_shift_register
>
> Den Seed kannst du ja aus dem Timer beim ersten Tastendruck beziehen.

oder http://en.wikipedia.org/wiki/Linear_congruential_generator

von Carsten (Gast)


Lesenswert?

schuldigung ich war frech

wenn Du den Timer auf max Freq laufen lässt,
(Startwert = "Kleinste Zahl" ; Endwert = "Größte Zahl")

.. sollte keiner mehr in der Lage sein eine bestimmte
   Zahl (Wert) zutreffen ...

von Carsten (Gast)


Lesenswert?

.. auch ein µC nicht ..

bei "bei regelmäßigen Abfragen"!

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.