Forum: Mikrocontroller und Digitale Elektronik MSP430F2012 Elektronischern Würfel Programmieren


von m. S. (marek)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

von m. S. (marek)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

> 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
int main()
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( Taster gedrü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
       else if( Augenzahl == 1 )
27
         // an den LED das Bitmuster für 2 ausgeben
28
29
       else if( Augenzahl == 2 )
30
         // an den LED das Bitmuster für 3 ausgeben
31
32
       else if( Augenzahl == 3 )
33
         // an den LED das Bitmuster für 4 ausgeben
34
35
       else if( Augenzahl == 4 )
36
         // an den LED das Bitmuster für 5 ausgeben
37
38
       else if( 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.

von m. S. (marek)


Lesenswert?

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

von Dennis (Gast)


Lesenswert?

Gehst du auch noch vor die Tür, oder bleibste jetzt 24/7 am 
Schreibtisch? :)

von m. S. (marek)


Lesenswert?

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

von Dennis (Gast)


Lesenswert?

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 :)

von m. S. (marek)


Lesenswert?

Genau du hast es erraten:-). Nein natürlich nicht das dient alles der 
wissens Erweiterung ;-).

von Dennis (Gast)


Lesenswert?

Marek S. schrieb:
> das dient alles der
> wissens Erweiterung ;-)

Ja Bier doch auch, dachte ich!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Dennis (Gast)


Lesenswert?

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 :)

von Stefan (Gast)


Lesenswert?

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**

von Karl H. (kbuchegg)


Lesenswert?

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

von Dennis (Gast)


Lesenswert?

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!

von m. S. (marek)


Lesenswert?

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

von S. Z. (szimmi)


Lesenswert?

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 :-)

von Karl H. (kbuchegg)


Lesenswert?

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
1
  while( 1 ) {
2
3
     if( Taster gedrückt ) {
4
       Augenzahl = Augenzahl + 1;
5
     }
6
7
     else {
8
       Augenzahl = Augenzahl % 6;
9
10
       if( Augenzahl == 0 )
11
         // an den LED das Bitmuster für 1 ausgeben
12
       ....

von S. Z. (szimmi)


Lesenswert?

Karl heinz Buchegger schrieb:
>
>
1
>   while( 1 ) {
2
> 
3
>      if( Taster gedrückt ) {
4
>        Augenzahl = Augenzahl + 1;
5
>      }
6
> 
7
>      else {
8
>        Augenzahl = Augenzahl % 6;
9
> 
10
>        if( Augenzahl == 0 )
11
>          // an den LED das Bitmuster für 1 ausgeben
12
>        ....
13
>

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

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von S. Z. (szimmi)


Lesenswert?

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.

von m. S. (marek)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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?

von Dennis (Gast)


Lesenswert?

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

von m. S. (marek)


Lesenswert?

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

von Dennis (Gast)


Lesenswert?

Marek S. schrieb:
> Damit ich euch
> nicht mehr so belästigen muß.

Solange immer ein wenig Eigenleistung dabei ist, ist das ja garkein 
Problem!

von m. S. (marek)


Lesenswert?

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;}
  }}
}

von Dennis (Gast)


Lesenswert?

Marek S. schrieb:
> P1REN |=0x01;  //Internen Widerstand zuschalten
> x =(rand()%6)+1;

Du erzeugst nur einmal eine Zufallszahl - das muss mit in die Schleife!

von Karl H. (kbuchegg)


Lesenswert?

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.

von m. S. (marek)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
int main()
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.

von m. S. (marek)


Lesenswert?

Danke für den Hinweis das werde ich ab jetzt berücksichtigen.

von m. S. (marek)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von m. S. (marek)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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 = was kleines
2
3
  while( 1 )
4
5
    if( Taste gedrückt )
6
      Wartezeit = was kleines
7
8
    if( Wartezeit < Grenze )
9
      Augenzahl = nächste Zufallszahl
10
11
    Augenzahl anzeigen
12
13
    if( Wartezeit < Grenze ) {
14
      warte Wartezeit
15
      erhöhe Wartezeit
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.

von Peter D. (peda)


Lesenswert?

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

von m. S. (marek)


Lesenswert?

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

von fass (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Dennis (Gast)


Lesenswert?

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!

von Vlad T. (vlad_tepesch)


Lesenswert?

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.

von m. S. (marek)


Lesenswert?

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
}

}

}}

von Karl H. (kbuchegg)


Lesenswert?

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
int x;
5
char start=0; // Variable für Tastendruck
6
char anz; //Variable für das Ausrollen (wie oft)
7
unsigned int pause; //länge der Pause zwische den Zahlen
8
9
void genZahl() {
10
  x =(rand()%6)+1; // "Zufalige generierung von 1 bis 6
11
  switch (x){
12
    case 1: P1OUT = 0x0C; break; // Die jeweiligen Segmente der
13
    case 2: P1OUT = 0xB6; break; // Anzeige werden angesprochen
14
    case 3: P1OUT = 0x9E; break;
15
    case 4: P1OUT = 0xCC; break;
16
    case 5: P1OUT = 0xDA; break;
17
    case 6: P1OUT = 0xF8; break;
18
  }
19
}
20
21
void delay(int p){//Verzögerungsfunktion
22
  while(p>0) {
23
    --p;
24
  }
25
}
26
27
int main(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.

von m. S. (marek)


Lesenswert?

Danke für den hinweis werde mich bemüchen das in Zukunft zu 
berücksichtigen. Werde das jetzt mal anpassen bei mir.
mfg

von Karl H. (kbuchegg)


Lesenswert?

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.

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.