PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Scopeuhr mit BASCOM??



sebastian.heyn
04.07.2005, 20:11
Hallo,

hat jemand schonmal sowas versucht??
http://www.nixieuhren.de/nixieuhren/andereuhren/index.php
(ganz oben) Wer hat nicht ab und zu mal sein oszisinnlos laufen? eine schöne uhr wäre da schon cool. oder ne kleine animation,grins

PicNick
05.07.2005, 13:05
Noch nicht probiert, ist aber eine nette Idee

sebastian.heyn
05.07.2005, 13:35
Ich bin noch am überlegen wie das laufen soll. also mann kann im x-y modus den punkt von oben nach unten bez links rechts frei steuern, (man könnte ihn unten links hinsetzen (0,0) und dann einfach zeile für zeile abfahren lassen) aber wie setzt man ihn auf null bei den stellen die man nicht sehen will?

JanB
05.07.2005, 13:48
Hallo,
viele Oszis haben einen zusätzlichen sog. Z-Eingang.
Über den kann man die Helligkeit des Strahls steuern.
Das ist z.B. bei meinem Hameg-Oszilloskop
eine BEC-Buchse auf der Rückseite des Gerätes.

Guß Jan

PicNick
05.07.2005, 13:49
Man könnt ins Scope reingreifen und "Intensity" mißbrauchen.
Oder, wenn man die dunklen Stellen einfach überspringt, könnt' es reichen.
Müßte man versuchen.

sebastian.heyn
05.07.2005, 14:02
MMHH eingriff is blööd. aber man könnte 0,0 auf irgendwo ausserhalb des sichtbaren bereiches setzen... Kennst du ein bildformat wo man 1 bit so einfach auslesen könnt? also was weiss ich 200x200 pixel - und dann bit für bit auf dem screen setzen bei ner null setz ich beide ports auf null..

sebastian.heyn
05.07.2005, 14:04
z achse das ist ja geil genau das habe ich gesucht! (schon peinlich wie scheisse man sich mit seinen geräten auskennt)

PicNick
05.07.2005, 14:08
Ich weiß nicht, ob Pixelgraphik so gut wäre. Ich würde gerne Vektorgraphik versuchen, d.,h. jedes Zeichen ist eine Folge von (vordefinierten) Strichen und Kurven.
Wenn Pixel, dann doch ein bißchen dithering, um Pseudomäßig graustufen zu erzeugen, also z.B. immer zwei Lines zusammen.
Am besten Bilder als BMP, aber mit RLE, damit das Schwarze wegfällt.
(Pixel)
Für Vector müßt man sich alte Plotterformate und Turtle-graphik anschauen.

sebastian.heyn
05.07.2005, 14:25
mmhh ich werde bei pixelgrafik bleiben. mit interner zeitbasis und ext. trigger um widerstände zu sparen mal sehen ob der z eingang dann auch noch läuft... O:) vektorgrafik ist zu aufwendig, habe mich damit auch noch nicht beschäftigt um ehrlich zu sein.
wie funktioniert tiff format?

PicNick
05.07.2005, 14:33
BMP, TIFF, PCX, ... und mehr sind alles Pixel Graphikformate. Nachteil ist, daß du das ganze Bild im Zugriff haben mußt, um das Bild refreshen zu können.
Also eine Linie von links nach rechts sind (z.B) 200 x y Werte. Als Vektor hast du nur Anfangspunbkt und Endpunkt.
Das soll aber keine Reklame sein.

JanB
05.07.2005, 14:48
Hi zusammen,
ich plädiere auch für Vektorgrafik.
Das bietet sich auf einem Scope doch geradezu an.
Und ist doch im Zeitalter der gerasterten Displays
technisch viel interessanter.
Mit zwei halbwegs flotten 8-Bit-DA-Wandlern wären
256 x256 Punkte ansteuerbar.
Es müssen pro Vektor ja auch nur die Endpunkte im Speicher
des uC gehalten werden.
Für flächige Bilder wie BMP und Co. ist das natürlich ungeeignet.

Aber ein schönes 3D-Drahtmodell von einem kleinen AVR
auf dem Scope langsam rotierend in 3D dargestellt,
das könnte mich schon reizen ein verregnetes Wochende dafür zu nutzen.

Gruß Jan

sebastian.heyn
05.07.2005, 14:49
mmhh mit vektorgraphik ist schon mehr machbar... (zb bei ner uhr die zeiger etc) aber for a start find ichs ganz schön hardcore. kenne mich nicht aus mit vektorgrafik.verde erstmal 2 da wander zaubern und ein bisschen rumspielen, wenn die ansteuerung läuft kann man sich ja mal in vektorgrafik reindenken...

PicNick
05.07.2005, 14:54
Oder ein hübsches Radar für den Robby mit US oder IR Sensoren

sebastian.heyn
05.07.2005, 14:55
mmhh meinst du das das reicht als da wandler??

PicNick
05.07.2005, 14:57
So würd' ich anfangen. Es gibt aber auch DAC für 2 stereo Kanäle f. Bitstream. Die sollten nicht teuer sein, in jedem MP3-Player is ja sowas drin.

sebastian.heyn
05.07.2005, 15:10
okay, dann werd ich mal anfangen das netzwerk aufzubauen.. (aufgeregt sei)
wie tasten wir dunkel?? (z=0v hell und z=5v dunkel??)

JanB
05.07.2005, 15:17
Ja, da das Scope ja ziemlich hochohmig am Eingang ist,
müsste das für erste Versuche reichen.

Wenn ich so drüber nachdenke -
der Teufel steckt wie immer im Detail:
Für eine echte Vektorgrafik bräuchte man noch
einiges analoges Zeugs dahinter.
Integratoren z.B, um den Strahl "langsam"
vom Start zum Endpunkt zu führen.
Diese Integratoren für X und Y-Achse müssten
immer gleichzeitig fertig werden, auch wenn die
Spannungsdifferenzen unterschiedlich sind, damit der
Strahl immer den direkten kürzesten Weg nimmt,
also die Gerade zwischen den Endpunkten des Vektors.
Und die geometrische Summe aus X und Y-Geschwindigkeit sollte
konstant sein, damit die Vektoren unabhängik von der Länge
immer gleich helll erscheinen....

Hmmm... mit sowas kenn ich mich nicht so gut aus...

Oder denke ich da zu kompliziert ??

Also nehmen wir lieber "unechte" Vektorgrafik und klappern
jeden Punkt auf dem Weg von A nach B per AVR selbst ab.

Dann genügen deine einfachen Wandler, und wir brauchen sonst nix weiter.

Gruß Jan

sebastian.heyn
05.07.2005, 15:28
das wäre denke ich das einfachste, weil sonst wird der aufwand zu hoch....

Andree-HB
05.07.2005, 15:41
Mal eine ganz blöde Frage - wie kann an denn bei einem Oszi den Leuchtpunkt nach links wandern lassen ? Man hat doch lediglich einen veränderbaren Sägezahn für die Timeline, der aber doch nicht rückwärts funktionert. Oder liege ich da jetzt ganz falsch ?

Auf der verlinkten Schaltung übernimmt ja eine ganz andere Ansteuerung für Kathode/Anode die Ablenkung des Elektronenstrahls.

