Echtzeit Diagramm

Gast #215837
Hay Leute

Ich sehe langsam den Wald vor lauter Böumen nicht mehr.

Ich möchte gerne ein Echtzeit Diagramm mit einen Grafik LCD Bauen nur
leider hängt es da bei mir an der realisierung ich Programmiere in
Codevision hat den jemand ein Beispiel oder vieleicht eine Idee wie ich
das den Anstellen könnte.

Ich lasse alle 200ms einen wert auslesen und diesen wert möchte ich
gerne mit einen Pixel auf dem Lcd festhalten bzw immer um eine Stelle
weiter schieben.

So wie das hier.
http://www.microsyl.com/graphlcd/graphlcd1.jpg

MFG: Fichte
Persönliche Seite #215838
was denn nu??
von links nach rechts oder von rechts nach links??
beschreib mal genauer, wie der graph aussehen soll
evtl ist ein array nicht verkehrt, wo du deine daten drin speicherst
oder gar ein ring puffer
du musst nur wenn der graph sich schieben soll immer das bild neu
aufbauen

Gruss
Gast #215839
Kann man das nicht mit einer Art Ringspeicher machen, indem man den
Anfangspunkt nach jeder Messung versetzt?

Man schreibt die Werte in ein Feld, das sinnvollerweise so groß ist,
wie das Display breit ist.
Dann wird das ganze Feld an das Display so übergeben, dass der
Feldindex die x-Position beschreibt und der dazugehörende Wert den
Y-Position.
Bei jedem Wert wird der 0-Index um einem Feldindex weiter nach hinten
geschoben.

Solange das Display nicht vollgeschrieben wurde, werden die Werte
"normal" ausgegeben. Danach muß es dann wohl verschoben werden...
Gast #215840
Hallo Fichte,

ja genauso was bräuchte ich.Ich werd mich mal jetzt hinsetzen und das
mal so programmieren.Das ist sicherlich ein sehr großer Aufwand.
Gast #215842
Wo liegt denn das eigentliche Problem?

Hast du schon was auf dem Display?
Oder funktioniert nicht mal das? (dann fällt die Frage wieder unter
Kategorie "Macht mal jemand meine Hausaufgaben für mich?")
Persönliche Seite #215844
ich verstehe nicht, wo das problem ist
auf dem bild wird von links nach rechst gescrollt sprich:
du baust dir einen ring speicher mit zB. 100 byte

in einer Interuptroutine loesst du immer das schreiben aus
(schreiben = 1)

in der main
 if(schreiben == 1)
   Display clear
   hier liesst du deine daten ein bis alle 100 byte vorhanden sind
   bzw gibst vorher von links nach rechts die daten aus
   nun wenn 100 byte vorhanden sind setzt du deinen offset IMMER auf

   +1
   und gibst die daten immer aus dem ringpuffer KOMPLETT!!! aus

von da aus, wo du die daten schreibst musst du nun nur aufpassen, wohin
du schreibst

denke diess sollte nun ausfuehrlich beschrieben sein und mit du es
schaffst
etwaas denken dann kommt man darauf auch selbst
Gast #215845
Ja und an welcher Stelle genau schriebst du die Werte in den
RingBuffer.
Ich würde keinen Buffer nehmen, sondern die Werte direkt ausgeben und
mit einer Hilfvariable die Anzahl der Werte mitzählen.
Gast #215846
Für den Ringpuffer brauchst du natürlich 2 Zeiger: einen fürs Schreiben
und einen fürs Lesen.
Beide sind zu Beginn des Programms gleich. Der Lesezeiger wird erst
dann verändert, wenn alle Felder des Puffers belegt sind, und der erste
Wert wieder überschrieben wird. Dann wandert der Lesezeiger (zeigt also
den Anfang der zu lesenden Daten an).
Der Schreibzeiger markiert die nächste Schreibpostion.

Man kann natürlich auch den Weg gehen, und bei vollem Puffer den
gesamten Puffer einmal "durchzushiften". Das bedeutet zwar eine Menge
Arbeit, ginge aber auch.
Gast #215848
Zeiger sind in meinem Fall nichts anderes als Variablen, in denen
Feldindizes gespeichert werden.

LeseZeiger = 0;
Schreibzeiger = 0;

Feld[Schreibzeiger++] = Messwert;

if (SchreibZeiger == Max)
 {
   SchreibZeiger = 0;
   LeseZeiger ++;
   if (LeseZeiger == Max) LeseZeiger = 0; // Anzeige vom Anfang des
                                          // Puffers
 }

Diese Lösung erfordert ein Max, das die wirkliche Grösse des Feldes
widergibt.

Die Ausgabe an das Display erfolgt dann durch eine Schleife von
LeseZeiger bis LeseZeiger - 1. Ringspeicher halt.
Gast #215850
Also das ganze soll von links nach rechts laufen.

Ich habe mir schon ein Teil davon erstellt.

