• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Microkontroller : Csv zu json object

Jok3r

New member
Hallo ich stehe leider bei meinem Projekt ein wenig an , ich komme eigentlich aus der C++ Schiene und arbeite seit einer Zeit an einem kleine Projekt.

Jetzt bin ich soweit das ich meinen Mikrocontroller und alles was er so verwaltet ins netz ohne Umwege stellen will.

Die Html Seite liegt auf einer SD Karte die geladen und an den Client geschickt wird sofern einer vorhanden ist ( max 1 client) .
Das macht alles schon der Mikrocontroller und funktioniert auch einwandfrei.

Jetzt bin ich gerade dabei einen Graphen zu implementieren und mir fehlt hier einfach stark das wissen und die Erfahrungen...
Das ganze weil ich offline damit arbeiten will muss auf der SD karte liegen das heißt es kommt kein jquery ect von einem fremden Server in Frage.

Der Graph funktioniert schon mal voll dynamisch daher er kann seine Größe umrisse ect verändern .

Übergebe ich meiner Graph Funktion zb
-->
Code:
var data = [{
                x: 0,
                y: 80
            }, {
                x: 2,
                y: 75
            }, {
                x: 4,
                y: 75
            }, {
                x: 6,
                y: 45
            }, {
                x: 8,
                y: 65
            }, {
                x: 10,
                y: 40
            }, {
                x: 12,
                y: 35
            }];

zeichnet er diese Koordinaten fein säuberlich ein.

Jetzt sind die eigentlichen Daten aber als csv abgespeichert und liegen auf der SD karte.... Ich habe schon verschieden Beispiele versucht aber wie kann ich am einfachsten (schmaler Code) eine csv in ein Json Objekt umwandeln?


Das klingt vill für viele banal aber bis vor dem Projekt hatte ich mit Javascript ect nichts am Hut...

Schon mal Danke

Gruß
 
Zuletzt bearbeitet:
Hast du auf dem Microcontroller irgendeine serverseitige Sprache zur Hand oder musst du das in JS machen?
Prinzipiell kann man mit JS auch CSV parsen, aber man muss sich den Parser hald selber schreiben (oder einen aus dem Netz verwenden).

Wie sieht die CSV denn genau aus. Vielleicht kann man da etwas quick'N'dirty zusammenschustern.
 
Microkontroller + Javascript, dass sind 2 dinge die mich bewegen. Microkontroller sind auch eines der Gründe warum ich so lange offline war, hatte einige Atmega Projekte abzuarbeiten und nun versuch ich mich wieder in Javascript.

Wie kkapsnerr schon sagt, dass einfachste wäre die CSV Datei in Javascript zu Parsen. Da gibt es bestimmt schon was fertiges auf github.
Besser noch du wandelst vorher die csv daten in json um.

Mich würde allerdings mehr interessieren wie du es schaffst Daten von einer sd Karte zu lesen? Hast Du Datenblätter dazu?
Und wie kommst du von den Microkontroller zum Client über tcp? Das ein Microkontroller tcp Pakete generieren kann weiß ich allerdings ist dazu noch ein weiterer IC nötig um auf RJ45 zu kommen.

Ich frage weil ich ich einen digitalen Stehwellenmesser Programmieren möchte der mir verschiedene Werte an den Browser sendet. Ideal wäre noch ein Stream von pcm Daten damit man noch die Empfangsbedingung visuell im Browser darstellen kann. Allerdings weiß ich nicht ob die Atmegas schnell genug sind PCM Daten in TCP umzuwandeln und wie schaut das der Signal-Rauschabstand aus? Alles solche Fragen.

Überhaupt einen Atemga über den Browser zu steuern wäre schon klasse.

Hast du mit sowas Erfahrung? Wenn ja dann werde ich wohl des öfteren eine PN an dich loslassen.

VG Xorg1990
 
Servus :) ,
also ehrlich gesagt dieses Thema ist gar nicht mal so schwierig umzusetzen. Anfangs hatte ich die ersten Seiten mit dem P makro im flash gespeichert weil der SRam sehr schnell voll gebalert wird und jetzt bin ich soweit das ich über eine SPI Schnittstelle auf die SD karte zugreifen kann und diese je nach anfrage an den client schicke .

