Forum: Mikrocontroller und Digitale Elektronik Würfelspiel programmieren in C, leider keine Ahnung wie


von Herbert K. (planlos91)


Angehängte Dateien:

Lesenswert?

Hallo,
erstmal möchte ich mich vorstellen. Ich heiße Carsten und besuche 
derzeit das 2-jährige BK für Informations und Kommunikationstechnik und 
muss dort im Fach Informationstechnik als besondere Lernleistung ein 
Würfelspiel ,mit vorgegebenen Regeln, für einen Microcontroller 
programmieren. Der Haken ist nur, das ich in diesem Fach eine Niete bin. 
Es liegt mir leider gar nicht und ich hoffe das mir hier jemand helfen 
kann, solang es nicht zu viel Zeit in Anspruch nimmt.
Als Anhang habe ich das Aufgabenblatt und ein von mir erstelltes(nicht 
wirklich gutes) Struktogramm als pdf´s beigelegt.
Meine Probleme:
-Wie soll ich würfeln lassen? Mit Lauflicht? Wie mach ich das?
-Wie steuer ich die einzelnen LED´s an? welche Hex-Adressen?
-Wie gebe ich die Summe aller Augenzahlen als Dualzahl aus?
-Was kann ich an dem Struktogramm verbessern?
-Und schließlich, wie programmiere ich alles so das es auch 
funktioniert?

Die Ports des Controllers:
Port 0= 0x90h -> Schalter
Port 1= 0x10h -> Steuerport
Port 2= 0x80h -> Anzeige
Port 3= 0xB0h

Ich hoffen ihr könnt mir helfen, diese Arbeit ist mein Rettungsanker:(
Mit freundlichen Grüßen,
planlos91

: Verschoben durch User
von Pete K. (pete77)


Lesenswert?

Gib mal weitere Infos zu dem Controller und wie der programmiert wird.

Beschreibt das Bild im zweiten Anhang Dein Entwicklungsboard?

von Herbert K. (planlos91)


Lesenswert?

Was für Infos brauchst du denn? Soviel hab nähmlich leider nicht.
Ja das Bild zeigt die 5 "Würfel" und ist mein Entwicklunsboard.
Ich könnt noch ein Foto von dem Controller machen und hochladen, falls 
das was bringt.Wir programmieren mit KeiluVision und compilieren mit 
Pony Prog2000.
MfG,
Carsten

von Justus S. (jussa)


Lesenswert?

Carsten Stulgies schrieb:

> Ich könnt noch ein Foto von dem Controller machen

die Bezeichnung wäre mal ein Anfang...

von Karl H. (kbuchegg)


Lesenswert?

Das ist jetzt schwer, dir zu helfen, ohne die Aufgabe komplett selbst zu 
lösen.

Welche Teile kriegst du alleine hin?

* Kannst du eine einzelne LED (egal welche) an deinem Ausgabeboard 
gezielt aufleuchten lassen?

(Dein Struktogramm ist ziemlich nichtssagend. Daher kann man das auch 
links liegen lassen. Daraus geht nichts hervor)


> -Wie soll ich würfeln lassen? Mit Lauflicht? Wie mach ich das?

Ein Lauflicht würfelt nicht :-)

Nein. Gemeint ist in der Aufgabenstellung, dass es für jeden Würfel eine 
Variable gibt, die die momentane Augenzahl des Würfels darstellt. Dein 
Programm läuft ständig in einer Endlosschleife (und das sehr schnell). 
Ist ein Würfel auf 'würfeln' eingestellt, wird die zugehörige Augenzahl 
Variable einfach immer nur um 1 erhöht und bei 7 wieder auf 1 
zurückgestellt. Da der µC diese Arbeit viele tausend mal in der Sekunde 
erledigen kann, ist es unwahrscheinlich, dass irgendjemand in der Lage 
ist, exakt den Zeitpunkt zu treffen, an dem die Augenzahl-Variable einen 
ganz bestimmten Wert hat.

> -Wie steuer ich die einzelnen LED´s an? welche Hex-Adressen?
Das müsstest eigentlich du wissen

> -Wie gebe ich die Summe aller Augenzahlen als Dualzahl aus?
Indem du die Augenzahlen zusammenzählst.
In einem Computer ist alles binär, d.h. Die vermeintliche Einschränkung 
'als Dualzahl' ist eigentlich eine Vereinfachung für dich.
Wo du die Ausgabe machen kannst: Das musst du wissen.
Hast du irgendwo zb 8 Led zur Verfügung?

> -Was kann ich an dem Struktogramm verbessern?
So ziemlich alles.
Das jetzige Struktogramm ist ... nicht zu gebrauchen

> -Und schließlich, wie programmiere ich alles so das es auch
Indem du nicht dia Aufgabe als Ganzes siehst, sondern dich von einem 
Teil zum nächsten durcharbeitest und dich deinem Ziel in kleinen 
Schritten näherst.

Zb. wäre es eine Vereinfachung, sich zunächst nur auf 1 Würfel zu 
konzentrieren. Dazu muss man aber die LED gezielt ansteuern können. Also 
könnte es dein erstes Ziel sein
* Eine einzelne LED an einem Würfel anzusteuern
* Der nächste Schritt wäre es dann zb, mehrere LED gezielt anzusteuern, 
so dass sich das Muster für eine bestimmmte Augenzahl ergibt.
* Hast du eine Funktion, die gezielt eine bestimmte Augenzahl an einem 
Würfel anzeigt, dann könnte man einmal weitergehen und mit dem 
'Würfelmechanismus' und einem Schalter einen einzelnen tatsächlichen 
Würfel aufbauen. Schalter ein - Würfel rollt - Schalter aus - Würfel 
bleibt stehen und die Augenzahl wird angezeigt.
* und so gehts weiter. Vom einfachen zum schwierigen


Wobei ich auch sagen muss, dass die Aufgabe eines Multiplexings (von dem 
war bisher noch gar nicht die Rede) schon ein gewisses Verständnis 
erfordert. Der Schwierigkeitsgrad des Multiplexins passt nicht so recht 
zu deinen Fragen hier. Was hast du bisher programmiert? Oder hast du nur 
Däumchen gedreht. Das rächt sich jetzt!

von Herbert K. (planlos91)


Lesenswert?

Atmel AT89S8252

von toxy (Gast)


Lesenswert?

das datenblatt wirst du früher oder später brauchen:
http://www.datasheetarchive.com/SAB80C537-datasheet.html

von Detlev T. (detlevt)


Lesenswert?

Hallo Carsten,

aus deinem Struktur-Diagramm lese ich, dass du die Aufgabenstellung noch 
gar nicht verstanden hast. Zu Beginn sollen alle Würfel "würfeln" - bei 
dir tut das immer nur einer. Außerdem muss die Reihenfolge beliebig sein 
können, in der die Würfel gestoppt werden. Auch das ist in deinem 
Entwurf nicht enthalten.

Die Idee von Karl Heinz, sich das Ganze erst einmal mit einem Würfel zu 
überlegen, ist sicher nicht falsch. Wie würfelt der Würfel? Wie wird das 
in der Anzeige umgesetzt?

Dann kann man mit fünf Würfeln weitermachen, wovon erst einmal nur der 
erste angezeigt wird. Dann nur der zweite. Das Multiplexen, um alle 
Würfel anzuzeigen, solltest du dann erst ganz zum Schluss hinzufügen, 
wenn der Spielablauf als solcher funktioniert.

Gruß, DetlevT

von Herbert K. (planlos91)


Lesenswert?

Hallo,
> Kannst du eine einzelne LED (egal welche) an deinem Ausgabeboard
> gezielt aufleuchten lassen?
Nein, bei mir kommt hier schon eine Fehlermeldung:
sfr Steuer=0x10;
sfr Anzeige=0x80;
sfr Schalter=0x90;
wieso?
So haben wir das in der Schule immer gemacht, dort arbeiten wir mit dem 
Infineon SAB 80C537 und können direkt mit KeiluVision Compilieren und 
ausgeben. Für zuhause habe ich allerdings den Atmel AT89S8252 
mitbekommen und muss, da dieser keinen externen Speicher besitzt, über 
Pony Prog laufen lassen. Ich habe mit diesem Controller noch nie 
gearbeitet und habe deshalb keine Ahnung.Laut Lehrer müsste dieser aber 
bis auf die anderen Ports gleich laufen.

>> -Wie steuer ich die einzelnen LED´s an? welche Hex-Adressen?
> Das müsstest eigentlich du wissen
Naja, nein. Woher?


> Wobei ich auch sagen muss, dass die Aufgabe eines Multiplexings (von dem
> war bisher noch gar nicht die Rede) schon ein gewisses Verständnis
> erfordert. Der Schwierigkeitsgrad des Multiplexins passt nicht so recht
> zu deinen Fragen hier. Was hast du bisher programmiert? Oder hast du nur
> Däumchen gedreht. Das rächt sich jetzt!
Wir haben schon eine Aufgabe Multiplexing gemacht. Mit 4 
7-Segmentenanzeigen. Das ging auch einigermaßen da wir ziehmlich viel 
Infos hatten und wir gut an die Aufgabe hernageführt wurden.
Bis jetzt habe ich noch nicht viel in C programmiert. Wir programmieren 
erst seit einem viertel Jahr.Bis jetzt haben wir Lauflichter und so 
etwas gemacht und halt die 7-Segmentanzeigen.
Und nein, ich habe bis jetzt nicht nur Däumchen gedreht...

von Karl H. (kbuchegg)


Lesenswert?

Carsten Stulgies schrieb:
> Hallo,
>> Kannst du eine einzelne LED (egal welche) an deinem Ausgabeboard
>> gezielt aufleuchten lassen?
> Nein, bei mir kommt hier schon eine Fehlermeldung:
> sfr Steuer=0x10;
> sfr Anzeige=0x80;
> sfr Schalter=0x90;
> wieso?

Weil das kein Standard-C ist und da jeder Compiler Hersteller ein 
anderes Süppchen kocht.

> So haben wir das in der Schule immer gemacht, dort arbeiten wir mit dem
> Infineon SAB 80C537 und können direkt mit KeiluVision Compilieren und
> ausgeben.

Gut

> Für zuhause habe ich allerdings den Atmel AT89S8252
> mitbekommen und muss

Welchen Compiler benutzt du?
Und wie sieht dort der Mechanismus aus, mit dem man eine Portdefinition 
macht.

>, da dieser keinen externen Speicher besitzt, über
> Pony Prog laufen lassen.

Das ist erst mal nicht so wichtig.
PonyProg ist das Programm mit dem man das fertig übersetzte Programm in 
den Controller überträgt. Du hast noch kein Programm, geschweige denn 
ein übersetztes Programm. Also: Welchen Compiler benutzt du? Und was ist 
dort das Äquivalent zu den sfr Angaben?

>>> -Wie steuer ich die einzelnen LED´s an? welche Hex-Adressen?
>> Das müsstest eigentlich du wissen
> Naja, nein. Woher?

Ähm.
Es ist deine Hardware.
Hier kann das keiner wissen.

von Herbert K. (planlos91)


Lesenswert?

> Welchen Compiler benutzt du?
> Und wie sieht dort der Mechanismus aus, mit dem man eine Portdefinition
> macht.

Keil Monitor-51 Driver.Kann das sein?
Mechanismus für Portdefinition? Was ist das?
Wie gesagt ich prgrammier noch nicht lang Microcontroller und von sowas 
habe ich in der Schule nie gehört :(


> Und was ist
> dort das Äquivalent zu den sfr Angaben?
Das weiß ich nicht, eigentlich müsste das auch mit sfr gehn. Diejenigen 
die sich über die Ferien einen Controller ausgeliehen haben sollten in 
der letzten Stunde mit dem programmieren und dort haben wir das auch mit 
sfr gemacht.


> Ähm.
> Es ist deine Hardware.
> Hier kann das keiner wissen.
Ich habe leider kein Datenblatt oder so mitbekommen nur die Hex-Adressen 
von den Ports und das Aufgabenblatt. Vllt sollte ich meinem Lehrer eine 
E-mail schreiben und ihn um die notwendigen Informationen bitten...

von Karl H. (kbuchegg)


Lesenswert?

Carsten Stulgies schrieb:

> von den Ports und das Aufgabenblatt. Vllt sollte ich meinem Lehrer eine
> E-mail schreiben und ihn um die notwendigen Informationen bitten...

Das wäre keine schlechte Idee.

von Herbert K. (planlos91)


Lesenswert?

Keil C51-Compiler

von Herbert K. (planlos91)


Lesenswert?

Okey, also was brauch ich alles? Datenblatt, Mechanismus zu 
Portdefinition...

von Karl H. (kbuchegg)


Lesenswert?

Carsten Stulgies schrieb:
> Okey, also was brauch ich alles? Datenblatt, Mechanismus zu
> Portdefinition...

Dein erstes Testprogramm besteht darin, eine LED auf dem 
Erweiterungsboard gezielt ein/ausschalten zu können.
Praktisch alles, was dazu nötig ist, ist von deinem Compiler/Hardware 
abhängig. Entweder du kannst diese Info liefern oder du musst sie 
erfragen. Aber hier im Forum kann dir niemand diese Info geben.

von toxy (Gast)


Lesenswert?

ohne kommentar editen gehört sich eigentlich nicht...

> Ich habe leider kein Datenblatt oder so mitbekommen
datenblatt für den AT89S8252:
http://www.atmel.com/dyn/resources/prod_documents/doc0401.pdf
sfr map befindet sich auf seite 6

übrigens: www.gidf.de

von Vlad T. (vlad_tepesch)


Lesenswert?

oh mann,
zum Glück sehen die aktuellen Datasheets um einiges besser aus.
das Ding ist ja furchtbar

von Herbert K. (planlos91)


Lesenswert?

toxy schrieb:
> ohne kommentar editen gehört sich eigentlich nicht...
Entschuldige und danke fürs Datenblatt.

von Axel R. (Gast)


Lesenswert?

Entsprechend der sechs möglichen Würfelkombinationen...
immmer 2 LEDs geschaltet.
Portzuordnung:
1
O3      O2
2
3
O1  O0  O1
4
5
O2      O3


Stimmt das? Kann das jemand lesen?

Naja - anspruchslos isses nicht ;)) Etwas überlegen muss man wohl...

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Du musst erstmal wissen, welche LED-Kombinationen an welchem CPU-Port 
hängen.
Und welche Ports für die gemeinsame Ansteuerung der Würfel zuständig 
sind.
Ach ja, genauso welcher Schalter über welche Ports abgefragt werden 
können.

Mit diesem Wissen (und dem, wie Du das Programm in den Prozessor 
bekommst) kannst Du dann anfangen einzelne LEDs über einzelen Schalter 
ein- und auszuschalten.

Danach kommt dann ein einfacher Interrupt-Blinker dran (C-Tutorial).

Jetzt musst Du eine Funktion schreiben, welches den Inhalt einer 
8-Bit-Variablen (du brauchst nur die unteren 3 bit) in eine passende 
Augenzahl umsetzt und auf den LEDs (eines Würfels) darstellt. Stichwort 
"lookup table".

Nun verwendest Du die Blinkroutine (nur etwas schneller) um diese 
Variable sehr schnell durchzuzählen. Mit einem Schalter kannst Du nun 
das Durchzählen unterbinden, also den Würfel anhalten.

Jetzt nimmst Du statt einer Variable fünf und fünf dazu passende 
Schalter.
Die einzelnen Variablen werden nun durch Multiplexing auf die fünf 
Würfel aufgeteilt.

Du kannst nun einzelne Würfel anhalten und wieder weiter laufen lassen 
(Achtung - Aufgabenstellung beachten!).

Wenn Du auch noch das Problem mit dem nicht weiterlaufen lassen gelöst 
hast, bist Du schon fertig.

Eventuell dann noch die einzelnen Würfelvariablen mit Zufallswerten 
vorinitialisieren. Wenn Du ganz gewitzt sein möchtest, kannst Du auch 
unterschiedliche Zählgeschwindigkeiten der Würfel einsetzen (gibt noch 
eine zusätzliche Zufallskomponente).

Viel Spass

von Vlad T. (vlad_tepesch)


Lesenswert?

aber für eine Schulaufgbe ist das schon ganz schön happig.
Wir hatten in Informatik 11. Klasse ein bisschen Delphi und Html, das 
wars dann auch schon.
Hab mich die meiste Zeit gelangweilt, oder Blödsinn gemacht ;)

von Axel R. (Gast)


Angehängte Dateien:

Lesenswert?

Das Pin-mapping der LEDs auf die Portbits ist tatsächlich in der Aufgabe 
enthalten. Leider ist die Qualität des Scans soo schlecht, das man 
(zumindest) auf meinem LCD nicht erkennen kann, wo welche LED drann 
kommt.

Daher frug ich, ob es jemand dort lesen kann ;)
Die mittlere an PORT2.0
Die mitte links und mitte rechts an PORT2.1
Die unten links und oben rechts an PORT2.2
Die beiden anderen an PORT2.3
So würde ich das lesen.

Ist das denn auf dem Blatt Papier auch so schlecht zu erkennen?

von Axel R. (Gast)


Angehängte Dateien:

Lesenswert?

so - nun aber

von Chris S. (hondaracer1)


Lesenswert?

na das sieht doch garnicht so schlecht aus, stellt sich nurnoch eine 
wichtige frage, kannst du gezielt die leds zum leuchten bringen? also 
die 3 pins auf high und low schalten? wenn ja wie sieht dafuer dein code 
aus?
wenn nein, dann lern es :-P
wenn das funktioniert koennen wir dir bei deinem eigentlichen 
wuerfelcode helfen.

wie bereits erwaehnt wurde ist eine lookuptable am sinnvollsten. Falls 
dir der begriff neu ist: eine lookuptable ist sozusagen ein array mit 
werten oder eben ein pointer auf eine list von werten (wie auch immer 
man es sehn will xD)

in deinem Fall kommt an die erste stelle der Lookuptable die passende 
bitkombination um eine 1 auf dem wuerden darzustellen, an die zweite 
stelle die kombination um eine 2 darzustellen .....
dann wuerde ein code ungefaehr so aussehn:

byte lookup[6] = {1,2,3,4,5,6};
byte i = 0;

while(1)
{
i++;
if (Taster1 = true)
{ Port2 = lookup[i]; }
}


ja ja ja, mein C ist etwas eingerostet aber die grundstruktur sollte 
rueberkommen hoff ich. Die oben genannte lookuptable(lookup) musst du 
natuerlich mit den sinnvollen bitkombinationen fuellen.

Da ich mal davon ausgehe das an den restlichen Pins von Port2 noch 
sachen haengen musst du statt Port2 = lookup[i]; das ganze mit masken 
machen. Aber wie die masken genau aussehn muessen haengt davon ab was an 
den pins noch dran haengt, daher bist auch hier wieder DU gefragt ;-)


ps.: ich weis das man das auch mit interrupts machen koennte anstatt zu 
pollen, und das mein code sehr vereinfacht ist aber es ist eine simple 
loesung bei der man recht wenig falsch machen kann.

von Vlad T. (vlad_tepesch)


Lesenswert?

pollen ist schon besser. Interupts zu entprellen ist bedeutend 
schwieriger

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Vlad Tepesch schrieb:
> aber für eine Schulaufgbe ist das schon ganz schön happig.
> Wir hatten in Informatik 11. Klasse ein bisschen Delphi und Html, das
> wars dann auch schon.
> Hab mich die meiste Zeit gelangweilt, oder Blödsinn gemacht ;)
Naja durch eine besondere Lernleistung soll man halt auserhalb des 
normalen Unterichtes etwas machen was durchaus auch länger als ein 
Schuljahr dauert und kann so seine Abiturnote um einige Prozent 
verbessern. Wie das auf einer 'BK' ist weiß ich natürlich nicht.

Ob
> muss
> ich in diesem Fach eine Niete bin.
> Es liegt mir leider gar nicht
Allerdings die perfekten Vorraussetzungen sind... ein gewisses maß an 
Eigeninitiative (lesen des Tutorials z.B.) und Spaß an der Sache (und 
nicht nur ein "Rettungsanker") sollte schon dazugehören.

von Wolfgang B. (et-tutorials) Benutzerseite


Lesenswert?

Hallo Carsten,
vielleicht kann mein Kurs Dir ein wenig helfen

http://et-tutorials.de/mikrocontroller/

Hier geht es auch um Keil und C.

von Horst (Gast)


Lesenswert?

Hallo Carsten,

Kann es sein, dass Du zu bequem bist Dir etwas selbst zu erlernern bzw. 
mit der Materie zu beschäftigen. Du könntest der Einfachheit halber 
schreiben "Wer programmiert mir mein Würfelspiel"

mfg
Horst

von Herbert K. (planlos91)


Angehängte Dateien:

Lesenswert?

Hallo, ich habe jetzt versucht das Programm mit den 4 
7-Segment-Anzeigen(bietet sich an, da auch Multiplexing) auf den 
Controller zu übertragen, da dies im moment mein Hauptproblem ist.
Ich habe also den Controller an die 7-Segment Anzeigen angeschlossen, 
die Hex Adressen geändert und in den optionen den neuen Controller 
angegeben.
Das Problem ist das das Programm, welches in der Schule mit dem 
Schulcontroller tadelos lief auf diesem Controller nicht mehr läuft. 
Beim Compilieren kommt diese Fehlermeldung:
error C142:`SFR´: invalid base address  und
error C202: `Steuer´: undefinded identifier.

Was habe ich falsch gemacht? Eigenlich hieß es das der Controller 
genauso funktioniert wie der in der Schule nur das man Pony prog 
benutzen muss.Das dem nicht so ist vereinfacht das ganze nicht 
unbedingt.

Achja und dazu:
Horst schrieb:
> Hallo Carsten,
>
> Kann es sein, dass Du zu bequem bist Dir etwas selbst zu erlernern bzw.
> mit der Materie zu beschäftigen. Du könntest der Einfachheit halber
> schreiben "Wer programmiert mir mein Würfelspiel"
>
> mfg
> Horst
Nein kann es nicht. Ich habe mich sehr wohl damit beschäftigt, nur wenn 
man noch nicht lang Controller programmiert ist es doch schon sehr 
hilfreich etwas Hilfe zu bekommen. Außerdem habe ich niemanden darum 
gebeten mir den kompletten Quelltext zu schicken sondern nur mit 
Hinweise und Lösungsansätze zu geben...

An den Rest:Vielen Dank für die bis jetzt hier stehenden Posts und die 
damit verbundene Mühe:)
Viele Grüße, Carsten.

von Stephan (Gast)


Lesenswert?

Hi

schau dir mal die Adressen (SFR) der Ports an!
In den Datenblatt (siehe oben) sind andere Adressen für die Ports 
angegeben.

Adr. 0x80, 0x90 ....

mfg
Stephan

von Wolfgang B. (et-tutorials) Benutzerseite


Lesenswert?

Bist Du sicher, dass das Program, das in der Schule lief mit Deinem 
Quell-Code commpiliert wurde?

sfr steuer=0x10;

sieht etwas komisch aus.

Überprüf doch mal die Adresse.

von Herbert K. (planlos91)


Lesenswert?

Hab Hex Addressen nach Datenblatt geändert, jetzt funktionierts. Da 
wurden mir wohl falsche Addressen mitgegeben. Danke.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Carsten Stulgies schrieb:
> Hab Hex Addressen nach Datenblatt geändert, jetzt funktionierts. Da
> wurden mir wohl falsche Addressen mitgegeben. Danke.
Sagen wirs mal so: Trotz nichtfunktion hast du es versaumt die Werte 
eigenständig gegen zu prüfen... Nächstmal bist du schlauer und 
vergewisserst dich gleich im Datenblatt ;)

von Herbert K. (planlos91)


Angehängte Dateien:

Lesenswert?

So, ich sitz jetz seit halb 11 dran und es ist nicht wirklich was 
gescheites bei raus gekommen. Könnt ihr mir nicht helfen ein Grundgerüst 
aufzubauen?
Ich schaffs ja nicht mal auf der Platine eine LED anzusteuern :(
Ich habe mich auch bei 2 Klassenkameraden umgehört, die sitzen genauso 
ratlos vor ihrer Arbeit wie ich :)

von Wolfgang B. (et-tutorials) Benutzerseite


Lesenswert?

Hallo Carsten,
in der Keil Entwicklungsumgebiung gibt es Beispielprogramme zum 
Ansteuern der Ports.
Die Projekte heißen je nach Version HELLO oder BLINKY.

Guck Dir doch einmal die Quelldatein an, dort wird jeweils eine LED aus- 
und eingeschaltet.

Alternativ schreibe setze doch mal abwechselnd die Portpins für Deine 
LEDs auf "0" bzw. "1".
Einige müssten dann leuchten, die anderen nicht.

von Vlad T. (vlad_tepesch)


Lesenswert?

Wolfgang Bengfort schrieb:
> Alternativ schreibe setze doch mal abwechselnd die Portpins für Deine
> LEDs auf "0" bzw. "1".
> Einige müssten dann leuchten, die anderen nicht.

auf jeden Fall darf nicht vergessen werden, wenigstens einen der 
Steuer-Ausgange auf 1 zu setzen, sonst kannst du an den anderen Pins 
wackeln wie du willst und es wird gar nix passieren.
Am besten setzt du erst mal den gesammten Steuerport auf 1.
die Led-Würfel scheinen ja alle ihre eigenen Widerstände zu haben, so 
das das von der Hardware her passen sollte.

von Wolfgang B. (et-tutorials) Benutzerseite


Lesenswert?

Wenn ich das richtig auf dem Arbeitsblatt erkenne sind die Steuerungen 
LOW-aktiv.
Dann müsstest Du eine "0" in die Steueraugänge schreiben.
Versuchs also einfach mal (vielleicht auch hier abwechselnd).

von Vlad T. (vlad_tepesch)


Lesenswert?

Wolfgang Bengfort schrieb:
> Wenn ich das richtig auf dem Arbeitsblatt erkenne sind die Steuerungen
> LOW-aktiv.

du hast recht, das ist mir entfallen, seit ich das Aufgabenblatt gelesen 
habe.

Übrigens: das Aufgabenblatt ist ein pdf. wenn man das als solches öffnet 
kann mans ganz gut lesen.

von Wolfgang B. (et-tutorials) Benutzerseite


Lesenswert?

Ja, danke.
So liest's sich leichter ;-)

von Chris S. (hondaracer1)


Lesenswert?

dann funzt das mit deiner leuchtenden led jetzt?  na dann bist ja schon 
fast fertig :-)

Schritt 1: LED gezielt leuchten lassen
Schritt 2: Wuerfel gezielt leuchten lassen
Schritt 3: eine LED in Abhaengigkeit eines Schalters leuchten lassen
Schritt 4: Party machen

Ich fang von hinten an denn morgen is mein letzter arbeitstag

von Herbert K. (planlos91)


Lesenswert?

Hallo, ich bins wieder ;)

Chris S. schrieb:
> Schritt 1: LED gezielt leuchten lassen
> Schritt 2: Wuerfel gezielt leuchten lassen
> Schritt 3: eine LED in Abhaengigkeit eines Schalters leuchten lassen
> Schritt 4: Party machen
Das hört sich so einfach an :)

Könntet ihr mir nicht vllt ein verständliches Struktogramm für das 
Würfelspiel schreiben, damit lässt es doch einfacher Programmieren und 
ich hätte zumindest nen Grundrahmen.
Auf jeden Fall vielen Dank bis jetzt für alle Antworten :)
Viele Grüße,
Carsten

von Karl H. (kbuchegg)


Lesenswert?

Solange von dir nicht die Rückmeldung kommt, dass du LED gezielt 
ein/ausschalten kannst, ist alles andere sinnlos.

Aber seis drum, für 1 Würfel