JanB
05.07.2005, 15:51
@Andree:
Du kannst fast jedes 2-Kanal Oszilloskop
auch in die X-Y Betriebsart umschalten.
Dann wird die Zeitablenkung abgeschaltet.,
und du kannst den Strahl in X und Y Richtung beliebig steuern.
Wenn beide EIngänge auf 0 Volt sind, steht einfach der Punkt in der Mitte.
( und brennt sich ein :-( )

Gruß Jan

sebastian.heyn
05.07.2005, 16:21
naja in der mitte, je nach dem wie des eingestellt hast *KLUGSCHE!SS*
ich hoffe heute abend noch wenigstens den punkt übern bildschirm wandern zu lassen also habe den wandler gemäß der schaltung aufgebaut...

JanB
05.07.2005, 16:36
Hallo,
Die Idee einer "echten" Vektorgrafik geht mir doch nicht aus dem Kopf.
Ich hab noch mal drüber nachgedacht, und mich informiert.
(VECTREX - kennt das noch jemand ? Aus der vor-C64-Zeit ? )

Also die Sache dürfte doch nicht so kompliziert sein.
Die zwei AD-Wandler und zwei OPs als Integratoren und
ein paar Analogschalter sollte reichen.
Und ein paar Kondensatoren und Widerstände natürlich.

Gruß Jan

sebastian.heyn
05.07.2005, 18:00
dazu bin ich warscheinlich zu jung, grins...
ich habe das netzwerk fertig und es lauft auch, jedenfalls nicht so wie ich es mit vorgestellt habe... Glaube mein scope ist zu träge, oder es geht echt nicht jeden punkt einzeln darzustellen...

PicNick
05.07.2005, 19:14
Jaja, der Jan scheint ein ganz Altgedienter zu sein.

Ich nehm' doch an, daß du deine XY Ausgänge mal mit dem Oszi im "normalbetrieb" gecheckt hast ?
welche Punkte gehen denn nicht ?

sebastian.heyn
05.07.2005, 19:17
Habe auf x-y gestellt und kann auch dunkel tasten (mit z eingang auf 5v) aber wenn ich versuche zwei dicke weisse balken auf den screen zu bringen dann ist das einfach zu langsam. also kann man warschenlich wirklich maximal einzele linien oder maximal zahlen darstellen, weil dafür die geschindigkeit der röhre grade so reicht...

PicNick
05.07.2005, 19:28
Na, die Röhre weniger, da fetzen ein paar Elektronen rum, die sind flott genug.
Aber der Verstärker hat natürlich Grenzfrequenzen.
Aber wenn du z.B. einen Sinus anhängst, und das Oszi zu langsam einstellst, siehst du ja auch einen weissen Balken. Also gehen muß das schon, daß du den Schirm einfärbst.
Ich muß für Eigenversuche erstmal solche DAC basteln, dann kann ich mitspielen.
Derweil klopf ich dir aus der Ferne aufmunternd auf die Schulter

pebisoft
05.07.2005, 20:49
hallo jan, was mach dein video-avr projekt. hast du schon neue ziele erreicht.
würde mich interessieren.
mfg pebisoft

JanB
05.07.2005, 21:21
Hi Peter, Grüß Dich !!

Nee, das Video-Projekt ruht noch.
Hab erstmal das Interesse verloren.
Was ich machen wollte, habe ich realisiert,

Ich könnte das noch weiter verbessern, aber wozu...
Ist doch Okay so wie es ist.
Irgendwann muss man auch mal sagen:
So jetzt ist es fertig.
Und Platz machen für ein neues interessantes Projekt.

z.B. Vektorgrafik mit AVR und Oszilloskop.
Das gefällt mir.
Sebastian hat schon angefangen - Klasse.
Mal sehen was er draus macht.

Ich muss erst 'ne Weile drüber nachdenken...


Gruß Jan

pebisoft
05.07.2005, 21:50
ich hatte 1983 mal ein spielgerät. war ein rechteckiger grünmonitor, der hochkant aufgestellt war. hatte 2 spielregler dran. die figuren(weltraumflieger) auf dem bildschirm waren nur durch linien verbunden. damals konnte ich das noch nicht einordnen. man konnte keine farben(graustufen) darstellen und keine ausgemalten körper. danach habe ich mir den c64 gekauft.
jetzt wo ich die scope-spielerei gesehen habe, kann ich dieses gerät zuordnen.
mfg pebisoft

sebastian.heyn
05.07.2005, 22:28
Also ich werde morgen mal versuchen ein paar zahlen darzustellen, wenn man den punkt langsam genug bewegt, müsste es eigentlich gehen. mit den bitmaps das ist echt zu blöd. ich denke evtl drüber nach mit zwei opv inverter zu machen, das ich null null oben links anfangen tue, damit fällt ein bisschen rechenarbeit weg, weil dann 254 254 unten rechts istr wie auf dem pc monitor. das ist denke ich nur gewohnheit, aber es macht viele sachen einfacher...

sebastian.heyn
06.07.2005, 09:51
Guten morgen. Hier mal ein bild. ich mache mir gedanken wie ich die zahlen realisiere wo man rundungen benötigt *kratz*

pebisoft
06.07.2005, 10:22
wenn du es so proggen tust, kannst du es nur realisieren wenn du die herkömmlichen ascii-pixelstrukturen nimmst.
ein mischmasch zu den pixeln mit vectoren sollte man-frau nicht machen, entweder das eine oder das andere.
mfg pebisoft

pebisoft
06.07.2005, 10:24
warum macht ihr das so umständlich , viele scope haben doch einen tv-eingang, den benutzt du dann, daran hängst du dein signal und brauchst dich nur noch um 0 oder 1 zu kümmern, aber rechtzeitig.
der bildstrahl der röhre hält zu lange an, wenn ich schon wieder auf den nächsten punkt bin entstehen schlieren. vectoren sind ein bisschen deutlicher,
ziehen aber auch nach.
mfg pebisoft

Manf
06.07.2005, 10:37
Als ich soetwas aufbgebaut habe (als Praktikumversuch vor 28 Jahren), da gab es nicht so viele Alternativen. Bei dem Aufbau wurde pixel-zeilenweise ausgelesen und ein Character-Rom kam dann auch noch mit dazwischen.
Ich nehme aber an, wenn es fertig ist, dann wird es kaum eine Anwendung dafür geben. Wie wäre es in Vergleich hiermit?
(Interessant wäre vielleicht die Größe und der Preis.)


Pollin LC-Display LPH7508-1
Grafisches LC-Display mit 100x64 Pixel zum Anschluss an die parallele Computerschnittstelle. Integrierter Controller SED1560 und grüne LED-Hintergrundbeleuchtung.
Best.Nr. 120 244 --- 4,95 EUR

http://www.pollin.de/shop/images/article/small/K120244.JPG

JanB
06.07.2005, 10:42
Hi Sebastian,
Das Bild sieht ja schon Super aus !!
Deine einfachen DA-Wandler funktionieren also einwandfrei.

Zahlen mit Kurven ?
Kurven bestehen aus mehreren Vectoren.
Je mehr, desto runder.
Ein Kreis z.B lässt sich einigermassen durch 6 Vektoren als Sechseck darstellen,
mit 12 oder noch mehr Vektoren wird er immer runder.

Gruß Jan

JanB
06.07.2005, 10:50
Hallo Manfred,

wenn es fertig ist, dann wird es kaum eine Anwendung dafür geben
Ja und ? ist doch egal.

Welche Anwendung hast du denn z.B. für einen ASURO, der Männchen machen kann ?
(Balancierender Zweirad Robot)
Ausser, dass es einfach interessant ist und Spaß macht es zu entwickeln.

Der Weg ist das Ziel.
Da kann man eine Menge bei lernen und es macht mir einfach Freude,
mich damit zu beschäftigen..

Schöne Grüße

Jan

chr-mt
06.07.2005, 11:07
Sieht ja schon klasse aus!
Bin schon gespannt, wie es weitergeht !
Theoretisch kann man mit einem Scope auch Videobilder darstellen..
Vor etwa 30 Jahren gab es so was mal als Experimentierkasten von Kosmos oder Philips.
Damals konnte man mit der Scope-Röhre fernsehen ;)
Nur so als Anregung, ihr macht ja die verrücktesten Sachen hier :D


Gruß
Christopher

PicNick
06.07.2005, 11:20
Das ist absolut anwendbar. Genauso könnt man Laser figuren in die Luft zeichnen etc.
Und für Drahtmodelle ist das wahrscheinlich überhaupt eine gute Möglichkeit für Controller.

sebastian.heyn
06.07.2005, 11:42
Hallo.
Bin jetzt an dem punkt, wo ich nicht mehr "spielen" will, ich habe nun angefangen eine sub"Line" zu bauen, aber irgendwo habe ich da nen denkfehler

im moment ist es schon ganz schön schlech gecoded aber optimiert wird hinterher.
im hauptprogramm rufe ich x= y= x2= y=2 danach die sub. meint ihr man sollte das als funktion schrieben (geht das in bascom überhaupt?)




Line:

'lX ursprung x
'lY ursprung y
'lX2 ziel x
'lY2 ziel y

Lx = X
Ly = Y

Lx2 = X2
Ly2 = Y2

Z = 0 'hell

Do

Porta = Lx
Portc = Ly

If Lx < Lx2 Then Incr Lx
If Ly < Lx2 Then Incr Ly

If Lx > Lx2 Then Decr Lx
If Ly > Lx2 Then Decr Ly

Waitus 10

Loop Until Lx = Lx2 And Ly = Ly2

Z = 1 ' dunkel

Return


[/code]

JanB
06.07.2005, 12:25
Hallo Sebastian,

Genau, eine LIne-Sub ist das richtige.

Dein Ansatz ist OK, wird aber so wohl nicht funktionieren, vermute ich.
Damit wirst du glaube ich immer 45Grad-Linien zeichnen,
die am Ende waagerecht oder senkrecht auslaufen.
Also immer so Haken.

Wenn ich Zeit finde, werde ich mal die Methode ausgraben, solche LInien zu ziehen.
Ich habe das vor Jahren mal in einem anderen Zusammenhang gebraucht.
Da ging es darum, Gussteile mit einem Ultraschallkopf nach Koordinaten aus
einer CAD-Datei abzutasten, um Risse zu finden.
Ist schon lange her, mal sehen ob ich das noch zusammenkriege.
Ich hatte eine schöne schnelle Methode, die nur Addition und Subtraktion brauchte.

Aber ich denke, du findest auch einen Weg...

Gruß Jan

sebastian.heyn
06.07.2005, 12:35
in der tat sieht das so auf das ist aber voll blööd. äähm meinst das das rein softwaretechnisch zu lösen ist? man müsste mal in eine turbo pascal unit reinschauen wie die das gemacht haben... aber damit nimmt man ja den reiz der ganzen geschichte. jemand anderes noch eine idee???