Der TCP IP stack ist wahnsinnig kompliziert umzusetzen und würde meine Fähigkeiten sicher überfordern, daher bin ich auf den W5100 Chip umgestiegen der die komplette Kommunikation regelt , dieser ist auch über SPI angebunden. Dieser wird über den Atmega einfach nur mit Befehlen gefüttert und der Chip erledigt den Rest. Dazu gibt es auch diverse fertig gelötete Platinen . Auch Musterprogramme gibt es wie Sand am Meer , also alles halb so wild.

Im Prinzip lese ich Byte für Byte von der SD und schicke es gleich anschließend zum client weiter wenn es eine Anfrage gibt. Der Browser ist ja sozusagen ein reiner Interpreter und erledigt dann den Rest.

So jetzt zum eigentlichen Thema:


Hat das Json object irgendwelche Vorteile ? Ich kann mein Skript auch umarbeiten das ich mit einem mehrdimensionalen Array arbeiten kann.... wäre das einfacher zum umsetzten ? :)



Gruß

- - - Aktualisiert - - -

Code:
 <script type="text/javascript" src="csvToArray.v2.1.js"></script>
    <script type="text/javascript" src="csvToArray.v2.1.min.js"></script>
<!------Plotter------->
    <script type="text/javascript"> 
        function LineChart(con) {
            // user defined properties
            this.canvas = document.getElementById(con.canvasId);
            this.minX = con.minX;
            this.minY = con.minY;
            this.maxX = con.maxX;
            this.maxY = con.maxY;
            this.unitsPerTickX = con.unitsPerTickX;
            this.unitsPerTickY = con.unitsPerTickY;
 
            // constants
            this.padding = 20;
            this.tickSize = this.canvas.width ;
            this.axisColor = "#587d8a";
            this.pointRadius = 2;
            this.font = "12pt Calibri";
 
            this.fontHeight = 20;
 
            // relationships     
            this.context = this.canvas.getContext("2d");
            this.rangeX = this.maxX - this.minY;
            this.rangeY = this.maxY - this.minY;
            this.numXTicks = Math.round(this.rangeX / this.unitsPerTickX);
            this.numYTicks = Math.round(this.rangeY / this.unitsPerTickY);
            this.x = this.getLongestValueWidth() + this.padding * 2;
            this.y = this.padding * 2;
            this.width = this.canvas.width - this.x - this.padding * 2;
            this.height = this.canvas.height - this.y - this.padding - this.fontHeight;
            this.scaleX = this.width / this.rangeX;
            this.scaleY = this.height / this.rangeY;
 
            // draw x y axis and tick marks

            this.drawXAxis();
            this.drawYAxis();
        }
 
        LineChart.prototype.getLongestValueWidth = function () {
            this.context.font = this.font;
            var longestValueWidth = 0;
            for (var n = 0; n <= this.numYTicks; n++) {
                var value = this.maxY - (n * this.unitsPerTickY);
                longestValueWidth = Math.max(longestValueWidth, this.context.measureText(value).width);
            }
            return longestValueWidth;
        };
 
        LineChart.prototype.drawXAxis = function () {
            var context = this.context;
	           
			
            // draw tick marks
            for (var n = 0; n < this.numXTicks; n++) {
                context.beginPath();
				context.strokeStyle= "#DCDCDC";
                context.moveTo((n + 1) * this.width / this.numXTicks + this.x, this.y + this.height);
				context.lineTo((n + 1) * this.width / this.numXTicks + this.x,this.y);
                context.stroke();
            }
			
            context.save();
            context.beginPath();
            context.moveTo(this.x, this.y + this.height);
            context.lineTo(this.x + this.width, this.y + this.height);
            context.strokeStyle = this.axisColor;
		  context.fillText("Time", (this.width/2)+40, 500);
            context.lineWidth = 2;
            context.stroke();
 
            // draw labels
            context.font = this.font;
            context.fillStyle = "black";
            context.textAlign = "center";
            context.textBaseline = "middle";
 
            for (var n = 0; n < this.numXTicks; n++) {
                var label = Math.round((n + 1) * this.maxX / this.numXTicks);
                context.save();
                context.translate((n + 1) * this.width / this.numXTicks + this.x, this.y + this.height + this.padding);
                context.fillText(label, 0, 0);
                context.restore();
            }

            context.restore();
        };
 
        LineChart.prototype.drawYAxis = function () {
            var context = this.context;
          
            // draw tick marks
            for (var n = 0; n < this.numYTicks; n++) {
                context.beginPath();
				context.strokeStyle= "#DCDCDC";
                context.moveTo(this.x, n * this.height / this.numYTicks + this.y);
                context.lineTo(this.x + this.tickSize, n * this.height / this.numYTicks + this.y);
                context.stroke();
            }
            context.save();
			context.beginPath();
            context.moveTo(this.x, this.y);
            context.lineTo(this.x, this.y + this.height);
            context.strokeStyle = this.axisColor;
		  context.fillText("Temp",10,20);
            context.lineWidth = 2;
            context.stroke();
			
            // draw values
            context.font = this.font;
            context.fillStyle = "black";
            context.textAlign = "right";
            context.textBaseline = "middle";
            for (var n = 0; n < this.numYTicks; n++) {
                var value = Math.round(this.maxY - n * this.maxY / this.numYTicks);
                context.save();
                context.translate(this.x - this.padding,( n * this.height / this.numYTicks + this.y)+2);
                context.fillText(value, 0, 0);
                context.restore();
            }
            context.restore();
        };
 
        LineChart.prototype.drawLine = function (data, color, width) {
            var context = this.context;
            context.save();
            this.transformContext();
            context.lineWidth = width;
            context.strokeStyle = color;
            context.fillStyle = color;
            context.beginPath();
            context.moveTo(data[0][1] * this.scaleX, data[0][2] * this.scaleY);
 
            for (var n = 0; n < data.length; n++) {
                var point = data[n];
 
                // draw segment
                context.lineTo(point[1] * this.scaleX, point[2] * this.scaleY);
                context.stroke();
                context.closePath();
                context.beginPath();
                context.arc(point[1] * this.scaleX, point[2] * this.scaleY, this.pointRadius, 0, 2 * Math.PI, false);
                context.fill();
                context.closePath();
 
                // position for next segment
                context.beginPath();
                context.moveTo(point[1] * this.scaleX, point[2] * this.scaleY);
            }
            context.restore();
        };
 
        LineChart.prototype.transformContext = function () {
            var context = this.context;
 
            // move context to center of canvas
            this.context.translate(this.x, this.y + this.height);
 
            // invert the y scale so that that increments
            // as you move upwards
            context.scale(1, -1);
        };
 
        window.onload = function () {
            var myLineChart = new LineChart({
                canvasId: "myCanvas",
                minX: 0,
                minY: 0,
                maxX: 31,
                maxY: 80,
                unitsPerTickX: 2,
                unitsPerTickY: 5,
            });
 
       
        //    myLineChart.drawLine(data, "blue", 1);
 
     //Test
   		
   		var   csvAsStringA =	'1,10,11,1,10,11,1,10,11,1,10,11,1,10,11,1,10,11'
 
 			csvAsArrayA = csvAsStringA.csvToArray({head:true});
 			
            myLineChart.drawLine(csvAsArrayA, "red", 1);
        };
    </script>


