mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Echtzeit Diagramm


Autor: Fichte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens D. (jens) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich nehme mal an von rechts nach links.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?")

Autor: Michael (Gast)
Datum:

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

Autor: Jens D. (jens) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens D. (jens) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael
wenn du keinen buffer nehmen willst, wie willst du das bild nach links
schieben???

Autor: Fichte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Stütz (tstuetz)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Stütz (tstuetz)
Datum:

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

und lass bitte die doppelpost's!

Gruss

Autor: Fichte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
};

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja und wo tust du deine Werte in das Array laden?

Autor: Fichte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fichte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Stütz (tstuetz)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schebahunter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
          }
}

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
          }
}

Autor: Thomas Stütz (tstuetz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bau die Schleife so auf:
while(1)
{   
  // Bisherige Anzeige löschen (mit leer überschreiben)
  for (i=0;i<108;i++) 
    LCD_PutPixel(i+16,120-Feld[i],0);

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

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

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

Gruss

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
  }

Autor: Thomas Stütz (tstuetz)
Datum:

Bewertung
0 lesenswert
nicht 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

for (i=0;i<100;i++) 
  {
   lcd_px_clr(i+16,120-Feld[i]);
  }
// Bis hier stimmts noch
 
Feld[1]=T;  
// Wir sind in C und in C gibt es auch ein Feld[0]
// Dieses wird AUSGEGEBEN aber nirgends belegt
// besser Feld[0] = T;

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

// Du willst doch folgendes haben
// FeldNr Wert
// [1]    T
// [2]    [1] 
// [3]    [2]...
// Du machst aber:
// FeldNr Wert
// [1]    T
// [2]    [3] 
// [3]    [4]...
// 

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

Gruss

PS: hast du den oben angegebenen Programmcode mal getestet ?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.