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
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
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...
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.
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?")
Also mein Display funktioniert. Ich kann Pixel setzen löschen, Texte und Zahlen ausgeben.
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
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.
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.
Puhh...ich weiss nun nicht wie ich das mit den Zeigern realisieren soll. Hast du da ein Beispiel wie so was aussehen kann?
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.
Michael wenn du keinen buffer nehmen willst, wie willst du das bild nach links schieben???
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
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.
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
- 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
erste zeile muß heißen - Lese- und Schreibzeiger mit 0 vorbelegen und lass bitte die doppelpost's! Gruss
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
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); };
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
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.
@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
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
@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
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); } }
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); } }
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
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. }
@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 ?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.