Manf
06.07.2005, 13:12
Die Inkremente für x und y entsprechdend der Größe der Vektorkomponenten wählen. Der größere Wert ist 1 der kleinere ensprechend geringer.
Das erfordert eine höhere Auflösung bei Lx und Ly. Ausgegeben wid dann nur der "ganzzahlige" Teil.
Manfred

sebastian.heyn
06.07.2005, 13:49
Hä *kopfkratz* langsam jetzt bitte. Soll ich also den wertebereich erweitern und dann ins verhältniss stellen? *fragend guck*

JanB
06.07.2005, 14:20
Hallo,
ich hab in der Mittagspause mal schnell in Pseudocode skizziert,
wie ich mir so eine Line-Routine vorstelle.
Müsste eigentlich funktionieren.

Die Linien sind allerdings noch nicht balanciert,
da war noch ein Trick nötig, der mir jetzt auf
die Schnelle nicht einfällt.




;Drawline in Pseudocode.
;-----------------------

;Übergeben werden die Start- und Endpunkte der Linie xs,ys und ys,ye

;Die Routine braucht nur Addition /Subtrktion, kommt ohne Multiplikation / Division aus.
;Alle Variable könne Byte sein.
;Kann problemlos und einfach in Assembler kodiert werden.



Drawline(xs,ys,ys,ye)

;Längen für x und y ausrechnen
xlen=xs-xe
ylen=ys-ye

;Schrittrichtung für x und Y festlegen
if xlen>=0 then xa=1 else xa=-1
if ylen>=0 then ya=1 else ya=-1

;wenn xlänge grösser ist, dann laufen wir an der X-Achse entlang
; ansonsten an der Y-Achse
if abs(xlen) < abs(ylen) then goto walky


walkx:
temp=xlen
do
portx=xs
porty=ys
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
endif
loop until xs=xe ;Wiederholen bis Ende der Linie

Return ;Ende sub



WalkY:
temp=ylen
do
portx=xs
porty=ys
ys=ys+ya
temp=temp-xlen
if temp<0 then
temp=temp+ylen
xs=xs+xa
endif
loop until ys=ye
return



Schau dirs halt mal an...

Ich denke immer noch über die Hardwarelösung nach,
wo die Linie auf dem Scope mittels zweier Integratoren
automatisch gezogen wird.

Gruß Jan

Manf
06.07.2005, 14:42
Wenn dx= 12 und dy = 3 ist, dann kann man in jedem Schritt x um 1 erhöhen und y um 1/4 erhöhen und erreicht bei angepasster Schrittweite gleichzeitig den Zielpunkt.
Die Ausgabewerte sollten für den D/A Wandler ganzzahlig sein, die intere Berechnung benötigt dafür eine höhere Auflösung.
Manfred

sebastian.heyn
06.07.2005, 16:25
So habe mal versucht den pseudocode anzupassen, viel war ja nicht mehr zu machen... Es scheint ein bisschen buggy zu sein. Hat jemand anderes schon die hardware nachgebaut???





$regfile = "m128def.dat"
$crystal = 16000000

'#########Variablen Line Funktion
Dim Xlen As Long
Dim Ylen As Long
Dim Xa As Long
Dim Ya As Long
Dim Temp As Long

'#################################

Declare Sub Drawline(byval Xs As Byte , Byval Ys As Byte , Byval Xe As Byte , Byval Ye As Byte)

Config Porta = Output
Config Portc = Output
Config Portf = Output

Z Alias Portf.1

Z = 1 ' dunkel


Do
Call Drawline(0 , 0 , 100 , 100)
Waitms 1


Loop

End




'Drawline in Pseudocode.
';-----------------------
'
';Übergeben werden die Start- und Endpunkte der Linie xs,ys und ys,ye
'
';Die Routine braucht nur Addition /Subtrktion, kommt ohne Multiplikation / Division aus.
';Alle Variable könne Byte sein.
';Kann problemlos und einfach in Assembler kodiert werden.


Sub Drawline(xs As Byte , Ys As Byte , Xe As Byte , Ye As Byte)

';Längen für x und y ausrechnen
xlen=xs-xe
ylen=ys-ye

';Schrittrichtung für x und Y festlegen
if xlen>=0 then xa=1 else xa=-1
if ylen>=0 then ya=1 else ya=-1

';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 Xlen = Xlen * -1
If Xlen < Ylen Then Goto Walky


walkx:
Z = 0 'licht einschalten
temp=xlen
do
Porta = Xs
Portc = 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
endif
Loop Until Xs = Xe ';Wiederholen bis Ende der Linie
Goto Endofsub

WalkY:
Z = 0
temp=ylen
do
Porta = Xs
Portc = Ys
Waitus 1
ys=ys+ya
temp=temp-xlen
if temp<0 then
temp=temp+ylen
xs=xs+xa
endif
loop until ys=ye

Endofsub:
Z = 1 'und wieder aus
End Sub

JanB
06.07.2005, 18:41
Hallo Sebastian,
ich habe deinen Code noch mal überarbeitet.
Sollte jetzt funktionieren.
Hauptproblem war das Bascom die Byte-Variablen nicht
als vorzeichenbehaftete Zahlen betrachten kann.
Deshalb habe ich es auf Integer umgeändert.
Probier es doch mal aus,und gib Bescheid, was passiert.
Müsste ein Dreieck angezeigt werden.

Gruß Jan



$regfile = "m128def.dat"
$crystal = 16000000

'#########Variablen Line Funktion
Dim Xlen As Integer
Dim Ylen As Integer
Dim Xa As Integer
Dim Ya As Integer
Dim Temp As Integer
'#################################

Declare Sub Drawline(byval Xs As Integer , Byval Ys As Integer , Byval Xe As Integer , Byval Ye As Integer)


Config Porta = Output
Config Portc = Output
Config Portf = Output

Z Alias Portf.1

Z = 1 ' dunkel


Do
Call Drawline(0 , 0 , 100 , 80 )
Call Drawline(100 , 80 , 22 , 33)
Call Drawline(22 , 33 , 0 , 0)
Waitms 1


Loop

End




Sub Drawline(xs As Integer , Ys As Integer , Xe As Integer , Ye As Integer)

';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
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
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

sebastian.heyn
06.07.2005, 19:08
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)

JanB
06.07.2005, 21:26
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



$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%

sebastian.heyn
06.07.2005, 22:01
Na prima, grins. Also ich werds morgen früh gleich mal testen. Bin schon ganz aufgeregt...

@jan: du machst keine pausen (wait) mehr? hatte angst das man gar nix mehr sieht... assembler ist natürlich schon geil, aber der µCOM assembler etwas undurchsichtig. (hatte mal nen grundkurs mit TASM vor jahren) Hast du 10/20k gewählt oder kleiner?

JanB
06.07.2005, 22:05
Hallo,
Ich habe 100k und 47k.
Hatte gerade nix anderes in der Menge da.
Ich bin aber erstaunt wie gut es sogar mit diesem
Primitiv-DA-Wandler geht. :-)

Ok, schauen wir morgen mal weiter...

Gruß Jan

sebastian.heyn
07.07.2005, 08:59
Heeyy, mit so einem DA wandler kann man richtig was anfangen (ich kann mich dran erinnern das es mal eine software gab, die damit sound auf dem LPT1 ausgegeben hat, grins)

Also es Läuft suupi. bei mir sieht es allerdings etwas gepunkterer aus, stört mich aber nicht...
Jetzt werde ich mal versuchen die zahlen zu definieren, und eine prozedur zu machen, die offsets mit einrechnet, um die buchstaben/zahlen an beliebige stellen zu positionieren...

Kennt jemand ein vektorprogramm, in dem man evtl auf die schnelle einen zeichensatz erstellen könnte? (oder nehm ich paint?)

JanB
07.07.2005, 10:46
Hallo,
Vieleicht sollten wir das etwas vereinheitlichen,
damit nicht so viele Zahlen übergeben werden müssen.
Ich schlage vor zunächst 4 Subroutinen zu definieren:

1. Move(x,y) - bewegt den Strahl unmittelbar auf Punkt x,y ohne eine Linie zu ziehen.

2. Drawabs(x,y) -Zieht eine LInie von der aktuellen Position nach Position x,y

3. Drawrel(x,y) - Zieht eine Linie relativ zur aktuellen Position, also x,y Punkte weiter.

4. Drawobj(Adresse von obj) - Zeichnet ein Objekt auf der aktuellen Position.

Objekt könnte z.B ein Buchstabe oder ein Raumschiff sein
Das Objekt besteht aus relativen sichtbaren und unsichtbaren Linien.
z.B. so:
x,y,0 - unsichtbare Linie von akt.Position
x,y,1 - sichbare LInie
x,y,1 - noch 'ne sichtbare
x,y,9 -letzte (sichtbare) Linie - ende Objekt

Damit könnte man schon mal eine Menge anfangen.
Die Zahlen würdest du als Objekte definieren.

