- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 7 von 7

Thema: ATMEGA 8 - sprintf Funktion

  1. #1
    jojo.glaser
    Gast

    ATMEGA 8 - sprintf Funktion

    Anzeige

    Praxistest und DIY Projekte
    HILFE!

    Hallo, ich habe folgendes Problem:

    Mein Programmspeicher ist voll und ich möchte was einspaen.

    Im Moment sieht das was ich ändern möchte so aus:


    unsigned char buffer[21] ;

    if(VariableEgal == 1)
    {
    sprintf(buffer, "\ TestEgal1 ");
    }

    if(VariableEgal == 2)
    {
    sprintf(buffer, "\ TestEgal2 ");
    }

    if(VariableEgal == 3)
    {
    sprintf(buffer, "\ TestEgal3 ");
    }

    //Buffer in Display schreiben.
    UART_PrintfProgStr(buffer);


    Um ein wenig speicher vom Programmspeicher in den Data speicher zu verlagern möchte ich das Programm wie folgt abändern:

    unsigned char bufferText1[21] = {?,?,?,?,?,...};
    unsigned char bufferText2[21] = {?,?,?,?,?,...};
    unsigned char bufferText3[21] = {?,?,?,?,?,...};

    if(VariableEgal == 1)
    {
    UART_PrintfProgStr(bufferText1);
    }
    if(VariableEgal == 1)
    {
    UART_PrintfProgStr(bufferText2);
    }
    if(VariableEgal == 1)
    {
    UART_PrintfProgStr(bufferText3);
    }


    So steht jetzt der Text nicht mehr im Programm, sondern in den arrays und ich spare mir ne menge Programmspeicher.

    Das Problem ist aber, ich weis nicht, was ich in den array ohne die sprint funktion schreiben soll. (Dort wo die Frageszeichen sind.)

    Giebt es ein Windows Programm, dass mit Text in einen array schreibt oder kann ich einfach die Buschstaben in den array schreiben?

    Ich hoffe, ihr versteht mein Problem.
    Ich hab mich bemüht, es verständlich zu erklähren.

    DANKE für eure Hilfe!

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    Ich weiß nicht, ob ich dich richtig verstehe...Meinst du, du schreibst die Daten in ein array um damit Speicherplatz im Flash zu sparen?
    Wenn ja, würde das wohl nicht funktionieren, weil das array ja auch im Flash gespeichert wird.

    Aber, falls du nicht soviel Text hast, könntest du ihn in das EEPROM schreiben.


    Du kannst die Buchstaben einzeln in ein array schreiben, wenn du einfache Anführungsstriche ('hier kommtdann der Buchstabe rein') verwendest.

  3. #3
    jojo.glaser
    Gast
    Ich mein anstatt:
    sprintf(buffer, "\r TestX ");
    im Programmtext



    Lieber in einem Array z.b. Buffer {"T","E","X","T","X"};

    also dann steht das ja nicht im Programmspeicher sondern im "Variablenspeicher".

    Aber das mit den "" geht irgendwie nich,so wie ichs oben gezeigt hab.

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hi,

    so sollte es eigentlich gehen:

    Code:
    char buffer[] = "Text";
    Bei Strings hängt der C-Compiler automatisch ein 0-Zeichen hinter die Zeichenkette. Deshalb man kann auch schreiben:

    Code:
    char buffer[5] = { 'T', 'e', 'x', 't', '\0' };
    Trotzdem steht der String bzw. das Array sowohl im Programmspeicher und im RAM. Es spart aber natürlich ungemein an Programmspeicher sprintf nicht zu verwenden.

    Ansonsten bliebe noch die Möglichkeit Strings in den EEPROM Bereich zu packen.

    Gruß m.a.r.v.i.n

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Du kannst die Nachrichten dich direkt ausgeben:
    Code:
    const char *messages[] = { "egal1", "egal2", "egal3"};
       ...
       {
          UART_PrintfProgStr (messages[variableEgal-1]) ;
       }
    Den Platz im Falsh kannst du nicht sparen, irgendwoher müssen die Strings ja initialisiert werden. Das einzige was du machen kannst, ist Platz im RAM zu sparen, indem du die Strings nicht ins RAM legst sondern in Flash lässt.

    In RN-Wissen steht was dazu im [wiki="avr-gcc"] Artikel unter Optimierungen.

    Platz kannst du hier vor allem sparen, indem du kein sprintf verwendest. Sobalt du eine lib-Funktion anfasst, wird ihr Code dazugelinkt. Eine lib-Funktion 1x zu benutzen ist also nicht billiger, als sie 2x oder 3x zu benutzen. Sie garnicht zu verwenden wird erst die Ersparnis bringen.
    Disclaimer: none. Sue me.

  6. #6
    jojo.glaser
    Gast
    oh sorry ich hab " mit ' vertauscht.

    Ich habe das mal eingegeben
    unsigned char buffer2[21] = {'\r','b','c','d','e','f','g','h','i','j','k','l', 'm','n','o','p','q','r','s','t','u'} ;

    das display zeigt jetzt folgendes an;

    abwechselnd

    abcdefghijklmnopqrstu
    [°cdefghijklmnopqrstu


    voran kann das liegen?

  7. #7
    jojo.glaser
    Gast
    DANKE an alle
    Der wahnsinn es geht!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    DANKE DANKE DANKE ................

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad