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
Gib mal weitere Infos zu dem Controller und wie der programmiert wird. Beschreibt das Bild im zweiten Anhang Dein Entwicklungsboard?
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
Carsten Stulgies schrieb:
> Ich könnt noch ein Foto von dem Controller machen
die Bezeichnung wäre mal ein Anfang...
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!
das datenblatt wirst du früher oder später brauchen: http://www.datasheetarchive.com/SAB80C537-datasheet.html
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
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...
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.
> 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...
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.
Okey, also was brauch ich alles? Datenblatt, Mechanismus zu Portdefinition...
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.
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
oh mann, zum Glück sehen die aktuellen Datasheets um einiges besser aus. das Ding ist ja furchtbar
toxy schrieb:
> ohne kommentar editen gehört sich eigentlich nicht...
Entschuldige und danke fürs Datenblatt.
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...
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
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 ;)
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?
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.
pollen ist schon besser. Interupts zu entprellen ist bedeutend schwieriger
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.
Hallo Carsten, vielleicht kann mein Kurs Dir ein wenig helfen http://et-tutorials.de/mikrocontroller/ Hier geht es auch um Keil und C.
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
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.
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
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.
Hab Hex Addressen nach Datenblatt geändert, jetzt funktionierts. Da wurden mir wohl falsche Addressen mitgegeben. Danke.
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 ;)
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 :)
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.
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.
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).
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.
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
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
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
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
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
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.
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.
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
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.
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
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.
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.
wenns wirklich der Controller ist, den er gepostet hat (Atmel AT89S8252), dann sollten die aktuellen adressen stimmen
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.
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.
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
Peter machts wie immer komplizierter als es nötig wäre...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.