dia_help1=i;
dia_help2=dia_help1;
dia_help3=dia_help2;
dia_help4=dia_help3;
dia_help5=dia_help4;
dia_help6=dia_help5;
dia_help7=dia_help6;
dia_help8=dia_help7;
dia_help9=dia_help8;
dia_help10=dia_help9;
dia_help11=dia_help10;

setpixel(234,dia_help1,1);
setpixel(233,dia_help2,1);
setpixel(232,dia_help3,1);
setpixel(231,dia_help4,1);
setpixel(230,dia_help5,1);
setpixel(229,dia_help6,1);
setpixel(228,dia_help7,1);
setpixel(227,dia_help8,1);
setpixel(226,dia_help9,1);
setpixel(225,dia_help10,1);

So zbs. aber das Problem ist halt das ich die Punkte nicht Löschen kann
wenn ihr wisst was ich meine.!

MFG: Fichte
Persönliche Seite #215851
Lösche die ausgegebenen Pixel, bevor Du Deinen "dia_help"-Variablen
neue Werte zuweist.

Davon abgesehen solltest Du Dir mal ansehen, was man mit Arrays so
anstellen kann; für ein Display mit 80 Pixelspalten wäre die Verwendung
80 einzelner Variablen und entsprechenden Aufwandes, wie Du ihn für nur
elf Variablen geschrieben hast, ein wenig daneben.
Gast #215852
Hallo,

ich habe da noch Probleme mit dem Ringspeicher.

unsigned char LeseZeiger;
unsigned char SchreibZeiger;
unsigned char Feld[100];
---
..
while(1)
{
 Feld[SchreibZeiger++] = T; //Temperaturwerte im Array

             if (SchreibZeiger == 100)
                {
                  SchreibZeiger = 0;
                  LeseZeiger ++;
                  if (LeseZeiger == 100)
                   {
                    LeseZeiger = 0;
                    for(x=0;x<100;x++)
                     {
                      LCD_PutPixel(x,Feld[x++], 1);  //Ausgabe

                     }
                   }
                }
}

