-
Thread
Strings mit AVR - aber richtig
strcpy (str, gut); strcpy (nstr, ngut); } void get_f_str (char *str, char *nstr, char* pstr) { strcpy_P (str, (const char*) f_gut); strcpy_P (nstr, (const char*) f_ngut); strcpy_P (pstr, p_gut); } int main(){} [/code] *Ausgabe von nm:* [code] 0000002c T f_gut 00000026
-
Thread
Wiefiel Platz ist in einem AVR Mega16?
..... if(Flags & DebugFlag){ // Schleife für Debugging durch Flag aktivieren uart_puts_p( PSTR("neuer String empfangen") ); ... // Variablenwert ausgeben } [/C] und der Text "neuer String empfangen" belegt dir keinen Speicher im SRAM mehr. richtig schön wird das dann noch mit einem Makro [C] #define uart_puts_P(s) uart_puts_p(PSTR(s)) [/C] denn dann brauchst du nur noch in [C] uart_puts( "neuer String empfangen" ); [/C] den Funktionsaufruf ändern zu [C] uart_puts_P( "neuer String empfangen" ); [/C] und der String
-
Thread
AVR variablen gültigkeit & zugriff
restTime(); //now we can display the rest Time lcd_write_int16(rstTimeHour); lcd_write_string(PSTR(":")); lcd_write_int16(rstTimeMin); lcd_write_string(PSTR(":")); lcd_write_int16(rstTimeSek); }//end of void displayRestTime() //- - - - - - - - - - - - - - - - - - - - - -
-
Thread
string Konstanten mit fprintf ausgeben
auch direkt im Flash anlegt. Beispiel. [c] void fun(const char* str); void fun_p(const char* pstr); #define fun_P(x) fun_p(PSTR(x)) const char PROGMEM str1[]="hallo"; // erzeugt Flashkonstante fun("hallo"); // legt Kosntante im Datensegment (+flash) an fun_p(str1); // benutzt flashkonstanten
-
Thread
ATmega8, UART: UDR mehrmals auslesen?
hintereinander mehrmals auslese. if(bit_is_set(UCSRA, RXC)) { if(UDR == 'o') { uart_puts_pgm(PSTR("O\n")); } if(UDR == 'l') { uart_puts_pgm(PSTR("L\n")); } } Wenn ich ein o sende erhalte ich sofort O als Rückmeldung, wie erwartet. Wenn ich allerdings ein l sende passiert was
-
Thread
PORT-PINS als Jumper AVR (Ethernut 2)
PB0 PORTB &= ~(_BV(1)); // set Pin PB1 to low /*...*/ if(bit_is_set(PINB,0)) { fputs_P(PSTR("HIGH"),stream); } else { fputs_P(PSTR("LOW"),stream); } /*...*/
-
Thread
Variable auf LCD ausgeben
geht nicht: ks0108Puts_P(PSTR( Buffer2 )); da kommt ks0108Test.c:76: error: invalid initializer
Klar. PSTR liefert einen Pointer auf einen konstanten String im FLASH. Ich sehe in deinem geposteten Code die Definition buffer2 nicht. Aber ich könnte wetten, dass zu 99,9999% buffer2 kein Pointer auf einen
-
Thread
-
Thread
frage zu sizeof() in c
builtin_constant_p (x) ? !strcmp_P(id,x) : !strcmp(id,x)) \ ) #define match(x) match_(PSTR(#x)) #define Match(x) if(0); match(x) Hier werden Ausschnitte aus dem String als byte oder eventuall auch als word/dword (optimiert, nicht hier) verglichen. Wenn es jetzt einen Error geben würde
) wird in ein if(0); else if(id[0]=='e'&&id[2]=='a'&&6==len&&id[len-2]=='l'&&!strcmp_P(id,PSTR("enable"))) umgewandelt. Das ist dann ziemlich optimiert, auch wenn es 200 Vergleiche sind. wird hingegen match_(foo) verwendet wo foo ein char* ist, dann wird if(0); else if(id[0]==foo
-
Thread
2 Dateien gleichzeitig öffnen (Roland Riegel LIB)
struct fat16_file_struct* fd1 = open_file_in_dir(fs, dd, "temp.txt"); if(!fd1) { uart_puts_p(PSTR("error opening1 ")); } //search file in current directory and open it struct fat16_file_struct* fd2 = open_file_in_dir(fs, dd, "temp2.txt"); if(!fd2) { uart_puts_p(PSTR("error opening2 "))
-
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
Liste von Zeigern auf Strings im Flash
Wie würdet ihr das Problem lösen? Mit dreimal P... : PGM_P padressen[][10] PROGMEM = { PSTR("Broadcast"), PSTR("Zimmer 1") }; Oliver
-
Thread
Atmel SAM25W I2C und WIFI
switch (u8MsgType) { case M2M_WIFI_RESP_CON_STATE_CHANGED: { tstrM2mWifiStateChanged *pstrWifiState = (tstrM2mWifiStateChanged *)pvMsg; if (pstrWifiState->u8CurrState == M2M_WIFI_CONNECTED) { } else if (pstrWifiState->u8CurrState == M2M_WIFI_DISCONNECTED) { printf
-
Thread
3310 Software will nicht char* nehmen
LcdImage(waitImage); //Bild LcdGotoXYFont(1,6); //Zeile LcdFStr(FONT_1X,(unsigned char*)PSTR("MPC Startet...")); //Startet LcdUpdate();// Auf Display _delay_ms(1000); LcdClear(); //Bildschirm räumen LcdUpdate();// Auf Display LcdGotoXYFont(1,1); //Zeile LcdFStr(FONT
[c] LcdFStr(FONT_1X,(unsigned char*)PSTR("MPC Startet...")); //Startet [/c] und kurz danach ... [c] LcdFStr(FONT_1X,(unsigned char*)Text); [/c] wobei „Text“ eine (falsch deklarierte, aber jedenfalls) Variable im SRAM ist. Also wird
-
Thread
sketch stört webserver - wer kann helfen?
ist mir noch aufgefallen, dass du viele relativ grosse Zeichenketten im RAM hast. Benutze PROGMEM, PSTR() und F() damit die Strings nur im Flash Speicher liegen, nicht im RAM. https://arduino-esp8266.readthedocs.io/en/latest/PROGMEM.html
mir noch aufgefallen, dass du viele relativ grosse > Zeichenketten im RAM hast. Benutze PROGMEM, PSTR() und F() damit die > Strings nur im Flash Speicher liegen, nicht im RAM. > https://arduino-esp8266.readthedocs.io/en/latest/PROGMEM.html Das sollte beim ESP32 doch eigentlich egal sein, da dieser
-
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
ENC28J60 myEthernet mit NeMo Stack Probleme
if(ind != 255) { if(debugLevel & DEBUGLVL_STACK_TCP_ERROR) { usart_send_line_P(PSTR("tcpOpen: conn already exists")); } return ind; } // Suche nach freiem Eintrag in TCP-Verbindungsliste ind = tcpGetFreeConnEntry(); // Kein freier Eintrag mehr vorhanden if(ind == 255) { if(debugLevel & DEBUGLVL_STACK_TCP_ERROR) { usart_send_line_P(PSTR("tcpOpen: connList full")); } return 255; } else { // MAC-Adresse zu IP-Adresse ermitteln mac = arpGetMac(ipAddr); tcpConnList[ind].handler = handler; tcpConnList
-
Thread
Debug-Funktionen wegdefinieren
> oder bei AVR für Text im ROM Oder [c] #if DEBUG # define trace(s,...) printf_P (PSTR(s) , ##z) #else # define trace(...) (void) 0 #endif [/c] Um Warnungen etc zu vermeiden bei [c] if (x) trace (a, b); else ... [/c] Die Leerzeichen um
Johann L. wrote: > # define trace(s,...) printf_P (PSTR(s) , ##z) Lag nahe, funktioniert(e) aber bei C++ nicht. Daher die andere Version.
-
Thread
Fallende Flanke von Variable nach MC neustart
dann vor der Routine eingefügt, [c] if (MC_hochgefahren && R_TRIG(!licht_status[9])) {DimmenAus (PSTR("89|11|02|00\r"),PSTR("98|11|02|00\n\r"),9);} [/c] Trozdem wird die "Iffe" nach 5 Sek einmal Wahr. Ich habe da irgendeinen Denkfehler, kann mir dort bitte jemand helfen? Danke!
-
Thread
ATXMega128A1: 32-bit quadrature decoder mit compare match ?
printf_P(PSTR("up OV: %i\n"), TCC0.CNT); // send an increment event, see Table 6-2 EVSYS.DATA |= (1<<1); EVSYS.STROBE |= (1<<1); } } // otherwise we're counting down else { if (TCC0.CNT>0) { printf_P(PSTR("dn OV: %i\n"), TCC0.CNT); // send a decrement event EVSYS.DATA &= ~(1<<1); EVSYS.STROBE |= (1<<1); } } } [/c]
-
Thread
Fehlerhafte Adressierung von lokalen Arrays bei tinyAVR(R) 0-series
--------------------------------------------------- */ #define puts_rom(str) (uart_puts_rom(PSTR(str))) void uart_puts_rom(const uint8_t *dataPtr) { uint8_t c; for (c=pgm_read_byte(dataPtr); c; ++dataPtr, c=pgm_read_byte(dataPtr)) uart_putchar(c); } /* -----------------------
*********************************************************/ #define putString_P(__s) puts_p(PSTR(__s)) void puts_p(const char *progmem_s ) { volatile char c {0}; while ( (c = pgm_read_byte(progmem_s++)) ) putChar(c); } [/c]
-
Thread
AVR String-Array
Hi, schon mal mit "PSTR()" im Array versucht? Hab gerade keine Möglichkeit dies zu testen, aber da es beim printf auch so geht sollte es möglich sein. Stephan
übersichtlicher und schnell erweiterbar. @Stephan dies funktioniert leider nicht, da [c] # define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];})) [/c] aus 2 Codezeilen besteht, welche natürlich nicht im Array verwendet werden können. Wahrscheinlich wirds drauf hinaußlaufen,
-
Thread
AVR-GCC: const __flash struct mydata_t *[4]
kleines Mock-up gemacht: [c] // Struct und seine Inhalte void dummyfkt(void) { glcd_putstr_P(PSTR("Ich schreibe also bin ich")); glcd_drawnow(); } int16_t dummyvar = 0; const __flash char TEXT1[] = "Hallo"; const __flash char TEXTN[] = {'\0'}; typedef struct { const __flash
}; // Test void test(const __flash mydata_t *(data[])) { snprintf_P(glstr_Buf,N_TEXTBUF,PSTR("hallo")); glcd_putstr(glstr_Buf); glcd_drawnow(); voidFcn_t fkt; fkt = data[1]->fktpointer; fkt(); // Geht schief snprintf_P(glstr_Buf,N_TEXTBUF,&(data[1]->text)); // Geht auch
-
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
LCD Userinterface
Diese vielen konstanten String brauchen so doppelt Speicher, im Flash und im RAM. Mit der Funktion PSTR() un eine kleine Anpassung von lcd_puts() kann man die konstanten Strings in den Flash verschieben, siehe Doku der libc zum Themas sprintf(). > lcd_gotoxy(0,1); > lcd_puts(">"); >
Diese vielen konstanten String brauchen so doppelt Speicher, im Flash > und im RAM. Mit der Funktion PSTR() un eine kleine Anpassung von > lcd_puts() kann man die konstanten Strings in den Flash verschieben, > siehe Doku der libc zum Themas sprintf(). Stimmt, daran hatte ich garnicht gedacht. Danke
-
Thread
Sonderzeichen LCD HD44780 kompatibel
So, nun zum Generieren anonymer Zeichenketten im Flash. Ein Blick in <avr/pgmspace.h>, Makro *PSTR*, zeigt wie es geht: #define P00(s) (__extension__({static const PROGMEM hd44780::a00::str<sizeof L##s/2> c(L##s); c.a;})) Es ist tatsächlich ein weiteres Makro erforderlich. A00 und P00 können
nicht zusammengelegt werden. Der Typecast-Operator ist dazu überflüssig. Die Anwendung ist wie bei PSTR: lcd_puts_P(P00("Test ÄÖÜäöüß °C kΩ")); Das erscheint erst mal komfortabel genug. Lästig ist, dass man beim AVR immer die beiden Adressräume, RAM und Flash, im Hinterkopf behalten muss.
-
Thread
Probleme bei der Ansteuerung MAX7219 mit 8x8 Dot Matrix
display.stopTransfer(); sendMessage_p ( ADDR_BROADCAST, rx.myAddress, PSTR ( "led" ) ); uartPuts ( uint8ToAh ( ( char* ) buffer, displayData ) ); uartPuts_p ( PSTR ( "\r" ) ); uartWaitTXEmpty(); [/code] Besten Dank shcon mal für die Bemühungen.
-
Thread
AVR, Heap - Variablen jenseits RAM-Grenze?
counter = 0; uint8_t buf[60]; [... versch. Initialisierungsgeschichten, unwichtig ...] uart_puts(PSTR("\n\rAdresse von cluster: ")); uart_puts_R(ltoa(&cluster, buf, 10)); uart_puts(PSTR("\n\r\n\r")); [... usw. usf. ...] } [/c] jetzt liefert mir dieses kleine Programmcodebeispiel ein [c]
-
Thread
Strings im Flash ablegen, oder nicht?
[c] uart_output("Dies ist eine Test-Ausgabe aus dem RAM"); [/c] vs. [c] uart_output_P(PSTR("Dies ist eine Test-Ausgabe aus dem Flash")); [/c] Option #2 braucht letztendlich sogar mehr Flash, wenn man es kompiliert. Das macht vermutlich auch Sinn, weil der String ja in beiden Fällen im
das Flash im RAM-Adressbereich sichbar ist. Auf diesen Devices kann man auf __flash und PROGMEM / PSTR etc. ohne Overhead verzichten. [c]const int i = 2; __attribute((noinline,noclone)) int readi (const int *pi) { return *pi; } int main (void) { return readi (&i); }[/c] Zunächst
-
Thread
1. Funktionsaufruf alles wunderbar 2. Funktionsaufruf => Absturz
Ohne den Rest-Code gesehen zu haben: Ram/Stack-Problem? pgmspace.h und dessen PSTR-Makro helfen.
Ich habe nun alle strings mit PSTR übergeben. Das löst das Problem allerdings auch nicht. Nach etwas herumprobieren und auskommentieren, habe ich herausgefunden, dass der eigentlich Knackpunkt wohl die spi_send_byte() Funktion ist. Warum
-
Thread
ATmega resettet dauernd
Beitrag #3602947: > uart_puts_P("Hallo\n"); Wahrscheinlich sollte das uart_puts_P(PSTR("Hallo\n")); lauten, oder täusch ich mich?
dafür gibts ja #define uart_puts_P(__s) uart_puts_p(PSTR(__s)) im header.
-
Thread
Arduino Uno R4: Besonderheiten und Abhilfen
Beim STM32 Core ist Progmem einfach als gar nichts definiert, PGM_P ist ein normaler const char* und PSTR(von x) ist auch ein dummy, nämlich x.
STM32 Core ist Progmem einfach als gar nichts definiert, > PGM_P ist ein normaler const char* und PSTR(von x) ist auch ein dummy, > nämlich x. Hallo Nemopuk, wie bekomme ich die Daten in den Flash bzw. wie und welche eindeutigen Adress-Bereiche muss ich angeben um beispielsweise: const int
-
Thread
Arbeitsspeicher sparen
www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Array_aus_Strings_im_Flash-Speicher PROGMEM und PSTR sind die Zauberwörter. Servus Michael
Code. Da gibt es einen kompletten Abschnitt drüber im AVR-GCC-Tutorial. Such mal nach PROGMEM und PSTR... In der Artikelsammlung sind auch Projekte beschrieben, die mit einer Menüführung auf einem LCD arbeiten. Da ist wahrscheinlichst auch entsprechender Code zu sehen.
-
Thread
Problem mit AVR NEt IO und Eingänge
break; } if(b) { strcpy_P(var_conversion_buffer, PSTR("ledon.gif")); } else { strcpy_P(var_conversion_buffer, PSTR("ledoff.gif")); } str_len = strnlen(var_conversion_buffer,CONVERSION_BUFFER_LEN);
-
Thread
WLAN Steckdosen Unterschiede?
CR":"372/699"}} tasmota/support.ino- if (is_8285) { tasmota/support.ino- strcpy_P(buff, PSTR("ESP8285")); tasmota/support.ino- } else { tasmota/support.ino: strcpy_P(buff, PSTR("ESP8266EX")); tasmota/support.ino- }