Mein Programm zeichnet leider nichts mehr kann bitte mal schnell jemand darüber schauen ? :)

Gruß
 
Zuletzt bearbeitet:
Jok3r schrieb:
Der TCP IP stack ist wahnsinnig kompliziert umzusetzen und würde meine Fähigkeiten sicher überfordern,
Jo, hab das auch nie fertig gebracht.. außerdem müsste man dazu noch einen Http Server programmieren der auf den Atmega läuft.
Es gibt auch Mikroprozessoren auf den nodejs läuft diese lassen sich in JS Programmieren. Ardunio hatte da mal was im Angebot, kann es nicht mehr finden.
Geben tut es das weil auch Drohnen damit ausgerüstet sind.

Zu deinem Problem:
<script type="text/javascript" src="csvToArray.v2.1.js"></script> bindest du 2 mal ein. .min ist Minimierte Version und würde diese aus Platzgründen vorziehen.

var csvAsStringA = '1,10,11,1,10,11,1,10,11,1,10,11,1,10,11,1,10,11' Semikolon vergessen.
Wenn deine csv Daten so aussehen, da fallen mir einfachere Methoden ein um das in ein Array umzuwandeln z.B Split() .

csvAsArrayA da fehlt das Schlüsselwort "var" zuvor.

Bist du dir sicher das aus deinem Teststring auch ein Mehrdimensionales Array entsteht? Laut dem beispiel von google.code müsste es so lauten:
' "1,10,11,1,10,11,1,10,11,1,10,11,1,10,11,1,10,11" '
Die " sind wichtig sonnst weiß der Parser ja gar nicht wo er trennen soll oder sehe ich das jetzt Falsch :confused:


Jok3r schrieb:
Hat das Json object irgendwelche Vorteile ?
Es ist zumindest einfacher zu lesen und die schleifen sind einfacher zu verstehen z.b die for in oder forEach schleife.
Was nun Performanter ist keine Ahnung.
 
Servus danke für die Antwort diese Fehler sind mir aufgefallen und hab sie noch geändert ....hab nur eine alte Version hier hochgeladen.
Zum entwickeln benutze ich auch einen Arduino Mega , programmieren tu ich den aber mit Atmel Studio...

Für

var csvAsStringA = ' "1,10,11,1,10,11,1,10,11,1,10,11,1,10,11,1,10,11" ';

var csvAsArrayA = csvAsStringA.csvToArray();
alert(csvAsArrayA[0][0]); // 1

dieses Beispiel bekomme ich leider nicht das zu erwartende Ergebnis mir wird der ganze String zurück gegeben :/
 
also bei mir funzt das nur wenn ich das so schreibe
Code:
var csvAsStringA = csvAsStringA = 'Header 1,Header 2,Header 3\r\n'
                + ' "1,10,11,1,10,11,1,10,11,1,10,11,1,10,11,1,10,11" ';

Dann hast du aber auch nur den kompletten String in einem Array und das ist ja nicht das ziel.
Wenn die Koordinaten ungefähr so da stehen wie in deinem BeispielString dann würde ich mit Split und substring() arbeiten.
Oder du konvertierst die csv doch zu json.

Mir saust noch ein ganz andrer Punkt durch den Kopf:
Wie willst du die csv Datei in deine Browser packen? Das würde mit einen ajax request gehen, das wiederum erfordert aber einen http server auf deinem Atmega.
Selbst dann wird es schwierig die csv Datei zu verarbeiten da wirst Du um die File Api nicht ringsum kommen.

PS: ich hab jetzt gerade erst mal gelesen was ein CSV Datei eigentlich ist
 
Zuletzt bearbeitet:
ajax funktioniert ...
zumindestens hatte ich mal einen Sourcefile getestet bei dem es funktioniert.
Hab mich damit aber noch nicht wirklich beschäftigt.

Das mit der .csv ist ziemlich banal , kommt von einem client eine Anfrage an den Webserver( Mikrocontroller ) macht der nur ein paar Züge, einmal auswerten ob eine Anfrage oder neue Daten für den Webserver vorliegen.

Liegt eine Anfrage vor wird die beantwortet die Antwort steckt Byte weise im TCI IP Packet drinnen, dem controller ist das ziemlich egal ich kann die .csv auch .html nennen das würde keinen unterschied machen.
Die Daten werden dem Interpreter(Browser) danach bekannt gemacht und der soll dann das richtige damit anstellen.

Ob das später so einfach zum umsetzen ist bezweifle ich , aber so hab ich die Theorie bisher verstanden und diverese Beispiele und code s haben mir das bestätigt....

Bei den Ausgabefeldern funktionierts auch schon mal, dort handle ich das über die Id ab :)

Gruß

- - - Aktualisiert - - -

Update: :)

Bildschirmfoto 2015-08-02 um 11.38.14.png
 
Jok3r schrieb:
ajax funktioniert ...
Wenn es so ist... dann ist doch gut:d

Mir fällt noch die Microsoft Methode ein wie man es ohne Ajax mache könnte.
Du packst bei jeder anfrage den Kompletten csv Inhalt ein verstecktes p tag. Das den Inhalt kann man dann via DOM/Javascript verarbeiten.
Der Mic. muss es nur schaffen den csv Inhalt on-the-fly in den html Request zu packen.