Was muss ich da ändern? Bei mir tut sich nix.
Ich möchte es so haben, dass das die Kurve aussieht wie in einem
Echtzeit Diagramm
#215853
- Lese und schreibzeiger vorbelegen mit 100
- prüf besser auf >= 100 anstatt auf == 100 (sollte aus irgendeinem
Grund 101 mal drinstehen schrottest du dir dein RAM
- wozu wird der lesespeicehr verwendet
- "Feld[x++]" dabei ist das x++ Blödsinn, das wird schon in der
schleife gemacht.
- bevor du die Schleife for(x=0;x<100;x++) ausführst wäre es sinnvoll
  das LC-Display zu löschen (sonst hast du nur einen "Nachleucht"
Effekt mit Dauer unendlich)

Was genau heißt "bei mir tut sich nix" ??

Gruss
Gast #215855
So sieht es jetzt bei mir aus und Funktioniert wunderbar

void diagramm_lauf (int x){
int i;
for (i=80;i<238;i+=4) {
        setpixel(i,32,1);
        setpixel(i+1,32,1);
};

for (i=0;i<158;i++) {
 setpixel(i+79,diagramm[i],0);
}
diagramm[1]=x;
for (i=158;i>1;i--) {
diagramm[i]=diagramm[i-1];
}
for (i=0;i<158;i++) {
 setpixel(i+79,diagramm[i],1);
}
}

MFG: Fichte
Gast #215856
Hallo Fichte deinen Code verstehe ich nicht.
Warum --> diagramm[1]=x; //ist das ok so dass hier eine 1 steht?
Und wozu die for Schleife am Anfang?
for (i=80;i<238;i+=4) {
        setpixel(i,32,1);
        setpixel(i+1,32,1);
};
Gast #215858
Ohhhh Sorry Hab da was dazwischen gebaut was da nicht hin gehört

int diagramm[156];

void diagramm_lauf (int x){
int i;
for (i=80;i<238;i+=4) {
        clr_setpixel(i,32,1);
        clr_setpixel(i+1,32,1);
};

for (i=0;i<158;i++) {
 setpixel(i+79,diagramm[i],0);
}
diagramm[1]=x;
for (i=158;i>1;i--) {
diagramm[i]=diagramm[i-1];
}
for (i=0;i<158;i++) {
 setpixel(i+79,diagramm[i],1);
}
}

So und die Werde ins Array lade ich doch mit "diagramm[1]=x; "


MFG: Fichte
Gast #215862
@Rufus

> Davon abgesehen solltest Du Dir mal ansehen, was man mit Arrays so

Da du hier wie auch in anderen Threads immer so großen Wert auf auf
exakte deutsche Sprache legst, möchte ich dir mitteilen, daß
Anredepronomen sowie besitzanzeigende Fürwörter generell
kleingeschrieben werden. Nur die Höflichkeitsanrede "Sie" wird
großgeschrieben.

Gruß
Katzenfutterjäger
Gast #215863
Bei mir funktioniert es noch nicht so 100%.
Und zwar werden bei mir zwei Streifen angezeigt.Der eine Streifen nimmt
von der länge zu und der andere ab.
Dabei will ich doch nur eine Linie haben.

while(1)
{
        Feld[i++]=T;
        for (i=0;i<108;i++)
           {
             LCD_PutPixel(i+16,120-Feld[i],0);
           }
        for (i=108;i>1;i--)
          {
            Feld[i]=Feld[i-1];
            Feld[108]=T;
            LCD_PutPixel(i+16,120-Feld[i],1);
          }
}
Gast #215864
Bei mir funktioniert es noch nicht so 100%.
Und zwar werden bei mir zwei Streifen angezeigt.Der eine Streifen
nimmt
von der länge zu und der andere ab.
Dabei will ich doch nur eine Linie haben.

while(1)
{
        Feld[i++]=T;
        for (i=0;i<108;i++)
           {
             LCD_PutPixel(i+16,120-Feld[i],0);
           }
        for (i=108;i>1;i--)
          {
            Feld[i]=Feld[i-1];
            Feld[108]=T;
            LCD_PutPixel(i+16,120-Feld[i],1);
          }
}
#215865
Bau die Schleife so auf:
1
while(1)
2
{   
3
  // Bisherige Anzeige löschen (mit leer überschreiben)
4
  for (i=0;i<108;i++) 
5
    LCD_PutPixel(i+16,120-Feld[i],0);
6

7
  // Alle Werte um eine Stelle weiter schieben
8
  // mann beachte den Endwert
9
  for (i = 0;i < (108 - 1);i++) 
10
    Feld[i+1] = Feld[i];
11

12
  // neuen Messwert an erster Position eintragen
13
  Feld[0] = T;
14

15
  // Ausgeben der Linie auf den LC-Display
16
  for (i=0;i<108;i++) 
17
    LCD_PutPixel(i+16,120-Feld[i],1);
18
}

Gruss
Gast #215866
So ein misst, wenn ich den Controller neu starte erscheint auf meinem
Display folgendes:

- :diese Linie nimmt zu


---------------------------- :diese Linie wird kleiner.
Ich komme einfach nicht dahinter.

************************************+
for (i=0;i<100;i++)
  {
   lcd_px_clr(i+16,120-Feld[i]);
  }
Feld[1]=T;
for (i=100;i>1;i--)
  {
   Feld[i]=Feld[i+1];
  }
for (i=0;i<100;i++)
  {
   lcd_px_set(i+16,120-Feld[i]);

Ich habe voll den Black Out!
Ich weiss nicht was ich da falsch gemacht habe.
  }
#215867
@Michael
- der Prozessor ist VOLLKOMMEN logisch
- dein Programmcode KANN nur so reagieren
- Bitte sei so gut und LIES die Beiträge im Forum
  Ich habe keine Lust gegen eine "tumbe" Wand anzureden!
- bitte gehe unter die KALTE Dusche und schau dir danach deinen
  Code an
1
for (i=0;i<100;i++) 
2
  {
3
   lcd_px_clr(i+16,120-Feld[i]);
4
  }
5
// Bis hier stimmts noch
6
 
7
Feld[1]=T;  
8
// Wir sind in C und in C gibt es auch ein Feld[0]
9
// Dieses wird AUSGEGEBEN aber nirgends belegt
10
// besser Feld[0] = T;
11

12
for (i=100;i>1;i--)
13
  {                   
14
   Feld[i]=Feld[i+1];             
15
  } 
16
// Ich nehme stark an das Feld mit [100] aufgemacht ist
17
// WARUM liest du von Element 101 und schreibst es in 100
18

19
// Du willst doch folgendes haben
20
// FeldNr Wert
21
// [1]    T
22
// [2]    [1] 
23
// [3]    [2]...
24
// Du machst aber:
25
// FeldNr Wert
26
// [1]    T
27
// [2]    [3] 
28
// [3]    [4]...
29
// 
30

31
for (i=0;i<100;i++) 
32
  {                      
33
   lcd_px_set(i+16,120-Feld[i]);
34
  }
35
// das stimmt wieder

Gruss

PS: hast du den oben angegebenen Programmcode mal getestet ?
Gast #215868
Achso ja deinen Code habe ich bei mir mal getestet.
Leider funktioniert es nicht so wie ich will.
Es soll so sein, dass der aktuelle Wert von links nach rechts wandert.
-->Echtzeit Diagramm.
Gast #215869
So den Code habe ich von deinem letzten Beitrag übernommen. Tut noch
immer nicht.
Ich möchte das verdammt Ding so haben, dass NUR eine Linie sichtbar
ist.
In meinem Falle ist es ja so das eine Linie von linkt nach rechts zu
nimmt und die andere Linie von links nach rechts abnimmt.
Hmmm...ich kann das nicht verstehen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.