Forum: Mikrocontroller und Digitale Elektronik Echtzeit Diagramm


von Fichte (Gast)


Lesenswert?

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

von Jens D. (jens) Benutzerseite


Lesenswert?

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

von Rahul (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

Ich nehme mal an von rechts nach links.

von Rahul (Gast)


Lesenswert?

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?")

von Michael (Gast)


Lesenswert?

Also mein Display funktioniert. Ich kann Pixel setzen löschen, Texte und
Zahlen ausgeben.

von Jens D. (jens) Benutzerseite


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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.

von Rahul (Gast)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

Puhh...ich weiss nun nicht wie ich das mit den Zeigern realisieren
soll.
Hast du da ein Beispiel wie so was aussehen kann?

von Rahul (Gast)


Lesenswert?

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.

von Jens D. (jens) Benutzerseite


Lesenswert?

Michael
wenn du keinen buffer nehmen willst, wie willst du das bild nach links
schieben???

von Fichte (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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

von Thomas S. (tstuetz)


Lesenswert?

- 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

von Thomas S. (tstuetz)


Lesenswert?

erste zeile muß heißen
- Lese- und Schreibzeiger mit 0 vorbelegen

und lass bitte die doppelpost's!

Gruss

von Fichte (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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);
};

von Michael (Gast)


Lesenswert?

Ja und wo tust du deine Werte in das Array laden?

von Fichte (Gast)


Lesenswert?

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

von Rahul D. (rahul)


Lesenswert?

Wieso schreibst du die Werte eigentlich erst bei 1 ins Feld und nicht
schon bei 0?
Du gibst ja auch das gesamte Feld (0..158) aus.

von Fichte (Gast)


Lesenswert?

@Rahul Ghose (Rahul)

Sorry hab ich voll vergessen Stimmt Danke für den Hinweis. Ich muss ja
von 0 beginnen.

Danke für den hinweis.


MFG: Fichte

von Thomas S. (tstuetz)


Lesenswert?

und wenn du schon dabei bist mach das Array auf 159 auf
int diagramm[156] ==> int diagramm[159];

diagramm geht dann von Index 0 bis 158, sonst überschreibst du dir
deinen Hauptspeicher!!

Gruss

von Schebahunter (Gast)


Lesenswert?

@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

von Michael (Gast)


Lesenswert?

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);
          }
}

von Michael (Gast)


Lesenswert?

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);
          }
}

von Thomas S. (tstuetz)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

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

von Thomas S. (tstuetz)


Lesenswert?

@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 ?

von Michael (Gast)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.