Microsoft Methode deshalb, weil bei der Windows HomeServer Website jedes Thumbnail als base64 auf der Webseite versteckt vorliegt.
 
Dein letzter Ratschlag ähm den versteh ich nicht.

Es gibt wieder ein kleines Update:
Code:
unction drawCsvfile(file)
{
    var rawFile = new XMLHttpRequest();
    rawFile.open("GET", file, true);
    rawFile.onreadystatechange = function ()
    {
        if(rawFile.readyState === 4)
        {
            if(rawFile.status === 200 || rawFile.status == 0)
            {
                var allText = rawFile.responseText;
                array = csv2array(allText);
                myLineChart.drawLine(array, "blue", 1, 1); 
                myLineChart.drawLine(array, "red", 1, 2); 
                
            }
        }
    }
    rawFile.send(null);
}
 
 
drawCsvfile("temperatures.csv");

Und ja was soll ich sagen ich bin begeistert :) es funktioniert.
Ein kleines Verständnis Problem hab ich aber dennoch, wie oft werden die Daten erneuern bzw wie lege ich das fest ?

Gruß
 
Vergiss das vom letzten Beitrag, dass ist ne absurdum Methode die gibt's nur bei Microsoft. :horror:

Mit SetInterval() führst Du den ajax request erneut aus.

Code:
setInterval(function(){
    drawCsvfile("temperatures.csv");
 }, 3000);

Sag mal weißt du zufällig wie ich das Ohm Symbol auf einen LCD Dispay (HD44780 Controller) darstellen kann? Wenn ich die ASCII Tabelle hernehme kommt bei mir statt dem Ohm immer ein Omega. Programmieren tue ich in C. Auch Custom chars haben nicht funktioniert.:mad:


PS.: als Mikrocontroller Fan sollte dich das interessieren: http://wwwhome.cs.utwente.nl/~ptdeboer/ham/sdr/weinheim-2005-pa3fwm.pdf
 
Zuletzt bearbeitet:
Hallo puh auf anhieb leider nein ich arbeite wenn dann nur immer mit TFT s oder TFT s mit Touch. Aber soviel ich noch weiß haben die LCD intern einen Speicher in dem du eigene Symbole ablegen und aufrufen kannst. Oft gibts noch einen erweiterten Speicher in dem schon viele Symbole hinterlegt sind. Der HD44780 interpretiert ja nur deine Befehle und die sind ja soviel ich weiß auch Programmierbar zb wie oben erwähnt .

Komisch komisch, jetzt hätte ich vorhin mal alles hochgeladen also die HMTL auf die SD und den Code in den Controller nur leider funktioniert der Spaß hier nicht mehr .
Die Homepage wird angezeigt samt Graph nur leider kommen die CSV Daten nicht an .. -.-
Auf dem PC im selben Ordner gehts, das hier kein Server dahinter frikelt ist mir auch klar ...


-->
Code:
unction drawCsvfile(file)
{
    var rawFile = new XMLHttpRequest();
    rawFile.open("GET", file, true);
    rawFile.onreadystatechange = function ()
    {
        if(rawFile.readyState === 4)
        {
            if(rawFile.status === 200 || rawFile.status == 0)
            {
                var allText = rawFile.responseText;
                array = csv2array(allText);
                myLineChart.drawLine(array, "blue", 1, 1); 
                myLineChart.drawLine(array, "red", 1, 2); 
                
            }
        }
    }
    rawFile.send(null);
}
 
 setInterval(function(){
    drawCsvfile("datalog.csv");
 }, 3000);
 
drawCsvfile("datalog.csv");


Der Fehler wird aber auch noch gefunden ... -.-
 
Zuletzt bearbeitet:
Das ist das Ohm Symbol was ich brauche.
omegaohm.jpg


aber egal was ich in den Mic einstanze es kommt das:
Greek_lc_omega.png
 
Ah... du willst ein großes Omega bekommst aber ein kleines... das ist natürlich ärgerlich. Ev. wird das Bit für die Groß- und Kleinschreibung nicht richtig gesetzt.
 
Kennst du dich aus mit sowas? Meine JS und Microprozessor sind ja nicht wirklich 2 dinge die miteinander zu tun haben.

