/* 

AVR Strings im Flash halten, um RAM zu sparen
=============================================


Ein Blick auf eine Google-Suche mit dem Begriff

"progmem avr"

bringt nicht nur unverständliche Seiten hervor, sondern auch 
das Eingeständnis

"bin zu blöd für progmem"	8 Beiträge	2. Juli 2004	http://www.mikrocontroller.net/topic/14628

Da es mir so ähnlich ging, hier eine Bauanleitung für den Anfang.

Viel Spaß wünscht Heinzelmann

*/



// Voraussetzung:
#include <avr/pgmspace.h>	// PROGMEM, pgm_read_byte



///////////////////////////////////////////////////////
// ein Beispiel-String (Stern-Notation geht nicht) ////
///////////////////////////////////////////////////////


const char help[] PROGMEM = "\r\nBefehle:\
\r\n h Hilfe \
\r\n m dieses Menue rufen \
\r\n a alle Messwerte anzeigen \
\r\n q,r,s,t einzelnen Messwert zeigen \
\r\n p  Parameterliste zeigen \
\r\n kq Kalibrierung Lichtquelle  K1 100% \
\r\n kr Kalibrierung Reflexion    K2 100% mit Spiegel \
\r\n ks Kalibrierung Streulicht   K3 100% mit Spiegel 45° \
\r\n kt Kalibrierung Transmission K4 100% dazu Zelle leeren \
\r\n b aktuelle Daten ins EEPROM brennen \
\r\nBefehl mit CR abschliessen\r\n\r\n> ";
^


///////////////////////////////////////////////////////
// Aufruf des Strings /////////////////////////////////
///////////////////////////////////////////////////////


uputsf(help);



///////////////////////////////////////////////////////
// Zugehörige Ausgabefunktion /////////////////////////
///////////////////////////////////////////////////////


// UART String aus Flash senden
void uputsf(const char *strg) {	// ab Zeiger *strg senden
	char ch = pgm_read_byte(strg);	// erstes char aus flash holen, 
	strg++;				// ptr increment
	while (ch) {	// solange ch != '\0' (ungleich String-Ende)
		uputc(ch);
		ch = pgm_read_byte(strg++);	// string abarbeiten
	}
}