Hauptprogram:
*************

      Augenzahl1 = 0
            |
            v
  +---> wiederhole
  |         |
  |      Schalter für Würfel 1 auf 'würfeln' ? --+
  |              Ja                            Nein
  |               |                              |
  |               v                              |
  |      Augenzahl1 = Augenzahl1 + 1             |
  |      Augenzahl1 > 5 ? -----------+           |
  |            Ja                   Nein         |
  |             |                    |           |
  |             v                    |           |
  |         Augenzahl1 = 0           |           |
  |             |                    |           |
  |             |<-------------------+           |
  |             |<-------------------------------+
  |             |
  |       Augenzahl_anzeigen( Augenzahl1 )
  |             |
  +-------------+


Das Problem an der ganzen Sache:
Die Berechnungen, die da vorkommen, sind trivial. Alles steht und fällt 
aber mit den beiden Punkten "Schalter für Würfel 1 auf 'würfeln'" bzw. 
mit der Ansteuerung der LED in der Funktionalität 'Augenzahl1 anzeigen'. 
Und die kann dir von hier aus keiner abnehmen, da sie hardwareabhängig 
sind. Also musst du da selber durch. Und da hilft dir auch kein 
Struktogramm oder Flussdiagramm. Da muss man sich einfach auf seinen 
Hintern setzen und solange rumspielen bis es klappt.

* Erst mal irgendeine LED einschalten.

* Dann gezielt ausprobieren die einzelnen geforderten Muster für die 
Anzeigen 1 bis 6 zu erzeugen die im Programm durch die Zahlen 0 bis 5 in 
der Variablen Augenzahl1 repräsentiert sind. Ist Augenzahl1 gleich 0, 
dann wird das LED-Muster für 1 angezeigt. Ist Augenzahl1 gleich 1, dann 
kommt das Muster für 2, etc.

* Dann den Schalter abfragen
Für die ersten Versuche, reicht es völlig aus, wenn der Schalter einfach 
nur zwischen 2 Mustern auf der Würfelanzeige umschaltet. Da du das ja im 
vorherigen Schritt schon gelernt hast, kann man sich ganz darauf 
konzentrieren, wie der Schalter abgefragt wird. Trotzdem ist diese 
Zwischenaufgabe noch einfach genug, dass man den Erfolg kontrollieren 
kann

* Und dann kann man den Würfel nach obigem Schema mal "rollen" lassen

* Und zu guter letzt erweitert man das Schema von einem Würfel zu 5 
Würfel, wobei die Würfel einfach nur rollen sollen, wenn ihr zugehöriger 
Schalter entsprechend steht

* Dann baut die geforderte Programmlogik noch ein.

* Fertig

von Herbert K. (planlos91)


Lesenswert?

So, habe jetzt  versucht einzelne LED´s und Würfel anzusprechen.
Ungefähr so:
/**** globale Variablendeklaration ************************************/
sfr steuer=0x90; //Port1
sfr anzeige=0x0A0; //Port2
sfr schalter=0x80; //Port0

char wuerfel [5]={0x90,0x91,0x92,0x93,0x94};  /*müssten doch die 
Hexadressen für die 5 Würfel sein? Da Würfel 0 ja an Pin 0 von Port 1 
hängt? */

char leds [4]={0x0A0,0x0A1,0x0A2,0x0A3}; /* die 4 LED Kombinationen, Pin 
0-4 an Port 2 ? */

/**** Hauptprogramm ************************************************/
main()
{
while(1)  // Endlosschleife => Programmabbruch mit RESET
{

//steuer=0xFF;
anzeige=leds[3];     //drittes Element, also augenzahl 2
steuer=wuerfel[1];   //erstes Element in array, also würfel 1

}    // Ende der Endlosschleife
}    // END MAIN

Warum funktioniert das so nicht?
MfG
Carsten

von Vlad T. (vlad_tepesch)


Lesenswert?

also ich vermute das deinen globale Variablendeklaration einfach mal 
falsch ist

sfr steuer=0x90; //Port1

heißt: lege eine Variable vom Typ sfr an und weise ihr den wert 0x90 zu.

was du willst ist aber:

lege eine Variable an, deren Adresse 90 ist.


Es gibt zwei Wege:
entweder du schaffst es die Variable an der Stelle 0x90 zu plazieren 
(unwahrscheinlich)

oder du behandelst die Variable als ein Pointer.
demzufolge müsstest du die Variable dereferenzieren, bevor du etwas 
zuweist:


*steuer  = 0;  // alle schalter ein, da low-aktiv
*anzeige = 1;  // bit eins des LED-Ports einschalten.

Ein Pointer ist ein Zeiger auf eine Speicherstelle.
Die Pointer-Variable anzeige zeigt auf die Speicherstelle, deines 
Controllers, die für das Steuern der Ausgabepins da ist.

wenn du schreibst:
anzeige = 4; änderst du den Ort, wo der Zeiger hinzeigt
schreibst du
*anzeige = 4;
schreibst du in die Speicherzelle, auf die der Pointer Zeigt eine 4

Hilfreich wäre es, wenn du die Definition von "sfr" posten würdest

von Wolfgang B. (et-tutorials) Benutzerseite


Lesenswert?

sfr steuer=0x90; //Port1

ist schon OK.

