Hallo zusammen!
Folgende Situation bei mir...hab ein STK500 mit Tiny13, funktioniert
alles prima bisher. Hier gleich eine kleine Frage am Rande: Hab
folgendes Programm:
Hab mit diesem Programm schon 63% des Programmspeichers vom ATtiny13
verbraucht, hätte echt nicht gedacht, dass der so schnell voll wird. Und
dazu meine Frage: wirken sich die inkludierten Header-Files auf die
Größe des Programms aus oder werden nur die benötigten Funktionen am µC
gespeichert? Das würde ja irgendwie erklären warum dieses Miniprogramm
schon so viel Platz benötigt...
Aber jetzt zur richtigen Frage. Will letztlich mit diesem µC einen
Würfel ansteueren. Hab mich über die Erzeugung von Zufallszahlen schon
ausreichend informiert und mich letztendlich für die Variante mit dem
SRAM entschieden, da sie für diese Anwendung vollkommen ausreicht. Wie
kann ich jetzt
1) den Zufallszahlenbreich auf 1-6 eingrenzen und
2) wenn ich im Watch-Window im AVR-Studio die Variable "zufall" ansehen
will, steht bei Value immer nur "Location not valid". Was ist hier
falsch?
Zu 1) Wäre das eine Möglichkeit?
Zu 1): Nach langem Nachdenken bin ich zur Überzeugung gekommen, dass
dieser Code wahrscheinlich sehr schlau ist. Ich hätte nie daran gedacht,
dass es nicht gleich viele Zufallszahlen kongruent zu 0,1,2,3,4,5 gibt,
wenn RAND_MAX kein Vielfaches von 6 ist. Aber wenn der
Zufallszahlengenerator so gut ist, wie die halt normalerweise so sind,
dann ist dass auch nur Zuckerguss auf einem Sandkuchen. Allerdings gibst
Du einen int zurück, wo ein uint16 erwartet wird und ein uint8 reichen
würde. Das ist unordentlich.
Zu 2): Das kann ich beantworten: Die Variable wurde wegoptimiert, weil
sie nur beschrieben und nie gelesen wurde.
Aber warum verwendest Du überhaupt rand() aus der stdlib? Hast Du
Zugriff auf die Numerical Recipes? Da gibt's doch sicherlich einen
10-Zeiler, der gut genug ist für einen Würfel. Ich nehme mal an, dass
sich dann auch Dein Speicherverbrauch besser in den Griff bekommen
lässt.
Und solltest du bei rand() bleiben dann zieh den Aufruf der srand vor
die while Schleife.
Zufallszahlengeneratoren funktionieren nur dann vernünftig, wenn man sie
in Ruhe arbeiten lässt. Den ersten Seed gibt man vor (ev. in irgendeiner
Form von einer Benutzeraktion abhängig) und dann lässt man den Seed
tunlichst in Ruhe! Nur so kann der Generator seine Normalverteilung
(oder was er sonst für eine Verteilung hat) aufbauen.
Also sollte "zufall" als uint8_t und nicht als uint16_t definiert sein,
um es sauber zu machen?
Naja, aus den Numerical Recipes werd ich nicht schlau, aber diese
Variante des Zufallsgenerators ist eh schon recht kurz. Wie könnte ich
den am einfachsten diese Zufallszahl einfach an Port B mit 4 Leds
(einfach in BCD Code) ausgeben?
Das hatte ich ganz vergessen dass das srand() aus der Schleife raus
gehört. Ich hab jetzt einfach mal ganz plump PORTB = zufall;
geschrieben, so sehe ich in der Simulation, dass sich bei jedem
Tastendruck dann an Port B etwas ändert, also dass sollte dann schon mal
funktionieren. Jetzt fehlt nur noch die Eingrenzung auf 1 bis 6.
Andreas Brunner schrieb:
> Das hatte ich ganz vergessen dass das srand() aus der Schleife raus> gehört. Ich hab jetzt einfach mal ganz plump PORTB = zufall;> geschrieben, so sehe ich in der Simulation, dass sich bei jedem> Tastendruck dann an Port B etwas ändert, also dass sollte dann schon mal> funktionieren. Jetzt fehlt nur noch die Eingrenzung auf 1 bis 6.
Deine Funktion zufallszahl() macht das schon.
Die macht das sogar sehr gut.
Andreas Brunner schrieb:
> Scheint zu funktionieren. Mein Problem ist jetzt wie gesagt die Ausgabe> über die vier Leds...
Versteh ich nicht.
Das ist doch der leichteste Teil der Übung.
Einfach an den Port rausgeben, so wie du das schon gemacht hast.
PORTB = zufall | ( 1 << PB4 ); // damit der Pullup nicht flöten geht
Achso, na dann scheint es doch eh irgendwie zu stimmen ^^ Aber auch eben
nur irgendwie, denn die Leds sind wenn ich mich richtig entsinne
active-Low, also hab ich mal geschaut, welche Werte da mit den Leds zu
Tage kommen, und habe festgestellt, dass 6 nicht vorkommt. Es war nur
0-5 zu sehen...hab ich doch glatt das "+1" bei der Berechnung vergessen.
Jetzt scheint der Generator fertig zu sein!
Alles weitere wird hoffentlich kein Problem mehr...und braucht auch
hoffentlich nicht mehr zu viel Speicherplatz ^^
Danke für die Hilfe,
Lg Andi
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.