Verlaufsdiagramm y/T

Bonze

Neues Mitglied
16. Jan. 2010
516
0
0
Altenkirchen (Pfalz)
Sprachen
  1. BascomAVR
hat jemand von euch schonmal ein Y/T Diagramm auf ein LCd , aus werten gezeichnet? hab doch sowas schonmal gese
bin die ganze Zeit am überlegen wie ich das anstellen soll. hab sowas doch schonmal irgendwo gesehen
 
Hi,

hat jemand von euch schonmal ein Y/T Diagramm auf ein LCd , aus werten gezeichnet?
meinst du damit die Verbindungen zwischen den koordinatenpunkten ?
Also sozusagen "Dot-Joining" oder so ?
Da habe ich noch aus ZX81 oder ZXSpectrum-Zeiten schöne Algorithmen
in Zeitschriften stehen wie man Linien erzeugen kann.

Wenn du es brauchst, dann sag bescheid. Mußt du dann nur in Bascom und
auf dein GLCD umsetzen.

Gruß
Dino
 
Hast du denn mal ein paar mehr Informationen?
Soll nur eine einzelne Linie zu sehen sein oder unterhalb der Linie alle Punkte an?
Kannst du zu deinem Display die Bascom Routinen Line() usw. nutzen? Wenn es um das 320x240 LCD aus deinem anderen Beitrag geht, wird das wohl nichts mit den eingebauten Routinen.
Sollen die Punkte "durchlaufen", also wenn ein neuer hinzukommt, alle um eins nach links verschoben werden? Oder willst du dann wieder links anfangen?

HBA
 
ja es soll auf dem 240x320 lcd sein,
es soll einfach eine linie sein, welche meine temps miteinander verbindet, ich messe ja nur sagen wir mal alle 5/10/15mins,. aber halt 24h am stück,.

obs durchläuft, mh ka ,.
ich glaub ohne sieht besser aus, die einzigste routine welche man benutzen kann ist die Set_pixel,.


hab aber vorhin auch einen beitrag gefunden, welcher sowas zeichnet aber auf nem Glcd,.
http://www.elektronik-projekt.de/thread.php?postid=34655
 
könntest du vielleicht mal deinen algorhytmus posten ?

also ich werd auf jedenfall 2 schleifen anwenden müssen, da ich ja nur einzelne pixel füllen kann,
und somit einmal die x und einmal die Y ablenkung durchlaufen muss
 
Hi,

ich habe mal bei 'ner Schaltung, die unter anderem eine DCF77-Antenne enthielt, das Pin-Signal selber als YT dargestellt. Das war zwar digital und von der Frequenz her deutlich höher, ist aber ansonsten nix anderes. Man konnte je nach Antennenstellung sehr schön den Unterschied zwischen 1 und 0 (verschiedene Pulslängen) sehen und hat auch Ausreißer bei schlechtem Empfang super sehen können.
Du hättest halt mehr als 2 Y-Werte, da analog.
Es ist nur zu entscheiden, ob Du zwei aufeinanderfolgende Punkte verbindest oder nicht. das wäre dann nur eine Schleife von ersten zum zweiten Wert, innerhalb derer Du den entsprechenden Pixel setzen kannst.
Alternativ könntest Du auch den min.- und max.-Wert innerhalb eines Meßzyklus nehmen und dann entweder den Mittelwert nutzen oder eine Linie zwischen min. und max ziehen (wieder Punkt für Punkt).

Schönen Gruss
Markus
 
nene hab mir her sowas wie punkt zu punkt verbundung vorgstellt, wobei, die schwierigkeit, dabei ja ist, das ih nur sagen wir mal alle 5mins messe, dann hab ich ja nur alle 5mins einen wert und müsste dann anhand der differenz der beiden werte, die entsprechenden pixel setzen.
Hab jetzt mal so grob nachgedacht, aber mir fehlöen noch diverse zwischenschritte,.
Code:
diff = wert_alt - wert_neu
diff_pro_x = diff/anzahl_zwischenpixel 'gibt y unterschied zwischen zwei messwerten pro x wert an 
For Pointer_x = Start_x To End_x Step 1                  'arbeitet die pixel von links nach rechts ab
      
      Call Lcd_set_pixel(pointer_x , Pointer_y , White)'setzt pixel
Next
 

Anhänge

  • diagramm.png
    diagramm.png
    25,8 KB · Aufrufe: 8