*Der Text, den Sie eingegeben haben, besteht aus 23132 Zeichen und ist damit zu lang. Bitte kürzen Sie den Text auf die maximale Länge von 20000 Zeichen.*:p
Das ist der Code für die Display Ausgabe *gekürzt:

Code:
/*************************************************************************
Low-level function to write byte to LCD controller
Input:    data   byte to write to LCD
          rs     1: write data
                 0: write instruction
Returns:  none
*************************************************************************/
static void lcd_write(uint8_t data,uint8_t rs)
  {
    #if (WAIT_MODE==1 && RW_LINE_IMPLEMENTED==1)
      lcd_waitbusy();
      if (PrevCmdInvolvedAddressCounter)
        {
          Delay_us(5);
          PrevCmdInvolvedAddressCounter=0;
        }
    #endif

    if (rs)
      {
        lcd_rs_port_high();                            // RS=1: Write Character
        #if (WAIT_MODE==1 && RW_LINE_IMPLEMENTED==1)
        PrevCmdInvolvedAddressCounter=1;
        #endif
      }
    else
      {
        lcd_rs_port_low();                          // RS=0: Write Command
        #if (WAIT_MODE==1 && RW_LINE_IMPLEMENTED==1)
        PrevCmdInvolvedAddressCounter=0;
        #endif
      }

    #if LCD_BITS==4
      lcd_db7_port_set(data&_BV(7));                  //Output High Nibble
      lcd_db6_port_set(data&_BV(6));
      lcd_db5_port_set(data&_BV(5));
      lcd_db4_port_set(data&_BV(4));

      Delay_ns(100);
      lcd_e_port_high();

      Delay_ns(500);
      lcd_e_port_low();

      lcd_db7_port_set(data&_BV(3));                  //Output High Nibble
      lcd_db6_port_set(data&_BV(2));
      lcd_db5_port_set(data&_BV(1));
      lcd_db4_port_set(data&_BV(0));

      Delay_ns(100);
      lcd_e_port_high();

      Delay_ns(500);
      lcd_e_port_low();

      lcd_db7_port_high();                            // All Data Pins High (Inactive)
      lcd_db6_port_high();
      lcd_db5_port_high();
      lcd_db4_port_high();

    #else //using 8-Bit_Mode
      lcd_db7_port_set(data&_BV(7));                  //Output High Nibble
      lcd_db6_port_set(data&_BV(6));
      lcd_db5_port_set(data&_BV(5));
      lcd_db4_port_set(data&_BV(4));
      lcd_db3_port_set(data&_BV(3));                  //Output High Nibble
      lcd_db2_port_set(data&_BV(2));
      lcd_db1_port_set(data&_BV(1));
      lcd_db0_port_set(data&_BV(0));

      Delay_ns(100);
      lcd_e_port_high();
      Delay_ns(500);
      lcd_e_port_low();

      lcd_db7_port_high();                            // All Data Pins High (Inactive)
      lcd_db6_port_high();
      lcd_db5_port_high();
      lcd_db4_port_high();
      lcd_db3_port_high();
      lcd_db2_port_high();
      lcd_db1_port_high();
      lcd_db0_port_high();
    #endif

    #if (WAIT_MODE==0 || RW_LINE_IMPLEMENTED==0)
      if (!rs && data<=((1<<LCD_CLR) | (1<<LCD_HOME))) // Is command clrscr or home?
        Delay_us(1640);
      else Delay_us(40);
    #endif
  }

/*************************************************************************
Send LCD controller instruction command
Input:   instruction to send to LCD controller, see HD44780 data sheet
Returns: none
*************************************************************************/
void lcd_command(uint8_t cmd)
  {
    lcd_write(cmd,0);
  }

/*************************************************************************
Set cursor to specified position
Input:    pos position
Returns:  none
*************************************************************************/
void lcd_goto(uint8_t pos)
  {
    lcd_command((1<<LCD_DDRAM)+pos);
  }


void lcd_gotoXY( uint8_t row, uint8_t col )
{
    uint8_t tmp = 0x00;

    switch (row) 
    {
        case 1: tmp=0x80+0x00+col; break;    // 1. Zeile
        case 2: tmp=0x80+0x40+col; break;    // 2. Zeile
        case 3: tmp=0x80+0x10+col; break;    // 3. Zeile
        case 4: tmp=0x80+0x50+col; break;    // 4. Zeile
    }
	lcd_command( tmp );
}

