mikrocontroller.net

Forum: PC-Programmierung Morris Graph mit Ajax


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Kolja L. (kolja82)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend


In der Hoffnung, dass hier jemand sich etwas mit JavaScript  und Ajax 
auskennt,
traue ich mich mal, hier meinen ersten Versuch mit diesen Sprachen zu 
posten:

</head>
  <script>
    function getdata(){
    $.getJSON("data1.php?n=1500", function(data) {

      new Morris.Line({
        element:    "graph",
        data:        data,
        xkey:       "date",
        ykeys:      ['wama_1', 'wama_2'],
        labels:     ['Wama_1', 'Wama_2'],
        lineColors: ['#1111ff',' #ff1111'],
        pointSize:  ['0'],
        hideHover:  ['always'],
        smooth:     ['false']
      }); //Morris.Line

      setTimeout("getdata()",5000);
    }); // getJSON

  } //function getdata

  getdata()

  </script>

<body>
    <div id="graph" style="height: 300px"></div>
</body>

"Mein" Code besteht eigentlich nur aus dem Line-Graph Beispiel der 
Morris.js Graph Bibliothek.
Prinzipiell funktioniert der Code auch, er werden die Daten aus der 
data1.php Datei gelesen und dargestellt.
Nur wird alle 5 Sekunden ein neuer Graph unter dem bisherigen Graph 
dargestellt / hinzugefügt.
Das soll so natürlich nicht sein.

Wie kann ich erreichen, dass die Daten neu eingelesen werden und der 
Graph damit aktualisiert wird?

Muss der alte Graph erst gelöscht werden?
Ist dann kurzzeitig eine weiße Fläche zu sehen?
Dann wäre das Prinzip ja irgendwie blöd und ich hätte auch alles mit 
einem Iframe und Meta-Refresh lösen können.

Im Anhang ein Bild wie es gerade aussieht.
Das Ganze soll ein Monitoring für unsere beiden Waschmaschinen werden.

Danke und Gruß

Kolja