Nur ein Vorschlag...

Gruß Jan

sebastian.heyn
07.07.2005, 11:36
Hi,

also das ganz in kleine unterprogramme aufzuteilen ist ne gute idee, weil das die arbeit hinterher schön einfach macht! Willst du die Z achse mitbenutzen, oder lassen wir sie weg, und der Strahl ist immer ungedimmt? Damit das nachbauen mit den vielen verschiedenen Prozessoren schneller geht habe ich mal den deklarationsteil geändert. X und Y sind direkte aliasse von den ports und können auch so gesetzt werden.

@jan: für vorschläge was die hardwarelösung angeht bin ich zu haben, lasse nächste woche einen prototypen fertigen und habe noch platz auf dem board.




X Alias Porta
Y Alias Portd
Z Alias Portf.1 'wenn z=0 dann ist der punkt sichtbar, wenn z=1 then ist der punkt aus

Config X = Output
Config Y = Output

JanB
07.07.2005, 11:57
Hallo,
Die Z-Achse ist schon irgendwie mit drin.
Move-Befehle sind mit Z=Aus.
Draw-Befehle sind mit Z=An.
Objekte haben in der letzten Zahl 0 oder 1 für Z.

Die Harwarelösung wird so schnell nicht gehen.
Ich muss das selbst erst aufbauen und testen.

Wer weiss, ob das überhaupt so geht, was ich mir da überlegt habe.
OK, ich hab 'ne Menge von dem VECTREX abgeguckt,
und da ging es ja auch...

Mit den Alias für die Ports, das finde ich gut.

Gruß Jan

sebastian.heyn
07.07.2005, 12:47
MMHH oder wir ziehen das jetzt einfach so wie es ist durch....
habe jetzt erstmal ein wenig ordnung gemacht...

Die subs move und showdot sind dazugekommen, generell übergebe ich keine variablen an die subs (wenn jemand anders drüber denkt bitte mitteilen)




$regfile = "m128def.dat"
$crystal = 16000000

'######### Variablen Hauptprogramm
Dim Xs As Integer
Dim Xe As Integer
Dim Ys As Integer
Dim Ye As Integer


'######### 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


'########### Deklarationsteil für Subroutinen
Declare Sub Drawline
Declare Sub Move
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

Restore Daten:
For N = 1 To 14
Read Xs
Read Ys
Read Xe
Read Ye
Call Drawline

Next

Loop
End
'################# Ende Haputprogramm; beginn subroutinen



'################################################# ################################################## ##########
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 '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 '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 'Bewegt den punkt gedimmt zu der angegebenen position (xs,ys)
X = Low(xs) 'x setzen
Y = Low(ys) '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

'################################################# ################################################## ##################




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%

sebastian.heyn
07.07.2005, 13:08
Die drawabs und drawrel können ja auf drawline basieren und dürften relativ schnell realisiert sein. also wenn man global mit xs und xe bzw ys und ye arbeitet ist xe und ye ja einfach auszurechnen... werde ich denke ich nachher mal machen

JanB
07.07.2005, 13:56
Die drawabs und drawrel können ja auf drawline basieren und dürften relativ schnell realisiert sein
Genau, ich seh schon - du hast das drauf... :-)
Wichtig ist nur: Hinterher ist xs,ys das vorherige xe,ye.

Die Variablen xs,ys,xe,ye und auch z global zu definieren,
finde ich auch gut so, das spart ne Menge Speicher und
Rechenzeit.


Wenn ich nachher nach Hause komme, werd ich mich dann
mit Drawobj befassen, damit von mir auch noch was kommt.

Gruß Jan

sebastian.heyn
07.07.2005, 14:19
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)




'################################################# ################################################## ##############
'#################### 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

'################################################# ################################################## ##################

JanB
07.07.2005, 18:08
Gute Arbeit, Sebastian !
Dein Programm läuft auch bei mir auf dem Mega32 einwandfrei.
Ich muss nur die Ports umsetzen, geht ja dank Alias sehr einfach.

Ich werde mich jetzt mal an die Objektdarstellung geben.
Es wird wohl sinnvoll sein, die Objekte auch drehbar zu machen.
Naja...Nächster Schritt... Eins nach dem Anderen...

Gruß Jan

sebastian.heyn
07.07.2005, 18:26
Wie willst du (falls du das planst) den Font einbauen?
Ich bin mal gespannt ob wir nich das drehende IC zu sehen kriegen, aber dafür habe ich wohl in Mathe nicht genug aufgepasst *grins*

pebisoft
07.07.2005, 18:45
wenn ihr das in winavr-c proggen tut, geht es wesentlich schneller.
es ist schade um die arbeit wenn ihr es in bascom umsetzt.
euro routinen sind klug erdacht, werden aber wieder durch das langsame bascom versaubeutelt. aus eurer kategorie heraus erwarte ich eigentlich winavr-c.
mfg pebisoft

sebastian.heyn
07.07.2005, 18:55
Hallo,

das Bascom nicht unbedingt langsamer ist als C wurde hier im forum glaube ich schonmal bewiesen. Leider haben hier einige (ICH übrigens auch) gar keine Erfahrung mit C und wollen es evtl auch gar nicht? (finde Pascal und Basic wesentlich angenehmer zu lesen)
Wenn dir der Beitrag hier nicht passt, werde ich ihn von Frank verschieben lassen.

Achja ich möchte eigentlich das aufkommen von diskussionen vermeiden, die nicht zum Thema gehören. Habe das schon oft beobachtet (auch bei mikrocontroller.net) das einige leute sachen posten die nicht zum eintrag gehören, was ich nicht sehr angenehm finde, und die auch besonders bei langen threads oft verwirren.

JanB
07.07.2005, 22:33
Hallo,
Also es geht weiter !
Das mit den Objekten ging viel einfacher als ich erwartet hatte.
ich musste allerdings leider das Programm ziemlich umbauen,
weil es wegen der ständigen Herumschieberei der Variablen
so gebremst wurde, das es schon zu Flimmern anfing.
Ich hab wieder auf globale Vars umgestellt. Sorry :-(

Aber dafür bewegen sich jetzt schon zwei Objekte
schön flüssig über den Oszi-Schirm. :-)

Probier es mal aus.

Z-Achse hab ich immer noch "ausgeblendet"

Gruß Jan





$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 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 : Call Moveabs

X = 100 : Y = 0 : Call Drawrel
X = 0 : Y = 100 : Call Drawrel
X = -100 : Y = 0 : Call Drawrel
X = 0 : Y = -100 : Call Drawrel

Xa = 50 : Ya = 150 : X = 100 : Y = 200 : Call Drawabs
Xa = 150 : Ya = 150 : X = 100 : Y = 200 : Call Drawabs
Xa = 50 : Ya = 150 : X = 150 : Y = 50 : Call Drawabs
Xa = 50 : Ya = 50 : X = 150 : Y = 150 : Call Drawabs

X = 0 : Y = 0 : Call Moveabs

Restore Obj5 : X = 60 : Y = 80 : Call Drawobj
Restore Obj5 : X = 130 : Y = 80 : Call Drawobj

H = H + Hs
If H = 200 Then Hs = -1
If H = 0 Then Hs = 1
Restore Obj5 : X = 20 : Y = H : Call Drawobj

Ss = Ss + 1
Restore Spaceship : X = Ss : Y = 170 : Call Drawobj

Loop

End




'################# Ende Haputprogramm; beginn subroutinen


Sub Drawabs
X = X - Xa : Y = Y - Xa
Xp = Low(xa) : Yp = Low(ya)
Call Drawrel
End Sub

'#################################
Sub Drawrel
Xe = Xa + X : Ye = Ya + Y
Xs = 1 : Ys = 1

If X < 0 Then
Xs = -1 : X = 0 - X
End If
If Y < 0 Then
Ys = -1 : Y = 0 - Y
End If
If X < Y Then Goto Walky

Walkx:
T = X
Shift T , Right , 1
Do
'Zp = 0
Xp = Xa : Yp = Ya
Xa = Xa + Xs ':immer einen Schritt in x-Richtung weiter
T = T - Y ';Schritt in Y-Richtung nötig ?
If T <= 0 Then ';wenn <=0 dann ja
T = T + X ';
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 = Y
Shift T , Right , 1
Do
'Zp = 0
Xp = Xa : Yp = Ya
Ya = Ya + Ys ':immer einen Schritt in x-Richtung weiter
T = T - X ';Schritt in Y-Richtung nötig ?
If T <= 0 Then ';wenn <=0 dann ja
T = T + Y ';
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
Call Moveabs
Do
Read X : Read Y : Read Z
If Z > 0 Then Call Drawrel Else Call Moverel
Loop Until Z > 1
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%

Obj5:
Data 5% , 0% , 1%
Data 5% , 5% , 1%
Data 0% , 5% , 1%
Data -5% , 5% , 1%
Data -5% , 0% , 1%
Data 0% , 10% , 1%
Data 10% , 0% , 3%

JanB
07.07.2005, 22:53
@Pebisoft:

Hallo Peter,
schön, das du dich auch dafür interessierst.

Warum machst du nicht mit, und steuerst auch
ein paar hilfreiche Ideen dazu bei,
um die Sache voranzubringen ?

Als nächstes möchten wir Objekte drehen und skalieren können.
Hast du da einen Vorschlag für, wie man das machen könnte ?

Gerne auch in C.


Gruß Jan

sebastian.heyn
08.07.2005, 08:05
Hallo,
ich denke das das so passt mit Z... (spart jedes mal ein bisschen zeit) man kann ja den anschluss lassen, und nur wenn man es nicht anders vermeiden kann ausblenden.... Habe noch ein altes RFT oszi wo der vorbesitzer ganzganz schlecht mit umgegangen ist... wenn das hier schön läuft, werde ich die röhre und den trafo nehmen und mal schauen was man vielleicht stand alone anrichten kann. melde mich dann wenn die software läuft.

@jan: Wie machst du die objekte - im kopf??

pebisoft
08.07.2005, 08:59
hallo, ich habe ein projekt mit einem fernseher (15cm) 12volt, habe horizontale und vertikale steuerung abgeklemmt und die strahlausschaltung. bei mir auf dem arbeitstisch steht nur die bildröhre, die ich im rahmen befestigt habe. man kann auch schön die frequenz mit pwm simulieren.
habe alle anschlüsse an der röhre steckbar gemacht. steuere die beiden jetzt über einen avr an und einem verstärkungstransistor. die endausschläge des strahls brauchen ca 12 volt. kann den strahl nach rechts nach links nach oben und nach unten schicken. schalte ihn ein wenn er leuchten muss oder auch nicht. eine einfache und günstige lösung. es funktioniert genauso wie auf dem scope. eine schöne experimentielle grundlage auch für diejenigen, die sich kein scope leisten können. die kleinen fernseher mit 12v netzteil bekommt man/frau bei ebay schon für 15 euro. mfg pebisoft

sebastian.heyn
08.07.2005, 09:06
Also das prog läuft soweit. Habe Z erstmal drin gelassen, weil wenn man nur das shiffchen und die 5 bewegt (mit 10ms pause) dann prennt der eine punkt doch schon ganz schön... Da das nun funktioniert, wäre ein font echt geil, meinst du einstrich font oder so jeder character mit nem rahmen zu zeichnen sieht besser aus??

sebastian.heyn
08.07.2005, 09:09
Hallo phebisoft, sorry für den etwas garstigen eintrag von mir gestern. War warscheinlich überreagiert.. Mit dem TV ist echt ne geile idee, was mich interessiert ist, pfeifft der trafo in den dingern immernoch so erbärmlich, wie bei dem, den ich mir vor 10 jahren mal gekauft habe?

pebisoft
08.07.2005, 09:14
zur zeit arbeite ich am cmu2cam projekt und am gameboycam projekt im zusammenhang mit video-capture, übertragen der bilder seriell zum pc, daten als ton-frequenz vom avr über video/audio-funk vom robby zum pc und den ton auswerten und umwandeln in daten. objekterkennung mit einem gegrabten video-bild von einer lifeübertragung und objekterkennung an einem seriell übertragenen bild.
also zur zeit ausgelastet.
mfg pebisoft

pebisoft
08.07.2005, 09:22
also der 15cm fernseher ist 4 monate alt. das was du jetzt geschrieben hast mit pfeifen ist mir neu, also ich höre gar nichts, ausser der lautsprecher hatte vorher gerauscht, wo noch alles zusammengebaut war.
ich weiss auch nicht, wie hoch die strahlsteuerung bei deinem alten tragbaren fernseher ist, die technik hat sich geändert. ich habe mich auch gefreut, das ich mit 12v die strahlendanschläge erreicht habe.
mfg pebisoft

PicNick
08.07.2005, 09:32
Morgen, ihr seid am Werken wie die Wilden, will euch nicht lang aufhalten

FONT: Jan hat ja schon so ein Object vordefiniert. Man könnte versuchen:
Polyline-Object, xy immer relativ zu origin und einheitsgröße. Dadurch konnte man das blank-out-bit und end-of object durchaus in die zwei Werte einpacken, würde sicher reichen
Zum aufbau dann immer scale und position angeben

Obj-n
const EOL = 128 ' end of polyline
const VIS = 128 ' visible (Z = on)

DIM array (256) as WORD ' 256 ist max-.anzahl

array(n) = makeint ( X1 . Y1 + VIS ) ' visible
incr n
array(n) = makeint ( X2 . Y2 ) ' blank
incr n
.....
array(n) = makeint ( Xn + EOL . Yn + VIS ) ' end poly, visible
incr n


Nachteil: beim suchen der variabel langen Poly's muß man durch die ganze table und mitzählen für den character-Index
Wenn man platz hat, könnt man natürlich auch eine Vector-table machen.
(mit dynamischem Aufbau für das aktuelle Frame zum refreshen)

Das drehen ist ja eigentlich kein Problem, aber eine Arbeit, müßt man schauen, ob noch Leistung übrigbleibt.

So, nun laß ich euch wieder wüten.

sebastian.heyn
08.07.2005, 10:00
mmhh,

also der einfachheit halber würde ich einfach vorschlagen alle fonts was-weiss-ich 20x30 zu machen. dann kann man sie gleichmäßig positionieren, zum bleistift für ne uhr. habe heute 4 stunden heimfahrt als beifahrer vor mir, da werde ich mir mal drüber gedanken machen... ich denke millimeterpapier und los gehts

JanB
08.07.2005, 10:17
ich denke millimeterpapier und los gehts
Genau, so isses und 20x30 finde ich okay.
Wichtig ist noch, das jedes Zeichen die gleiche Ursprungsposition hat.
z.B. unten links. Dann muss man je nach Zeichen
evtl. erst mal 'ne leere LInie zum wirklichen Anfang des Zeichens ziehen.
z.B beim "V", beim "P" dagegen passt es schon.
Für eine Uhr brauchen wir erstmal nur die Zahlen.

UIch bastel heute Nachmittag weiter dran...

Gruß Jan

sebastian.heyn
08.07.2005, 10:31
Also ich lasse jedes zeichen unten links (0,0) anfangen und gehe davon dann weiter.. Jedes Zeichen wird drei vier dots spaces dazwischen haben, sodass man direkt das nächst an position 20 oder 21 daneben bauen kann.

Das ist ein ziemliches geduldsspiel... hier erstmal die ersten. Verbesserungen werden gerne angenommen....


[code]

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%

sebastian.heyn
08.07.2005, 15:15
Hallo,

vielleicht erklärt ihr mich jetzt für bekloppt, aber man könnte doch (vorrausgesetzt man hat genug freie ports auf 10bit gehen, oder? Das würde die auflösung imens vergrößern.. (habe jetzt 6 ziffern gut lesbar in ein 1x1cm kästchen geschoben)

JanB
08.07.2005, 15:47
vielleicht erklärt ihr mich jetzt für bekloppt,
Nee, so schnell nicht :-)
Aber im Ernst, du hast im Prinzip bzw. in der Theorie Recht.
Aber in der Praxis macht die die begrenze Genauigkeit der
Widerstandswerte und der Ausgangsspannnugen bzw. Ströme
der Ports einen Strich durch die Rechnung.
Schon bei 10Bit Auflösung, also 10 Ports, muss die Genauigkeit
allein der Widerstände besser als 1 Promille sein,
damit das noch Sinn macht.
Ich habe schon bei 8 Stufen mit den einfachen
5%-Kohleschichtwiderständen deutlich sichbare
Unregelmässigkeiten in den Kurven.
Ich würde sagen bei 8-Bit ist mit dieser einfachen Methode Schluss.
Da brauchst du schon einen richtigen 12-Bit oder mehr DA-Wandler.

Bei der Hardware-Methode mit den Integratoren ist das besser,
da können die zwei (mit S&H nur einer) 8-Bit D/A-Wandler zusammen
65535 Richtungen eines Vektors vorgeben, und die Länge
wird durch die Integrationszeit bestimmt.
Da kann man einen viel grösseren Bereich mit den gleichen Wandlern
abdecken, weil alle Vektoren immer relativ erzeugt werden.

Gruß Jan

P.S. Muss deine Zahlen gleich mal ausprobieren...

sebastian.heyn
08.07.2005, 15:52
Die zahlen sehen bei mir eher "dem zwecke entsprechend" aus, grins. wenn man einen 12bit da converter nehmen würde, wäre das doch eigentlich ne super lösung. ´mit dem integrator da blick ich nicht so ganz durch. da muss ich wohl erstmal das alte formel und schaltungsbuch konsultieren, grins

sebastian.heyn
08.07.2005, 15:54
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...

JanB
08.07.2005, 17:48
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





$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%