Hallo Bonze,
du kannst für diese Aufgabe natürlich einen allgemeinen Algorithmus nehmen. Aber: Ich nehme mal an, dass die Pixel in x-Richtung doch jeder benutzt werden, also alle 5min ein neuer Wert direkt in die Spalte neben den vorhergehenden gesetzt wird.
D.h., dass bis zur halben Differenz der beiden Werte werden in der Spalte x die Pixel eingeschaltet und der rest wird in der Spalte x+1 eingeschaltet.
Also ziemlich simpel.

Code:
                      o      o 
                      .      . 
                      .      .
                       .    .
                       .    .
                       o   o 
                        o  .
                        .  . 
                         .o
                         o
o sind immer die gemessenen Werte, . die berechneten Zwischenwerte.

HBA
 
sähe dan so ungefähr aus
Code:
diff = alt-neu
diff1 = diff/2
for pointer_x = x_start to x_end step 1
 for pointer_y = 1wert_y to 1wert_y+diff1
  call lcd_set_pixel....
 next

next

bloß wie setze ich dann das x +1 um ? bzw wie sag ich ihm welches diff1 wann zählt?
 
Ich dachte an sowas:
Code:
Call Lcd_set_pixel(x , Alt)
Mitte = Neu - Alt
Shift Mitte , Right , 1 , Signed                            'Diff = Diff / 2
Mitte = Mitte + Alt
Richtung = -1
If Neu > Alt Then Richtung = 1
I = Alt + Richtung
While I <> Mitte                             'hier wird die erste Hälfte gezeichnet
   Call Lcd_set_pixel(x , I)
   I = I + Richtung
Wend
Incr X
While I <> Neu                               'und nun die zweite Hälfte
   Call Lcd_set_pixel(x , I)
   I = I + Richtung
Wend
Call Lcd_set_pixel(x , Neu)
Alle Variablen sind Integer, damit die auch mit negativen Werten umgehen können.

HBA
 
blicke zwar bei dem while noch nich so ganz durch, ..
sieht aber dann so aus ungefähr
Code:
  '*Koordinatenkreuz zeichnen
   Call Lcd_h_line(30 , 240 , 30 , White)
   Call Lcd_v_line(30 , 320 , 30 , White)
   '##########################
    Call Lcd_set_pixel(Alt ,pointer_x  , White)
    Mitte = Neu - Alt
    Shift Mitte , Right , 1 , Signed       'Diff = Diff / 2
    Mitte = Mitte + Alt
    Richtung = -1
    If Neu > Alt Then
       Richtung = 1
       I = Alt + Richtung
    End If
     While I <> Mitte                                       'i ungleich mitte |hier wird die erste Hälfte gezeichnet
          Call Lcd_set_pixel(I ,pointer_x  , White)
          I = I + Richtung
     Wend
    Incr Pointer_x                                          'erhöhe pointer_x um eins
     While I <> Neu                                         'i ungleich mitte |und nun die zweite Hälfte
          Call Lcd_set_pixel(I ,pointer_x  , White)
          I = I + Richtung
     Wend
    Call Lcd_set_pixel(pointer_x , Neu , White)

irgend ne kleinigkeit wurde da vielleicht übersehen, denn ich bekomme nur mein koordinatenkreuz un 1strich angezegt,.
 
Call Lcd_set_pixel(Alt ,pointer_x , White)
Call Lcd_set_pixel(pointer_x , Neu , White)
In einer der beiden Versionen muss x und y vertauscht sein.

If Neu > Alt Then
Richtung = 1
I = Alt + Richtung
End If
Dies ist nicht exakt so, wie bei mir. Das Setzen von I muss raus aus dem IF
If Neu > Alt Then
Richtung = 1
End If
I = Alt + Richtung

Pointer_x, Alt und Neu haben die richtigen Werte?

HBA
 
mh ne , bleibt gleich, klar hab x und Y getauschd, da das display auf der seite liegt,. der strich geht ja auch in die richtige richtung,
Code:
Dim Zwischenspeicher As Word
Dim Neu As Word
Zwischenspeicher = 0
Do
   Neu = Volt
   Call Lcd_draw_dia(zwischenspeicher , Neu)
   Zwischenspeicher = Neu
