-
Thread
instabilität WinAVR und ATmega8535
schreiben, die den String aus'm ROM popelt, und die Aufrufe schreiben in der Art: LCD_WriteData(PSTR("**DisplSensors Set**")); Ein Editor mit "advanced search and replace features" (zum Beispiel mittels regulärer Ausdrücke) erledigt das in wenigen Sekunden.
-
Thread
Register variablen unterschied?
OK: void main (void) { uart1_puts_p(PSTR("TestString")); do {} while(1); } So sieht der rest des Codes aus. Also ich rufe dir Funkton nur einmal auf um etwas über die Uart auszugeben und zwar aus dem Programmspeicher
-
Thread
ATMega32 Stack overflow. Wie vermeiden/analysieren?
Lösungvorschlag gaga. Die vernünftige Lösung wurde bereits oben genannt: z.B. sprintf_P() in Kombination mit PSTR().
-
Thread
Strings ins Progmem und nicht ins SRAM
Oh ja. PSTR ist die Lösung. Wer lesen kann ist klar im Vorteil
-
Thread
Unerwünschter Reset - wie Interrupt abfangen?
wusste ich bis gestern noch nicht, dass in diesem Fall die Strings im RAM angelegt werden. Umstieg auf PSTR("....") und fputs_P() brachte dann auch eine deutliche RAM-Entlastung, und seitdem läuft alles wieder stabil. Vorsorglich habe ich jetzt noch ein paar lokale Variablen, sofern sinnvoll machbar, "globalisiert
-
Thread
T6963C-Display flackert
if (FontSet == 0) return; if (Alignment != ALIGN_LEFT) { unsigned char * pstr = str; unsigned int Offset = 0; unsigned char idx = 0; unsigned char TextWidth = 0; while (*pstr >= ' ') { idx = *pstr - ' '; Offset = pgm_read_byte(UsedFont.fontoffset
+ idx*2 + 1) << 8); TextWidth += pgm_read_byte(UsedFont.fontdata + Offset); pstr++; } if (Alignment == ALIGN_RIGHT) _PosX = (LCD_PIXELX - TextWidth); else _PosX = (LCD_PIXELX - TextWidth) / 2; } while (*str) { if (*str == '\n')
-
Thread
Wie kann ich diesen String über überprüfen?
== 0 ) { // mach was } oder: #include <avr/pgmspace.h> //... if ( strncmp_P( UBefehl, PSTR("REV:"), 4 ) == 0 ) { // mach was } Weiteres zu strncmp(_P) siehe avr-libc Dokumentation. Martin Thomas
-
Thread
Problem mit pgmreadbyte
gebe Dir einfach den Code weiter: //Falls der Formatstring in PROGMEM stehen soll printf_P(PSTR("Hallo aus dem Progmem %d mal.\n"), 73); //Falls ein String-Parameter im PROGMEM steht printf_P(" %S %d %S\n", PSTR("Hallo aus dem Progmem\n"), 73, PSTR("mal")); //Beachte "%S" statt "%s"
Habe mal den Tip mit PSTR aus dem Tutorial probiert nun bin ich soweit das ich nur noch wissen muß wie man die bits auswerten kann. hier der neue Code int drawchar(char c) { // es wird das Font6x8 Array ab position
-
Thread
UART uart_getc(); in for(;;) Schleife
sich der Compiler nicht wehren kann :-) Die korrekte Syntax für den gcc lautet: uart_puts_P( PSTR( ">" ) ); Siehe auch das gcc-Tutorial, den Abschnitt 17.2 und dann schau dir mal im Fleury Source-Code an, was uart_puts_P mit dem übergebenen Wert macht.
das so richtig sei. Diesmal hab ich was übersehen. P.Fleury hat sich ein Makro gebaut, dass den PSTR einsetzt: #define uart_puts_P(__s) uart_puts_p(PSTR(__s)) deshalb funktioniert das korrekt. Mea culpa.
-
Thread
USART Sende Problem - 168
// Same function as printf() but the format string resides in flash // printf_P(PSTR("Type text in TX window, then press ENTER\r\n")); while(scanf("%s",s) == 0); // Get text printf_P(PSTR("\r\nYou entered '%s'\r\n"),s); } }
-
Thread
ADC Programm
einen long: unsigned int Vin = ADC*3300L/1024; // Result in mV und zur Ausgabe: printf_P(PSTR("Vin = %d.%03dV\r\n"),Vin/1000,Vin%1000); Man beachte das dezente 'L' hinter '3300'.
@Rolf Das mit div() scheint interessant zu sein: printf_P(PSTR("Vin = %d.%03dV\r\n"),div(Vin,1000)); ist fies, könnte aber zum erhofften Ergebnis führen, da der struct gleich wieder exakt in der gewollten Reihenfolge auf den Stack kommt. Aber das nur am Rande
-
Thread
ks0108-atmega32
ks0108ReadFontData, BLACK); // Set a position ks0108GotoXY(15,10); // Print some text ks0108Puts_P(PSTR("KS0108-Treiber")); // a nice little round rect ks0108DrawRoundRect(5, 5, 117, 20, 8, BLACK); // Once again :) // Select a font ks0108SelectFont(Corsiva_12, ks0108ReadFontData, BLACK); // Set a position ks0108GotoXY(5,30); // Print some text ks0108Puts_P(PSTR("http://www.apetech.de\nmailto:me@apetech.de")); while(1); } auf dem datenblatt ist das lcd mit dem lpt verbunden und dabei ist reset fest auf 5V, das wäre dann doch quasi activ high, oder?
-
Thread
Wie String in PROGMEM mit printf ausgeben?
Format-String handelt sondern eben um einen Parameter hierfür. Ich stelle mir sowas wie: printf_P(PSTR("Das ist der String im ProgMem: %S\r\n"),ProgMemString); vor. Also z.B. ein spezieller Formatbezeichner. Besten Dank im Voraus!
-
Thread
Zeiger auf 2D Char-Array - casten
merkwürdige Effekte beobachte ;) Wie sähe denn eine korrekte Definition aus? Muss ich die Strings mit PSTR("blabla") ins Array schreiben? Gruß, Daniel
-
Thread
gcc gibt Fehlermeldung, auf anderem PC nicht
initialisiert sein */ fdevopen(Send_char_via_USART, NULL, 0); /* string aus dem FLASH */ printf_P ( PSTR("-----------------------------------------\r\n")) ; printf_P ( PSTR( "* START * " __DATE__" " __TIME__ "\r\n")) ; /* HAUPTSCHLEIFE: Run forever */ for (;;) { } /* Ende for (;;) */
-
Thread
printf druckt falsch aus dem FLASH
probier mal printf (" %s \n\r", PSTR(x)); Du willst einen String ausgeben, deshalb %s, sowie einen Pointer der aber im Flash liegt, dieser muss erst mittels PSTR "konvertiert" werden. Da der AVR Flash und Ram getrennt hat, braucht
Falls der Formatstring in PROGMEM stehen soll printf_P(PSTR("Hallo aus dem Progmem %d mal.\n"), 73); Falls ein String-Parameter im PROGMEM steht printf(" %S %d %S\n", PSTR("Hallo aus dem Progmem\n"), 73, PSTR("mal")); Beachte "%S" statt "%s" im Format
-
Thread
Vektor speichern
int millisec); void OSCCAL_calibration(void); int main(void) { PGM_P statetext = PSTR("KRAIS_SAEGER"); uint8_t input, buttons; uint8_t last_buttons = KEY_NULL; uint8_t vektor[20]; Initialization(); timer0_init() ;//10ms der schritt sei(); for (;;)
-
Thread
MMC/SD-Karte mit FAT16 an AVR
uart_puts_p(PSTR("partition open \n")); /* open file system */ struct fat_fs_struct* fs = fat_open(partition); if(!fs) { uart_puts_p(PSTR("opening filesystem
{ uart_puts_p(PSTR("fat_get_dir_entry_of_path\n")); struct fat_dir_struct* dd = fat_open_dir(fs, &directory); if(!dd) { uart_puts_p(PSTR("opening
-
Thread
Buss'scher Webserver - meine Probleme
return 3; // no 3com // Produktkennung st = readreg(0x312); printf_P(PSTR("Product ID: %04X\n"), st); if(st != 0x9450) return 4; // no 3c5x9 [/C]
-
Thread
struct und PSTR
Adressen die Struktur zu füllen! Bemerkenswerterweise erwischt es den avr-gcc bei der Makroexpansion von PSTR. Da spuckt er Fehler aus. Ich probiere am besten auch gleich mal ne neue avr-libc aus. - cl
prog_char *x; uint8_t i; }; struct _xyz x[] = { {PSTR("Hallo, World"), 2}, {PSTR("Blah"), 4} }; }
-
Thread
Strings allgemein
damit "welt" direkt aus dem FLASH // geladen wird und kein RAM verschwendet wird strcpy_P(test,PSTR("welt")); MfG Peter
-
Thread
strstr?
strcpy(string, pos); } } Wird der Suchstring gefunden. Auch der Aufruf von StringReplace mit PSTR("#wm#") oder "#wm#" bringt nicht das gewünschte Ergebnis. Was mache ich hier falsch? Danke schonmal, Christian
der schon falsch ist. > Wird der Suchstring gefunden. Auch der Aufruf von StringReplace > mit PSTR("#wm#") oder "#wm#" bringt nicht das gewünschte Ergebnis. Hmm. Zumindest letzteres sollte funktionieren. Aendere doch mal die Funktion ob, so dass sie die die Strings iregendwo ausgibt, damit
-
Thread
assembler-routinen in C++: function-names
lcd.o mprintf.o uuprintf.o unter KDevelop übersetzt. In avrthermometer2.c steht u.a: const char pstr1[] PROGMEM = "Temp = %\000C "; extern void uuprintf_P(char *s, const char *ff, uint16_t n); ... int main(void) { ... char A[20]; uuprintf_P(A, pstr1, (uint16_t) ScratchPad[0]>>1)
-
Thread
LCD, HD44780 und KS0076
automatically storing string constant in program memory */ #define lcd_puts_P(__s) lcd_puts_p(PSTR(__s)) /*@}*/ #endif //LCD_H [/c] main.c [c]int main(void) { //Globale Interrupts einschalten sei(); /*-------------------------------------------------------------------------
-
Thread
LCD - Menu
@Stefan, PGM_P pStr = pgm_read_word( &menue[0].text ); und dann zB lcd_printf_P(pStr);
-
Thread
sehr viele printfs -> probleme mit ram (?)
Ohne pgm_read_byte() Einfach printf_P(PSTR("xyz"),...) verwenden.
Jezt siehts gleich vieeel besser aus :D Ich hatte nur printf_P("text"); versucht ohne das PSTR... Das brachte null,nix ;) Danke !
-
Thread
UART-Interrupt haengt das Programm auf (Atmega8)
(PSTR("** **\n\r")); uart_puts_P(PSTR("** 1 Starte Blinklicht **\n\r")); uart_puts_P(PSTR("** 2 Starte Nightrider **\n\r")); uart_puts_P(PSTR("** e Stop Programm **\n\r")); uart_puts_P(PSTR("** **\n\r")); uart_puts_P(PSTR("***
-
Thread
128x64 Grafikdisplay von Pollin
LCD_RST) #define LCD_RST_L() LCD_CTRL &= ~_BV(LCD_RST) #define lcd_puts_P(__s) lcd_puts_p(PSTR(__s)) #define XMAX 127 #define XMIN 0 #define YMAX 63 #define YMIN 0 #define G_BASE 0x200 #define BYTES_PER_ROW 21 void lcd_init(void); void lcd_status(void); void lcd_status_am(void
-
Thread
Uhrzeit formatieren...
Mit WinAVR aktuelle Version von avrLibC snprintf_P(buffer, 20, PSTR(" %02d:%02d:%02d %-6S"), tm.tm_hour, tm.tm_minute, tm.tm_second, dst); NULL problemo
-
Thread
Stirngs auf dem Controller
pdutext,buf); kann man auch so machen if(strlen(buf)<2){ strcpy_P(&pdutext[strlen(pdutext)],PSTR("0")); }else strcpy(&pdutext[strlen(pdutext)],buf); das ist zwar etwas unübersichtlicher.. aber im if verbrauchst du weniger ram (weil direkt aus dem flash kopiert wird.. dann könnte man nun auch
-
Thread
Einfacher und billiger Webserver mit AtMega32
Offentischtlich habe ich Probleme, den Zeilenumbruch zu senden. So sende ich Zeichen ab: printf_P(PSTR("12\n")); In Hyperteminal wird auch 12 ausgegeben, aber sie kommt leider nicht am anderen Mikrokontroler an. Wenn ich mit Hyperterminal eine Zahl absende, dann kommt es auch an nur wenn ich es
-
Thread
Zugriff auf Strings im Flash
/* comand description */ PGM_P CmdDescr; }; const struct cmdtab_st cmdtab[] = { { PSTR("help"), PSTR("print help message\r\n")} }; wird nicht uebersetzt, es waeren keine Klammern innerhalb eines Ausdruckes erlaubt. Ich nehme mal an das er die PSTR(..) Anweisungen nicht mag, aber wie
-
Thread
-
Thread
strcmp_P
Leider habe ich da meine Probleme. Mit diesem Befehl funktioniert es. gleich = strcmp_P(string,PSTR("Measure")); Versuche ich aber so geht es nicht. gleich = strcmp_P(string,COMMAND1); ich hab natuerlich den String im Flash ueber PROGMEM initalisiert. const char PROGMEM COMMAND1[] =
-
Thread
Probleme mit UART
verschickt wird. Text kannst Du dann zB mit printf("Wert: %u", var); oder printf_P(PSTR("Wert: %u"), var); aussenden. Die richtige Library muß natürlich auch dazu gelinkt werden. Siehe Doku. Volkmar
-
Thread
Nokia 6100 Display Atmel Mega8
sorry muß heisen: glcdPrint("Dein Text hier", 0) für RAM, und glcdPrint(PSTR("Dein Text hier"), 1) für FLASH. Gruß Hagen
-
Thread
Nokia 6100 Grafiklibrary die Zweite
linken Rand die automatischen Funktionen der Library. D.h. für diesen Text ruft man nur glcdPrint_P(PSTR("text, bla bla hier")); auf, In den letzten Bildern seht ihr übergroße Fonts, sozusagen Icons/Images in 4 Farben. Allerdings sind diese 4 Farben hauptsächlich so gewählt das ein Anti-Aliasing stattfindet
-
Thread
Nokia 6100 Ansteuerung in C
stdio.h> //In main() (oder wo auch immer ;-) fdevopen(glcdPut, NULL, 0); //Ausgabe printf_P(PSTR("%02i:%02i"), minute, second); Im Makefile mußt Du darauf achten die richtige Version zu nehmen. Wenn ich mich recht erinnere, wird in der derzeitigen WinAVR-Distribution die minimale stdio-Lib eingebunden
-
Thread
KS0108 GLCD Routinen
> #include "ks0108.h" [...] void meinBeispielFunktion(void) { [...] ks0108Puts_P(PSTR("Ein String im Flash")); [...] } Die Width-Funktionen geben jeweils (wie der Name schon sagt) die Breite eines einzelnen Zeichens, eines Strings im SRAM und eines Strings im Flash an. Die Breite
einen String mittig auf dem Display platzieren möchte kann man einfach schreiben: PGM_P string = PSTR("Mittiger Text"); uint8_t w = ks0108StringWidth_P(string); ks0108GotoXY(64-(w<<1), 24); ks0108Puts_P(string); Das ganze kann man natürlich auch durch probieren erreichen und würde dann sogar schneller
-
Thread
Prozessor startet sich beim Array beschreiben neu
ganz hülfreich. Gern übersehen wird, daß string literals standardmäßig (also wenn sie nicht via PSTR() deklariert werden und einer auf _P endenden Routine übergeben werden) auch RAM benötigen (damit sie mit den normalen String-Funktionen aus <string.h> kompatibel sind). Vielleicht hast Du davon
-
Thread
Problem mit strcmp???
. Habe aber jetzt eine Lösung gefunden die funktioniert: ...if (!strncasecmp(empfangsdaten, PSTR("OK"), 2)){... Vielen Dank für die antworten. Das mit dem vielen Speicher stimmt natürlich schon, aber ich wüsste nicht wie ich das anders machen soll?!? Ist ein ATMega16, der sollte genug Speicher
-
Thread
printf mit Atmega128 über uart0
ändern: char character PROGMEM = 'H'; char string[] PROGMEM = "ello World!"; ... printf_P(PSTR("%c"),character); Vielen Dank Heiko
-
Thread
WinAVR 20030913 veröffentlicht
()-Formatstrings kannst Du auch beim avr-gcc im ROM haben, Du hast die volle Kontroller: benutze PSTR() und die *_P() Varianten der Funktionen, und schon bist Du dabei. Der Zugriff auf die Strings ist dann naturgemäß langsamer, aber im umgekehrten Falle hättest Du wiederum ja keine Möglichkeit,
-
Thread
String ausschliesslich im flash...
habs mal so versucht klappt aber leider nicht ganz lcdputstrP(PSTR(menu[0][0]));
{ "Test1", "Test2", "Test3", "Test4" }; und für die ausgabe so. lcdputstrP(PSTR(menu[0][0])); aber es klappt wie gesagt schon nicht mit dem anlegen im flash
-
Thread
Konstanten im Flash ablegen
nicht global, sondern lokal, jeweils in den Funktionen, in denen ich die Strings benötigt habe, als PSTR deklariert habe. unsigned char szBuf[42]; void xyx() { char *ps1 = PSTR("Hier kommt der String\n"); char *ps2 = PSTR("und hier noch einer\n"); // irgendwelche Befehle strcpy_P (szBuf, ps1
-
Thread
Probleme mit Progmem
attribute ignored Und der Text findet sich anschliessend im RAM wieder. probiere ich: char *lcd = PSTR("xxx"); funktioniert das, blos ich kann anschliessend nicht mit char buchstabe = PRG_RDB(lcd+position); drauf zugreifen. Das liefert dann nämlich genau gar nix zurück und mein Display zeigt nix an
ich habe es jetzt anders lösen können: uint16_t lcd = PSTR("test"); kann gelesen werden mit: char buchstabe = PRG_RDB(lcd+counter); mal sehen welche "Schreibweise" weniger Code erzeugt.
-
Thread
Ram wird follgeschrieben
outp(*ptr,UDR); break; } } } wenn ich nur den Aufruf: char *line1 = PSTR("1.Test von Florian"); uart_send(line1,18); schreibe, so funktionierts. wenn ich aber char *line1 = PSTR("1.Test von Florian"); uart_send(line1,18); char *line2 = PSTR("2.Test von Florian
-
Thread
Wie kriege ich viele Strings in den Programm Memory
ich mache es auf vorgeschlagene Standardversion. Ich dachte aber, daß solche Strings, die nicht mit PSTR erzeugt worden sind, bei Programmstart ins RAM kopiert werden, und da wäre dann kein Platz mehr. Das mit dem unsigned char ist glaube ich, damit man auch ASCII Codes größer 127 verwenden kann. Oder