sebastian.heyn
08.07.2005, 21:47
Die Zahlen sehen bei dir viel besser aus als bei mir.. liegt wohl an deinem dac.. Ich habe z bei mir drin und nur wenn auch was gemalt wird z=0 gemacht... hat geholfen.. Werde nächste woche zwei dac ics kaufen.. kosten ja nicht die welt.. wich werde mir mal das tga proggi reingeben, sofern mich meine frau an den pc lässt.
"SCHATZ SITZT DU SCHON WIEDER VOR DEM DING!?" falls nicht. Schöönes wochenende.

JanB
09.07.2005, 09:54
Hallo,

...liegt wohl an deinem DAC...
Ich hab mit jetzt 1% Metallfilmwiderstände mit mit
5k und 10k besorgt. Sieht wesentlich besser aus damit.

So, das Rotieren der Objekte funktioniert jetzt auch.
Jedenfalls in 2D, also in der Ebene.
Sieht lustig aus, wenn sich die Zahlen um sich selbst drehen.
Statt 360 Grad für den Vollkreis habe ich 256 "Grad" gewählt,
das ist einfacher zu rechnen.
Rechter Winkel ist dann 64 "Grad" statt 90 Grad usw..
Ich hab eine SUB ROTOBJ gebastelt.
Funktioniert genau wie DRAWOBJ, nur das Objekt wird
um den Winkel W gedreht gezeichnet.

Die Z-Achse hab ich auch aktiviert, das Bild wird erheblich besser dadurch.
Der Z-Eingang an meinem Oszi funktioniert aber andersherum als
deiner. Also 1 = Strahl an. Egal, kann man ja leicht anpassen.

Ich bastel noch ein wenig, dann stell ich das Program nochmal hier rein.

Bis dann...Jan

sebastian.heyn
09.07.2005, 16:33
Hi sieht ja echt scharf aus. wenn bessere widerstände auch schon helfen... ich habe als 20k 2x10k in reihe das merkt man warscheinlich doch schon ganz schön. schade das ich keinen oszi hier habe, und bis montag warten muss... Ich werde nächste woche ein alphabet machen, so dass auch text dargestellt werden kann. Ich denke als uhr wird das ziemlich dekorativ sein, grins. (mal schauen ob ich geduld genug habe, nen 7 segment zahlen font zu basteln, schöne große ziffern..)

JanB
10.07.2005, 21:20
Hallo,
So, hier wie verspochen nochmal der Code.
Hab jetzt etwas Spielerei und die Uhr eingebaut.
Um die ging es ja eigentlich ursprünglich.
Aber die Uhr kann man noch nicht stellen.
Das muss noch gemacht werden.

@Sebastian: Du wirst die Z-Funktion umdrehen müssen.
Im sechsten Abschnitt des Progs. Vor Start-Hauptprogramm.

Gruß Jan




$regfile = "m32def.dat"
$crystal = 16000000

'########### Variablen Vektorgrafik
Dim X As Integer
Dim Y As Integer
Dim W As Integer
Dim S 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

Dim Sw As Integer
Dim Cw As Integer


'######### Variablen Hauptprogramm
Dim H As Integer
Dim Hs As Integer
Dim Ss As Byte
Dim S1 As Byte
Dim S2 As Byte

Dim Sina(340) As Integer
Dim W1 As Integer
Dim N As Integer

Dim Sekunde As Byte
Dim Sekd As Byte
Dim Minute As Byte
Dim Mind As Byte
Dim Stunde As Byte
Dim Stud As Byte
Dim St2 As Byte
Const Timeconst = 65536 - 15625


'########### Deklarationsteil für Subroutinen
Declare Sub Moverel
Declare Sub Moveabs
Declare Sub Drawline
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
Declare Sub Rotobj

Declare Sub Zeigeuhr
Declare Sub Shownumb(byval Number As Byte)
Declare Sub Showdigit(digit As Byte)

'########### Deklarationsteil für Ports
Xp Alias Porta
Yp Alias Portc
Zp Alias Portd.7 'wenn 1 dann ist der punkt sichtbar, wenn 0 then ist der punkt aus

Config Xp = Output
Config Yp = Output
Config Portd = Output

'#### Hier ändern für Z-Funktion ############
Const Zan = 1
Const Zaus = 0


'################# Start Hauptprogramm

Zp = Zaus
Ss = 0

Stunde = 20 : Stud = Makebcd(stunde)
Minute = 15 : Mind = Makebcd(minute)
Sekunde = 0 : Sekd = Makebcd(sekunde)


Restore Sintab
For H = 1 To 256
Read Sina(h)
Next

Config Timer1 = Timer , Prescale = 1024
On Timer1 Timint
Timer1 = Timeconst
Enable Interrupts
Enable Timer1




Do

X = 0 : Y = 0 : Moveabs
X = 40 : Y = 30 : Drawabs
X = 72 : Y = 11 : Drawabs
X = 40 : Y = 0 : Moveabs
X = 110 : Y = 25 : Drawabs
X = 160 : Y = 0 : Drawabs
X = 134 : Y = 13 : Moveabs
X = 160 : Y = 38 : Drawabs
X = 190 : Y = 0 : Drawabs
X == 220 : Y = 1 : Drawabs
X = 255 : Y = 40 : Drawabs
X = 238 : Y = 22 : Moveabs
X = 210 : Y = 38 : Drawabs
X = 184 : Y = 7 : Drawabs
X = 0 : Y = 0 : Moveabs


' Y = 50
' 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

W1 = W1 + 4 : If W1 > 255 Then W1 = 0
Ss = Ss + 1
S1 = S1 - 2 : If S1 < 0 Then S1 = 254
S2 = S2 - 3 : If S2 < 0 Then S2 = S2 + 256

Restore Spaceship : X = Ss : Y = 20 : Drawobj
Restore Spaceship : X = S1 : Y = 15 : W = 128 : Rotobj
Restore Obj5 : X = 40 : Y = 60 : W = W1 : Rotobj
Restore Obj2 : X = 75 : Y = 40 : W = W1 * 2 : W = W And 255 : Rotobj
Restore Spaceship : X = S2 : Y = 90 : W = 256 - W1 : Rotobj
Restore Obj 4 : X = 140 : Y = 55 : Rotobj

Zeigeuhr

Loop
End



'################# Ende Hauptprogramm; beginn subroutinen
Timint:
Timer1 = Timeconst
Incr Sekunde

If Sekunde = 60 Then
Sekunde = 0
Incr Minute
If Minute = 60 Then
Minute = 0
Incr Stunde
If Stunde = 24 Then
Stunde = 0
End If
End If
End If
Sekd = Makebcd(sekunde)
Mind = Makebcd(minute)
Stud = Makebcd(stunde)
Return


Sub Zeigeuhr
X = 36 : Y = 154 : Moveabs
X = 220 : Drawabs
Y = 116 : Drawabs
X = 36 : Drawabs
Y = 154 : Drawabs

X = 40 : Y = 120
Call Shownumb(stud)
Restore Objdp : Drawobj
X = X + 22
Call Shownumb(mind)
Restore Objdp : Drawobj
X = X + 22
Call Shownumb(sekd)
End Sub



Sub Shownumb(byval Number As Byte)
St2 = Number / 16
Call Showdigit(st2)
X = X + 22
Call Showdigit(number)
X = X + 22
End Sub

Sub Showdigit(byval Digit As Byte)
Digit = Digit And 15
Select Case Digit:
Case 0 : Restore Obj0
Case 1 : Restore Obj1
Case 2 : Restore Obj2
Case 3 : Restore Obj3
Case 4 : Restore Obj4
Case 5 : Restore Obj5
Case 6 : Restore Obj6
Case 7 : Restore Obj7
Case 8 : Restore Obj8
Case 9 : Restore Obj9
End Select
Drawobj
End Sub



'##########################

Sub Drawabs
Xe = X : Ye = Y
Drawline
End Sub
'#################################

Sub Drawrel
Xe = Xa + X
Ye = Ya + Y
Drawline
End Sub

Sub Drawline:
Xl = Xe - Xa : Xs = 1
If Xl < 0 Then
Xl = 0 - Xl : Xs = -1
End If
Yl = Ye - Ya : Ys = 1
If Yl < 0 Then
Yl = 0 - Yl : Ys = -1
End If

If Xl < Yl Then Goto Walky

Walkx:
T = Xl
Shift T , Right , 1
Do
Zp = Zan
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 = Zaus
Goto Ex1

Walky:
T = Yl
Shift T , Right , 1
Do
Zp = Zan
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 = Zaus
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 = Zan 'licht ein
Waitus 2 'kurz warten
Zp = Zaus 'lichtwieder aus
End Sub

'##############################
'Stellt Objekt auf Position X,Y dar.
' X und Y sind >=0 und <=255
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

'##############################
'Stellt Objekt Auf Position X , Y um den Winkel W gedreht dar.
' X und Y und W sind >=0 und <=255

Sub Rotobj
Xo = X : Yo = Y : W = W + 1
Sw = Sina(w)
Cw = W + 64 : If Cw > 256 Then Cw = Cw - 256 : Cw = Sina(cw)
W = W - 1
Call Moveabs
Do
Read Xl : Read Yl : Read Z
X = Cw * Xl : Y = Sw * Yl : X = X - Y
Y = Sw * Xl : Xl = Cw * Yl : Y = Y + Xl
X = X / 256 : Y = Y / 256