loop 
end 
Sub Lcd_draw_dia(byval Alt As Word , Neu As Word)
    'Lcd_set_pixel(byval X1 As Word , Y1 As Word , Color As Word)

   Const Start_x = 30
   Const Start_y = 30
   Const End_x = 210
   Const End_y = 310
   Local Pointer_x As Word
   Pointer_x = 30
   Local I As Word
   'Local Alt As Word
   'Local Neu As Word
   Local Mitte As Integer
   Local Richtung As Integer

   '*Koordinatenkreuz zeichnen
   Call Lcd_h_line(30 , 240 , 30 , White)
   Call Lcd_v_line(30 , 320 , 30 , White)
   '##########################
    Call Lcd_set_pixel(Alt ,pointer_x  , White)
    Mitte = Neu - Alt
    Shift Mitte , Right , 1 , Signed       'Diff = Diff / 2
    Mitte = Mitte + Alt
    Richtung = -1
    If Neu > Alt Then
       Richtung = 1
    End If
    I = Alt + Richtung
     While I <> Mitte                                       'i ungleich mitte |hier wird die erste Hälfte gezeichnet
          Call Lcd_set_pixel(I ,pointer_x  , White)
          I = I + Richtung
     Wend
    Incr Pointer_x                                          'erhöhe pointer_x um eins
     While I <> Neu                                         'i ungleich mitte |und nun die zweite Hälfte
          Call Lcd_set_pixel(i , Pointer_x , White)
          I = I + Richtung
     Wend
    Call Lcd_set_pixel(Neu ,pointer_x  , White)
End Sub
mh es werden 2 vertikale linien auf der y achse angezeigt, und die zykluszeit ist extrem lange,. ca 3s
 
Hallo Bonze,
rufe die Funktion doch mal im Simulator auf und lass dir anstelle von Lcd_set_pixel() die Werte per Print ausgeben.
Dann kann man besser sehen, was passiert.
Ich kann die Befehle nicht ausprobieren.

HBA
 
also ist klar warums nur 1linie anzeigt,

die erste while ist scheinbar ne endlos-scleife,.
Code:
While I <> Mitte                                       'i ungleich mitte |hier wird die erste Hälfte gezeichnet
          Call Lcd_set_pixel(i , Pointer_x , White)
          print "1hälfte i: "; i ; "P_x: ";pointer_x
          I = I + Richtung
     Wend
1hälfte i:61304 p_x: 30
1hälfte i:61303 p_x: 30
1hälfte i:61302 p_x: 30
1hälfte i:61301 p_x: 30
1hälfte i:61300 p_x: 30

läuft so langsam von 65535 runter, deshalb dauert der programmzyklus auch so lange,.

hab ja noch keine temp auswertung, benutze zur simulation ein poti am Analog eingang,.
 
also beim allerersten Durchgang nach Programmstart:

ADC wert6.0
alt: 0
neu: 6
mitte 3
1hälfte i: 1P_x: 30
1hälfte i: 2P_x: 30
2hälfte i: 3P_x: 31
2hälfte i: 4P_x: 31
2hälfte i: 5P_x: 31
neu: 6P_x: 31

also er zählt anscheinend 1hälftei einmal komplett hoch bis 65535, und dann wieder runter...

btw hab ich erwähnt das der 1284 mit 16Mhz und nem Baud von 19200 rennt ? :D is ganz schön schwer per Terminalprog da den wert anzuhalten ,.

Code:
    X = Pointer_x
    Y = Pointer_y

    Call Lcd_set_pixel(alt , X , Yellow)
    Mitte = Neu - Alt
    Shift Mitte , Right , 1 , Signed                        'Diff = Diff / 2
    Mitte = Mitte + Alt
    Richtung = -1

    '*linie steigt oder fällt
    If Neu > Alt Then
       Richtung = 1
    End If

    Pointer_y = Start_y + 1                                 'startwert in y-richtung
    X = Pointer_x
    Y = Pointer_y

    Print "alt: " ; Alt
    Print "neu: " ; Neu
    Print "mitte " ; Mitte

    Pointer_y = Alt + Richtung

        While Pointer_y <= Mitte                            'pointer_y ungleich mitte |hier wird die erste Hälfte gezeichnet
             X = Pointer_x
             Y = Pointer_y
             Call Lcd_set_pixel(y , X , White)
             Print "1 hälfte pointer_y: " ; Pointer_y ; "Pointer_x: " ; Pointer_x
             Pointer_y = Pointer_y + Richtung
        Wend

    Incr Pointer_x                                          'erhöhe pointer_x um eins

        While Pointer_y <= Neu                              'pointer_y ungleich mitte |und nun die zweite Hälfte
             X = Pointer_x
             Y = Pointer_y
             Call Lcd_set_pixel(y , X , White)
             Print "2 hälfte pointer_Y: " ; Pointer_y ; "Pointer_x: " ; Pointer_x
             Pointer_y = Pointer_y + Richtung
        Wend
       X = Pointer_x
       Y = Pointer_y
       Call Lcd_set_pixel(neu , X , White)
        Print "neuer Wert : " ; Neu ; "P_x: " ; Pointer_x
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)