Forum: Mikrocontroller und Digitale Elektronik Stringausgabe in den ROM verschieben


von Markus W. (kornbanane)


Lesenswert?

Hallo,

ich programmiere einen Atmega16 in C. Mit folgender Funktion gebe ich 
Strings über die UART Schnittstelle aus:
1
void putstring(char *string, unsigned char channel)
2
{
3
  while (*string != '\0')
4
  { 
5
    if(*string == '\n')           // CR senden ?  
6
    {
7
      putch('\r',channel);
8
      string++;
9
    }
10
    else
11
    {
12
      putch(*string,channel);       // Jedes Zeichen einzeln in den Sendebuffer schreiben
13
      string++;
14
    }
15
    }
16
}


So kann ich z.B.:so eine Ausgabe realisieren:
1
putstring("\nTaster 1 wurde als gedrueckt erkannt\n",0);

Das blöde daran ist, das der String "\nTaster 1 wurde als gedrueckt 
erkannt\n" durch den Funktionsaufruf im EEPROM gespeichert wird und 
dieser leider viel zu voll wird bei mir. Also würde ich den String gerne 
im ROM speichern, aber ohne meine Funktion groß umzuschreiben (da ich so 
halt variabler bin z.B.: wenn ich Arrays ausgeben will) und ohne den 
eigendlichen Aufruf groß zu ändern. Ich habe es jetzt so gelöst:

[c]
#define Text "\nTaster 1 wurde als gedrueckt erkannt\n"
putstring(Text,0);
[\c]

Das fuktioniert zwar (der String wird im ROM gespeichert), aber 
besonders elegant erscheint es mir nicht.

Klar ich kann es anstatt mit einem define auch mit einem konstantem 
Array machen, aber dann habe ich ja vom Aufwand her auch nicht 
gewonnen...

Am liebsten währe es mir, wenn ich an meinem eigendlichem Aufruf nichts 
ändern müsste, also einfach nur den Text in den Funktionsaufruf 
hereinschreiben und dem Compiler mitteilen, dass er den String im ROM 
speichern kann. Jemand eine Idee?

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Markus Wi*** schrieb:
> Das blöde daran ist, das der String "\nTaster 1 wurde als gedrueckt
> erkannt\n" durch den Funktionsaufruf im EEPROM gespeichert wird und
> dieser leider viel zu voll wird bei mir.

Du meinst RAM, nicht EEPROM.

Wie man Daten im Flash ablegt, und wieder daraus extrahiert, wird hier 
beschrieben:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Speicherzugriffe

von Markus W. (kornbanane)


Lesenswert?

Ich meinte eigendlich den FLASH, war nur bisschen verwirrt ; )

Wie auch immer, jedenfalls habe ich mir deinen Link angeschaut und auch 
weitere Quellen im Netz und hab es aber nicht komplett verstanden. Dann 
bin ich auf eine kleine Anleitung hier gestoßen, wo es super erklährt 
ist.

Also für die Nachwelt:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=38003

von Haro (Gast)


Lesenswert?

PROGMEM und die "pgmspace.h" Funktionen sind eine hässliche Krücke, die 
aber mittlerweile nicht mehr notwendig ist.
Google doch mal nach dem Keyword  _flash.

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
Noch kein Account? Hier anmelden.