/*************************************************************************
Clear screen
Input:    none
Returns:  none
*************************************************************************/
void lcd_clrscr()
  {
    lcd_command(1<<LCD_CLR);
  }


/*************************************************************************
Return home
Input:    none
Returns:  none
*************************************************************************/
void lcd_home()
  {
    lcd_command(1<<LCD_HOME);
  }


/*************************************************************************
Display character
Input:    character to be displayed
Returns:  none
*************************************************************************/
void lcd_putc(char c)
  {
    lcd_write(c,1);
  }


/*************************************************************************
Display string
Input:    string to be displayed
Returns:  none
*************************************************************************/
void lcd_puts(const char *s)
  {
    register char c;

    while ((c=*s++)) 
      lcd_putc(c);
  }


/*************************************************************************
Display string from flash
Input:    string to be displayed
Returns:  none
*************************************************************************/
void lcd_puts_P(const char *progmem_s)
  {
    register char c;

    while ((c=pgm_read_byte(progmem_s++))) 
      lcd_putc(c);
  }

/*************************************************************************
Initialize display
Input:    none
Returns:  none
*************************************************************************/
void lcd_init()
  {
    //Set All Pins as Output
    lcd_e_ddr_high();
    lcd_rs_ddr_high();
    #if RW_LINE_IMPLEMENTED==1
      lcd_rw_ddr_high();
    #endif
    lcd_db7_ddr_high();
    lcd_db6_ddr_high();
    lcd_db5_ddr_high();
    lcd_db4_ddr_high();
    #if LCD_BITS==8
      lcd_db3_ddr_high();
      lcd_db2_ddr_high();
      lcd_db1_ddr_high();
      lcd_db0_ddr_high();
    #endif

    //Set All Control Lines Low
    lcd_e_port_low();
    lcd_rs_port_low();
    #if RW_LINE_IMPLEMENTED==1
      lcd_rw_port_low();
    #endif

    //Set All Data Lines High
    lcd_db7_port_high();
    lcd_db6_port_high();
    lcd_db5_port_high();
    lcd_db4_port_high();
    #if LCD_BITS==8
      lcd_db3_port_high();
      lcd_db2_port_high();
      lcd_db1_port_high();
      lcd_db0_port_high();
    #endif

    //Startup Delay
    Delay_ms(DELAY_RESET);

    //Initialize Display
    lcd_db7_port_low();
    lcd_db6_port_low();
    Delay_ns(100);
    lcd_e_port_high();
    Delay_ns(500);
    lcd_e_port_low();

    Delay_us(4100);

    lcd_e_port_high();
    Delay_ns(500);
    lcd_e_port_low();

    Delay_us(100);

    lcd_e_port_high();
    Delay_ns(500);
    lcd_e_port_low();

    Delay_us(40);

    //Init differs between 4-bit and 8-bit from here
    #if (LCD_BITS==4)
      lcd_db4_port_low();
      Delay_ns(100);
      lcd_e_port_high();
      Delay_ns(500);
      lcd_e_port_low();
      Delay_us(40);

      lcd_db4_port_low();
      Delay_ns(100);
      lcd_e_port_high();
      Delay_ns(500);
      lcd_e_port_low();
      Delay_ns(500);

      #if (LCD_DISPLAYS==1)
        if (LCD_DISPLAY_LINES>1)
          lcd_db7_port_high();
      #else
        unsigned char c;
        switch (ActiveDisplay)
          {
            case 1 : c=LCD_DISPLAY_LINES; break;
            case 2 : c=LCD_DISPLAY2_LINES; break;
            #if (LCD_DISPLAYS>=3)
            case 3 : c=LCD_DISPLAY3_LINES; break;
            #endif
            #if (LCD_DISPLAYS==4)
            case 4 : c=LCD_DISPLAY4_LINES; break;
            #endif
          }
        if (c>1)
          lcd_db7_port_high();
      #endif

      Delay_ns(100);
      lcd_e_port_high();
      Delay_ns(500);
      lcd_e_port_low();
      Delay_us(40);
    #else
      #if (LCD_DISPLAYS==1)
        if (LCD_DISPLAY_LINES<2)
          lcd_db3_port_low();
      #else
        unsigned char c;
        switch (ActiveDisplay)
          {
            case 1 : c=LCD_DISPLAY_LINES; break;
            case 2 : c=LCD_DISPLAY2_LINES; break;
            #if (LCD_DISPLAYS>=3)
            case 3 : c=LCD_DISPLAY3_LINES; break;
            #endif
            #if (LCD_DISPLAYS==4)
            case 4 : c=LCD_DISPLAY4_LINES; break;
            #endif
          }
        if (c<2)
          lcd_db3_port_low();
      #endif

      lcd_db2_port_low();
      Delay_ns(100);
      lcd_e_port_high();
      Delay_ns(500);
      lcd_e_port_low();
      Delay_us(40);
    #endif

    //Display Off
    lcd_command(_BV(LCD_DISPLAYMODE));

    //Display Clear
    lcd_clrscr();

    //Entry Mode Set
    lcd_command(_BV(LCD_ENTRY_MODE) | _BV(LCD_ENTRY_INC));

    //Display On
    lcd_command(_BV(LCD_DISPLAYMODE) | _BV(LCD_DISPLAYMODE_ON));
  }