So definiert man (syntaktisch) in der Keil-Umgebung die Special Function 
Register des 8051 (hier zur Definition der Portadresse für den 
Steuerausgang.

Ob das 0x90 ist, habe ich nicht überprüft.

von Vlad T. (vlad_tepesch)


Lesenswert?

Wolfgang Bengfort schrieb:
> sfr steuer=0x90; //Port1
>
> ist schon OK.
>
> So definiert man (syntaktisch) in der Keil-Umgebung die Special Function
> Register des 8051 (hier zur Definition der Portadresse für den
> Steuerausgang.
>

Ok, das wusste ich nicht.
das hat dann aber nicht mehr viel mit C zu tun, oder?

> Ob das 0x90 ist, habe ich nicht überprüft.

von Chris S. (hondaracer1)


Lesenswert?

ne, das faellt unter "jeder compiler backt seinen eigenen kuchen" ;-)


"warum funktioniert das so nicht?"

was genau passiert denn? was sollte denn passieren deiner meinung nach?
leuchtet garnicht, leuchtet etwas das du nicht erwartest und wenn ja was 
leuchtet und was haettest du erwartet?


wenn ich das richtig sehe hast du einen denkfehler drin.
sfr steuer=0x90; //Port1    hiermit weist du dem Port1 den namen steuer 
zu und kannst danach mit
steuer = 4;  beispielsweise die zahl 4 auf den Port schreiben, die Zahl 
4 wuerde hier bedeuten das Pin2 auf 1 gesetzt wird da die zahl 4 eben 
0000 0100 binaer entspricht
du hingegen hast:
steuer=wuerfel[1];   //erstes Element in array, also würfel 1 wobei 
wuerfel[1] = 0x91 entspricht
damit schreibst du 91h auf port1

Das ist ein typischer anfaengerfehler und brauch dir nicht peinlich sein 
;-) aber du musst verstehn was du falsch gemacht hast dann ist der rest 
echt simpel.
Du kannst einer adresse keine adresse zuweisen, du kannst adressen nur 
einen Wert zuweisen.

zweiter fehler:
wuerfel[1] ist das zweite element im array.
char wuerfel [5]={0x90,0x91,0x92,0x93,0x94}; // hier hast du ein array 
der laenge 5, also 5 werten erstellt
auf due 5 werte zugreifen tust du mit wuerfel[0] bis wuerfel[4].

char wuerfel [5]={0x01,0x02,0x04,0x08,0x0F};  // so haette die Zeile 
aussehn muessen


wie immer ohne gewaehr
viel glueck ;-)

ps.: Fehler 1 gilt auch fuer deine LEDs, aber das kriegst du ja jetzt 
selber geloest

von Karl H. (kbuchegg)


Lesenswert?

Achtung:
Die Enable Leitungen sind laut PDF Low-Aktiv!. D.h. eine 0 an einem 
Port-Pin gilt als aktiviert. Keine 1

Und ich würde auch empfehlen, die 'Special-Function Variablen' genauso 
zu benennen, wie sie im PDF aufgeführt sind. Also:
  Wuerfel          eine 1 am Pin schaltet eine LED Kombination ein
  Enable           eine 0 am Pin schaltet die LED Kombination eines
                   Würfels ein
  Schalter         Schalterabfrage

Wuerfel und Enable muessen zusammenarbeiten. Nur die Kombination aus 
beiden führt zum Erfolg. Du kannst es dir so vorstellen:
mit "Wuerfel" wird ausgewählt, welche LED leuchten soll
mit "Enable" wird ausgewählt, an welchem der 5 Wüerfel das passieren 
soll

Um die mittlere LED im Würfel mit der Nummer 0 zu erleuchten, muss daher 
ausgewählt werden
1
sfr Wuerfel = 0x90;  // Port1, verbunden mit Anschluss "Würfel"
2
sfr Enable  = 0xA0;  // Port2, verbunden mit Anschluss "Enable"
3
4
int main()
5
{
6
  while(1)  // Endlosschleife => Programmabbruch mit RESET
7
  {
8
9
    Wuerfel = 0x01;     // 0x01 ist binär  0000 0001
10
                        // also Pin 0 auf 1. Und auf Pin 0 liegt
11
                        // die mittlere LED.
12
                        // Siehe PDF
13
14
    Enable = 0xFE;      // 0xFE ist binär  1111 1110
15
                        // also Pin 0 auf 0. Dieser Ausgang ist
16
                        // Low-Active. Hier zaehlt das 0 Bit!
17
                        // Siehe PDF
18
  }
19
}

Wenn damit die mittlere LED im Würfel 0 (und nur diese!) nicht leuchtet, 
dann hast du entweder einen Verdrahtungsfehler (falscher Port am 
falschen Anschluss) oder die SFR Angaben stimmen nicht.

von Herbert K. (planlos91)


Lesenswert?

OK, vielen euch für die Antworten, ich werd mich dann gleich mal wieder 
dran setzten und das überarbeiten.Ich poste euch dann später/morgen das 
Ergebniss ;)
Nochmals Dankeschön :)
Mfg, Carsten

von Herbert K. (planlos91)


Lesenswert?

Karl heinz Buchegger schrieb:
> Achtung:
> Die Enable Leitungen sind laut PDF Low-Aktiv!. D.h. eine 0 an einem
> Port-Pin gilt als aktiviert. Keine 1
Ha, deshalb ist zwar immer brav die mittlere LED an wie verlangt, das 
mit den Würfeln klappt aber nicht. Wie kann ich das noch in Array Form 
hinbekommen?
>
> Wuerfel und Enable muessen zusammenarbeiten. Nur die Kombination aus
> beiden führt zum Erfolg. Du kannst es dir so vorstellen:
> mit "Wuerfel" wird ausgewählt, welche LED leuchten soll
> mit "Enable" wird ausgewählt, an welchem der 5 Wüerfel das passieren
> soll
>
> Um die mittlere LED im Würfel mit der Nummer 0 zu erleuchten, muss daher
> ausgewählt werden
> sfr Wuerfel = 0x90;  // Port1, verbunden mit Anschluss "Würfel"
> sfr Enable  = 0xA0;  // Port2, verbunden mit Anschluss "Enable"
>
> int main()
> {
>   while(1)  // Endlosschleife => Programmabbruch mit RESET
>   {
>
>     Wuerfel = 0x01;     // 0x01 ist binär  0000 0001
>                         // also Pin 0 auf 1. Und auf Pin 0 liegt
>                         // die mittlere LED.
>                         // Siehe PDF
>
>     Enable = 0xFE;      // 0xFE ist binär  1111 1110
>                         // also Pin 0 auf 0. Dieser Ausgang ist
>                         // Low-Active. Hier zaehlt das 0 Bit!
>                         // Siehe PDF
>   }
> }
>
> Wenn damit die mittlere LED im Würfel 0 (und nur diese!) nicht leuchtet,
> dann hast du entweder einen Verdrahtungsfehler (falscher Port am
> falschen Anschluss) oder die SFR Angaben stimmen nicht.