Autor: Frank L. (Firma: Flk Consulting UG) (flk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Nimm mal die Zeile
[c]
setTimeout("getdata()",5000);
[\c]

aus Deinem Code raus. Damit produzierst Du einen rekursiven Aufruf.
Gruß
Frank

Autor: Kolja L. (kolja82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Frank

Ja, die Zeile ruft die Funktion getdata() alle 5 Sekunden auf,
meine Idee war ja, dass sich der Graph damit alle 5 Sekunden 
aktualisiert.

Wenn ich die Zeile rausnehme, dann ist die Seite ja "statisch".

Daher die Frage: Wie kann ich den div aktualisieren?

Gruß Kolja

Autor: Dunno.. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Set timeout hinter der Funktionsdeklaration?

Dann wäre es nicht mehr rekursiv (sagt einer der null Ahnung von JS 
hat..)

Autor: Kolja L. (kolja82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon versucht, gleiches Ergebnis :-(

Autor: M.K. B. (mkbit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kolja L. schrieb:
> Wie kann ich erreichen, dass die Daten neu eingelesen werden und der
> Graph damit aktualisiert wird?

Morris Doku:
Note 2: if you need to update the plot, use the setData method on the 
object that Morris.Line returns. There's a setData example in the GitHub 
repo.


Du musst also mit den ersten Daten das Morris.Line Objekt anlegen und in 
einer Variable außerhalb des Scopes von getData anlegen. Bei den 
weiteren Daten rufst du dann auf der Variable setData mit den neuen 
Daten auf.

: Bearbeitet durch User
Autor: Kolja L. (kolja82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du meinst wahrscheinlich dieses Beispiel:

https://github.com/morrisjs/morris.js/blob/master/examples/updating.html

Das bekomme ich aber nicht mal ohne es zu verändern zum Laufen.
Geschweige, dass ich wüsst, wo ich dort die url zu der php Datei 
einfügen muss.

Ich verstehe dieses Javascript einfch zu wenig.
Vielleicht belasse ich es bei einem meta-refresh im iframe.

Autor: M.K. B. (mkbit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kolja L. schrieb:
> Du meinst wahrscheinlich dieses Beispiel:

Ich habe mir das Beispiel nicht angeschaut, aber mit meiner Erklärung 
kannst du es ja in deinem Code einfach einbauen. Wenn du nicht 
weiterkommst, dann poste deinen Code mit dem Versuch.

Das Problem ist jetzt nichts JS spezifisches, sondern 
Objektorientierung. Du legst ein Graphobjekt an und dann setzt du immer 
wieder neue Daten.

Autor: sogenannter javascriptprofi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du willst dir ausserdem window.setInterval() ansehen.

Autor: Zeno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank L. schrieb:
> Hallo,
> Nimm mal die Zeile
>
> setTimeout("getdata()",5000);
> [\c]

Das ist ja auch so gewollt, da er alle 5s aktualisieren möchte. Allerdings ist es ausreichend setTimeout einmal aufzurufen.


Diese Zeile
[c]
new Morris.Line({ ....
[/]

ist Dein Problem. Du erzeugst jedes Mal einen neuen Graphen.

Lege Dir beim Aufruf der Seite eine Objectvariable an, z.B. so:
[c]
   MorrisLine = new Morris.Line();
Schreibe Dir eine Initialisierungsfunktion wo Du diese Variable 
erzeugst. In dieser Funktion kannst Du auch gleich SetTimeout mit unter 
bringen.

In Deiner geposteten Funktion greifst Du einfach auf diese Ojectvariable 
zu und modifizierst die Daten

Autor: Zeno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei den Codeblöcken ist was schief gelaufen - sorry.

Autor: M.K. B. (mkbit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeno schrieb:
> Allerdings ist es ausreichend setTimeout einmal aufzurufen.

setTimeout muss immer wieder neu aufgerufen werden. Du meinst vermutlich 
setInterval.

Autor: sid (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich nehme stark an data liegt als Array vor..
oder ist das ein JSOn Objekt?

Naja, jdf sollte es so funktionieren ohne es getestet zu haben
</head>
<script>
var nReloads = 0;
var graph = new Morris.Line({
  element:    "graph",
  data:       [],
  xkey:       "date",
  ykeys:      ['wama_1', 'wama_2'],
  labels:     ['Wama_1', 'Wama_2'],
  lineColors: ['#1111ff',' #ff1111'],
  pointSize:  ['0'],
  hideHover:  ['always'],
  smooth:     ['false']
}); //Morris.Line

function getdata(){
  $.getJSON("data1.php?n=1500", function(data)
  {
    nReloads++;
    graph.setData(data);
    $('#reloadStatus').text(nReloads + ' reloads');
    setTimeout("getdata()",5000);
  }); // getJSON

} //function getdata

getdata()

</script>

<body>
<div id="graph" style="height: 300px"></div>
<div id="reloadStatus"> initial data</div>
</body>

Ich hab mal ein reloadStatus div hinzugefügt gemäss dem Beispielcode,
das sollte die Anzahl der Schleifen zählen, damit Du siehst ob es sich 
aktualisiert auch bei statischen Daten;
kannst es ja nachher entfernen.

Ich halte das setTimeout übrigens für die elegantere Lösung als 
SetInterval,
da es terminiert im Fehlerfall und eben nicht bis in alle Ewigkeit alle 
fünf Sekunden auf dem Server rumhämmert solange die Seite geöffnet ist.

Autor: DPA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> setTimeout("getdata()",5000);

Ändert das doch bitte auf:
setTimeout(getdata,5000);

Es ist nicht schön, wenn der Browser das jedes mal evaln muss.

Autor: TotoMitHarry (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder einfach ein:
document.getElementById('graph').innerHTML = "";
als erste Zeile in/hinter  getdata(){ einfügen.

Autor: Frank L. (Firma: Flk Consulting UG) (flk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TotoMitHarry schrieb:
> Oder einfach ein:
> document.getElementById('graph').innerHTML = "";
> als erste Zeile in/hinter  getdata(){ einfügen.

Hallo,

genau so muss es sein. Das Problem hierbei ist, dass die Funktion die 
durch getData mit new Morris() immer ein neues Objekt erzeugt und an das 
div hängt.

Wenn Du vor getData die Kinder des div löschst und anschließend wie 
gehabt getData aufrufst, sollte es funktionieren.

D.h. Dein Ursprungscode war vollkommen korrekt. Lediglich die Zeile von 
TotoMitHarry ergänzen.

Gruß
Frank

Autor: sid (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TotoMitHarry schrieb:
> document.getElementById('graph').innerHTML = "";
> als erste Zeile in/hinter  getdata(){ einfügen.

Oder da jquery im Spiel ist
$('#graph').empty();

AAABER mal ehrlich das Div zu leeren
und neu zu erstellen statt die daten zu aktualisieren

Frank L. schrieb:
> Hallo,
>
> genau so muss es sein. Das Problem hierbei ist, dass die Funktion die
> durch getData mit new Morris() immer ein neues Objekt erzeugt und an das
> div hängt.
>

ist exakt genau FALSCH!
also klar, es funktioniert, ist nur ziemlich das uneleganteste was man 
machen kann...

Das ist wie den Briefkopf für jeden Brief einzeln zu erstellen, statt 
das fertige Template von gestern zu benutzen ;)

Also einmal Briefkopf
(globalen Morris graphen in "graph" abgelegt)
und bei jedem durchlauf nur den Inhalt (Daten) erneuern,
der Webbrowser braucht dann auch weniger CPU ;)

Autor: Frank L. (Firma: Flk Consulting UG) (flk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
me culpa, Du hast natürlich recht. Besser ist es den graph zu 
aktualisieren. Aber der TO hat geschrieben keine Ahnung von AJAX und JS. 
So ist es am einfachsten.

Der korrekt Syntax für eine Aktualisierung wäre hier zu finden:

https://github.com/morrisjs/morris.js/blob/master/examples/updating.html

Gruß
Frank

Autor: Zeno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
M.K. B. schrieb:
> Zeno schrieb:
>> Allerdings ist es ausreichend setTimeout einmal aufzurufen.
>
> setTimeout muss immer wieder neu aufgerufen werden. Du meinst vermutlich
> setInterval.

Ja stimmt. Ich verwende auf meine Seite setInterval - habe ich 
verwechselt

Autor: sid (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank L. schrieb:
> me culpa, Du hast natürlich recht. Besser ist es den graph zu
> aktualisieren.
kein Ding
Frank L. schrieb:
> Aber der TO hat geschrieben keine Ahnung von AJAX und JS.
genau deswegen war ich kleinlich ;)
Ich find beides tut sich nix was die Komplexität angeht;
und die 'vom Entwickler so vorgesehene' Variante ist in der Regel die 
bessere Wahl ;)

Autor: Kolja L. (kolja82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin

Erstmal vielen Dank, dass ihr euch so um mich bemüht.

Ich habe verucht euren Erklärungen zu folgen, aber dafür fehlt mir 
tatsächlich das Wissen um Javascript.

Nun habe ich mir besagtes Beispiel nochmal angeschaut bzw. ausprobiert.
Wenn ich mir das ganze git runterlade und das updating Beispiel starte 
funktioniert es.

Sobald es sich auf meinem Webspace befindet nicht mehr.
Dabei habe ich die vier lokal eingebundenen Skripte einfach mit in das 
Stammverzeichnis gelegt und die Pfade angepasst.
Sind auch alle erreichbar.

Als Ausgabe bekomme ich, neben der Überschrift, einen KAsten mit 
Scrollbalken und dem Inhalt des JS-Skriptes als Text angezeigt.

Kannsich das jemand erklären?

Autor: sid (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, nochmal mit Kommentaren..
vielleicht ist es dann einfacher zu verstehen:
</head>
<script>
//Iniitaliseren zweier globaler Variablen

var nReloads = 0;
// Optional aber für den Test hier ganz nützlich


/* 
streng genommen ist "Mgraph" ein Objekt keine Variable, 
initialisieren tun wir das dennoch gleich
und zwar JETZT damit du nicht jedesmal einen neuen erstellen musst
innerhalb der Funktion.
*/
var Mgraph = new Morris.Line({
  element:    "graph",
  data:       [],   // initialisiert als leeres Array hier
  xkey:       "date",
  ykeys:      ['wama_1', 'wama_2'],
  labels:     ['Wama_1', 'Wama_2'],
  lineColors: ['#1111ff',' #ff1111'],
  pointSize:  ['0'],
  hideHover:  ['always'],
  smooth:     ['false']
}); 
/*
Damit brauchst du nurnoch auf "Mgraph" zu verweisen.
Nun zurück zu Deiner Funktion 
wir brauchen darin den graphen nichtmehr zu erstellen,
das haben wir ja grade eben global getan,
deswegen ist sie nun deutlich kürzer!
*/
function getdata()
{
  // Ajax Aufruf
  $.getJSON("data1.php?n=1500", function(data)
  {
    // Mgraph ist der oben erstellte globale MorrisGraph, da schieben wir nun die empfangenen Daten rein!
    Mgraph.setData(data);
    /* fertig!
     also falls data1.php ein Array überträgt, wovon ich ausgehe...
     ansonsten braucht es einen parser dazwischen, 
     da müsste ich erstmal das Datenformat sehen
    */

    // nReload hochzählen für die Anzeige
    nReloads++; 
    $('#reloadStatus').text(nReloads + ' reloads'); // und angezeigt!
  // die beiden Zeilen sind wie gesagt optional  und nur drin um nen sichtbaren Zähler zu haben
    
  // das TimeOut damit getdata wieder aufgerufen wird in 5 sekunden
  setTimeout(getdata,5000);
  });

}

//und dann wie gehabt der Aufruf:
getdata();

</script>

<body>
<div id="graph" style="height: 300px"></div>
<!-- der optionale nReload braucht auch ein Kästchen, das ist natürlich auch optional -->
<div id="reloadStatus"> initial data</div>
</body>

Autor: sid (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und ohne Zähler und Überschuss wird's
dann auch niedlich klein
</head>
<script>
var graph = new Morris.Line({
  element:    "graph",
  data:       [],
  xkey:       "date",
  ykeys:      ['wama_1', 'wama_2'],
  labels:     ['Wama_1', 'Wama_2'],
  lineColors: ['#1111ff',' #ff1111'],
  pointSize:  ['0'],
  hideHover:  ['always'],
  smooth:     ['false']
});
function getdata()
{
  $.getJSON("data1.php?n=1500", function(data)
  {
    graph.setData(data);
    setTimeout(getdata,5000);
  });
}
getdata();
</script>
<body>
<div id="graph" style="height: 300px"></div>
</body>

Autor: Kolja L. (kolja82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi sid

Geil, vielen Dank für die Kommentare.
Jetzt verstehe ich zumindest, warum data:[] richtig sein muss.

Wir erstellen quasi ein Objekt mit Loch und rufen es später auf und 
füllen das Loch mit den Daten :-)

Leider passiert das anscheinend noch nicht bei mir.
Die Seite bleibt weiß, bis auf den Text " initial data".

Die Dateh aus der PHP Datei sehen so aus:
[{"date": "2019-11-05 13:34" , "wama_1":193, "wama_2":238},{"date": "2019-11-05 13:34" , "wama_1":201, "wama_2":238},{"date": "2019-11-05 13:34" , "wama_1":202, "wama_2":234},......]

Und da es ja funktioniert, siehe ganz oben, sollten die ja eigentlich 
richtig sein, oder?



Danke nochmal und Gruß

Kolja

Autor: sid (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja solange da "initial data"
da steht wurde getdata() nicht aufgerufen..
ich nehme an das Ding läuft in deinem Localhost (xampp oder so?)
Also schau mal bitte in deinem Browser im javascript error log..
vielleicht hab ich n Tippfehler drin.

der ursprüngliche getdata() Aufruf ist so wie er ist nicht sonderlich 
schön,
könnte ja sein, dass noch nicht alles geladen ist, dann läuft er ins 
Leere,
deswegen ist es schöner ihn in ein "onready" zu packen,
oder manchmal schlicht in den footer der html zu setzen.
In dem Fall sollte es mMn gehen,
öffne einfach mal die Konsole im Browser
und gib dort nochmal getdata(); ein (entertaste nicht vergessen)
wenn dann immernoch initial data da steht hab ich bestimmt n TippFehler 
drin ;)

oder falls Du's online hast, gib mir mal den Link dann schau ich selbst 
wo's klemmt.

Es kann auch sein, dass "setData" die JSON Objekte nicht parsed;
ich hab nichteinmal in den Quelltext von Morris geguckt um ehrlich zu 
sein.
Ich hätte behauptet er tut

Falls nicht, muss man sich halt nen Parser bauen,
das ist aber auch relativ banal
function getdata()
{
  $.getJSON("data1.php?n=1500", function(data)
  {
    // ein neues leeres Array
    var parseddata=[];
    for(i=0; i< data.length; i++)
    {
        // das Array mit JSON geparsten Objekten füllen
        parseddata.push(JSON.parse(data[i])); 
    }
    Mgraph.setData(parseddata); // und dieses nun volle Array dann dem graphen zuschustern
    nReloads++; 
    $('#reloadStatus').text(nReloads + ' reloads');
    setTimeout(getdata,5000);
  });
}
Achte darauf dass ich das MorrisGraph Objekt einmal "Mgraph"
und zuletzt nur "graph" genannt hatte (letzteres ist allerdings mit dem 
html div leicht verwirrend, deswegen macht ein aussagekräftigere Name 
Sinn)

Autor: sid (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Aaalso

ich hab das Morris Dingen jetzt mal geladen und in meinen localhost 
geschoben

wenn ich Deine data1.php richtig verstanden habe
rufst Du 1500 datenpunkte ab,
das läuft in meinem Browser nicht, der morrisgraph braucht länger zum 
errechnen der Grafik als 5Sekunden, damit bleibt das Dingen weiss
500 stellt kein Problem dar, ab 1000 wird's schwierig bei meiner alten 
xp Kiste hier.

Also mein Test mit nur 150 Datenpunkten.

ich hab ne php gebastelt die zufällige Nummern erzeugt
und die Sekunden mit Übertragen im Datum damit Morris nicht alle Punkte 
auf eine Position der Zeitachse malt ;)

Ich denke Du kannst dem Beispiel folgen
(einfach beides in den example-Unterordner kopieren)

Autor: Kolja L. (kolja82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sid schrieb:
> Naja solange da "initial data"
> da steht wurde getdata() nicht aufgerufen..
> ich nehme an das Ding läuft in deinem Localhost (xampp oder so?)
> Also schau mal bitte in deinem Browser im javascript error log..
> vielleicht hab ich n Tippfehler drin.

Nabend

Ne, das ganze läuft schon im Internet, aber ioch würde die URL ungerne 
öffentlich machen.

Die Konsole gibt mir aber folgende Fehlermeldung aus:

TypeError: Morris.Line is not a constructor

Und das auch mit deinem neuene Beispiel.

Warum läuft das denn bei dir und bei mir nicht?

Habe W10 und n aktuellen Firefox, daran sollte es nicht scheitern.

Danke für die ganze Unterstützung :-)

Autor: sid (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aktuell heisst nicht immer besser, aber das ist ein gaaanz anderes Thema 
;)

Also, kein Konstruktor heisst, morris.js ist nicht korrekt eingebunden;
möglicherweise fehlt jquery.
oder liegt in falscher version vor (das reicht manchmal)

ich kann ohne nachzusehen leider keine "korrekte" Antwort geben,
und wenn Du die url nicht teilen möchtest müssen wir eben anders an die 
Sache ran.

Also mach bitte mal folgendes:
lade diese zip:
https://github.com/morrisjs/morris.js/archive/0.5.1.zip


Entpacke das in einen Order in deinem webarchiv...
sagen wir "var/www/morristest/"

Nun kopiere den Inhalt meines zip Archivs von oben
nach "/var/www/morristest/examples"
[nichts in den Dateien ändern bitte, schau nach, tut nichts böses ;)]

Und zu guter letzt rufe
<deineurl>/morristest/data1.html im Browser auf

Öffne die Browser Konsole (STRG+UMSCHALT+J)
und mach mir von der Seite und der Konsole nen Screenshot bitte
( deine url kannste nachträglich im grafikprogramm schwärzen wenn Du 
magst,
mich interessiert der exakte Wortlaut und was wirklich zu sehen ist)

Autor: sid (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh.. es muss natürlich <deineurl>/morristest/examples/data1.html heissen 
..

Autor: Kolja L. (kolja82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin

Licht am Ende des Tunnels :-)

sid schrieb:
> <deineurl>/morristest/data1.html im Browser auf

Das funktioniert!
Und wenn ich dann einfach meine echen Daten einbinde funktioniert es 
auch noch :-)

Aber wenn ich das Ganze in mein Stammverzeichnis lege, ging es (trotz 
angepasster Pfade) zuerst nicht.

Der Unterschied und vielleicht die Erklärung für das mMn etwas 
mysteriöse Verhalten:

SSL

Mit https gehts nicht, mit http gehts(! :-).

Die Domain erzwingt kein SSL, meine Stammverzeichnis ist mit https im 
Browser gespeichert, den Pfad zu deinem Beispiel habe ich händisch 
getippt.

Ich suche mal nach einer Lösung.


Eins noch:
Wenn die Seite aufgerufen wird, erscheint der JS Code solange, bis die 
1500 Datensätze geladen worden sind (habe das Timeout einfach auf 10s 
gestellt ;-).
Bekommt man das noch relativ einfach weg?
Vielleicht sogar durch so ein sich drehendes Rad?

Lieben Gruß und besten Dank

Kolja

Autor: Kolja L. (kolja82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ging schnell, die eingebundenen Dateien müssen über https aufgerufen 
werden:

<script 
src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>;
<script 
src="https://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.2/raphael-min.js"></script>;


Leg die mal lokal ab.

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.

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