#if (LCD_DISPLAYS>1)
void lcd_use_display(int ADisplay)
  {
    if (ADisplay>=1 && ADisplay<=LCD_DISPLAYS)
      ActiveDisplay=ADisplay;
  }
#endif
Stammt ursprünglich von sa Development.
habe aber das hinzugefügt
Code:
void lcd_gotoXY( uint8_t row, uint8_t col )
{
    uint8_t tmp = 0x00;

    switch (row) 
    {
        case 1: tmp=0x80+0x00+col; break;    // 1. Zeile
        case 2: tmp=0x80+0x40+col; break;    // 2. Zeile
        case 3: tmp=0x80+0x10+col; break;    // 3. Zeile
        case 4: tmp=0x80+0x50+col; break;    // 4. Zeile
    }
	lcd_command( tmp );
}

Wenn ich da lcd_puts nehme unterscheidet er zwischen groß und Kleinschreibung
Ein einzelner char kommt immer groß der via lcd_putc ausgegeben wurde. Warum eigentlich?
für das Ohm schreibe lcd_putc(0xF4); Dann kommt das W artige was ich nicht will.
Habe bis jetzt noch nichts darüber Gelsen das man ein Bit setzten muss für groß und Kleinschreibung
 
Kennst du dich aus mit sowas?
Nicht wirklich, aber C kann ich lesen.
Warum eigentlich?
Das ist seltsam, da lcd_puts auch direkt lcd_putc aufruft.
für das Ohm schreibe lcd_putc(0xF4)
Welches Encoding ist das, dass das 0xF4 sein muss? In Unicode ist das "ô".

Habe bis jetzt noch nichts darüber Gelsen das man ein Bit setzten muss für groß und Kleinschreibung
Man muss da kein Bit setzten, aber normalerweise unterscheiden sich die beiden Buchstaben nur um ein Bit. So ist ein "A" 0x41 und "a" 0x61 - also nur das 6. Bit (von rechts) unterschiedlich.
 
kkapsner schrieb:
Das ist seltsam, da lcd_puts auch direkt lcd_putc aufruft.
Logisch laut der Tabelle auf Wikipedia gibt es Großbuchstaben und Kleinbuchstaben. Das erklärt so einiges. Macht aber dennoch keinen sinn, wenn ich z.B. das R ausgebe über putc ist das auch immer groß.
https://de.wikipedia.org/wiki/HD44780

kkapsner schrieb:
Welches Encoding ist das
Laut Wikipedia ASCII

kkapsner schrieb:
Man muss da kein Bit setzten, aber normalerweise unterscheiden sich die beiden Buchstaben nur um ein Bit. So ist ein "A" 0x41 und "a" 0x61 - also nur das 6. Bit (von rechts) unterschiedlich.
Meine das sogar ausprobiert zu haben, aber da ist das Display abgestürzt... hat sich mit Nullen gefüllt.

PS.: der CGRAM ist voll den brauch ich für eine Balkenanzeige.
 
Zurück
Oben