Hallo Leute, Ich programmiere einen Plotter, der über einen ATMega32 gesteuert wird. Der Plotter kann bereits Großbuchstaben, Zahlen und ein paar Sonderzeichen schreiben. Nun sollen auch die Kleinbuchstaben implementiert werden. Der Plotter wird über einen Terminal via RS232-Schnittstelle angesteuert. Nun zu meiner Frage: wie schaffe ich es, dass der Controller Kleinbuchstaben akzeptiert, die er über den Terminal als Input bekommt?
Ich versteh die Frage nicht. Dem Mega ist es ja letztendes egal, welche Bytes da über die Schnittstelle kommen und ob das Groß oder Kleinbuchstaben oder sonst was sind. Byte ist Byte und wenn es mit einem Vergleichswert übereinstimmt, dann wird die entsprechende Routine angesprungen (oder wie auch immer du das gemacht hast)
Naja ich arbeite mit dem Programm Bascom, und der Controller bekommt über eine Input Funktion über den Terminal seinen Buchstaben. Die Buchstaben etc. sind alle als Sub im Programm enthalten. Die Sub für A heißt also Sub A. Aber sobald ich Sub a erzeugen will, geibt mir Bascom den Fehler aus, dass es das bereits gibt.
Das Problem ist nicht die Sub, sondern folgende Zeile: Dim A As String * 2 (funktioniert) DIm a As String * 2 (Fehler: Variable bereits dimensioniert)
Wenn ich das richtig in Erinnerung habe, dann liegt das doch an BASCOM, da hier nicht von Groß- und Kleinschreibung unterschieden wird.
ich hoffe, Du definierst nicht für jede Zahl und jeden Buchstaben einen String oder? Poste Doch mal Deinen Code, dann kann Dir geholfen werden ... avrGerd
Hi Aus der BASCOM-Hilfe: Case is not significant. The following line labels are equivalent: alpha: Alpha: ALPHA: Merkst du etwas? MfG Spess
Hm, verdammtes Bascom, habt ihr eine Idee wie ich das lösen kann? Und ja, ich generiere für jeden Buchstaben etc einen String, da ja jeder Buchstabe über den Terminal eingegeben werden soll.
Gorn schrieb: > Hm, verdammtes Bascom, das Problem sitzt VOR dem PC ! du hast nicht verstanden was du programmierst kleine starthilfe: Dim C41 as string *2 ' GROSSES A Dim C61 as string *2 ' kleines a ist nur ein tip, aber poste mal dein programm, alles andere ist wieder "Glaskugelraten" vlG Charly
Schön und gut, der Plotter, der von dem Mega kontrolliert wird, wird über einen Pc mittels RS232 gesteuert. In den Terminal soll aber einfach nur der Buchstabe getippt werden, der auch geschrieben werden soll. Das Programm hat 2000 Zeilen, ich hängs mal an
uiuiui ... sonderlich elegant ist das nicht gelöst ... Da kann jetzt Bascom echt nix dafür. Prinzipiell kannst Du aber deine Subs a_gross oder a_klein benennen und Deine Strings dann äquivalent a_gross_string a_klein_string Ich hätts mit Data und Restore gemacht, aber so gehts auch ... nur aufwändiger
Kann es sein, dass ich a gar nicht als String definieren muss, wenn ich es über den Terminal eingebe?
Hi Gorn, exakt. Du benutzt diese Variablen ja garnicht. Also brauchst Du sie nicht definieren. Hier benutzt Du ja die varialble "Buchstabe". Zum Vergleich mit "A" musst Du A nicht definieren. <snip> Select Case Buchstabe Case "A" Aa Goto Start ... <snip> Gruss, avrGerd
Sehr genial, danke, jetzt funktioniert es Mir ist gerade aufgefallen, dass da noch etwas wäre, das zu lösen wäre: Über den Terminal wird jedesmal nur ein Buchstabe etc eingegeben, und dann nach einem Enter sozusagen an den Controller gesendet wird. Wie schaffe ich es, dass der Text komplett eingegeben werden kann, und erst dann komplett geschrieben wird?
Aber das ist doch einfach gesagt Murks (sorry, falls ich Dich beleidigt haben sollte, war nicht meine Absicht), für jeden Buchstaben eine Sub zu definieren. Das macht man besser mit Arrays oder noch besser mit Data-Zeilen. So könnte man das machen:
1 | 'Steuercodes: 0 = bewegen zur absoluten Position (2 Bytes folgen), |
2 | ' 1 = Stift hoch (kein Byte), 2 = Stift runter (kein Byte) |
3 | |
4 | Dim Zeichen[26, 32] As Byte |
5 | |
6 | 'Anzahl der Einträge |
7 | Zeichen[1, 1] = 10 |
8 | |
9 | 'Stift hoch |
10 | Zeichen[1, 2] = 1 |
11 | |
12 | 'Position 0, 0 |
13 | Zeichen[1, 3] = 0 |
14 | Zeichen[1, 4] = 0 |
15 | Zeichen[1, 5] = 0 |
16 | |
17 | 'Stift runter |
18 | Zeichen[1, 6] = 2 |
19 | |
20 | 'Linie zeichnen |
21 | Zeichen[1, 7] = 0 |
22 | Zeichen[1, 8] = 255 |
23 | Zeichen[1, 9] = 255 |
24 | |
25 | 'Stift hoch |
26 | Zeichen[1, 10] = 0 |
27 | |
28 | Do |
29 | Loop |
30 | |
31 | |
32 | Zeichen_zeichnen: |
33 | Schritt_Anzahl = Zeichen[Zeichennummer, 1] |
34 | Schritt = 2 |
35 | Do |
36 | Befehl = Zeichen[Zeichennummer, Schritt] |
37 | Incr Schritt |
38 | |
39 | If Befehl = 0 Then 'Position anfahren |
40 | PositionX = Zeichen[Zeichennummer, Schritt] |
41 | Incr Schritt |
42 | PositionY = Zeichen[Zeichennummer, Schritt] |
43 | Incr Schritt |
44 | FahrePositionAn |
45 | |
46 | Elseif Befehl = 1 Then 'Stift hoch |
47 | StiftHoch |
48 | |
49 | Elseif Befehl = 2 Then 'Stift runter |
50 | StiftRunter |
51 | |
52 | EndIf |
53 | Loop until Schritt = Schritt_Anzahl |
54 | Return |
Hast Du das Prinzip verstanden? Gruß Jonathan
Leider nicht, habe in der Schule nicht aufgepasst, lag aber am Leherer, wir haben lieber gezockt als ihm zuzuhören :D Der Flash ist groß genug um das abzuspeichern, und zumindest die Subs verstehe ich
Gorn schrieb: > Leider nicht, habe in der Schule nicht aufgepasst, lag aber am Leherer, > wir haben lieber gezockt als ihm zuzuhören :D Dann solltest du das nochholen. Das was du da machst, ist doch Unsinn. Spätestens dann, wenn es darum geht, dass der Text gedreht werden muss oder größer kleiner geschrieben werden muss, ist die Kacke am Dampfen. > Der Flash ist groß genug um das abzuspeichern, und zumindest die Subs > verstehe ich Das ist kein Grund, die Grundlagen nicht lernen zu wollen. Im übertragenen Sinne bewirbst du dich gerade in einem Ingenieurbüro und die testen dich mit ein paar einfachen Rechnungen. Wieviel ist 4 mal 5 und du rechnest 5 1 mal 5 5 2 mal 5 ---- 10 + 5 3 mal 5 ---- 15 + 5 4 mal 5 ---- 20 Klar kommt hinten das Richtige raus. Aber nehmen werden sie dich trotzdem nicht. Denn der gegenübersitzende Personalchef überlegt gerade fieberhaft, wie du wohl 6528 * 8723 rechnen würdest. Und hier hast du genau die gleiche Situation. Bei 1 oder 2 Dingen, die dein Plotter können soll, kann man das so machen. Aber in der Menge, in der Menge eines kompletten Fontes ist das dann einfach nur noch Unsinn. Anstatt dich da mit viel Enthusiasmus und noch mehr Arbeit in das Abenteuer Plotter zu stürzen, solltest du dir erst einmal die wichtigsten Grundlagen von Datenhaltung in BASCOM aneigenen. So viele sind es dann ja auch wieder nicht, BASCOM ist da ohnehin sehr sparsam mit dem Gebotenen. Aber wenn du zumindest das was möglich ist beherrscht, sparst du dir 70% deiner jetzigen Tipparbeit UND du bist gleichzeitig noch universeller UND kannst besser auf Anforderungen (wie zb gedrehter Text, wie zb verschiedene Fontgrößen) reagieren.
Gorn schrieb: > Sehr genial, danke, jetzt funktioniert es > > Mir ist gerade aufgefallen, dass da noch etwas wäre, das zu lösen wäre: > > Über den Terminal wird jedesmal nur ein Buchstabe etc eingegeben, und > dann nach einem Enter sozusagen an den Controller gesendet wird. > Wie schaffe ich es, dass der Text komplett eingegeben werden kann, und > erst dann komplett geschrieben wird? Das Zauberwort heißt String, der als ganzes übertragen wird und den dein Programm dann Buchstabe für Buchstabe durchgeht und den jeweiligen Buchstaben malt. Mal ehrlich: Du willst einen Plotter bauen? Lern doch erst mal die allereinfachsten Grundlagen!
Hi, Zu Deiner Frage: Du machst das mit dem Befehl "INPUT Buchstabe" schon ganz richtig. Hier kannst Du 10 Zeichen eingeben, welche im String Buchstabe gespeichert werden. Die Anyahl von 10 Zeichen hast Du ja definiert. Nach dem Enter werden dann alle Zeichen gesendet und in Buchstabe gespeichert. Vor dem "Select Case Buchstabe" muss Du nun den String wieder in Buchstaben zerlegen. Das kann man auf vielen Wegen machen z.B. mit dem Befehl MID. Oder Du benutzt eine Overlay Variable und greifst mit einem Zähler auf die einzelnen Zeichen zu. Gruss, avrGerd
Na, na, nun zerreist ihn doch nicht gleich in der Luft. Er hat ja nicht gesagt, dass er das Ding verkaufen will. Ich bin mal Optimist und sage mir, Gorn will hier eine Hardware die er rumliegen hat irgendwie zum Laufen bringen und auch noch was lernen. Am Anfang haben wir Alle mal so einen Mist gemacht und uns später gesagt: Wie konnte ich damals nur ... Spätetestens wenn der Flash voll ist und er noch viele Features einbauen will muss er sich was Neues ausdenken. Lass Dich nicht entmutigen, auch aus Fehlern kann man lernen. avrGerd
Gibts da irgendein Tutorial zu diesem Thema? Ich habe da bisher noch nix anständiges gefunden. Wäre natürlich cool, wenn man die Schriftgröße einfach ändern könnte. Und wie schaffe ich es, dass ich die Buchstaben nicht nur einzeln eingeben muss, sondern den ganzen Text tippen kann.
In Gurgel (Auch bekannt als Guhgl xD) findet man da vieles. Das mit dem ganzen Text geht so: Du liest einen String ein und arbeitest diesen dann Zeichenweise ab. Mehr steckt da nicht dahinter. Beispiel:
1 | Laenge = Len(Text) |
2 | For Zeichennummer = 1 To Laenge |
3 | Zeichen = Mid(Text, Zeichennummer, 1) |
4 | ZeichenAusgeben |
5 | Next Zeichennummer |
Gar nicht so schwer, oder? ;) Gruß Jonathan
Das Versteh ich jetzt nicht ganz von der Syntax her. Abarbeiten ist klar, nur wie verwirkliche ich das?
Ich bin auch mit dem Musikmachen und dem Singen überfordert. Daher lass ich es einfach sein. Selbsterkenntnis.
Müsste das dann in etwa so aussehen: Input Buchstabe Buchstabe_split = MID(Buchstabe, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) soweit verstehe ich es inzwischen, wie es weitergeht ist mir allerdings immernoch ein rätsel
Na da stand doch eben noch ein langer Text von Kalle dem Meister . Den fand ich schon gut, jetzt ist er weg; die Macht des Moderators ?
Der Bayer schrieb: > Na da stand doch eben noch ein langer Text von Kalle dem Meister . > Den fand ich schon gut, > > jetzt ist er weg; die Macht des Moderators ? :-) Ja. Ich habs mir anders überlegt und den Text zurückgezogen. Ich finde nämlich die Diskrepanz zwischen dem Niveau der Fragen hier und dem Programmtext im 11. Posting ganz erstaunlich :-) Leider hab ich mir das Programm dann erst nach dem Posten genauer angesehen. Und jetzt bin ich neugierig wie es weitergeht. An meiner Meinung, die du offenbar gelesen hast, ändert sich allerdings noch nichts.
Den Plotter muss ich ja auch gar nicht mehr bauen, der steht bereits neben mir und funktioniert an sich einwandfrei, war sogar bei Jugend-Forscht mit 2 Kumpeln, ich will ihn jedoch noch etwas verfeinern bis zu Langen Nach der WIssenschaften, wo wir auch dabei sind
Achso, weils mir gerade einfällt, der Plotter ist recht massiv aus Alu gebaut, besteht aus 2 Achsen, die jeweils von einem Schrittmotor bewegt werden. Der Stift wird mittels eines Servos rauf und runter bewegt. Das Problem an der ganzen Sache ist, dass der Plotter nicht so perfekt genau schreiben kann, liegt an der Trägheit der Achsen. Ursprünglich wollten wir ihn mit hpc (ich glaube so hieß es) das ist eine Sprache für Plotter steuern, das geht nur leider nicht wegen der Trägheit.
Die Sprache heißt HPGL und die Trägheit der Achsen hat damit erst mal gar nichts zu tun sondern wirkt sich nur auf die Verfahrgeschwindigkeit aus. Die wiederrum wirkt sich so aus, dass der Plotter eingehende Zeichen in einem Buffer zwischenspeichern muss, während er bereits erhaltene Befehle abarbeitet. Und da so ein Speicher bei etwas größeren Zeichnungen überzulaufen droht muss man sich dann Gedanken um Handshake an der Schnittstelle machen. Das hat jetzt allerdings alles nichts mit Zeichenverarbeitung mittels BASCOM zu tun. Hast du denn die Befehle, die Johnathan da oben eingesetzt hat, schon mal in der Hilfe nachgeschlagen? Oder wenigstens mal nach einem BASCOM Tutorial gegoogelt, in dem auch Basics in String und Zeichenverarbeitung vorkommen?
Input Buchstabe Laenge = Len(Buchstabe) For Zeichennummer = 1 To Laenge Buchstabe_Split = Mid(Buchstabe , Zeichennummer , 1) Select Case Buchstabe_Split Case "A" Aa Goto Start ... Case Else Print "Falsch!" Goto Start End Select Next Zeichennummer So habe ich das jetzt mal gelöst, ist das insofern richtig? Bascom meldet zumindest keinen Fehler
streiche bitte ganz schnell den Befehl "Goto" aus Deinem Repertoire ... Wenn man einmal anfängt damit im Programm herum zu springen kommen die Lustigsten Fehlfunktionen dabei raus und der Code ist praktisch nicht mehr zu debuggen. Verwende Schleifen For - Next While - Wend Do - Loop Verzweigungen If - Then Select - Case und für Unterprogramme Gosub - Return oder Call Und bitte bitte schlag mal in der Bascom Hilfedatei nach ... oben im Menü im Fenster von Bascom "Help" klicken ...
Hallo Gorn, ich beobachte deinen Beitrag nun schon einige Zeit und beim Querlesen stelle ich fest, dass du in Bascom nicht sehr kundig bist. Ich würde mich selbst als "alten Bascom Hasen" bezeichnen obwohl ich zugeben muss, dass ein kleines Inline-Asssebler dem prozessor dann auf die Sprünge helfen könnte. Ich erkläre mich bereit dir zu helfen wenn du mir sagst welche Version von Bascom du derzeit benutzt und ob deine Version eine Kaufversion ist oder ob du die kostenlose Testversion verwenden willst. Irgendwo in deiner Kette von Fragen hast du sogar erwähnt, es hätte irgendwas mit "Jugend forscht" zu tun. Überlege es dir, was deine ehrliche Antwort sein wird und sag mir Bescheid. Liebe Grüsse Klaus de Lisson
Servus Klaus, momentan nutze ich Version 2.0.2.0. ist die Kaufversion, hat aber die Schule gezahlt. Ja bei Jugend Forscht waren wir mit dem Plotter dabei.
Gorn schrieb: > Ja bei Jugend Forscht waren wir mit dem Plotter dabei. Ich hoffe ihr habt niemandem euren Quellcode gezeigt ...
Hallo Gorn, das ist ja schonmal ein gutes Zeichen dass ihr die Vollversion habt. Freut mich. Ich sehe mir dein Programm dann im Laufe des Tages oder Abends mal genauer an und poste dann mal eine Alternative. Gruss Klaus de Lisson
Hi Gorn, wie versprochen habe ich mir deinen Bascontext mal genauer angesehen. Irgendwie bin ich selber im Zweifel wo ich da ansetzen sollte. Deshalb fange ich mal klein an und kritisiere zunächst deine Hauptschleife. Das ist die, die du immer mit Goto anspringst (START) Die ganzen GOTO wird man eigentlich ganz einfach los. Eine Hauptschleife ist eigentlich immer so : Do Loop end .... und hier kommen die Unterprogramme Nun ist es so dass das Programm immer von Do nach Loop geht. Das "end" ist eigentlich unwichtig und wird ja niemals erreicht. Sinnvoll wird es aber dann, wenn dein Programm mal ausser Kontrolle gerät und die Grenzen dann überspringt. deshalb ist ein END immer zu setzen. Zudem habe ich gesehen dass du am Anfang des programmes sehr viele "Declare Sub" verwendest. Diese sind eigentlich überflüssig und nur dann sinnvoll wenn du an das Unterprogramm Werte (variablen ) übergeben willst. Es macht alo nur bei Declare Sub Rnb_servo(byval Servonummer As Byte , Byval Position As Byte) Declare Sub Rnb_servob(byval Servonummer As Byte , Byval Position As Byte) einen Sinn. Bei all den anderen stört es nicht aber der Sinn ist nicht da. Der Unterschied der sich ergibt wenn du "Declare Sub" einfach weglässt ist der, dass du beim Aufruf des SUB nicht einfach schreiben kannst Case "A" Aa ohne ein Declare würde es dann heissen: Case "A" Gosub Aa und das Unterprogramm Aa hätte nicht den Namen Sub Aa sondern einfach Aa: hier dein prog return Hier also ein Beispielprogramm: $regfile = "m32def.dat" Dim Buchstabe As String * 10 '---------------------------------------- Do Print "Bitte Buchstaben eingeben. " Input Buchstabe Select Case Buchstabe Case "A" Print "gross A" Case "a" Print " klein A" Case "u" Gosub Unterprogramm End Select Wait 1 Print "ich warte " Loop End Unterprogramm: Print "nun bin ich unten " Return Bitte schreib mir, ob du es verstehst und bearbeite dein altes programm adequat. Gruss Klaus
Soweit habe ich alles verstanden, Programm ist bereits komplett überarbeitet Danke für die Hilfe Was mir immernoch ein Rätsel ist, sind Arrays ;)
Gorn schrieb: > Soweit habe ich alles verstanden, Programm ist bereits komplett > überarbeitet Dann zeig her ! Das war doch erst der Anfang , oder ? Gruss Klaus de Lisson
Kann man. Das Problem: Damit das Sinn macht müsste man die komplette Struktur verändern. Die Beschreibung dessen, wie ein Buchstabe auszusehen hat, müsste man in DATA Zeilen kodieren und EINE Subroutine arbeitet den entsprechenden DATA Satz ab und erzeugt aus dieser Beschreibung die Bewegungen. So wie eine Drehorgel auch nur EiNEN Mechanismus hat, der durch unterschiedliche Daten (in Form von Lochscheiben) auf verschiedene Lieder programmiert wird. Der Vorteil: Dein Programm magert sofort auf 1, vielleicht 2 Bildschirmseiten ab und das hinzufügen von neuen Buchstaben ist einfach nur ein ergänzen der Abfahrbeschreibung in der DATA Section. Aber das soll dir Klaus erklären, wie man das machen kann.
Karl Heinz Buchegger schrieb: > Aber das soll dir Klaus erklären, wie man das machen kann. Warum denn das ? das wird ja richtig anstrengend . (smile) k.
Klaus De lisson schrieb: > Karl Heinz Buchegger schrieb: >> Aber das soll dir Klaus erklären, wie man das machen kann. > > Warum denn das ? das wird ja richtig anstrengend . (smile) Du hast dir die Frage selbst beantwortet. (Ausserdem nehm ich ihm die Sache mit Jugend forscht nicht ab. Jemand der dort teilnimmt, hat in 3 Nächten alle am Web verfügbaren BASCOM Tutorials durch und deshalb Ringe unter den Augen. So einer weiß mehr über BASCOM als du und ich zusammen. Ist aber nur meine persönliche Meinung)
Karl Heinz Buchegger schrieb: > (Ausserdem nehm ich ihm die Sache mit Jugend forscht nicht ab. Jemand > der dort teilnimmt, hat in 3 Nächten alle am Web verfügbaren BASCOM > Tutorials durch und deshalb Ringe unter den Augen. So einer weiß mehr > über BASCOM als du und ich zusammen. Ist aber nur meine persönliche > Meinung) Ja , aber das wäre doch eigentlich auch egal, oder ? Bisher hat es doch auch kaum Arbeit gemacht und Gorn ist ein Stück weiter gekommen. Klaus
Karl Heinz Buchegger schrieb: > (Ausserdem nehm ich ihm die Sache mit Jugend forscht nicht ab. Jemand > der dort teilnimmt, hat in 3 Nächten alle am Web verfügbaren BASCOM > Tutorials durch und deshalb Ringe unter den Augen. So einer weiß mehr > über BASCOM als du und ich zusammen. Ist aber nur meine persönliche > Meinung) Wir waren bei Jugend Forscht dabei, aber das war nur so ein kleines extra, neben dem Robotik-Seminar in der 11. und 12. Klasse (scheiß G8 und so...) deshalb hatten wir anderthalb jahre zeit für den ganzen Scheiß
Der Anwendungsfall ist ideal für Restore, Read und Data. Die ganzen Subs kann man sich sparen. Die Zeichen würde ich anhand des ASCII Codes ermitteln. In den Datazeilen dann jeweils codiert, welche Aktion wie oft ausgeführt werden soll. Ein Vorschlag, wie ich beginnen würde: (Prinzipprogramm(Den Eingang würde ich puffern)) $regfile = "m32def.dat" $crystal = 16000000 $baud = 38400 $hwstack = 64 $swstack = 64 $framesize = 64 Dim Zeichen As Byte Dim Dauer As Byte Dim Befehl As String * 1 Dim I As Byte Do If Ischarwaiting() = 1 Then Gosub Empfangen End If Loop End Empfangen: Zeichen = Waitkey() Gosub Auswerten Return Auswerten: Select Case Zeichen Case 45 Restore Asc45 Case 46 Restore Asc46 Case 47 Restore Asc47 Case Else Return End Select Do Read Dauer If Dauer > 0 Then Read Befehl For I = 1 To Dauer Select Case Befehl Case "r" Gosub Rechts Case "u" Gosub Hoch Case "l" Gosub Links Case "d" Gosub Runter Case "m" Gosub Motorlinks Case "n" Gosub Motorrechts End Select Next I Else Return End If Loop Return Rechts: Return Hoch: Return Links: Return Runter: Return Motorlinks: Return Motorrechts: Return Asc45: Data 20 , "u" , 10 , "l" , 20 , "m" , 20 , "r" , 0 'Zeichen Ascii 45 Asc46: Data 20 , "u" , 10 , "l" , 20 , "d" , 20 , "r" , "u" , 10 , "l" , 20 , "d" , 20 , "r" , 0 'Zeichen Ascii 46 Asc47: Data 20 , "u" , 10 , "l" , 20 , "n" , 20 , "r" , "u" , 10 , "l" , 20 , "d" , 0 'Zeichen Ascii 47
Nach eingehender studierung :D dieses Programmes meine ich es zu verstehen (zumindest hoffe ich das) Was ich nur nicht ganz verstehe ist, wie auf diese Weise Kreise bzw. Viertelkreise zustandekommen. Für meine Version der Kreise habe ich bereits einige Zeit und die Hilfe von einem LabView-Profi gebraucht
Gorn schrieb: > Nach eingehender studierung :D dieses Programmes meine ich es zu > verstehen (zumindest hoffe ich das) > > Was ich nur nicht ganz verstehe ist, wie auf diese Weise Kreise bzw. > Viertelkreise zustandekommen. Für meine Version der Kreise habe ich > bereits einige Zeit und die Hilfe von einem LabView-Profi gebraucht Du machst dir eine Funktion für Kreise bzw Viertelkreise, die du aufrufen kannst. Dann vereinbarst du einen Buchstaben in der Databeschreibung, zb 'c' für circle, und wenn du bei der Auswertung auf ein 'c' stösst, dann rufst du diese Funktion auf. Genauso wie es ja auch bei 'r' oder den anderen Buchstaben gemacht wurde. Kreis ist leicht. Da brauchst du nur Mittelpunkt und Radius zu kennen (das sind dann eben die nächsten Zahlen im Data). Bei Viertelkreisen wirst du wahrscheinlich keine allgemeinen Viertelkreise brauchen, die 90° aus jedem beliebigen Startwinkel zum Endwinkel malen können, sondern du wirst mit ein paar Standardformen auskommen. Für jede der Standardformen machst du dir eine eigene Sub, die im Data einen eigenen Buchstaben bekommt. PS: Gerade die Kreisproblematik ist zb der Grund, warum Plotter gerne so 'eckige' Zeichensätze haben. Ein S wird zb oft so gemalt
1 | ********** |
2 | * * |
3 | * * |
4 | * * |
5 | * |
6 | * |
7 | ********** |
8 | * |
9 | * |
10 | * * |
11 | * * |
12 | * * |
13 | ********** |
also mit Anfasungen anstelle von Rundungen. Ein Plotter ist ja in erster Linie ein Gerät um damit Zeichnungen zu Papier zu bringen und kein Schönschreibgerät. Für technische Zeichnungen tut es das allemal, und diese kantigen Buchstaben haben auch so ihren Reiz. Zudem haben diese Fonts den enormen Vorteil, dass man sie ohne Probleme sowohl in der X-Achse als auch in der Y-Achse skalieren kann. Kreise nur in einer Achse zu skalieren bedeutet sie in Ellipsen zu verwandeln und dann fangen die Probleme an. Auch Dinge wie Kursivschrift sind viel einfacher, wenn man keine Kreise/Bögen hat, eben weil es ziemlich Aufwändig ist einen Kreis bzw. Kreisbogen geometrisch entsprechend zu verformen. Auch Textdrehungen sind dann nicht mehr so banal. All diese Punkte sind lösbar, wenn man den richtigen Aufbau hat. Aber: Bei Kreisen/Bögen hat man zudem noch das Problem, dass man sie irgendwann immer in gerade Linienstücke aufteilen muss. Damit das aber gut aussieht muss man aus dem Kreisradius zurückrechnen, wie fein die Unterteileung sein muss, damit man sie am Papier noch nicht sieht. Auch das ist lösbar, aber es ist ziemlich aufwändig. Keine Kreise, keine Bögen und man hat diese Probleme erst gar nicht :-) Wer schön schreiben will soll einen Laserdrucker nehmen. Edit: Sieh dir zb hier http://www.mikrocontroller.net/articles/Vektor-Font_in_C mal in den Grafiken die Darstellung von zb dem 'a' oder dem 'e' an. Wenn du genau schaust, sind das keine Bögen sondern genau diese Abfasungen. Sieht doch gar nicht so schlecht aus.
Aus deinem Code für die Buchstaben mit den ganzen Rechts, Motorrechts und sonstigem werde ich nicht schlau. Ist das sowas wie eine Turtle-Grafik? Ich vermisse nämlich in deinem Code eine Funktion, die Grundbaustein jeglichen Plotters ist:
1 | eine Gerade vom Punkt x1,y1 zum Punkt x2,y2 ziehen. |
(und zwar von beliebigen Koordinaten zu beliebigen Koordinaten. Nur senkrechte bzw. waagrechte Linien plotten zu können ist zu wenig) Die ist doch das Hauptarbeitspferd, mit der Zeichnungen ausgegeben werden. Und sie ist natürlich Baustein um daraus dann weitere Funktionalitäten aufzubauen. Seien es jetzt Kreise, Bögen oder auch Buchstaben. Irgendwie kommt mir vor, ihr macht bei eurem Programm den 5ten Schritt vor dem ersten.
Ja die Kreise bestehen auch aus Abstufungen, noch feiner wäre viel zu aufwendig gewesen. Bezüglich der x1y1 zu x2y2 fahren, da haben wir das Problem, dass wir 1. keine Endschalter haben und 2. die Motoren nicht gerade selten einen Schritt überspringen (liegt an der Trägheit der Achsen, wäre zwar lösbar, wenn man den Abstand zwischen den Schritten verringern würde, zu wenig, dann bewegt sich die Achse gar nicht, zu schnell dann überspringt er Schritte
Dafür wurden Schrittmotoren erfunden. Evtl. ist die Ansteuerung dieser nicht optimal. Einen Endlagenschalter oder eine Mechanik, welche es verkraftet Schritte über "Anschlag" zu überleben sollten aber vorhanden sein, um die Position nach dem Start zu definieren. Danach kannst du im Programm die Schritte mitzählen und weißt bis zum nächsten Stromausfall normal, wo sich die Nadel / der Stift befindet. Ansonsten soll mein Codebeispiel nur ein Wink in die von mir bevorzugte Richtung zeigen. Die Subs Links, rechts und Co überlasse ich dir, da ich die Hardware nicht habe und Code zu erstellen, welchen ich in Aktion nie testen werden kann, macht mir nicht wirklich Spaß.
Was ich viellecht hinzufügen sollte: Motorlinks ist der Motor, der für Rauf und Runter zuständig ist, Motorrechts ist für Rechts und Links zuständig, habe ich eigentlich nur gemacht, dass ich nicht so viel schreiben muss. ich habe inzwischen auch schon alle Kleinbuchstaben programmiert, und versuche immernoch, dahinterzukommen, wie ich Arrays verwenden kann in dem Programm
Hey Leute, ich bin momentan dabei, das ganze mal mit Data und Restore zu probieren, wird mir ich schätze mal 2000 Zeilen einsparen (danke für den Tipp), ich hoffe es funktioniert. Bezüglich der Eingabe bin ich mir eben noch unsicher, ob das mit den Ascii Codes funktioniert
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.