Forum: Mikrocontroller und Digitale Elektronik Programmierung mit Bascom


von Gorn (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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)

von Gorn (Gast)


Lesenswert?

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.

von sub (Gast)


Lesenswert?

dann nenn sie doch einfach Sub A_klein

von Gorn (Gast)


Lesenswert?

Das Problem ist nicht die Sub, sondern folgende Zeile:

Dim A As String * 2         (funktioniert)
DIm a As String * 2         (Fehler: Variable bereits dimensioniert)

von sub (Gast)


Lesenswert?

Wenn ich das richtig in Erinnerung habe, dann liegt das doch an BASCOM, 
da hier nicht von Groß- und Kleinschreibung unterschieden wird.

von avrGerd (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

Aus der BASCOM-Hilfe:

Case is not significant. The following line labels are equivalent:
alpha:
Alpha:
ALPHA:

Merkst du etwas?

MfG Spess

von Gorn (Gast)


Lesenswert?

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.

von Charly B. (charly)


Lesenswert?

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

von Gorn (Gast)


Angehängte Dateien:

Lesenswert?

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

von Weingut P. (weinbauer)


Lesenswert?

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

von Gorn (Gast)


Lesenswert?

Kann es sein, dass ich a gar nicht als String definieren muss, wenn ich 
es über den Terminal eingebe?

von avrGerd (Gast)


Lesenswert?

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

von Gorn (Gast)


Lesenswert?

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?

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

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

von Gorn (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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!

von avrGerd (Gast)


Lesenswert?

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

von avrGerd (Gast)


Lesenswert?

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

von Gorn (Gast)


Lesenswert?

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.

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

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

von Gorn (Gast)


Lesenswert?

Das Versteh ich jetzt nicht ganz von der Syntax her.
Abarbeiten ist klar, nur wie verwirkliche ich das?

von Bascom Hacker (Gast)


Lesenswert?

Ich bin auch mit dem Musikmachen und dem Singen überfordert.

Daher lass ich es einfach sein.

Selbsterkenntnis.

von Gorn (Gast)


Lesenswert?

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

von Der Bayer (Gast)


Lesenswert?

Na geht doch immer besser mit der Pädagogik, weiter so ;-)

von Der Bayer (Gast)


Lesenswert?

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 ?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Der Bayer (Gast)


Lesenswert?

Da bin ich bei Dir .....

von Gorn (Gast)


Lesenswert?

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

von Gorn (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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?

von Gorn (Gast)


Lesenswert?

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

von Weingut P. (weinbauer)


Lesenswert?

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

von Klaus D. (kolisson)


Lesenswert?

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

von Gorn (Gast)


Lesenswert?

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.

von Lehrmann M. (ubimbo)


Lesenswert?

Gorn schrieb:
> Ja bei Jugend Forscht waren wir mit dem Plotter dabei.

Ich hoffe ihr habt niemandem euren Quellcode gezeigt ...

von Gorn (Gast)


Lesenswert?

doch, aber von der jury hatte keiner einen plan davon

von Klaus D. (kolisson)


Lesenswert?

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

von Klaus D. (kolisson)


Lesenswert?

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

von Gorn (Gast)


Lesenswert?

Soweit habe ich alles verstanden, Programm ist bereits komplett 
überarbeitet

Danke für die Hilfe


Was mir immernoch ein Rätsel ist, sind Arrays ;)

von Klaus D. (kolisson)


Lesenswert?

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

von Gorn (Gast)


Angehängte Dateien:

Lesenswert?

Ich hoffe natürlich, das ich daran noch mehr verbessern kann

von Karl H. (kbuchegg)


Lesenswert?

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.

von Klaus D. (kolisson)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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)

von Klaus D. (kolisson)


Lesenswert?

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

von Gorn (Gast)


Lesenswert?

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ß

von peterfido (Gast)


Lesenswert?

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

von Gorn (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Gorn (Gast)


Lesenswert?

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

von peterfido (Gast)


Lesenswert?

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

von Gorn (Gast)


Lesenswert?

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

von Gorn (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.