rand() beim mega8

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 12 7 2026  18:14:25      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Oszilloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


Autor
rand() beim mega8

    







BID = 634717

Peda

Schriftsteller



Beiträge: 891
 

  


Hallo,

ich will einen Mega8 so programmieren dass er mir Impulse von 1ms Länge in pseudozufälligen Abständen ausspuckt.
Die Abstände sollen zwischen 50 und 200ms liegen.
Eigentlich eine einfache Aufgabe dennoch hätt ich ein paar Fragen:

rufe ich rand() auf, was bekommen ich beim Mega8 dann zurück? Eine 8bit Zahl oder eine 16 bit Zahl?
Was mache ich am besten mit Werten die der Zufallsgenerator ausspuckt, die nicht innerhalb von 50-200ms liegen? Verwerfen, oder irgendwie so umrechenen, dass sie innerhalb dem gewünschtem Bereich liegen ?
Mir käme es drauf an, dass sich die Zufallsfolge nicht zu schnell wiederholt.

Ansonsten, wenn der mikrocontroller nichts sonst zu tun hat, soll ich interupts benutzen, oder doch bloß einfach den timer auslesen und mit dem Sollwert vergleichen ?

PS: Wahrscheinlich blöde Fragen, aber ich hab mit den Dingern noch nicht soviel gemacht.