If Z > 0 Then Call Drawrel Else Call Moverel
Loop Until Z > 1
X = Xo : Y = Yo
End Sub


'##############################

Sintab:
Data 0% , 6% , 13% , 19% , 25% , 31% , 38% , 44%
Data 50% , 56% , 62% , 68% , 74% , 80% , 86% , 92%
Data 98% , 104% , 109% , 115% , 121% , 126% , 132% , 137%
Data 142% , 147% , 152% , 157% , 162% , 167% , 172% , 177%
Data 181% , 185% , 190% , 194% , 198% , 202% , 206% , 209%
Data 213% , 216% , 220% , 223% , 226% , 229% , 231% , 234%
Data 237% , 239% , 241% , 243% , 245% , 247% , 248% , 250%
Data 251% , 252% , 253% , 254% , 255% , 255% , 256% , 256%
Data 256% , 256% , 256% , 255% , 255% , 254% , 253% , 252%
Data 251% , 250% , 248% , 247% , 245% , 243% , 241% , 239%
Data 237% , 234% , 231% , 229% , 226% , 223% , 220% , 216%
Data 213% , 209% , 206% , 202% , 198% , 194% , 190% , 185%
Data 181% , 177% , 172% , 167% , 162% , 157% , 152% , 147%
Data 142% , 137% , 132% , 126% , 121% , 115% , 109% , 104%
Data 98% , 92% , 86% , 80% , 74% , 68% , 62% , 56%
Data 50% , 44% , 38% , 31% , 25% , 19% , 13% , 6%
Data 0% , -6% , -13% , -19% , -25% , -31% , -38% , -44%
Data -50% , -56% , -62% , -68% , -74% , -80% , -86% , -92%
Data -98% , -104% , -109% , -115% , -121% , -126% , -132% , -137%
Data -142% , -147% , -152% , -157% , -162% , -167% , -172% , -177%
Data -181% , -185% , -190% , -194% , -198% , -202% , -206% , -209%
Data -213% , -216% , -220% , -223% , -226% , -229% , -231% , -234%
Data -237% , -239% , -241% , -243% , -245% , -247% , -248% , -250%
Data -251% , -252% , -253% , -254% , -255% , -255% , -256% , -256%
Data -256% , -256% , -256% , -255% , -255% , -254% , -253% , -252%
Data -251% , -250% , -248% , -247% , -245% , -243% , -241% , -239%
Data -237% , -234% , -231% , -229% , -226% , -223% , -220% , -216%
Data -213% , -209% , -206% , -202% , -198% , -194% , -190% , -185%
Data -181% , -177% , -172% , -167% , -162% , -157% , -152% , -147%
Data -142% , -137% , -132% , -126% , -121% , -115% , -109% , -104%
Data -98% , -92% , -86% , -80% , -74% , -68% , -62% , -56%
Data -50% , -44% , -38% , -31% , -25% , -19% , -13% , -6%


'######## 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%

pebisoft
10.07.2005, 22:34
hallo jan, kann man die uhr als kreisuhr(ziffernblatt) mit minuten-stunden-sekunden-zeiger herstellen.
was sind das eigentlich für matte striche im hintergrund. sind das bildstörungen(elektronenstrahlstörungen) oder zu schnell gezeichnete objekte.
mfg pebisoft

JanB
11.07.2005, 07:44
Hallo Peter,

kann man die uhr als kreisuhr(ziffernblatt) mit minuten-stunden-sekunden-zeiger herstellen
Ja sicher - gute Idee ! Alle Voraussetzungen sind im Programm schon enthalten.
Also mach mal, ich freu mich auf deine Lösung.


was sind das eigentlich für matte striche im hintergrund...
Das sind bewegte / sich drehende Objekte.
Durch die lange Belichtungszeit...

Gruß Jan

sebastian.heyn
11.07.2005, 09:01
Hallo allerseits.

Ich stelle hier jetzt nach und nach die verbesserten objekte rein...

@jan: Sieht wirklich besser aus, mit den 1% widerständen.
Die Uhr läuft ned richtig (ich werde sie heute abend korrigieren)

@pebi: Ich habe auch schon über so ne uhr nachgedacht, dürfte kein problem sein, jetzt wo dank jan objekte gedreht werden können....




'#### 4: Komplett neu #############
Obj4:
Data 11% , 0% , 0%
Data 0% , 30% , 1%
Data -13% , -17% , 1%
Data 18% , 0% , 3%


'##### 8: Y korrigiert
Obj8:
Data 4% , 0% , 0%
Data 10% , 0% , 1%
Data 4% , 5% , 1%
Data 0% , 7% , 1%
Data -18% , 8% , 1%
Data 0% , 7% , 1%
Data 4% , 4% , 1%
Data 10% , 0% , 1%
Data 4% , -5% , 1%
Data 0% , -7% , 1%
Data -18% , -8% , 1%
Data 0% , -7% , 1%
Data 4% , -5% , 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% , -8% , 1%
Data 0% , 15% , 1%
Data 4% , 4% , 1%
Data 8% , 0% , 1%
Data 5% , -4% , 3%

Obj7:
Data 0% , 30% , 0%
Data 15% , 0% , 1%
Data 0% , -30% , 1%
Data -10% , 15% , 0%
Data 16% , 0% , 3%

sebastian.heyn
11.07.2005, 22:46
Hallo, ich habe mal eine Analoguhr gebastelt, der große fette zeiger ist der stundenzeiger, an dem design müsste man warscheinlich etwas basteln *grins*
hat jemand eine idee wie man den stundenzeiger etwas feiner wechseln lassen könnte? so dass er zb bei halb zwölf zwischen 0 und 1 steht......
Achja ich habe den mittelpunkt bei 100/100 gedetzt, das lässt sich ja entweder im code oder am scope schnell nachstellen... sorry für das bild. habs mitm handy gemacht....



$regfile = "m128def.dat"
$crystal = 16000000

'########### Variablen Vektorgrafik
Dim X As Integer
Dim Y As Integer
Dim W As Integer
Dim S 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

Dim Sw As Integer
Dim Cw As Integer


'######### Variablen Hauptprogramm
Dim H As Integer
Dim Hs As Integer
Dim Ss As Byte
Dim S1 As Byte
Dim S2 As Byte

Dim Sina(340) As Integer
Dim W1 As Integer
Dim N As Integer
Dim I As Integer

Dim Sekunde As Byte
Dim Sekd As Byte
Dim Minute As Byte
Dim Mind As Byte
Dim Stunde As Byte
Dim Stud As Byte
Dim St2 As Byte
Const Timeconst = 65536 - 15625


'########### Deklarationsteil für Subroutinen
Declare Sub Moverel
Declare Sub Moveabs
Declare Sub Drawline
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
Declare Sub Rotobj

Declare Sub Stundenzeiger
Declare Sub Minutenzeiger
Declare Sub Sekundenzeiger

'########### Deklarationsteil für Ports
Xp Alias Porta
Yp Alias Portd
Zp Alias Portf.1 'wenn 1 dann ist der punkt sichtbar, wenn 0 then ist der punkt aus

Config Xp = Output
Config Yp = Output
Config Portf = Output

'#### Hier ändern für Z-Funktion ############
Const Zan = 0
Const Zaus = 1


'################# Start Hauptprogramm

Zp = Zaus
Ss = 0

Stunde = 0
Minute = 15
Sekunde = 30


Restore Sintab
For H = 1 To 256
Read Sina(h)
Next

Config Timer1 = Timer , Prescale = 1024
On Timer1 Timint
Timer1 = Timeconst
Enable Interrupts
Enable Timer1




Do
Stundenzeiger
Minutenzeiger
Sekundenzeiger

Loop
End



'################# Ende Hauptprogramm; beginn subroutinen
Timint:
Timer1 = Timeconst
Incr Sekunde
If Sekunde = 60 Then
Sekunde = 0
Incr Minute
If Minute = 60 Then
Minute = 0
Incr Stunde
If Stunde = 24 Then
Stunde = 0
End If
End If
End If

Return


Sub Stundenzeiger:
Restore Hourtab
For I = 0 To Stunde : Read W : Next
Restore Zeiger1 : X = 100 : Y = 100 : Rotobj
End Sub

Sub Minutenzeiger:
Restore Mintab
For I = 0 To Minute : Read W : Next
Restore Zeiger2 : X = 100 : Y = 100 : Rotobj
End Sub

Sub Sekundenzeiger:
Restore Mintab
For I = 0 To Sekunde : Read W : Next
Restore Zeiger3 : X = 100 : Y = 100 : Rotobj
End Sub


'##########################

Sub Drawabs
Xe = X : Ye = Y
Drawline
End Sub
'#################################

Sub Drawrel
Xe = Xa + X
Ye = Ya + Y
Drawline
End Sub

