Hallo mal wider,
ich stehe vor einer neuen Herausvorderung. Ich will nem Elektrischen
würfel Programmieren. Ich dachte mir machste dir zwei .c dateinen ein
main.c und eine Anzeige.c. In der Main.c wird ein Timer initialisiret
der von 1-6 zählt wenn eine Taste gedrückt wird, wird der währt an dem
der zähler stehen bleibt ausgegeben auf eine 7 Segmentanzeige. Es gibt
ja an dem MSP4302012 8 Ports einer für den Taster der rest für jeweils
ein Segment. Hat da schon jemand mit erfahrungen gemacht das zu
programmieren? Da mir ihrgend wie gerade der Anfang fehlt wie ich das
machen könnte auser die idee hab ich nichts weiter. Weis auch nicht wie
ich Programmier technisch rangehen soll. Hat da vielleicht jemand ein
Beispiel das ich mir anschauen kann oder nen Link auf ne seite wo
vielleicht schon mal so was gemacht worden ist. Danke schon mal im
voraus.
mfg
Marek
Ich würde da 1 C-Datei machen und die funktion rand() zur
Zufallszahlenerzeugung verwenden...
Und das ganze zuerst hart aber herzlich ganz ohne Timer, nur mit
Verzögerungsschleifen. Denn so ein Würfel braucht ja nicht gerade eine
Art interruptgesteuertes Multitaksking-Betriebssystem.
Wie initialisirt man denn denn den hab noch nie damit gearbietet hab
gerade was gelesen das man mit srand() da was machen muß hab aber kein
gescheites beispiel gefunden anhand ich das verstehen könnet wie mann
die rand() funktion nutzen kann.
mfg
Lothar Miller schrieb:> Ich würde da 1 C-Datei machen und die funktion rand() zur> Zufallszahlenerzeugung verwenden...
Würd ich nicht so machen.
Zumindest nicht für den Anfang. Ich finde die Idee die Marek vorschlägt
schon ganz in Ordnung. Die ist auch simpel zu implementieren: Ausser
Port einlesen und an einem Port ausgeben braucht man sonst nichts.
> Und das ganze zuerst hart aber herzlich ganz ohne Timer, nur mit> Verzögerungsschleifen. Denn so ein Würfel braucht ja nicht gerade eine> Art interruptgesteuertes Multitaksking-Betriebssystem.
Full Ack.
Marek S. schrieb:> Wie initialisirt man denn denn den hab noch nie damit gearbietet hab> gerade was gelesen das man mit srand() da was machen muß hab aber kein> gescheites beispiel gefunden anhand ich das verstehen könnet wie mann> die rand() funktion nutzen kann.
du rufst sie einfach auf.
Da du höchst wahrscheinlich sowieso keinen gescheiten Wert für die
Initialisierung mittels srand hast, ist jeder Wert so gut wie jeder
andere. Daher kannst du es auch bei gar keiner Initialisierung mittels
srand belassen.
Aber wie gesagt: Ich finde deine Idee während eines Tastendrucks zu
zählen, bzw. die Zählerei mit einem Tastendruck abzubrechen nicht so
schlecht. Einzig der Hardwaretimer ist überkandidelt, den braucht hier
sicherlich keiner.
Ist einfach aber doch geschmacklos. Und für einen menschlichen Bediener
praktisch nicht zu manipulieren.
> Da mir ihrgend wie gerade der Anfang fehlt wie ich das> machen könnte auser die idee hab ich nichts weiter.> Weis auch nicht wie ich Programmier technisch rangehen soll.
Normalerweise:
Darüber nachdenken, sich den Programmfluss zu recht legen, das Programm
planen.
Die Aufgabe ist aber so simpel, dass man das auch im 'Code' mittels
Kommentaren die Planung machen kann
1
// includieren was alles gebraucht wird
2
3
intmain()
4
{
5
....
6
7
// Port für die LEDs auf Ausgang schalten
8
9
// Port für den Taster auf Eingang schalten
10
11
12
Augenzahl=0;
13
14
while(1){
15
16
if(Tastergedrückt){
17
Augenzahl=Augenzahl+1;
18
if(Augenzahl==6)
19
Augenzahl=0;
20
}
21
22
else{
23
if(Augenzahl==0)
24
// an den LED das Bitmuster für 1 ausgeben
25
26
elseif(Augenzahl==1)
27
// an den LED das Bitmuster für 2 ausgeben
28
29
elseif(Augenzahl==2)
30
// an den LED das Bitmuster für 3 ausgeben
31
32
elseif(Augenzahl==3)
33
// an den LED das Bitmuster für 4 ausgeben
34
35
elseif(Augenzahl==4)
36
// an den LED das Bitmuster für 5 ausgeben
37
38
elseif(Augenzahl==5)
39
// an den LED das Bitmuster für 6 ausgeben
40
}
41
}
42
}
Jetzt bist du drann um die 'Kommentare' in realen C-Code umzusetzen.
Wenn du etwas mehr Erfahrung hast, kannst du ja mal darüber nachdenken,
wie du den Programmteil, der sich mit der Ausgabe des Bitmusters für die
LED beschäftigt, einfacher gestalten kannst. Da die Augenzahlen ja von 0
bis 5 laufen, würde sich zb ein Array anbieten. Augenzahl ist Index in
das Array und aus dem Array erhält man das Bitmuster welches an die LEDs
muss.
Super danke das ist das was ich bruachte. Ich hab mir ja ein
Programablaufplan gemacht und mir Gedanken gemacht aber da ich bis jetzt
noch nicht viel programmiert habe fehlt mir die Routine. Deswegen binn
ich auch immer für Hilfestellung dankbar die einem was brinkt und die
hier tut es. ich verstehe auch was alles passiert und so danke noch mal.
Ich werde es so probieren wie du es gerade angegeben hast und auch mal
mit der rand() funktion damit ich mal alles probiert habe. Noch mals
recht schönen dank an alle die sich beteilicht haben. Genist ansonsten
noch die Sonne das ist mir bis 17 uhr leider nicht vergönnt.
mfg
marek
Ne natürlich nicht ich geniese auch die Sonne. Aber so ein
Studentenleben ist schon schwer wenn man im Praktikum hockt und sich
sonst ganz gut ums programmieren gedrückt hat. Das ist halt nicht meine
Stärke deswegen muß ich euch hir bischen ärgern und fragen stellen.
Hatte ja auch Programmieren gehabt aber immer nur so kleinere sachen und
Übungen zu den sachen die man gerade gemacht hat und so. ABer wird schon
klapt ja auch ich hab ja auch ideen wie man das machen könnte aber mir
fehlt halt die Übung deswegen beschäftige ich mich jetzt damit. Aber ich
werde nicht 24/7 nur drinne verbringen. Morgen wird fußball beim kumpel
im Garten geguckt und gegrillt un das We genossen nach dem man dann 5
tage lang nur MSp430 programiert hat und sich beispiele angeschaut hat
und so. Des wegen werde ich mir auch mal das buch heute kaufen gehen und
mir das mal anschauen dammit ich nicht mehr so viel posten muß und es
mir vielleicht leichter feld mit dem msp umzugehen. Mach euch nen
entspannten und morgen beginnt die WM;-).
mfg
Marek S. schrieb:> Morgen wird fußball beim kumpel> im Garten geguckt und gegrillt
Jaja, is klar, dann gibts wohl eher Mäxchen mit nem elektronischen
Würfel, was? Musste nur auf zwei erweitern :)
Nur zur Klarstellung. Die ursprüngliche Frage war:
>>>> Ich will nem Elektrischen würfel Programmieren.
Die Ursache allen Übels ist:
> Aber so ein Studentenleben ist schon schwer wenn man im Praktikum> hockt und sich sonst ganz gut ums programmieren gedrückt hat.
Die Frage müsste also eigentlich so beginnen:
Ich muss nem Elektrischen würfel Programmieren.
BTW:
Du solltest an deinen lexikalischen und grammatikalischen Leistungen
arbeiten. Sonst lacht später die Sekretärin über dich. Ohne Witz...
Lothar Miller schrieb:> Die Frage müsste also eigentlich so beginnen:> Ich muss nem Elektrischen würfel Programmieren.
Da hat er ihn erwischt! Das glaube ich langsam auch :)
Lothar Miller schrieb:>> Ich muss nem Elektrischen würfel Programmieren.
^ ^ ^ ^
BTW:
> Du solltest an deinen lexikalischen und grammatikalischen Leistungen> arbeiten. Sonst lacht später die Sekretärin über dich. Ohne Witz...
**Hüstel**
Stefan schrieb:> Lothar Miller schrieb:>>> Ich muss nem Elektrischen würfel Programmieren.> ^ ^ ^ ^> BTW:>> Du solltest an deinen lexikalischen und grammatikalischen Leistungen>> arbeiten. Sonst lacht später die Sekretärin über dich. Ohne Witz...>> **Hüstel**
Das war ein etwas umgemodeltes 'Zitat' aus dem Eröffnungsposting:
> ... Ich will nem Elektrischen würfel Programmieren
Karl heinz Buchegger schrieb:> Das war ein etwas umgemodeltes 'Zitat' aus dem Eröffnungsposting:>> ... Ich will nem Elektrischen würfel Programmieren
Das würde ich auch so durchgehen lassen, das passt schon!
Ich weis meine Rechtschreibeung ist ne Katastrophe (bringt Legasteniker
sein so mit sich) aber es gibt schlimmeres. Naja muß, will ist so ne
sache ich mach das ja freiwig und will das ja acuh können aber so von
ganz alleine kommt man manchmal halt nicht drauf wenn mann sich nie so
wirklich mit msps beschäftigt hat. So ich bin dann jetzt weg geniest die
Sonne.
mfg
Karl heinz Buchegger schrieb:>> while( 1 ) {>> if( Taster gedrückt ) {> Augenzahl = Augenzahl + 1;> if( Augenzahl == 6 )> Augenzahl = 0;> }>> else {> if( Augenzahl == 0 )> // an den LED das Bitmuster für 1 ausgeben>> else if( Augenzahl == 1 )> // an den LED das Bitmuster für 2 ausgeben>> else if( Augenzahl == 2 )> // an den LED das Bitmuster für 3 ausgeben>> else if( Augenzahl == 3 )> // an den LED das Bitmuster für 4 ausgeben>> else if( Augenzahl == 4 )> // an den LED das Bitmuster für 5 ausgeben>> else if( Augenzahl == 5 )> // an den LED das Bitmuster für 6 ausgeben> }
Ihr alten Zinker. Mit diesem Code ist eine gewürfelte 1 wahrscheinlicher
als alle anderen Zahlen, da die Laufzeit beim Uebergang von Augenzahl ==
5 auf Augenzahl == 0 durch die Zuweisung mit 0 groeser ist als bei den
anderen, wo "nur" inkrementiert wird.
Man kann das auch rumdrehen, sodass die 6 am wahrscheinlichsten wird,
dann wimmelt es beim "Mensch aegere dich nicht" nach kurzer Zeit von
Maennlein. O.k. ist vielleicht etwas uebertrieben...
Gleichverteilung bekommt man denke ich nur, wenn man einen Timer von 0
bis 5 laufen lässt und beim Loslassen ausliest. Oder man aendert das
Programm so, dass die Laufzeiten in allen Faellen gleich sind.
@ Marek: Du bist doch Student und hast einen Haufen Zeit :-). Probiere
mal beide Varianten aus und berichte, ob ich recht habe :-)
S. Z. schrieb:> Ihr alten Zinker. Mit diesem Code ist eine gewürfelte 1 wahrscheinlicher> als alle anderen Zahlen, da die Laufzeit beim Uebergang von Augenzahl ==> 5 auf Augenzahl == 0 durch die Zuweisung mit 0 groeser ist als bei den> anderen, wo "nur" inkrementiert wird.
Hmm.
Interessante Betrachtung, der ich so erst mal nichts entgegen zu setzen
habe, ausser: Zufallszahlen sind ein Hund.
wie wärs mit
Hmmm, jetzt forderst Du mich aber heraus. Muss ich schon zu schwerer
Kruemelkackerei greifen.
Nun sind die 5 und die 6 geringfuegig benachteiligt, wenn man unsigned
short mal annimmt. Beim Ueberlauf sind 65532(0)...65535(3) moeglich, 4
und 5 jedoch nicht mehr :-)
Nee, im Ernst, sieht schon besser aus...
S. Z. schrieb:> Nun sind die 5 und die 6 geringfuegig benachteiligt, wenn man unsigned> short mal annimmt. Beim Ueberlauf sind 65532(0)...65535(3) moeglich, 4> und 5 jedoch nicht mehr :-)
ach Mist.
Ja, das rand() - Schubladenargument
Sagte ich schon, dass Zufallszahl ein Hund sind?
> Nee, im Ernst, sieht schon besser aus...
Die erste war besser, da war nur 1 Zahl geringfügig benachteiligt.
(Das ist wieder so eines von den Problemen, die mir die halbe Nacht
unterkommen :-)
Karl heinz Buchegger schrieb:> S. Z. schrieb:>>> Nun sind die 5 und die 6 geringfuegig benachteiligt, wenn man unsigned>> short mal annimmt. Beim Ueberlauf sind 65532(0)...65535(3) moeglich, 4>> und 5 jedoch nicht mehr :-)>> ach Mist.> Ja, das rand() - Schubladenargument>> Sagte ich schon, dass Zufallszahl ein Hund sind?>>> Nee, im Ernst, sieht schon besser aus...> Die erste war besser, da war nur 1 Zahl geringfügig benachteiligt.
Nee, die zweite ist viel besser.
Variante 1:
Annahme: Laufzeit für 5->0 doppelt so gross wie bei allen anderen.
--> Wahrscheinlichkeiten:
1: 2/7 = 28,5%
2-6: 1/7 = 14,3%
Variante 2:
1-4: 10923/65536 = 16,6671%
5-6: 10922/65536 = 16,6656%
Mit unsigned long kann man es noch weiter treiben. Das rechne ich aber
nun net mehr aus...
So. Nun ist aber Schluss mit meiner Schlaumeierei.
@ S. Z.
Jo werde ich machen erstmal Löte ich mir die schltung zusammen das ich
das mal testen kann was ich heute geschrieben habe hab das mit rand()
gemacht und modulo 6 +1 damit nur zahlen ausgegeben werden die von 1 - 6
gehen. Je nach dem welche zahl dan erscheint die Pins werden dann auf
high gesetzt und die / segment anzeige solte leucht berichte dann mal
die tage ob es geklabt hat vielleicht schon morgen denke ich.
> Jo werde ich machen erstmal Löte ich mir die schltung zusammen das ich> das mal testen kann was ich heute geschrieben habe
Zwei Schritte auf einmal:
1) eine neue Schaltung inbetriebnehmen
und
2) ein neues Programm zum Laufen bekommen
das kann hart werden...
Willst du nicht erst mal mit dem "Hello World" des Microcontrollers,
also der blinkenden LED anfangen?
Da ist er doch schon lange drüber hinweg...haben ihm die Tage hier doch
schon drei Programme vorgearbeitet. Für sein Praktikum. Wahrscheinlich
muss der Würfel erst Montag fertig sein.
Ich kenn das :) Aufgabenstellung im Januar, Abgabetermin Mitte Juni,
Beginn der Arbeit: 5.6
So in der Art zumindest...
NJo blinken und so hatte ich ja schon wie Dennis es schon sagte. Das
alles nur so neben bei damit ich was zu tun habe die aufgabenstellung
hab ich am Montag bekommen und zeit hab ich dafür eigentlich 3 Monate.
So ein mini Projekt un da ich das aber auch können will beschäftige ich
mich damit und da ihr mich ja tatkräftig unterstützt weis ich jetzt mehr
als zuvor wofür ich sehr dankbar bin. Das buch hab ich mir bestellt
solte ide tage mal dann da sein werde dann damit rumspielen und schauen
ob ich damit zurecht komme mir die Beispiele anschauen. Damit ich euch
nicht mehr so belästigen muß. Schönen Tag dann noch.
mfg
So ich hab mal wider ein Problem hab die Schaltung fertig gelötet die
Funktioniert auch. hab anstelle von rand() mal die zahlen 1 bis 6
eingegeben die werden auch angezeigt. Wenn ich aber rand() benutze kommt
immer nur die 3 raus und ich muß auch noch jedes mal neustarten da mein
programm noch nicht ganz optimal ist glaube ich. Wenn jemand mal wider
ne idee hat melden.
Meinem verstendnis nach mach doch rand() nichts anderes als
pseudowillkürlich zahlen festlegen un ddie dann wie bei mir gefordert
berechnen. Vielleicht leuft das bei dem controler ihrgend wie anders.
Wenn jenad weis wie das hir ist würde ich mich freuen wenn jemand sein
wissen mit mir teilt.
#include <msp430x20x2.h>
#include <stdlib.h>
int x;
int main (void){
WDTCTL = WDTPW + WDTHOLD; // Watchdog aus
P1SEL &= 0x00; //I/O funktion festgelegt
P1DIR &= 0x00; //
P1DIR |= 0xFE; //P1.0 Ausgang rest Eingang
P1OUT &= 0x00; //Ausgänge auf 0
P1IN &= 0x00; //Eingänge auf 0
P1REN |=0x01; //Internen Widerstand zuschalten
x =(rand()%6)+1;
while(1)
{ if((P1IN & 0x01)==1){
if (x==1){P1OUT = 0x0C;}
else if
(x==2){P1OUT = 0xB6;}
else if
(x==3){P1OUT = 0x9E;}
else if
(x==4){P1OUT = 0xCC;}
else if
(x==5){P1OUT = 0xDA;}
else
{P1OUT = 0xF8;}
}}
}
Marek S. schrieb:> P1REN |=0x01; //Internen Widerstand zuschalten> x =(rand()%6)+1;
Du erzeugst nur einmal eine Zufallszahl - das muss mit in die Schleife!
Marek S. schrieb:> Funktioniert auch. hab anstelle von rand() mal die zahlen 1 bis 6> eingegeben die werden auch angezeigt. Wenn ich aber rand() benutze kommt> immer nur die 3 raus
logisch.
Da du deinen µC jedesmal neu startest, kommt da immer das selbe raus.
rand() saugt sich ja nicht irgendwelche Zahlen aus dem Kosmos sondern
benutzt eine Formel um aus einem vorhandenen Wert den nächsten Wert zu
berechnen. Startet rand() immer mit derselben Zahl, dann kommt auch
immer dieselbe Zahl als nächste Zahl raus. Wenn du den µC neu startest
wird die erste Zahl immer auf denselben Wert initialisiert und daraus
folgt dann alles andere.
Jetzt weißt du auch, wozu srand() gut ist :-)
> und ich muß auch noch jedes mal neustarten da mein> programm noch nicht ganz optimal
nicht optimal ist gut :-)
Du hast wirklich das letzte Semester ziemlich gepennt wenn du die
Ursache dafür nicht siehst.
Das das nicht ihrgend wo herkommt das weis ich ja. Aber wußte nicht
genau wie man das hir genau funktioniert. Gepennt habe ich nicht ich war
immer fit aber so mit rand() haben wir nie was gesagt bekommen. Aber ich
hab mich auch bischen vorm programieren gedrückt wie der Teufel vorm
Weihwasser.
@ Dennis danke für den Tip aber hätte mir auch einfallen wüßen weil er
fürt das ja nur ein mal aus und bleibt dan in der schleife hängen und
fast das x =.. nicht mehr an.
Danke noch mal.
Marek S. schrieb:> Das das nicht ihrgend wo herkommt das weis ich ja. Aber wußte nicht> genau wie man das hir genau funktioniert. Gepennt habe ich nicht ich war> immer fit aber so mit rand() haben wir nie was gesagt bekommen.
Das hat nichts mit rand an sich zu tun
Der generelle Aufbau eines µC Programms ist
1
intmain()
2
{
3
4
// hier wird alles initialisiert
5
// und konfiguriert, so dass die eigentliche Arbeit gemacht werden kann.
6
7
while(1){
8
9
// hier findet die eigentliche Arbeit des Programms statt
10
11
}
12
}
Alles was vor dem while kommt, wird nur 1 mal gemacht.
Alles was regelmässig ablaufen soll bzw. Teil der Logik ist, die das
Programm implementieren soll, steht innerhalb der while-Schleife.
Sollte eigentlich nach den ersten 2 oder 3 Übungsprogrammen klar sein.
Teil deines Würfels ist es, dass immer wieder neue Zufallszahlen
generiert werden müssen, daher kann die Generierung der Zahlen nicht vor
dem while kommen.
Kann mir vielleicht einer einen Hinweis geben wie man den Würfel
möglichst einfach "ausrollen" lassen kann? Ich hab mir gedacht das
vielleicht noch mit na schleife zu machen oder so hab aber keine Ahnung
wie.Sitze gerade rum und zerbreche mir den Kopf aber gescheit kommt
nichts bei raus es ist einfach zu warm. Mit nem Interrupt macht das
glaube ich nicht so viel sin da ich ja noch nicht mal nn Timer benutze.
Ich bin wie immer dankbar für jede art von hilfe ich brauch nur nen
anstoß in die richtige richtung oder gibt es dafür schon beispile die
man sich anschauen kann. Danke schon mal.
mfg
Marek S. schrieb:> vielleicht noch mit na schleife zu machen oder so hab aber keine Ahnung> wie.Sitze gerade rum und zerbreche mir den Kopf aber gescheit kommt> nichts bei raus es ist einfach zu warm. Mit nem Interrupt macht das> glaube ich nicht so viel sin da ich ja noch nicht mal nn Timer benutze.
Das wäre grundsätzlich kein Argument
Aber mit deinem Wissen solltest du um Interrupts einen großen Bogen
machen. Das kann zur Zeit nur schief gehen.
Da hast du recht dafür weis ich warcheinlich noch nicht genug und hab
kein eÜbung drinne. Deswegen beschäftige ich mich ja auch mit da mit
aber gerade stoße ich ihrgend wie an die Grenze hab kein Beispiel wie
man so was realiesiren kann. Mir wurde auch nicht gesagt wi ich das
machen kann hab keine großartige idee auser das man das vielleicht mit
na schleife machen kann. Vielleicht könnt ihr mir wie gesagt nen anstoß
geben mit dem ich mich beschäftigen kann oder nen beispiel zeigen wie
man das machen könnte und ich probiere dann rum bis ich das dann
verstanden habe.
mfg
Marek S. schrieb:> hab keine großartige idee
hier liegt eines der Hauptprobleme
> auser das man das vielleicht mit> na schleife machen kann.
Ist doch schon ein Ansatz!
Und du sagst du hast keine Ideen :-)
Also was ist 'Ausrollen'
Du generierst nach dem loslassen des Tasters weiterhin Zufallszahlen und
zeigst sie an. Allerdings wird zwischen den Zahlen eine Pause eingelegt,
wobei die Pause immer länger wird. So lange bis die Pause eine gewisse
Grenze überschreitet, ab dann gilt die letzte Zahl
Das ist doch das, was du machen willst.
Frage 1:
wie kannst du definiert eine gewisse Zeit lang warten
> man das machen könnte und ich probiere dann rum bis ich das dann> verstanden habe.
Mit probieren wirst du da nicht weiter kommen.
Es gibt eine ganz einfache Lösung:
Zentrales Element ist die Wartezeit in einer Variablen.
Wenn die unter einer gewissen Grenze liegt, wird die nächste Zufallszahl
erzeugt.
Abgesehen davon zeigt das Programm ständig die Zufallszahl an und wartet
danach die angegebene Wartezeit (wenn die Wartezeit unter der Grenze
liegt).
Und jetzt kommt der Trick:
Wird eine Taste gedrückt, so wird die Wartezeit sehr klein gesetzt. Der
restliche Meschanismus sorgt dann dafür, dass rasend schnell
Zufallszahlen erzeugt und angezeigt werden.
Wird die Taste losgelassen, so geht der Mechanismus grundsätzlich
weiter, nur wird die Wartezeit immer ein klein wenig erhöht. Das
Programm lässt den Würfel nach loslassen der Taste 'weiterrollen' wobei
das Rollen immer langsamer wird. Irgendwann geht die Wartezeit über die
Grenze drüber und der Würfel steht (und es werden auch keine neuen
Zufallszahlen mehr erzeugt)
1
Wartezeit=waskleines
2
3
while(1)
4
5
if(Tastegedrückt)
6
Wartezeit=waskleines
7
8
if(Wartezeit<Grenze)
9
Augenzahl=nächsteZufallszahl
10
11
Augenzahlanzeigen
12
13
if(Wartezeit<Grenze){
14
warteWartezeit
15
erhöheWartezeit
16
}
17
}
Die Wartezeit steuert also
ob überhaupt Zufallszahlen erzeugt werden
wie lange diese angezeigt werden
und dadurch dass sie immer länger wird, rollt der Würfel aus. Ist eine
Taste gedrückt, so wird dieser Mechanismus ausgehebelt, indem die
Wartezeit ständig immer wieder auf 'sehr kurz' gestellt wird.
Marek S. schrieb:> Kann mir vielleicht einer einen Hinweis geben wie man den Würfel> möglichst einfach "ausrollen" lassen kann?
Ich hab sowas schonmal gemacht mit nem AT89C2051.
Allerdings nicht mit Pseudozufall, sondern mit echtem Zufall.
Dazu läuft ein Timer unsichtbar und prüft zum exakt gleichen Zeitpunkt
den Taster. Somit ist der Mensch das vom CPU-Takt unabhängige
Zufallsereignis.
Und der andere Timer rollt sichtbar den Würfel und rollt dann aus, bis
der unsichtbare Wert erreicht ist. Er rollt so langsam, daß der Eindruck
entsteht, man könnte manipulieren.
Beide Timer laufen mit verschiedenen Primzahlen als Intervall.
Nach Loslassen ist die Taste ne Zeitlang gesperrt, um Schummeln zu
verhindern.
Nach ner weiteren Zeit geht er in Power-Down, d.h. es ist kein
Einschalter notwendig.
Peter
Ja genau das soll passieren. ich werde mir das mal in ruhe zu gemüte
führen und mal durchdenken wie ich das bei mir einfügen kann. Ich danke
schon mal für deine Hilfe. Bei weiteren problemen wende ich mich wider
an euch. Ihr seit die besten und wenn es läuft stelle ich das programm
auch mal hier rein.
mfg
Oje,
sind die guten alten Zeiten vorbei, in denen man nen elektronischen
würfel noch diskret aufgebaut hat mit nem 3bit zähler und
logikverknüpfungen für die anzeige?
fass schrieb:> Oje,>> sind die guten alten Zeiten vorbei, in denen man nen elektronischen> würfel noch diskret aufgebaut hat mit nem 3bit zähler und> logikverknüpfungen für die anzeige?
Ja.
Heutzutage braucht man ja auch ein PC samt Programm um einen
Hausmeister, tschuldigung, Facility Manager zu casten.
fass schrieb:> sind die guten alten Zeiten vorbei, in denen man nen elektronischen> würfel noch diskret aufgebaut hat mit nem 3bit zähler und> logikverknüpfungen für die anzeige?
Ja, die Zeiten sind glaub ich echt vorbei :) Das geht einfach viel
schneller & kostet auch nicht mehr!
so sollte es fairer sein:
> while( 1 ) {>> if( Taster gedrückt ) {> Augenzahl = Augenzahl + 1;> Augenzahl = Augenzahl % 6;> }>> else {>> if( Augenzahl == 0 )> // an den LED das Bitmuster für 1 ausgeben> ....
hängt aber natürlich davon ab, wie das modulo implementiert wird.
Hi wie angedeutet hab ich eine Lösung meines Problmes hingekriegt sas
das wochenede mal dranne. So jetzt stelle ich das mal hoch und Ihr könnt
ja mal sage ob das so gut ist weil laufen tut es oder wo man was besser
machen könnte. Danke schon mal.
mfg
#include <msp430x20x2.h>
#include <stdlib.h>
int x;
char start=0; // Variable für Tastendruck
char anz; //Variable für das Ausrollen (wie oft)
unsigned int pause; //länge der Pause zwische den Zahlen
void genZahl(){
x =(rand()%6)+1; // "Zufalige generierung von 1 bis 6
switch (x){
case 1: P1OUT = 0x0C; break; // Die jeweiligen Segmente der
case 2: P1OUT = 0xB6; break; // Anzeige werden angesprochen
case 3: P1OUT = 0x9E; break;
case 4: P1OUT = 0xCC; break;
case 5: P1OUT = 0xDA; break;
case 6: P1OUT = 0xF8; break;
}
}
void delay(int p){//Verzögerungsfunktion
while(p>0){--p;}
}
int main(void){
WDTCTL = WDTPW + WDTHOLD; // Watchdog aus
P1SEL &= 0x00; //I/O funktion festgelegt
P1DIR &= 0x00; //
P1DIR |= 0xFE; //P1.0 Ausgang rest Eingang
P1OUT &= 0x00; //Ausgange auf 0
P1IN &= 0x00; //Eingange auf 0
P1REN |=0x01; //Internen Widerstand zuschalten
anz=4; // wie oft sich der würfel bewegen soll
pause=10000; // länge der pause
while(1){
// Generirung der "Zufalszahl" und merken on knopf gedrückt oder nicht
if ((P1IN & 0x01)==1){
start=1;
while((P1IN & 0x01)==1){genZahl();}
//
if(start==1){
while(anz>0){
genZahl();
delay(pause);
pause = pause + 1000; // Pause verlangern
--anz;
}
pause=10000; //Anfangswert der Pause
start=0; //alle Zahlen wurden ausgerollt
anz=4; //wie oft sich der würfel bewegen soll
}
}
}}
Deine Code-Formatierung ist schauderhaft. Arbeite daran!
Ein optisch sauberer Code ist nicht nur optischer Aufputz, sondern auch
ein wichtiges Hilfsmittel um Logik-Fehler zu sehen und zu finden.
Eines der ersten und einfachsten Hilfsmittel dazu sind Einrückungen. Das
funktioniert aber nur dann wenn du
konsequent
und konsistent
deine Einrückungen durchführst.
1
#include<msp430x20x2.h>
2
#include<stdlib.h>
3
4
intx;
5
charstart=0;// Variable für Tastendruck
6
charanz;//Variable für das Ausrollen (wie oft)
7
unsignedintpause;//länge der Pause zwische den Zahlen
8
9
voidgenZahl(){
10
x=(rand()%6)+1;// "Zufalige generierung von 1 bis 6
11
switch(x){
12
case1:P1OUT=0x0C;break;// Die jeweiligen Segmente der
13
case2:P1OUT=0xB6;break;// Anzeige werden angesprochen
14
case3:P1OUT=0x9E;break;
15
case4:P1OUT=0xCC;break;
16
case5:P1OUT=0xDA;break;
17
case6:P1OUT=0xF8;break;
18
}
19
}
20
21
voiddelay(intp){//Verzögerungsfunktion
22
while(p>0){
23
--p;
24
}
25
}
26
27
intmain(void){
28
WDTCTL=WDTPW+WDTHOLD;// Watchdog aus
29
30
P1SEL&=0x00;//I/O funktion festgelegt
31
P1DIR&=0x00;//
32
P1DIR|=0xFE;//P1.0 Ausgang rest Eingang
33
P1OUT&=0x00;//Ausgange auf 0
34
P1IN&=0x00;//Eingange auf 0
35
P1REN|=0x01;//Internen Widerstand zuschalten
36
37
anz=4;// wie oft sich der würfel bewegen soll
38
pause=10000;// länge der pause
39
40
while(1){
41
// Generirung der "Zufalszahl" und merken on knopf gedrückt oder nicht
42
if((P1IN&0x01)==1){
43
start=1;
44
45
while((P1IN&0x01)==1){
46
genZahl();
47
}
48
49
//
50
if(start==1){
51
while(anz>0){
52
genZahl();
53
delay(pause);
54
pause=pause+1000;// Pause verlangern
55
--anz;
56
}
57
58
pause=10000;//Anfangswert der Pause
59
start=0;//alle Zahlen wurden ausgerollt
60
anz=4;//wie oft sich der würfel bewegen soll
61
}
62
}
63
}
64
}
Auch musst du dich mit dir selbst einigen, wie du es mit Leerzeichen
halten willst.
Hier
pause = pause + 1000; // Pause verlangern
machst du Leerezeichen, hier
start=1;
machst du keine
Auch wenn es dem Compiler egal ist: Mach Leerzeichen! Dein Code ist viel
leichter zu lesen, wenn nicht alle 'Wörter' im Source Code auf 'Knirsch'
stehen (dicht an dicht). Seit Kindesbeinen hast du dein Gehirn
trainiert, dass zwischen Wörtern ein Leerraum steht. An diesem Leerraum
erkennt dein Gehirn ganz von alleine wo Wörter anfangen und wo Wörter
aufhören. Du brauchst dann nicht mit den Augen ständig durch eine Zeile
zu flitzen um die Einzelteile zu identifizieren
Code schreibt man nur einmal (oder ändert ihn nur selten). Man liest ihn
aber viele male! D.h. schreib den Code so, dass du ihn gut lesen kannst.
Das kostet kaum Zeit, hilft dir aber beim Verstehen dessen was du
geschrieben hast.
Und das allerwichtigste: Sei konsistent!
Ob du die öffnende { in derselben Zeile schreibst, oder in der nächsten,
ist nicht so wichtig, als das dein { } Schema immer gleich ist!
Wenn die schliessende } immer in derselben Spalte steht, wie die
Anweisung, die die öffnende { enthält, dann geht so etwas
1
while(p>0){--p;}
gar nicht!
Im Sinne der Konsitenz muss es heissen
1
while(p>0){
2
--p;
3
}
Das hat dann auch den Vorteil, dass auch ein Blinder mit Krückstock aus
2 Meter Entfernung greifen kann, dass hier etwas besonderes passiert und
eine Anweisung von einer anderen abhängt. Sonst wär sie nämlich nicht
eingerückt.
Marek S. schrieb:> Danke für den hinweis werde mich bemüchen das in Zukunft zu> berücksichtigen. Werde das jetzt mal anpassen bei mir.
Und wichtig für die Zukunft:
Nicht im Nachhinein. Gleich von Anfang an richtig machen!
Das bischen Zeit, das dir die Formatierung kostet, kriegst du 100-fach
durch verringerte Fehlersuchzeit zurück.