Ja,nach der Methode leuchtet zwar die mittlere LED. Aber leider an jedem 
Würfel nicht nur am ersten :(. Portangaben sind richtig und 
Verkabelungsfehler kann ich auch ausschließen.

Danke bis hierhin und Schönes Wochenende,
Carsten

Edit: die verschiedenen LED-Kombinationen klappen so wunderbar :) nur 
halt die Würfel auswahl nicht. Und ich würde das wie gesagt gern in 
Array Form realisieren.

von Karl H. (kbuchegg)


Lesenswert?

Carsten Stulgies schrieb:

>
> Ja,nach der Methode leuchtet zwar die mittlere LED. Aber leider an jedem
> Würfel nicht nur am ersten :(. Portangaben sind richtig und
> Verkabelungsfehler kann ich auch ausschließen.

Es muss aber eines der beiden sein.

ist das

sfr Enable  = 0xA0;  // Port2, verbunden mit Anschluss "Enable"

richtig?
Ändert eine Zuweisung an 'Enable' den tatsächlichen Port Zustand? Mit 
einem Multimeter kontrollieren!

Ist Enable von der Würfel-Platine tatsächlich mit Port2 verbunden?
Hat Port2 tatsächlich die Adresse 0xA0?

Ich frage deshalb nach, weil zb in deinem Eröffnungsposting ganz andere 
Werte stehen

<Zitat>
Die Ports des Controllers:
Port 0= 0x90h -> Schalter
Port 1= 0x10h -> Steuerport
Port 2= 0x80h -> Anzeige
Port 3= 0xB0h
</Zitat>

Weder Bezeichnung noch Adresse stimmen mit anderen Aussagen in diesem 
Thread überein.

und in deinem 7-Segment Beispiel stehen wieder andere Werte

sfr eingabe=0x90; //0x90; Port 1 <hexzahlen im Kommentar=Schulcontroller
sfr anzeige=0x80; //0xE8; Port 4 <hexzahlen im Kommentar=Schulcontroller
sfr steuer=0x10; //0xF8; Port 5 <hexzahlen im Kommentar=Schulcontroller


Ich hab nur das, was du hier postest. Daraus muss ich meine Schluesse 
ziehen. Du sitzt vor der Hardware und kannst direkt Messungen vornehmen 
und Dinge kontrollieren.

von Vlad T. (vlad_tepesch)


Lesenswert?

wenns wirklich der Controller ist, den er gepostet hat (Atmel 
AT89S8252), dann sollten die aktuellen adressen stimmen

von Herbert K. (planlos91)


Lesenswert?

Karl heinz Buchegger schrieb:
> sfr Enable  = 0xA0;  // Port2, verbunden mit Anschluss "Enable"
>
> richtig?
> Ändert eine Zuweisung an 'Enable' den tatsächlichen Port Zustand? Mit
> einem Multimeter kontrollieren!

Ja alles richtig verbunden.Da ich kein Multimeter habe habe ich einfach 
einen anderen Port vom Controller ausprobiert und die Hex-Addresse im 
Quellcode entsprechend verändert. Die Kabel habe ich auch mal 
ausgetauscht. Leider kein Unterschied.

Die richtigen Addressen laut Datenblatt sind:
Port 0=80h
Port 1=90h
Port 2=0A0h
Port 3=0B0h

Ob vllt der Steckplatz an der Würfelplatine kaputt ist? Denn egal was 
ich auch hinschreib, keine Reaktion.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Wenn Du kein Multimeter hast, hilft auch eine LED mit einem 
1KOhm-Widerstand.
Zwei Kabel an die LED (Anode -> Widerstand, Kathode -> Masse). Dein 
offenes Widerstandsende ist Deine Prüfspitze.

LED leuchtet -> Spannung (> ~2,5V) vorhanden.
LED lehchtet nicht -> keine Spannung (0V..2V) bzw Masse.

Sowas hilft zur Not schonmal etwas weiter.

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Anbei mal ein altes Würfelprogramm von mir.

Das Erzeugen von echten Zufallszahlen ist sehr tricky.
Ich habe dafür den Druckzeitpunkt ausgenutzt, der ja ein unabhängiges 
Ereignis bezogen auf den CPU-Takt ist.
Damit dann auch wirklich zufällige Werte rauskommen, muß er im exakt 
gleichen Zeitintervall abgetastet werden, also im Timerinterrupt.

Der Code ist für den AT89C2051 geschrieben, läßt sich daher leicht an 
jeden anderen 8051-kompatiblen anpassen.


Peter

von Mathew (Gast)


Lesenswert?

Peter machts wie immer komplizierter als es nötig wäre...

von Herbert K. (planlos91)


Lesenswert?

Hallo, ich muss meine Arbeiten vorersten pausieren, da an der LED 
Platine ein Port kaputt war und dieser gerade von meinem Fachlehrer 
repariert wird. Ich melde mich wenns weiter geht unds wieder mal klemmt 
:)
MfG
Carsten

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.