Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, habe den code gleich mal probiert.
hatte noch ein anderes problem, das mir vorher nicht aufgefallen ist (siehe bild) Portc ist bestimmt irgendwie durch was anderes belegt, habe portd genommen, jetzt ist die y-linie okay...
Was den code angeht scheint er nicht zu laufen...
Er zeichnet nur eine linie von 0/0 bis 0/30 (ca 1cm hoch)
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,
ich hab mir jetzt mal selbst was zum Testen zusammen gestrickt.
Und bei mir läuft die Line-Sub.
Jedenfalls auf meinem ATmega32.
Ich musste das Programm etwas vereinfachen, damit
meine Testversion-Bascom mit dem Speicher auskommt.
Aber das Prinzip der Line-Routine ist geblieben.
Auf dem Prinzip kann man aufsetzen...
Die Line-Draw Routine werde ich in Assembler schreiben,
damit es richtig schnell wird.
@Sebastian: Testest du mal ?
Gruß Jan
Code:
$regfile = "m32def.dat"
$crystal = 16000000
'#########Variablen Line Funktion
Dim Xs As Integer
Dim Xe As Integer
Dim Ys As Integer
Dim Ye As Integer
Dim Xlen As Integer
Dim Ylen As Integer
Dim Xa As Integer
Dim Ya As Integer
Dim Temp As Integer
Dim N As Byte
'#################################
Declare Sub Drawline()
Config Porta = Output
Config Portc = Output
'Z Alias Portf.1
'Z = 1 ' dunkel
Do
Restore Daten:
For N = 1 To 14
Read Xs
Read Ys
Read Xe
Read Ye
Call Drawline()
Next
Loop
End
Sub Drawline()
';Längen für x und y ausrechnen
Xlen = Xe - Xs
Ylen = Ye - Ys
';Schrittrichtung für x und Y festlegen
If Xlen >= 0 Then Xa = 1 Else Xa = 255
If Ylen >= 0 Then Ya = 1 Else Ya = 255
';wenn xlänge grösser ist, dann laufen wir an der X-Achse entlang
'; ansonsten an der Y-Achse
If Xlen < 0 Then Xlen = Xlen * -1
If Ylen < 0 Then Ylen = Ylen * -1
If Xlen < Ylen Then Goto Walky
Walkx:
' Z = 0 'licht einschalten
Temp = Xlen
Shift Temp , Right , 1
Do
Porta = Low(xs)
Portc = Low(ys)
Waitus 1
Xs = Xs + Xa ':immer einen Schritt in x-Richtung weiter
Temp = Temp - Ylen ';Schritt in Y-Richtung nötig ?
If Temp <= 0 Then ';wenn <=0 dann ja
Temp = Temp + Xlen ';
Ys = Ys + Ya ';Schritt in Y-Richtung
End If
Loop Until Low(xs) = Low(xe) ';Wiederholen bis Ende der Linie
Goto Endofsub
Walky:
' Z = 0
Temp = Ylen
Shift Temp , Right , 1
Do
Porta = Low(xs)
Portc = Low(ys)
Waitus 1
Ys = Ys + Ya
Temp = Temp - Xlen
If Temp < 0 Then
Temp = Temp + Ylen
Xs = Xs + Xa
End If
Loop Until Low(ys) = Low(ye)
Endofsub:
'Z = 1 'und wieder aus
End Sub
Daten:
Data 0% , 0% , 200% , 0%
Data 200% , 0% , 200% , 200%
Data 200% , 200% , 0% , 200%
Data 0% , 200% , 0% , 0%
Data 20% , 20% , 180% , 80%
Data 180% , 80% , 80% , 180%
Data 80% , 180% , 20% , 20%
Data 100% , 120% , 80% , 120%
Data 80% , 120% , 80% , 100%
Data 80% , 100% , 90% , 100%
Data 90% , 100% , 100% , 90%
Data 100% , 90% , 100% , 80%
Data 100% , 80% , 90% , 70%
Data 90% , 70% , 80% , 70%
Liste der Anhänge anzeigen (Anzahl: 1)
Habe es nun doch mit lokalen variablen gemacht, spart überlegungen und somit dass ich immer fragen guckend auf meinen monitor starre *G*
Drawabs und drawrel sind drin.
(achja ich habe die verstärkung am oszi verstellt, deshalb ist das objekt auf dem bild so dammed klein)
Code:
'#################################################################################################################
'#################### Achtung stack einstellungen verdoppeln!! ###################################################
'#################################################################################################################
$regfile = "m128def.dat"
$crystal = 16000000
'######### Variablen Hauptprogramm
Dim Xh1 As Integer
Dim Xh2 As Integer
Dim Yh1 As Integer
Dim Yh2 As Integer
Dim Aktx As Integer 'aktuelle x position
Dim Akty As Integer 'aktuelle y position
'######### Variablen Line Funktion
Dim Xlen As Integer
Dim Ylen As Integer
Dim Xa As Integer
Dim Ya As Integer
Dim Temp As Integer
Dim N As Byte
'########## Hilfsvariablen für drawrel
Dim Xr1 As Integer
Dim Yr1 As Integer
'########### Deklarationsteil für Subroutinen
Declare Sub Drawabs(byval X3 As Integer , Byval Y3 As Integer) 'Zeichnet vom aktuellen Punkt zu den angegebenen kordinaten eine linie
Declare Sub Drawrel(byval X2 As Integer , Byval Y2 As Integer) 'Zeichnet vom aktuellen Punkt zur relativen position eine linie
Declare Sub Drawline(byval Xs As Integer , Byval Ys As Integer , Byval Xe As Integer , Byval Ye As Integer)
Declare Sub Move(byval X1 As Integer , Byval Y1 As Integer)
Declare Sub Showdot
'########### Deklarationsteil für Ports
X Alias Porta
Y Alias Portd
Z Alias Portf.1 'wenn f=0 dann ist der punkt sichtbar, wenn f=1 then ist der punkt aus
Config X = Output
Config Y = Output
'################# Start Hauptprogramm
Z = 1 ' dunkel
Do
Call Move(50 , 50)
Call Drawrel(0 , 100)
Call Drawrel(100 , 0)
Call Drawrel(0 , -100)
Call Drawrel( -100 , 0) 'wieder bei 50,50
Call Drawabs(150 , 150)
Call Drawabs(100 , 200)
Call Drawabs(50 , 150)
Call Drawrel(100 , -100)
Loop
End
'################# Ende Haputprogramm; beginn subroutinen#########################################################
Sub Drawabs(byval X3 As Integer , Byval Y3 As Integer)
Call Drawline(aktx , Akty , X3 , Y3)
End Sub
'############################################################################################################
Sub Drawrel(byval X2 As Integer , Byval Y2 As Integer)
Xr1 = Aktx + X2
Yr1 = Akty + Y2
Call Drawline(aktx , Akty , Xr1 , Yr1)
End Sub
'#############################################################################################################
Sub Drawline(byval Xs As Integer , Byval Ys As Integer , Byval Xe As Integer , Byval Ye As Integer)
'Sub Drawline
'Längen für x und y ausrechnen
Xlen = Xe - Xs
Ylen = Ye - Ys
'Schrittrichtung für x und Y festlegen
If Xlen >= 0 Then Xa = 1 Else Xa = 255
If Ylen >= 0 Then Ya = 1 Else Ya = 255
'wenn xlänge grösser ist, dann laufen wir an der X-Achse entlang
' ansonsten an der Y-Achse
If Xlen < 0 Then Xlen = Xlen * -1
If Ylen < 0 Then Ylen = Ylen * -1
If Xlen < Ylen Then Goto Walky
Walkx:
Temp = Xlen
Shift Temp , Right , 1
Do
Call Move(xs , Ys) 'position setzen
Call Showdot 'punkt zeigen
Xs = Xs + Xa ':immer einen Schritt in x-Richtung weiter
Temp = Temp - Ylen ';Schritt in Y-Richtung nötig ?
If Temp <= 0 Then ';wenn <=0 dann ja
Temp = Temp + Xlen ';
Ys = Ys + Ya ';Schritt in Y-Richtung
End If
Loop Until Low(xs) = Low(xe) ';Wiederholen bis Ende der Linie
Goto Endofsub
Walky:
Temp = Ylen
Shift Temp , Right , 1
Do
Call Move(xs , Ys) 'position setzen
Call Showdot 'punkt zeigen
Ys = Ys + Ya
Temp = Temp - Xlen
If Temp < 0 Then
Temp = Temp + Ylen
Xs = Xs + Xa
End If
Loop Until Low(ys) = Low(ye)
Endofsub:
End Sub
'######################################################################################################################
Sub Move(byval X1 As Integer , Byval Y1 As Integer) 'Bewegt den punkt gedimmt zu der angegebenen position (xs,ys)
X = Low(x1) 'x setzen
Y = Low(y1) 'y setzen
Aktx = Low(x1) 'x setzen
Akty = Low(y1) 'y setzen
End Sub
'######################################################################################################################
Sub Showdot 'zeigt den punkt an seiner aktuellen position an
Z = 0 'licht ein
Waitus 2 'kurz warten
Z = 1 'lich wieder aus
End Sub
'#####################################################################################################################
Liste der Anhänge anzeigen (Anzahl: 1)
Kannst ja mal hier die software angucken, die sollte wohl besser sein als millimeterpapier.
So. kann erst wieder montag probieren. habe daheim noch kein oszi...
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Sebastian,
Deine Zahlen sehen einwandfrei aus,
nur die 4, die 6 und die 7 könnten noch
etwas "Politur" vertragen.
Sonst Klasse !
Ich hab das Programm noch etwas verändert,
da waren noch einige Bugs drin.
Ich hab es jetzt so gemacht, das die Subs zwar
X und Y nutzen, aber nie verändern, so das man
die nicht immer neu setzen muss.
Mit dem Z-Eingang muss ich jetzt doch was machen,
sonst sieht man immer die Anfangs-und Endpunkte
der Linien und Objekte.
Ich bleib dran...
Gruß Jan
Code:
$regfile = "m32def.dat"
$crystal = 16000000
'######### Variablen Hauptprogramm
Dim H As Integer
Dim Hs As Integer
Dim Ss As Byte
'########### Variablen Vektorgrafik
Dim X As Integer
Dim Y As Integer
Dim Z As Integer
Dim Xa As Integer
Dim Ya As Integer
Dim Xe As Integer
Dim Ye As Integer
Dim Xs As Integer
Dim Ys As Integer
Dim Xl As Integer
Dim Yl As Integer
Dim Xo As Integer
Dim Yo As Integer
Dim Zo As Integer
Dim T As Integer
'########### Deklarationsteil für Subroutinen
Declare Sub Moverel
Declare Sub Moveabs
Declare Sub Drawrel 'Zeichnet vom aktuellen Punkt zur relativen position eine linie
Declare Sub Drawabs 'Zeichnet vom aktuellen Punkt zu den angegebenen kordinaten eine linie
Declare Sub Showdot
Declare Sub Drawobj
'########### Deklarationsteil für Ports
Xp Alias Porta
Yp Alias Portc
Zp Alias Portf.1 'wenn f=0 dann ist der punkt sichtbar, wenn f=1 then ist der punkt aus
Config Xp = Output
Config Yp = Output
'################# Start Hauptprogramm
'Zp = 1 ' dunkel
H = 0
Hs = 1
Ss = 0
Do
X = 50 : Y = 50 : Moveabs
X = 100 : Y = 0 : Drawrel
X = 0 : Y = 100 : Drawrel
X = -100 : Y = 0 : Drawrel
X = 0 : Y = -100 : Drawrel
Xa = 50 : Ya = 150 : Xe = 100 : Ye = 200 : Drawabs
Xa = 150 : Ya = 150 : Xe = 100 : Ye = 200 : Drawabs
Xa = 50 : Ya = 150 : Xe = 150 : Ye = 50 : Drawabs
Xa = 50 : Ya = 50 : Xe = 150 : Ye = 150 : Drawabs
X = 0 : Y = 0 : Moveabs
Restore Obj5 : X = 58 : Y = 80 : Drawobj
Restore Obj5 : X = 128 : Y = 80 : Drawobj
Ss = Ss + 1
Restore Spaceship : X = Ss : Y = 170 : Drawobj
Y = 0
X = 0 : Restore Obj0 : Drawobj
X = 22 : Restore Obj1 : Drawobj
X = 44 : Restore Obj2 : Drawobj
X = 66 : Restore Obj3 : Drawobj
X = 88 : Restore Obj4 : Drawobj
X = 110 : Restore Obj5 : Drawobj
X = 132 : Restore Obj6 : Drawobj
X = 154 : Restore Obj7 : Drawobj
X = 176 : Restore Obj8 : Drawobj
X = 198 : Restore Obj9 : Drawobj
X = 220 : Restore Objdp : Drawobj
Loop
End
'################# Ende Haputprogramm; beginn subroutinen
Sub Drawabs
X = Xe - Xa : Y = Ye - Ya
Xp = Low(xa) : Yp = Low(ya)
Call Drawrel
End Sub
'#################################
Sub Drawrel
Xe = Xa + X : Ye = Ya + Y
Xl = X : Yl = Y
Xs = 1 : Ys = 1
If Xl < 0 Then
Xs = -1 : Xl = 0 - Xl
End If
If Yl < 0 Then
Ys = -1 : Yl = 0 - Yl
End If
If Xl < Yl Then Goto Walky
Walkx:
T = Xl
Shift T , Right , 1
Do
'Zp = 0
Xp = Xa : Yp = Ya
Xa = Xa + Xs ':immer einen Schritt in x-Richtung weiter
T = T - Yl ';Schritt in Y-Richtung nötig ?
If T <= 0 Then ';wenn <=0 dann ja
T = T + Xl ';
Ya = Ya + Ys ';Schritt in Y-Richtung
End If
Loop Until Low(xa) = Low(xe) ';Wiederholen bis Ende der Linie
'Zp = 1
Goto Ex1
Walky:
T = Yl
Shift T , Right , 1
Do
'Zp = 0
Xp = Xa : Yp = Ya
Ya = Ya + Ys ':immer einen Schritt in x-Richtung weiter
T = T - Xl ';Schritt in Y-Richtung nötig ?
If T <= 0 Then ';wenn <=0 dann ja
T = T + Yl ';
Xa = Xa + Xs ';Schritt in Y-Richtung
End If
Loop Until Low(ya) = Low(ye) ';Wiederholen bis Ende der Linie
'Zp = 1
Ex1:
End Sub
'##############################
Sub Moveabs 'Bewegt den punkt gedimmt zu der angegebenen position (x,y)
Xa = Low(x) 'Xaktuell setzen
Ya = Low(y) 'Xaktuell setzen
Xp = Low(x) 'Xport setzen
Yp = Low(y) 'yPort setzen
End Sub
'##############################
Sub Moverel
Xa = Xa + X : Ya = Ya + Y
End Sub
'##############################
Sub Showdot 'zeigt den punkt an seiner aktuellen position an
'Zp = 0 'licht ein
Waitus 2 'kurz warten
'Zp = 1 'lichtwieder aus
End Sub
'##############################
Sub Drawobj
Xo = X : Yo = Y
Call Moveabs
Do
Read X : Read Y : Read Z
If Z > 0 Then Call Drawrel Else Call Moverel
Loop Until Z > 1
X = Xo : Y = Yo
End Sub
'######## Objektdefinitionen
'X, Y, Z
'X, Y, Z
'X und Y sind relative Positionen
'z=0 bedeutet moverel
'z=1 bedeutet sichtbare Linie
'Ende Objekt ist wenn z=3
Spaceship:
Data 15% , 8% , 1%
Data -15% , 8% , 1%
Data 6% , -8% , 1%
Data -6% , -8% , 1%
Data 4% , 8% , 0%
Data -5% , 3% , 1%
Data 5% , -3% , 1%
Data -5% , 0% , 1%
Data 5% , 0% , 1%
Data -5% , -3% , 1%
Data 5% , 3% , 3%
Obj1:
Data 0% , 16% , 0%
Data 16% , 14% , 1%
Data 0% , -30% , 3%
Obj2:
Data 0% , 26% , 0%
Data 0% , 2% , 1%
Data 4% , 2% , 1%
Data 9% , 0% , 1%
Data 5% , -4% , 1%
Data 0% , -3% , 1%
Data -18% , -23% , 1%
Data 6% , 3% , 1%
Data 8% , 0% , 1%
Data 6% , -3% , 3%
Obj3:
Data 0% , 3% , 0%
Data 4% , -3% , 1%
Data 10% , 0% , 1%
Data 4% , 3% , 1%
Data 0% , 10% , 1%
Data -3% , 3% , 1%
Data -2% , 0% , 1%
Data 2% , 0% , 0%
Data 3% , 3% , 1%
Data 0% , 8% , 1%
Data -4% , 3% , 1%
Data -10% , 0% , 1%
Data -4% , -3% , 3%
Obj4:
Data 11% , 0% , 0%
Data 0% , 17% , 1%
Data 6% , -5% , 0%
Data -17% , 0% , 1%
Data 17% , 18% , 3%
Obj5:
Data 0% , 4% , 0%
Data 4% , -4% , 1%
Data 10% , 0% , 1%
Data 5% , 5% , 1%
Data 0% , 8% , 1%
Data -5% , 5% , 1%
Data -9% , 0% , 1%
Data -5% , -6% , 1%
Data 0% , 18% , 1%
Data 17% , 0% , 3%
Obj6:
Data 0% , 10% , 0%
Data 0% , -5% , 1%
Data 4% , -4% , 1%
Data 10% , 0% , 1%
Data 5% , 5% , 1%
Data 0% , 8% , 1%
Data -5% , 5% , 1%
Data -9% , 0% , 1%
Data -5% , -6% , 1%
Data 0% , 15% , 1%
Data 4% , 4% , 1%
Data 8% , 0% , 1%
Data 5% , -4% , 3%
Obj7:
Data 0% , 30% , 0%
Data 12% , 0% , 1%
Data 0% , -30% , 1%
Data -6% , 15% , 0%
Data 12% , 0% , 3%
Obj8:
Data 4% , 0% , 0%
Data 10% , 0% , 1%
Data 4% , 5% , 1%
Data 0% , 6% , 1%
Data -18% , 8% , 1%
Data 0% , 6% , 1%
Data 4% , 4% , 1%
Data 10% , 0% , 1%
Data 4% , -5% , 1%
Data 0% , -6% , 1%
Data -18% , -8% , 1%
Data 0% , -6% , 1%
Data 4% , -5% , 3%
Obj9:
Data 0% , 5% , 0%
Data 4% , -5% , 1%
Data 10% , 0% , 1%
Data 4% , 5% , 1%
Data 0% , 20% , 1%
Data -4% , 5% , 1%
Data -10% , 0% , 1%
Data -4% , -5% , 1%
Data 0% , -7% , 1%
Data 4% , -5% , 1%
Data 10% , 0% , 1%
Data 4% , 4% , 3%
Obj0:
Data 0% , 5% , 0%
Data 4% , -5% , 1%
Data 10% , 0% , 1%
Data 4% , 5% , 1%
Data 0% , 20% , 1%
Data -4% , 5% , 1%
Data -10% , 0% , 1%
Data -4% , -5% , 1%
Data 0% , -20% , 3%
Objdp:
Data 7% , 7% , 0%
Data 4% , 0% , 1%
Data 0% , 4% , 1%
Data -4% , 0% , 1%
Data 0% , -4% , 1%
Data 0% , 12% , 0%
Data 4% , 0% , 1%
Data 0% , 4% , 1%
Data -4% , 0% , 1%
Data 0% , -4% , 3%