-
Thread
Probleme mit Übergabe eines Arrays
Operationen benutzen, die die Zusicherung geben, den String nicht zu verändern [c] const char* pStr = uart_return_rx_buffer_address(); size_t len = strlen( pStr ); // Ist ok, denn strlen gibt die Zusicherung // den String nicht zu verändern [/c] du kannst ihn aber nicht dazu benutzen, den String zu verändern [c] const char* pStr = uart_return_rx_buffer_address(); pStr[0] = 'a'; // Fehler. pStr zeigt auf einen konstanten String strcpy( pStr, "Hallo" ); // Fehler: der ganze String in pStr ist nicht änderbar
-
Thread
Uart Interrupt Problem
LCD_PutString((const char*)uart_string); uart_puts((const char*)uart_string); LCD_PutString_P(PSTR("\r\n")); LCD_PutString_P(PSTR("Erfolg \r\n\n")); uart_puts((const char*)uart_string); uart_str_complete=0; } Update_LCD(); //_delay_ms(1000); }
LCD_PutString((const char*)uart_string); uart_puts((const char*)uart_string); LCD_PutString_P(PSTR("\r\n")); LCD_PutString_P(PSTR("Erfolg \r\n\n")); uart_puts((const char*)uart_string); uart_str_complete=0; } Update_LCD(); //_delay_ms(1000); }
-
Thread
was passiert bei fehlerhafter Adresse im I2C-Bus?
status = I2C_init(I2Cx); // initialize I2C peripheral if(status) goto error; printf_P(PSTR("\fScan I2C adresses\n\a")); /* Check for I2C devices */ printf_P(PSTR("I2C=\a")); for(uint8_t i=0x00; i<0x7F; i++) { printf_P(PSTR("0x%2x\a"),i<<1); status = I2C_ping(I2Cx,i<
fallthrough default: // Unterwarte Faelle I2C_reset(I2Cx); printf_P(PSTR("TO=%2x,%2x \a"),i<<1,status); } delay_us(50000); } printf_P(PSTR("\b\b\b\bdone. \a")); while(!key_getstroke()); return; error: I2C_reset(I2Cx); printf_P(PSTR
-
Thread
Was passiert, wenn man als Funktionsparameter statt einem prog_char* ein char* übergibt?
Strings steht. Beispiel: In ff.c hatte ich ein paar Variablen per Uart anzeigen lassen: [c]xprintf(PSTR("ff_Test_pdrv=%d\n"), fs->pdrv); xprintf(PSTR("ff_Test_stat=%d\n"), stat); xprintf(PSTR("f_mount: vol=%d\n"), vol); xprintf(PSTR("f_open > find_volume res:%d\n"), res); xprintf(PSTR("f_open > end:%d\n"), res);[/c] In der Main habe ich ebenfalls ein paar Ausgaben mit PSTR und auch ein paar mit einem normalen String machen lassen: [c] int variable = 44; xprintf("zeile %d \n", 1); //=1 xprintf("%s \n","String"); //332 xprintf("%d \n", 1); //_mount: vol=1 xprintf(
-
Thread
Kann keine datei auf sd card estellen
); if(!partition) { uart_puts_p(PSTR("opening partition failed\n")); return(0); } else { uart_puts_p(PSTR("opening partition OK\n")); } } struct fat16_fs_struct* fs = fat16_open(partition); if(!fs) { uart_puts_p(PSTR("opening filesystem failed\n")); } else { uart_puts_p(PSTR("opening filesystem OK\n")); } /* open root directory */ struct fat16_dir_entry_struct directory;
-
Thread
"0" in vorschieben wenn nur einstellig.
mail_auth_str)+1); memcpy_P(ð_buffer[TCP_DATA_START_VAR+strlen(mail_auth_str)],PSTR("\r\n"),2); [/c] ist einfach nur grober Unfug.
> sprintf_P( &mail_buffer[z], PSTR("\r\n\r\nDämmerung: %02i:%02i:%02i"), > (int)iDaemmerung_hh),(int)iDaemmerung_mm),(int) > iDaemmerung_ss ); was soll eigentlich diese int casterrei? http://www.gnu.org/software/libc
-
Thread
TWI AVR Problem bei Arbitrierung Multimaster Betrieb
= 1; //lcd_gotoxy(0,40); //lcd_writestringP(PSTR(" ")); TWDR = 0x06; //Adresse 3 _ write 0 TWCR = (1<<TWINT) | (1<<TWEN)| (1<<TWIE); //lcd_gotoxy(0,40); //lcd_writestringP(PSTR("Start gesendet"));
0x68: lcd_gotoxy(0,20); lcd_writestringP(PSTR("Aribitration lost")); break; case 0x78: lcd_gotoxy(0,20); lcd_writestringP(PSTR("Aribitration lost")); break; case 0xB0: lcd_gotoxy(
-
Thread
#define Fehler
STM32 hat/braucht kein PROGMEM. Du kannst da das PSTR vermutlich einfach so definieren: #define PSTR(s) (s) Außerdem ist __c ein für die Standard Library reservierter Bezeichner, de darfst du in deinem Code nicht verwenden. Hoffentlich hast du den
PSTR sieht für den STM wie folgt aus: [c] #define PSTR(s) ((const char *)(s)) [/c] Wie schon richtig angemerkt kennt der ARM kein Progmem. Demenstprechend muss man ggf. auch PROGMEM wegdefinen.
-
Thread
expected initializer before progmem - Problem
Header. Das ganze sieht jetzt so aus: cpp-Datei: const struct menu myMENU[] PROGMEM = { {PSTR("Test1"), &SetMenu, test1}, {PSTR("Test2"), &bar, NULL}, {PSTR("Test3"), &foobar, NULL}, {PSTR("zurück?"), NULL, NULL}, {PSTR(""), NULL, NULL} }; Prototyp
Pkt1: PSTR(...) ist als Typecast definiert, darf aber nicht zur Initialisierung von PROGMEM Elementen verwendet werden.
-
Thread
Nur Teile eines struct in den Flash
einfach dann um den String von Florian noch ein PSTR drumherum und schon ist es im Flash... geht doch ganz einfach ;-)
const char* blub; } test; test testvariable = { 0xff, PSTR("String1") }; [/C] ../Forum9.c:12: error: braced-group within expression allowed only inside a function Wenn ich mir das PSTR Makro ansehe [C] # define PSTR(s) (__extension__({static char
-
Thread
Struct mit String im Flash Zugriff
jedoch, dass z.B. die Lib-Funktionen alle /ohne/ AS-Qualifier geschrieben sind und Literale wie in PSTR keine AS-Qualifier haben (dürfen). Daher gibt es auch kein AS-Äquivalent zu PSTR. Somit ist es kaum möglich, Code zu schreiben, der AS verwenden und diese Warnung /nicht/ produziert. Grund ist
gegriffen haben, dass es darauf nun auch nicht mehr ankommt. ;-) >> Dass es kein Äquivalent zu PSTR() gibt, ist allerdings in der Tat >> schade. > > hmmm, folgendes scheint zu gehen, ganz analog zu PSTR: Danke!
-
Thread
konstante Menustruktur im FLASH ablegen
return(MM_EXIT); } uint16_t menuMain(void) { asm("nop"); menuCap_t mcMain = PSTR("Hauptmenü"); menuCap_t mcPlay = PSTR("Drum spielen"); menuCap_t mcMetro = PSTR("Metronom einstellen"); menuCap_t mcInstr = PSTR("Instrumente einstellen"); menuCap_t mcKonf = PSTR
] const menuDef_t mmMain PROGMEM = {mcMain, {RED, WHITE, BLUE, BLACK}, {{PSTR( "Drum spielen"), functionPlay}, {PSTR( "Metronom einstellen"), menuMetronom}, {PSTR( "Instrumente einstellen"), menuInstrumente}
-
Thread
sprintf bringt nach Compilierung im Relaese Mode nur "?" als Wert
eeName, sizeof(eeName)); // LiIon Voltage if(Flags116 & FMLiIon_alarm) { strcat_P(Text,PSTR("-> ")); } sprintf(U_array_fl[LiIon],"%4.2f",((double)mVLiIon/1000)); strcat_P(Text,PSTR("Backup battery: ")); strcat(Text,U_array_fl[LiIon]); strcat_P(Text,PSTR("V\n")); // Main Battery Voltage if(Flags116 & FMmb_alarm) { strcat_P(Text,PSTR("-> ")); } strcat_P(Text,PSTR("Main battery: ")); sprintf(U_array_fl[Akku],"%5.1f",((double)MainBatValue/1000)); strcat(Text,U_array_fl[Akku]); strcat_P(Text,PSTR("V\n")); SMS_Send
-
Thread
putchar funktion soll auf Progmem umgebaut werden
Die sache ist das PSTR() es nicht im RAM ablegt, somit geht wenn ich das richtig verstanden habe auch kein pointer auf den RAM.. und da liegt mein Problem, ich brauche irgendwie die Möglichkeit die Funktion auch mit PSTR
Sowas? [code]void uart_usb_send_buffer_P (const char *pstr) { size_t len = strlen_P (pstr); char str[len]; strcpy_P (str, pstr); uart_usb_send_buffer (str, len); }[/code]
-
Thread
C++ char members in Progmem?
sollte ja das klappen: const __flash char* _label; public: Item(const char* label) : _label(PSTR(label)) { } }; [/c]
das klappen: > const __flash char* _label; > > public: > Item(const char* label) : _label(PSTR(label)) > { > } > }; Auf einem AVR wird das aber so nicht wirklich was. Das PSTR Makro wird vom Aufrufer benutzt um den String ins Flash zu verlagern. Deine Klasse hat einen ganz banalen Pointer
-
Thread
STM32: Suche Hilfe zu ADC
ADC-Routinen (Multiplex und Interrupt-Aufruf) */ void edm_test_adc(void) { printf_P(PSTR("\fTest EDM-ADC \n" "Beenden durch Knopfdruck\a")); edm_adc_init(); printf_P(PSTR("Init OK\n\a")); edm_adc_start(); printf_P(PSTR("Start OK\n\a")); while(!key_getstroke()
ADC1ConvertedValues[7], ADC1ConvertedValues[8],ADC1ConvertedValues[9]); printf_P(PSTR("|%4u,%u|"),gl_a,gl_b); printf_P(PSTR("\n\a")); } } [/c] Warum steht in "gl_a" 19? Nirgendwo wird hineingeschrieben, die Variable kommt in keiner anderen Datei vor und globale Variablen werden
-
Thread
LCD Ansteuerung Atmel ATxmeag 128 A3
> #define PROGMEM __ATTR_PROGMEM__ #define PSTR (s) ((const PROGMEM char*)(s)) // Snippet 3 // display "Hello World" on LCD first line lcd_line_one(); lcd_write_string_p(PSTR("Hello World\0")); // message from flash space //////////
// Snippet 3 // display "Hello World" on LCD first line lcd_line_one(); lcd_write_string_p(PSTR("Hello World\0")); / message from flash space Quelle: http://blog.frankvh.com/2010/10/18/atmel-xmega-hd44780-lcd-support/ Meine Einbindung (vielleicht auch falsch): #define PSTR (s)
-
Thread
LCD Display, komische Ausgabe.
mir trotzdem jemand kurz erklären wie das mit lcd_string funktioniert und was es mit der funktion PSTR() auf sich hat??
lcd_string_P("Scheinleistung "); funktioniert daher auch, und ist das gleiche wie lcd_string(PSTR("Scheinleistung "));
-
Thread
Array-Speicher nach LCD-Ausgabe wieder freigeben
dass es einen Pointer ins Flash erwartet, muss es an dieser Stelle heißen [C] DOG_writetext( PSTR("Start: kurz dr."), 1, 0 ); [/C] Dann verfrachtet der Compiler den Text auch ins Flash und er belegt KEINEN Platz mehr im SRAM dafür. Man muss also wissen, welchen Pointer eine FUnktion jeweils
sendbyte( c ); } } ... // Strings aus dem Flash heraus ausgeben DOG_writetext_p( PSTR("*BOS08E-Konfig.*"), 0, 0 ); DOG_writetext_p( PSTR("Start: kurz dr."), 1, 0 ); DOG_writetext_p( PSTR("Konfig: lang dr."), 2, 0 ); // Strings aus dem SRAM heraus ausgeben DOG_writetext
-
Thread
PSTR - Problem
date",4)==0) { ... } funktioniert problemlos aber wenn man es ändert zu if(strncmp(command,PSTR("time"),4)==0) { ... } else if(strncmp(command,PSTR("date"),4)==0) { ... } wird es zwar anstandslos kompiliert, jedoch funktioniert der Vergleich nicht mehr, es wird immer nur die Zeit verändert
Nein, nur die AVR-LibC Doku nicht gelesen. Überall ein _P dranhängen... strncmp_P(command,PSTR("date"),4);
-
Thread
STM32F4 printf für float implementieren
char, if you want to use printf(), * you need implement this function * * @param pStr Storage string. * @param c Character to write. */ void PrintChar(char c) { if (c == '\n') { while (!(USART1->SR & 0x0080)); USART1->DR = 0x0D; } while (!(USART1
* * @param pStr Storage string. * @param pSource Source string. * @return The size of the written */ signed int PutString(char *pStr, const char *pSource) { signed int num = 0; while (*pSource
-
Thread
MMC Lib vom Holger Klabunde
SetBacklightIntensity(255); // Backlight brightness 100% FillScreen_BrushColor(); DisplayText_F(70, 120, PSTR("xv-display.de")); DisplayText_F(65, 140, PSTR("Display Module")); SetFont(0); DisplayText_F(15, 160, PSTR("Demonstration of Instruction Set")); SetFont(1); _delay_ms(5000);
Demo_UserMemory(); DrawRect_BrushColorFill(0, 0, 239, 319); DisplayText_F(5, 5, PSTR("Repeating Demonstration ...")); _delay_ms(2000); */ } return 0; } [/c]
-
Thread
PROGMEM Problem
besser ein C-Buch, nämlich dein ganz persönliches C-Buch zu Rate ziehen > const char *linetwo = PSTR(a); > Du kannst hier nicht PSTR benutzen. PSTR ist ein Makro, welches einen konstanten Text während des Compilierens ins Flash verschiebt und einen Pointer darauf liefert. Du hast hier keinen konstanten Text! Die Verschiebung, und damit die Anwendung des PSTR muss bereits der Aufrufer der Funktion machen. Derjenige, der die Stringkonstante hat, muss sie mittels PSTR ins Flash verlagern. D.h. der Aufrufer der Funktion gibt dir bereits den korrekten Pointer
-
Thread
Nach Aufteilung Code um 6KB größer
{ lcd_draw_bmp(Achtung); lcd_set_cursor(30,LINE0+1); lcd_puts_p(normal,PSTR("Batteriespannung:")); lcd_set_cursor(46,LINE2+1); lcd_puts_p(normal,PSTR("niedrig !")); } if(result > BattMax) { lcd_draw_bmp(Achtung); lcd_set_cursor(30,LINE0+1); lcd_puts_p(normal,PSTR("Batteriespannung:")); lcd_set_cursor(42,LINE2+1); lcd_puts_p(normal,PSTR("zu hoch !")); } if(result >= BattMin && result <= BattMax) { lcd_set_cursor(22
-
Thread
String splitten (Programmiersprache: C)
cmd_switch(void) { char cmd = uart_string[0]; switch(cmd) { case 'm': uart_puts_p(PSTR("MOTOR\r\n")); break; case 'l': uart_puts_p(PSTR("LEDS\r\n")); break; case 's': uart_puts_p(PSTR("SPEED\r\n")); break; case 'u': uart_puts_p(PSTR("UEBERSICHT")); break; default: uart_puts_p(PSTR("ERROR\r\n")); memset(uart_string, 0, UART_MAXSTRLEN); } }[/c]
-
Thread
SRAM voll, RAM fast leer, printf und Array
Debug-Strings müssen nicht ins RAM. Mit printf_P(PSTR("Hallo")); landen sie nur im ROM. Und mit [c] #if DEBUG #include <stdio.h> #define PRINTF(s, ...) do{ static char __s[] PROGMEM = (s); \ printf_P(__s, ## __VA_ARGS__); }while(0
verwende ich immer folgendes Macro: [c] #ifdef DEBUG #define DbgPrintf(format, ...) printf_P(PSTR(format), ##__VA_ARGS__) #else #define DbgPrintf(format, ...) #endif [/c]
-
Thread
Flash Speicher sparen
Namen. Aber was uart_puts_p angeht: Die Strings müssen zum Parameter passend in ROM gelegt werden. PSTR("xxx") statt "xxx" könnte notwendig sein. Manchmal gibt es Versionen _p ohne und _P mit automatischem PSTR. Doku lesen.
Probiers mal so: #define uart_puts_P(s) uart_puts_p(PSTR(s)) (diesmal wars daneben geklickt...)
-
Thread
Elm-Chans FFT-Routinen verstehen?
0b00000010; /* PE1:<conout>, PE0:<conin> in N81 38.4kbps */ TCCR1B = 3; /* clk/64 */ xmitstr(PSTR("\r\nFFT sample program\r\n")); for(;;) { xmitstr(PSTR("\r\n>")); /* Prompt */ rcvrstr(pool, sizeof(pool)); /* Console input */ cp = pool; switch (*cp++) { /* Pick
default : /* Unknown command */ xmitstr(PSTR("\n???")); } } } [/c]
-
Thread
Langes Programm: Fehlfunktion AVR ATmega32
> Ich habe folgendes Idiom verwendet: > > [pre] > printf( strcpy_P( (char *) &acBuffer[0], PSTR( "Hello !" ))); > [/pre] Häh!? Vielleicht beschreibst du ja mal, was du tun willst... Du suchst nicht etwa einfach nur [c] printf_P(PSTR("Hello!")); [/c] oder?
Ich habe folgendes Idiom verwendet: >> >> [pre] >> printf( strcpy_P( (char *) &acBuffer[0], PSTR( "Hello !" ))); >> [/pre] > > Häh!? ;-) Hallo Jörg! > > Vielleicht beschreibst du ja mal, was du tun willst... > > Du suchst nicht etwa einfach nur > > [c] > printf_P(PSTR("Hello!")
-
Thread
AtMega168 zu wenig RAM ?
Compiler. Hat da zufällig jemand einen Workaround für mich bei der ich die praktisch einfache PSTR Routine beibehalten kann ?
-1.6.1) I've done some checking and found a solution, or work around, I'm not sure which one. PSTR is defined as (pgmspace.h): Code: # define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];})) If I change the definition to Code: # define PSTR(s) (__extension__({static
-
Thread
AVR, memcmp
11) != 0) && (dir.Name[0] != 0x00) ) { getDirEntry(0, c++, &dir, 1); uart_puts(PSTR("\n\ngetDataDir: ")); uart_puts_R(dir.Name); } uart_puts(PSTR("\n\nGefundene DataDir: ")); uart_puts_R(dir.Name); c--; if(dir.Name[0] != 0x00) return(dir.FirstClusterLO
folgendes: In der while Schleife: [C] ... getDirEntry(0, c++, &dir, 1); uart_puts(PSTR("\n\ngetDataDir: \"")); uart_puts_R(dir.Name); uart_puts(PSTR("\"")); } [/C] Und dann zählst du in der Ausgabe mal wieviele Leerzeichen hinter dem in dir.Name enthaltenem String
-
Thread
Suche ein 28 Pin Mikrocontroller mit mehr als 32 kBit Flash Speicher
32k Flash benötigt? > Riesige Lookup-Tabellen? Nein. Aber viele Display Nachrichten. Die mit PSTR in denn Flash kopiert werden.
Jan H. schrieb im Beitrag #4634771: > Nein. Aber viele Display Nachrichten. Die mit PSTR in denn Flash kopiert > werden. Falls viele Nachrichten sich nur in Parametern unterscheiden, kann man diese als Variablen übergeben. Oder Du schließt noch nen 24C512 an.
-
Thread
printf_P aus Flash funktioniert scheinbar nicht
Nachtrag: printf_P(PSTR("Hallo !"));
[c] #define myprintf(fmt, ...) printf_P(PSTR(fmt), ##__VA_ARGS__) [/c]
-
Thread
[AVR] __flash conversion warning
printf_P und printf angeguckt. Kam da jetzt aber nicht wirklich weiter. Allerdings habe ich mir dann mal PSTR genauer angesehen. Letzendlich will ich mein Zeugs ja in den Flash schreiben. Aber nicht mehr über PSTR und dem PROGMEM sondern über __flash. Über https://www.mikrocontroller.net/topic/382907 und PSTR bin ich jetzt auf folgendes hinaus: [code] #define XSTR(X) ({static const __flash char __s[] = (X); &__s[0];}) [/code]
-
Thread
LCD 0 anzeigen uint16_t
X Wert schreiben lcd_gotoxy(32,60); // Auf LCD Position springen lcd_writestringP(PSTR(": Y Wert")); // String dahinter schreiben } } [/c] Ich hoffe das hilft weiter. Den Fehler habe Ich immer noch nicht gefunden :/ Mfg Elias
(32,60); // Auf LCD Position springen lcd_writestringP(PSTR(": Y Wert")); // String dahinter schreiben } [/C] Und noch eine Anmerkung: Schau dir deine Kommentare noch einmal an. Und dann beantworte mal die Frage: Was erzählt mir eigentlich der Kommentar
-
Thread
Hat hier schon mal jemand einen WinXP-Treiber nach Win7/64 konvertiert?
"\""); strcat(text, ++name_ptr); strcat(text, "\", on "); if(win_merker==1) strcat_P(text, PSTR("win7")); if(win_merker==-1) strcat_P(text, PSTR("raspian")); if(!win_merker) strcat_P(text, PSTR("OS ???")); /* } // if(strlen_P(MainName)) else strcpy_P(text, PSTR("MainName einbinden
"\""); strcat(text, ++name_ptr); strcat(text, "\", on "); if(win_merker==1) strcat_P(text, PSTR("win7")); if(win_merker==-1) strcat_P(text, PSTR("raspian")); if(!win_merker) strcat_P(text, PSTR("OS ???")); /* } // if(strlen_P(MainName)) else strcpy_P(text, PSTR("MainName einbinden
-
Thread
AVR PROGMEM Spezifikt im Quellkode ersetzen
Hi, Alf, schaut auf den ersten Blick gut aus. Lediglich hier > #define PSTR(s) s stolpere ich, ob es nicht *s heissen sollte? Der eine uP trennt Datenspeicher von Programmspeicher und nutzt sie gleichzheitig, der andere packt alles ins SDRAM. Ciao Wolfgang Horn
#2352931: > Hi, Alf, > > schaut auf den ersten Blick gut aus. > > Lediglich hier >> #define PSTR(s) s > stolpere ich, ob es nicht *s heissen sollte? Müsste schon stimmen. Die typische Verwendung von PSTR ist ja lcd_puts( PSTR("Hallo World") ); wobei der PSTR dafür sorgt, dass der
-
Thread
AVR-GCC: PSTR(__func__)
ich habe gerade mal wieder ein Verständnisproblem mit den Flash-Makros: [c] fprintf_P(stderr,PSTR("hallo")); // geht fprintf_P(stderr,PSTR(__func__)); // geht nicht fprintf_P(stderr,PSTR(__DATE__)); // geht fprintf_P(stderr,PSTR(__LINE__)); // geht nicht (da Integer) [/c] Was ist am Makro __func__ so besonderes, daß es im Zusammenhang mit "PSTR" nicht funktioniert? Viele Grüße W.T.
-
Thread
Fehler bei snprintf_P(.) Arduino ESP8266
Debug Meldungen generieren: [c] void setRelay(uint8_t power) { snprintf_P(log, sizeof(log), PSTR("Test")); addLog(LOG_LEVEL_INFO, log); snprintf_P(log, sizeof(log), PSTR("Power: %d"), power); addLog(LOG_LEVEL_INFO, log); . . . [/c] Obwohl die Syntax vielfach, auch unter der Verwendung
(log, sizeof(log), PSTR("Test")); ^ sonoff:752: error: cannot convert 'double (*)(double)' to 'const char*' for argument '2' to 'void addLog(byte, const char*)' addLog
-
Thread
AVRGCC nach Keil C166
auch einfach irgendwo im Header folgendes machen, dann musst du im Code nichts ändern: #define PSTR #define PROGMEM
"*" macht kein Cast, sondern eine Dereferenzierung. In deiner Anwendung kannst du einfach das PSTR weglassen bzw. [code]#define PSTR(S) S[/code]
-
Thread
was bewirkt "usart_write_P(PSTR(format) , ## args"
schrieb im Beitrag #3671081: > in usart.h: > #define usart_write(format, args...) usart_write_P(PSTR(format) , ## > args) Wichtig ist dabei, daß nach ## /kein/ Zeilenumbruch erfolgt, also [c] #define usart_write(format, args...) usart_write_P(PSTR(format) , ##args) [/c] Eine weitere
Der Übersichtlichkeit wegen ohne expandiertes PSTR Makro.
-
Thread
Library für BME280
Graphik-LCD und für SPI-LCD, oder auch für SPI-farb-TFT. Ich brauche nur statt [c]lcd_intern_string_P(PSTR("Ich bin Maxim!")); [/c] [c]graph_128x64_string_P(PSTR("Ich bin Maxim!")); [/c]oder [c]tft9341_string_P(PSTR("Ich bin Maxim!")); [/c] [c]i2c_lcd_string_P(PSTR("Ich bin Maxim!")); [/c] zu schreiben
-
Thread
Pointer im Flash auf String im Flash
[C] char* foo_flash[] PROGMEM = { PSTR( "Menu1" ), PSTR( "Menu2" ) }; [/C] müste auch gehen, bin mir aber nicht 100% sicher Kennst du: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher
Karl heinz Buchegger schrieb: > [C] > char* foo_flash[] PROGMEM = { PSTR( "Menu1" ), > PSTR( "Menu2" ) }; > [/C] > > müste auch gehen, bin mir aber nicht 100% sicher Nein, das PSTR-Makro funktioniert nicht in Initialisierungslisten.
-
Thread
Data-Memorie is voll - In den Program-Memorie verschiebbar?!
[c] printf_P(PSTR("Text im Flash! Variablen gehen auch: %d"), value); [/c]
Lothar Miller schrieb im Beitrag #1770065: > printf_P(PSTR(" die variante mit dem großen P ist normalerweise ein Makro, dass das PSTR selbst macht. also entweder printf_P("text") oder printf_p(PSTR("text"))
-
Thread
Stack-Überlauf durch externe Variable?
Mit bisschen Geschick kannst du das einfacher schreiben als: [c] send_string_uart0_P(PSTR("Press any key to continue")); [/c] Der _P-Suffix ist dabei die übliche Kennzeichnung dafür, dass die Funktion einen progmem-String bekommt. Die Funktion ist dabei selbst dafür verantwortlich, die Daten aus dem Progmem zu ziehen (letztlich mittels LPM-Anweisungen). Der PSTR-Makro ist ein wenig Magie, die den String in den Progmem legt und dessen Adresse gleich zurückgibt. Der String selbst bildet dabei sowas wie eine anonyme Array-Variable.
-
Thread
Funktion wird nicht ausgeführt mit Ausgabe auf LCD
Kleiner Korrekturvorschlag: lcd_puts_P( PSTR("String") ); http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html#ga05ca900ebf7cd121be73c654d9ccb3eb
Krapao schrieb im Beitrag #2719316: > Kleiner Korrekturvorschlag: > lcd_puts_P( PSTR("String") ); > http://www.nongnu.org/avr-libc/user-manual/group__... Hast bestimmt recht, allerdings läufts bei mir auch ohne PSTR ausm Flash. Keine Ahnung warum, habe Peter Fleury aber auch erst
-
Thread
XMega DMA transfers zu UART
); return len; } int main(void) { DMA_Enable(); uart_dma_init(); DBG(PSTR("test\n")); DBG(PSTR("test1\n")); DBG(PSTR("test-test-test\n")); while(1); } [/c] lg, stef
(new_data_len>maxlen) len=maxlen; else len=new_data_len; //printf_P(PSTR("DMA_CH0_vect: starting transfer (%i of %i)\n"), len, tx_ringbuf.new_data_len); // set source address src_addr = ((uint16_t)tx_ringbuf.buf) + read_index; DMA_TX_CHANNEL.SRCADDR0 =
-
Thread
AVR Webserver 3C5x9 I/O-Adresse
erst mal weitere fehler geben. Bei mir hört es früher schon auf und zwar hier: printf_P(PSTR("Phase 3\n")); // Erst mal warten, nic initialisiert sich delay(100); printf_P(PSTR("Phase 4\n")); // Aktivierungssequenz schicken activate_3c5x9_nic(); printf_P(PSTR("Phase 5\n")); // read the mac address of this card from eeprom address 10,11, and 12 st = readLoop(10); printf_P(PSTR("node %02X-"),st); // Every nic i have seen has "00" in the
-
Thread
Webserver ATmega32/644DIP ENC28J60
],"LED1=1\0")!=0){PORTA ^= (1<<PA0);} ersetzen durch if{ strcasestr_P((char*)ð_buffer[a],PSTR("LED1=1"))!=0){PORTA ^= (1<<PA0);} Und memmove(&var_conversion_buffer, "EIN\0", 4); ersetzen durch strcpy_P(var_conversion_buffer, PSTR("EIN")); Gruß holger
habe das Servo nur zum Test ganz Primitiv eingebunden: [c]if(strcasestr_P((char*)ð_buffer[a],PSTR("LED3=3"))!=0){tmp |=(1<<PA2);} if(strcasestr_P((char*)ð_buffer[a],PSTR("LED4=4"))!=0){tmp |=(1<<PA3);} if(strcasestr_P((char*)ð_buffer[a],PSTR("LED5=5"))!=0){tmp |=(1<<PA4
-
Thread
PSTR und SRAM-Speicher
hat. Kann also irgendwie nicht sein? Hat jemand eine bessere Idee? Jetzt möchte ich außerdem mit PSTR() einen Großteil der (String-)Meldungen in den Flash auslagern. Die meisten Meldungen sehen aber aus wie USART_TransmitStr("depp."); Dazu will ich mir eine USART_TransmitStr_P(PSTR("depp.")); schreiben