Sub Drawline:
Xl = Xe - Xa : Xs = 1
If Xl < 0 Then
Xl = 0 - Xl : Xs = -1
End If
Yl = Ye - Ya : Ys = 1
If Yl < 0 Then
Yl = 0 - Yl : Ys = -1
End If

If Xl < Yl Then Goto Walky

Walkx:
T = Xl
Shift T , Right , 1
Do
Zp = Zan
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 = Zaus
Goto Ex1

Walky:
T = Yl
Shift T , Right , 1
Do
Zp = Zan
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 = Zaus
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 = Zan 'licht ein
Waitus 2 'kurz warten
Zp = Zaus 'lichtwieder aus
End Sub

'##############################
'Stellt Objekt auf Position X,Y dar.
' X und Y sind >=0 und <=255
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

'##############################
'Stellt Objekt Auf Position X , Y um den Winkel W gedreht dar.
'X und Y und W sind >=0 und <=255

Sub Rotobj
Xo = X : Yo = Y : W = W + 1
Sw = Sina(w)
Cw = W + 64 : If Cw > 256 Then Cw = Cw - 256 : Cw = Sina(cw)
W = W - 1
Call Moveabs
Do
Read Xl : Read Yl : Read Z
X = Cw * Xl : Y = Sw * Yl : X = X - Y
Y = Sw * Xl : Xl = Cw * Yl : Y = Y + Xl
X = X / 256 : Y = Y / 256

If Z > 0 Then Call Drawrel Else Call Moverel
Loop Until Z > 1
X = Xo : Y = Yo
End Sub


'##############################

Sintab:

Data 0% , 6% , 13% , 19% , 25% , 31% , 38% , 44%
Data 50% , 56% , 62% , 68% , 74% , 80% , 86% , 92%
Data 98% , 104% , 109% , 115% , 121% , 126% , 132% , 137%
Data 142% , 147% , 152% , 157% , 162% , 167% , 172% , 177%
Data 181% , 185% , 190% , 194% , 198% , 202% , 206% , 209%
Data 213% , 216% , 220% , 223% , 226% , 229% , 231% , 234%
Data 237% , 239% , 241% , 243% , 245% , 247% , 248% , 250%
Data 251% , 252% , 253% , 254% , 255% , 255% , 256% , 256%
Data 256% , 256% , 256% , 255% , 255% , 254% , 253% , 252%
Data 251% , 250% , 248% , 247% , 245% , 243% , 241% , 239%
Data 237% , 234% , 231% , 229% , 226% , 223% , 220% , 216%
Data 213% , 209% , 206% , 202% , 198% , 194% , 190% , 185%
Data 181% , 177% , 172% , 167% , 162% , 157% , 152% , 147%
Data 142% , 137% , 132% , 126% , 121% , 115% , 109% , 104%
Data 98% , 92% , 86% , 80% , 74% , 68% , 62% , 56%
Data 50% , 44% , 38% , 31% , 25% , 19% , 13% , 6%
Data 0% , -6% , -13% , -19% , -25% , -31% , -38% , -44%
Data -50% , -56% , -62% , -68% , -74% , -80% , -86% , -92%
Data -98% , -104% , -109% , -115% , -121% , -126% , -132% , -137%
Data -142% , -147% , -152% , -157% , -162% , -167% , -172% , -177%
Data -181% , -185% , -190% , -194% , -198% , -202% , -206% , -209%
Data -213% , -216% , -220% , -223% , -226% , -229% , -231% , -234%
Data -237% , -239% , -241% , -243% , -245% , -247% , -248% , -250%
Data -251% , -252% , -253% , -254% , -255% , -255% , -256% , -256%
Data -256% , -256% , -256% , -255% , -255% , -254% , -253% , -252%
Data -251% , -250% , -248% , -247% , -245% , -243% , -241% , -239%
Data -237% , -234% , -231% , -229% , -226% , -223% , -220% , -216%
Data -213% , -209% , -206% , -202% , -198% , -194% , -190% , -185%
Data -181% , -177% , -172% , -167% , -162% , -157% , -152% , -147%
Data -142% , -137% , -132% , -126% , -121% , -115% , -109% , -104%
Data -98% , -92% , -86% , -80% , -74% , -68% , -62% , -56%
Data -50% , -44% , -38% , -31% , -25% , -19% , -13% , -6%


Hourtab: 'gibt die gradzahlen der stunden zurück angefangen bei null
Data 256% , 234% , 213% , 192% , 170% , 149% , 128% , 106%
Data 85% , 64% , 42% , 21% , 256% , 234% , 213% , 192%
Data 170% , 149% , 128% , 106% , 85% , 64% , 42% , 21%

Mintab: 'gibt die gradzahlen der minuten/sekunden zurück angefangen bei null
Data 256% , 252% , 247% , 243% , 239% , 234% , 230% , 226%
Data 222% , 217% , 213% , 209% , 205% , 200% , 196% , 192%
Data 188% , 183% , 179% , 174% , 171% , 166% , 162% , 158%
Data 153% , 149% , 145% , 141% , 136% , 132% , 128% , 124%
Data 119% , 115% , 111% , 106% , 102% , 98% , 94% , 90%
Data 85% , 81% , 77% , 72% , 68% , 64% , 60% , 55%
Data 51% , 47% , 43% , 38% , 34% , 30% , 26% , 21%
Data 17% , 12% , 8% , 4% , 0%

'######## 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%

Zeiger1: 'stundenzeiger
Data -15% , 0% , 0%
Data 30% , 0% , 1%
Data -15% , 100% , 1%
Data -15% , -100% , 3%

Zeiger2: 'minutenzeiger
Data -10% , 0% , 0%
Data 20% , 0% , 1%
Data -10% , 75% , 1%
Data -10% , -75% , 3%

Zeiger3: 'sekunden"zeiger"
Data 0% , 110% , 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% , 30% , 1%
Data -13% , -17% , 1%
Data 18% , 0% , 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% , -8% , 1%
Data 0% , 15% , 1%
Data 4% , 4% , 1%
Data 8% , 0% , 1%
Data 5% , -4% , 3%

Obj7:
Data 0% , 30% , 0%
Data 15% , 0% , 1%
Data 0% , -30% , 1%
Data -10% , 15% , 0%
Data 16% , 0% , 3%

Obj8:
Data 4% , 0% , 0%
Data 10% , 0% , 1%
Data 4% , 5% , 1%
Data 0% , 7% , 1%
Data -18% , 8% , 1%
Data 0% , 7% , 1%
Data 4% , 4% , 1%
Data 10% , 0% , 1%
Data 4% , -5% , 1%
Data 0% , -7% , 1%
Data -18% , -8% , 1%
Data 0% , -7% , 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%

JanB
12.07.2005, 07:39
Hallo,
Schöne Uhr ! - ein paar Sunden-Ziffern / Markierungen wären nicht schlecht.

hat jemand eine idee wie man den stundenzeiger etwas feiner wechseln lassen könnte? Nimm doch für den Stundenzeiger auch die Minuten-Grad-Tabelle.
Der Stundenzeiger macht pro Stunde 5 "Minutensprünge", alle 12 Minuten einen. (60/5=12)
Also Stundenzeiger-Minutenposition = Stunde + int( Minute / 12 ).
Ist hoffentlich verständlich.

Übrigens, deine Grad-Definitionen gehen bis 256, das darf aber höchstens bis 255 gehen.
255 ist quasi wie 359 Grad, danach kommt wieder 0, nicht 256.
Ich weiss nicht ob die Rotationsberechnung bei
Winkeln >255 oder <0 immer richtig funktioniert.

Gruß Jan

sebastian.heyn
12.07.2005, 08:24
Okay,ich werds heute abend angleichen. ( Also ist 255=0??)
Mit dem stundenzeiger, das habe ich mir auch so ähnlich gedacht... Mich reizt es noch so eine uhr "standalone" zu machen, habe aber bedenken, dass die alte rft röhre dann nach zwei tagen den geist aufgibt..

JanB
12.07.2005, 08:49
( Also ist 255=0??)
Nee, 256 = 0.
Die Gradeinteilung geht von 0 - 255,
es dürfen also nur die Winkel von 0 - 255 vorkommen.
256 ist einmal rum, also wieder 0

Gruß Jan

sebastian.heyn
12.07.2005, 09:10
achso, dann kann ich die rot-funktion einfach mit if w=256 then w=0 erweitern dann müsste es auch gehen... *faul sei*

JanB
12.07.2005, 09:29
dann kann ich die rot-funktion einfach mit if w=256 then w=0 erweitern
Ja, das kostet dann jedesmal Rechenzeit.
Geschickter finde ich es, Werte > 255 garnicht erst vorkommen zu lassen.
Oder wenn schon , dann mach w=w and 255,
das läuft schneller als und macht das Gleiche.

Gruß Jan

sebastian.heyn
12.07.2005, 09:39
okay, also diese funktion versteh ich zwar nicht ganz, aber sie funktioniert. ich glaube mir fehlt an dieser stelle fundamentales grundwissen *kratz* da könnte ich viele programme warscheinlich wesentlich verbessern...