_________________
Do you have Math Problems ?? Then call 0049-0800 sin(lg((10^45*tan(56))/(f(0)'->(45x^3/3x^2*3x^7)))

BID = 634731

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

 

  


Zitat :
Was mache ich am besten mit Werten die der Zufallsgenerator ausspuckt, die nicht innerhalb von 50-200ms liegen?
Gute Frage!
Ein ordentlicher Zufallsgenerator liefert gewöhnlich gleichverteilte Zufallszahlen.
Wenn du die in dieser *) Weise filterst, sind sie eben nicht mehr gleichverteilt.
Ob eine solche Operation zulässig ist, hängt von der Aufgabenstellung ab.

*) Du kannst aber andere, vom Wert unabhängige, Filter anwenden, z.B. nur jede 7. Zufallszahl verwenden, weil dadurch die Gleichverteilung nicht gestört wird.


P.S.:

Zitat :
was bekommen ich beim Mega8 dann zurück? Eine 8bit Zahl oder eine 16 bit Zahl?
Der Mega8 liefert überhaupt keine Zufallszahlen. Wenn er das tut, ist er kaputt.
Solche Funktionen sind in Software realisiert und werden aus mitgelieferten Bibliotheken eingebunden.
Über Qualität und Eigenschaften des Zufallsgenerators wirst du also in der Hardwaredokumentation des Mega8 nichts erfahren, sondern in der Dokumentation des Compilers.


[ Diese Nachricht wurde geändert von: perl am 18 Sep 2009 12:25 ]

BID = 634754

Peda

Schriftsteller



Beiträge: 891

Hmm also eigentlich wär mir ja die gleichverteilung wurscht (egal).
Es geht vielmehr darum 2 Datenströme die auf getrennten Rechnern gespeichert werden im Nachhinein zu synchronisieren.
Ich hätte mir das so vorgestellt, dass man zufällige Pulse in beide Datenströme (die Geräte haben dafür Eingänge) mitreinschreibt. Und nachher am Rechner, durch Korrelation der Zeitpunkte der Impulse, die Datenströme synchronisiert.
Hierzu benötige ich (nach meiner Vorstellung) die Impulse mit pseudozufälligen Abständen.
Wenn ich "man rand()" richtig interpretiere kriegt man wahrscheinlich einen Integer-Wert zurück.
Der sollte dann auf dieser Architektur 8 bit breit sein. Soweit richtig oder ?
Was mach ich dann am schlauesten damit ich dann am besten irgendwie auf pause von 50 - 200ms oder meinetwegen auch 20 - 200 ms komme. Ohne dass sich die pseudopausenfolge dann nach 20 Pausen sich beginnt zu wiederholen.
Sonst kann ich meine Synchronisation vergessen, wenn ich bloß 2s ausgleichen könnte.

_________________
Do you have Math Problems ?? Then call 0049-0800 sin(lg((10^45*tan(56))/(f(0)'->(45x^3/3x^2*3x^7)))

BID = 634760

Racingsascha

Schreibmaschine



Beiträge: 2247
Wohnort: Gundelsheim
ICQ Status  

Du könntest zuerst deinen Ausgang auf high setzen und 50ms warten, danach die Zufallszahl mit einem Zeitfaktor multiplizieren, um den Zufallszahlbereich zwischen 0 und 256 bzw. 65536 auf die 0-150ms abzubilden. Dann erst den Ausgang wieder auf low setzen.

_________________
Fnord ist die Quelle aller Nullbits in deinem Computer.
Fnord ist die Angst, die Erleichterung, und ist die Angst.
Fnord schläft nie.

BID = 634777

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach


Zitat :
hätte mir das so vorgestellt, dass man zufällige Pulse in beide Datenströme (die Geräte haben dafür Eingänge) mitreinschreibt.
Warum schreibst du da nicht gleich die Datenblocknummer oder ein Zeitzeichen rein?
Da brauchst du nacher nicht zu suchen, wo im Datenstrom du gerade liest.

P.S.:

Zitat :
Der sollte dann auf dieser Architektur 8 bit breit sein. Soweit richtig oder ?
Was mach ich dann am schlauesten damit ich dann am besten irgendwie auf pause von 50 - 200ms oder meinetwegen auch 20 - 200 ms komme. Ohne dass sich die pseudopausenfolge dann nach 20 Pausen sich beginnt zu wiederholen.
Auch wenn das Datenwort nur 8 Bit hat, so kann doch die Periodenlänge des PRN-Generators seeeeeeeeeeeehr viel länger sein.
Das zeichnet ja gerade einen guten Zufallsalgorithmus aus, dass man die nächste Zahl nicht leicht vorhersehen kann.

[ Diese Nachricht wurde geändert von: perl am 18 Sep 2009 16:23 ]

BID = 634799

DonComi

Inventar



Beiträge: 8604
Wohnort: Amerika

Hallo peda,

Du nutzt also vermutlich den GCC, wenn du von 'man rand' schreibst, oder?

In C ist der Datentyp int mindestens 16 Bit breit, kann auch mehr sein (je nach Architektur). Also selbst wenn die Zielarchitektur 8 Bit hat, wird int nicht kürzer als 16 Bit.
Diese Funktion wird dementsprechend einen (short) int ausgeben, also 16 Bit!

Offtopic :

Du kannst aber diesen C-Standard beeinflussen, indem du die Flagge -mint8 setzt. Der Datentyp int wird dann 8 Bit breit.
Diese Flagge würde ich immer setzen, da z.B. auch Enumerationen als int behandelt werden, also auch auf AVRs 16 Bit breit sind. Das ergibt aber erst Nutzen, wenn man mehr als 256 Enummitglieder hat, hat mal aber selten.


Die Bibliothek, die einzubinden wäre für rand() ist die stdlib, mit dem Header stdlib.h .
Der Compiler linkt da von allein gegen, ansonsten bei Fehlern wie "undefined referenze to..." einfach mit -l die Bibliothek mitangeben.

Hier noch etwas zum Thema:
http://www.rn-wissen.de/index.php/Zufallszahlen_mit_avr-gcc

_________________



[ Diese Nachricht wurde geändert von: DonComi am 18 Sep 2009 18:12 ]

BID = 635819

Peda

Schriftsteller



Beiträge: 891

Hmm ja die Antwort von DonComi klingt sehr aufschlussreich, ich werd dann mal versuchen das so umzusetzen !!

_________________
Do you have Math Problems ?? Then call 0049-0800 sin(lg((10^45*tan(56))/(f(0)'->(45x^3/3x^2*3x^7)))

BID = 637674

gerhard54

Gelegenheitsposter



Beiträge: 76
Wohnort: Wien

Ohne daß ich von Microcontrolleren etwas verstehe:

In C läßt sich das ganz einfach programmieren:
Du willst eine Zahl zwischen 50 und 250.
Das kann man auch so schreiben 50+(0 ... 200).

Wenn Du von dem Rückgabewert von rand() den Rest bei der Division durch 201 nimmst hast Du es schon fast:

x = 50 + (rand() % 201);

Noch etwas, wie schon gesagt es gibt keinen Zufallsgenerator, sondern nur einen Algorithmus der "zufällig" verteilete Zahlen liefert. D.h. er liefert nach jedem Start die gleiche Folge.
Wenn Du das nicht, willst mußt Du ihn jedesmal mit einer andern Zahl initieren. Am einfachsten machst Du das mit time(). (=Zeit in Sekunden seit 1.1.1970).

Also:
init = time(NULL);
srand(init);

Auf allen Prozesoren für die ich programmiert habe (x68, ARM..) geht das.

Gerhard

BID = 637882

DonComi

Inventar



Beiträge: 8604
Wohnort: Amerika


Zitat :

Auf allen Prozesoren für die ich programmiert habe (x68, ARM..) geht das.


Ist theoretisch in Ordnung, nur: der AVR hat keine (Echtzeit-)Uhr.

Die müsste man dann selbst noch implementieren...

Es geht auch mehr oder weniger gut, indem man vor der Initialisierung des RAMs (Nullsetzen) einen Startwert aus dem RAM-Inhalt errechnet, denn dort kann ziemlicher Datenmüll stehen.

Irgendwo meine ich gelesen zu haben, dass alle Bytes aus dem RAM xor verknüpft wurden.


_________________


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 7 Beiträge im Durchschnitt pro Tag       heute wurden bisher 2 Beiträge verfasst
© x sparkkelsputz        Besucher : 192373930   Heute : 3807    Gestern : 4345    Online : 624        12.7.2026    18:14
0 Besucher in den letzten 60 Sekunden         ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0492041110992