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...
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?")
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.
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.
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
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
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);
}
}
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.
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.