-
Thread
AVR-GCC 4.8.1: unrecognizable insn
die folgende Abwandlung mit einem konstanten String im Flash: [c] snprintf_P(glstr_Buf,N_TEXTBUF,PSTR("u=%u"),\ *menudata[item].puint8); [/c] Das Struct "menudata" ist etwas komplizierter aufgebaut: [c] // Header #define constflash const __flash enum datatype_e {
// Normale und hervorgehobene Menuepunkte if (selectedItem == item) glcd_putstr_P(PSTR("\033i")); // Hervorgehoben glcd_putstr(glstr_Buf); if (selectedItem == item) glcd_putstr_P(PSTR("\033n")); // Hervorhebung
-
Thread
uin16_t ist/wird negativ bei 0x8000.
wenn ich es zu einem uint16_t caste also so: [code] snprintf_P(strBuffer, sizeof(strBuffer), PSTR("Config 3: %d VAR: %d\r\n"), config, (uint16_t)ADS1015_REG_CONFIG_OS_SINGLE); [/code] bleibt das Ergebnis unverändert. Also immer noch negativ. Dadurch sollte der Compiler doch wissen das es sich
die Zahl auf der Seriellen aus? So: [code] snprintf_P(strBuffer, sizeof(strBuffer), PSTR("Config 3: %d VAR: %d\r\n"), config, (uint16_t)ADS1015_REG_CONFIG_OS_SINGLE); sendToSerial(COMM_INTERNAL, strBuffer); [/code] Comm_Internal gibt nur an das die Daten über den USART2 übertragen
-
Thread
JSON parsen mit AVR
strlen zusammen mit Makro oder Inline-Funktion. [c]#define strncmpf(S, STR) \ strncmp_P (S, PSTR (STR), strlen (STR)) bool func (const char *str) { if (!strncmpf (str, "abc")) return true; return false; }[/c] Ein Problem ist, dass es wegen PSTR keine Inline-Funktion sein
\ match_len = strlen (STR); \ match = ! strncmp_P (S, PSTR (STR), match_len); \ match; \ }) bool func (const char *str) { bool match; size_t match_len; if (MATCH (str, "
-
Thread
LM75 am Atmel 128 mit TWI_Master
Routinen in C habe ich mal beigepackt. Aufruf aus dem Hauptprogramm mit: [c] fprintf_P(stream, PSTR("%d"), LM75_temperature(0)); [/c] bzw. [c] fprintf_P(stream, PSTR("%d"), LM75_temperature(1)); [/c] für den zweiten Sensor. Kann da mal bitte jemand einen Blick drauf werfen? Ich verlieren sonst
nach der Abfrage den Wert aus dem Status-Register der LM75 ausgelesen mit [c]fprintf_P(stream, PSTR(" %u"), TWI_Get_State_Info());[/c] Für die erste Abfrage ist das 248 = 0xF8 // No relevant state information available; TWINT = “0” Für alle folgenden kommt der Wert 72 zurück. 72 = 0x48
-
Thread
Aufruf mit/ohne Flash. Zwei identische Funktionen nötig?
<avr/pgmspace.h> extern void foo_P (const __memx char *); void hallo (void) { foo_P (PSTR ("Hallo")); } [/c] Der Zeiger, den PSTR zurückliefert, liegt formal im Generic Address Space (RAM), enthält aber eine Flash-Adresse. Für dieses Beispiel erzeugt der Compiler Code wie erwartet, d.h. übergibt an foo_P einen 24-Bit Zeiger aufs Flash. Dummerweise ist das, was PSTR macht, nicht auf Embedded-C abbildbar.
-
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
Library für EA-DOGM Grafikdisplays inkl. Font-Generator
String im Flash und nicht im (meist wertvollen) RAM: [code]lcd_put_string_P(FONT_PROP_16,NORMAL, PSTR("Hallo Welt"));[/code]
lcd_move_xy(0,0); lcd_put_string_P(FONT_FIXED_8, NORMAL, PSTR("Hallo Welt")); } } eigentlich gibt es da nicht all zu viel zum falsch machen oder?
-
Thread
ENC28J60 (Mikro-)Web-Server die Nächste
code am Webserver: [code] #define BROADCASTPORT 65535 void uip_UdpAppHubCall(void) { printf_P(PSTR("UDP Call!\n")); switch(uip_udp_conn->lport){ case HTONS(BROADCASTPORT): printf_P(PSTR("Broadcast received!\n")); printf("Remote address:%d%d\n",uip_udp_conn->ripaddr[0],uip_udp_conn->ripaddr[1]); //uip_connect(uip_udp_conn->ripaddr,HTONS()) break; default: printf_P(PSTR("undefined UDP packet on PORT:"));printf("%d",uip_udp_conn->lport);printf_P(PSTR(" received!\n")); break; } printf_P(PSTR("undefined UDP Call!\n")); } void uip_UdpAppHubInit(void) {
-
Thread
MPU6050 keine Messdaten
ADDRESS, MPU6050_RA_SMPLRT_DIV, 0x01); if(error ==1) { lcd_line_four(); lcd_write_string(PSTR("ByteWrite Fail")); } else if (error == 0) { lcd_line_four(); lcd_write_string(PSTR("ByteWrite Pass")); } lcd_line_four(); lcd_write_string(PSTR("ByteWrite")); //Disable FSync
RA_FIFO_R_W, 0x00); //MPU6050_RA_WHO_AM_I //Read-only, I2C address lcd_home(); lcd_write_string(PSTR("MPU6050 Setup Done")); //printf("\nMPU6050 Setup Complete"); } [/c] [c] regWrite(0x6B, 0xC0); regWrite(0x6C, 0x00); delay(10); // regWrite(0x6B, 0x70); regWrite(0x6B, 0x00
-
Thread
Code funktioniert in main(), aber nicht über Funktion?
Kompletter Programmcode attached). /* Ask for command and store result in string s */ UART_readline(PSTR("Enter command. \r\n"), s); /* Ask for command and store result in string s */ /*printf_P(PSTR("Enter command. \r\n")); wdt_disable(); fgets(s, sizeof(s)-1, stdin); wdt_enable(WDTO_500MS); s[strlen(s)-2] = 0; // drop the ending \r\n printf_P(PSTR("You entered '%s'\r\n"),s); */ Nutze AVR Studio. Irgendwelche Ideen, an was das liegen mag? Danke Axel
-
Thread
Ideen und Konzepte für dynamisches Logging
oder? Bisher habe ich hierfür ein eigenes Makro der Form: [c]#define uart_puts_P(s) uart_puts_p(PSTR(s))[/c] Entsprechend würde sich wahrscheinlich ein log_output_P() Makro anbieten, oder? Makros mit flexiblen Parameter kennt GCC ja [1]. Mit freundlichen Grüßen, Karol Babioch [1]: https:/
Ansatz mit variablen Argumenten umgesetzt. Das Ganze lässt sich übrigens auch mit einem entsprechenden PSTR() Makro umsetzen, sodass die Strings im Flash landen und keinen zusätzlichen Ram in Anspruch nehmen, z.B. so: [c]#define log_output_P(module, fmt, ...) log_output_p(module, PSTR(fmt), ##__VA_ARGS
-
Thread
AVR GCC Textausgabe von Flash-Strings
du hast vollkommen Recht, das muss natürlich PSTR("text") heißen. hab den Code einfach schnell hingetippt. Aber das war auch der Fehler im Programm: bei den initpage_p Aufrufen war auch kein PSTR davor. text_p wird ansonsten über ein Macro aufgerufen [c] #define TEXT_P(x,y,attr,string) (text_p(x,y,attr,PSTR(string))) [/c] jetzt funktionierts! Danke!
-
Thread
ATMega644p: Kein Reset nach Programmiervorgang
rc_t nRC = RC_OK; // Line 1: Title display_format( 1, strcpy_P( (char *) &acBuffer[0], PSTR( "* PSU + DARC *" ))); // Line 2: Model display_format( 2, strcpy_P( (char *) &acBuffer[0], PSTR( ">%6s< by DG1SBG" )), PSU_MODEL ); // Line 3 Serial Nr and Version display_format( 3, strcpy_P( (char *) &acBuffer[0], PSTR( "# %s - %s")), PSU_SERIAL_NR, PSU_VERSION ); roger(); if( nDelayMilliSeconds > 0 ) _delay_ms( nDelayMilliSeconds ); return nRC; } ISR( TIMER1_COMPA_vect ) // Routine triggered
-
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
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
Infinite Loop STM32 Zeichen ersetzen
#5836613: > ich bekomme bei folgendem Code ein infinite Loop. Zwei Moeglichkeiten: a) Worauf pStr zeigt, ist kein C-String, i.e. nicht durch NUL terminiert b) Du kaputtest diesen String irgendwo spaeter HTH leo
>> ich bekomme bei folgendem Code ein infinite Loop. > > Zwei Moeglichkeiten: > > a) Worauf pStr zeigt, ist kein C-String, i.e. nicht durch NUL terminiert > b) Du kaputtest diesen String irgendwo spaeter c) "replace" ist NUL, i.e. du vernichtest dein Stringende. > > HTH > leo
-
Thread
avr-gcc: __DATE__ formatieren / "initializer element is not constant"
zu kürzen. Ich erstelle ja immer einen Standardstring mit folgendem Format sprintf_P(c_str, PSTR("%04d/%02d/%02d_%02d:%02d:%02d"), year, month, day, hour, minute, second); nicht besser? =" JanFebMarAprMayJunJulAugSepOctNovDec"; oder ="ErrJanFebMarAprMayJunJulAugSepOctNovDec";
Serial.println(); Serial.print(F("Nach der Umformatierung:")); char buf[20]; sprintf_P(buf, PSTR("%04d/%02d/%02d_%02d:%02d:%02d"), BUILD_YEAR(), BUILD_MONTH(), BUILD_DAY(), BUILD_HOUR(), BUILD_MINUTE(), BUILD_SECOND()); Serial.println(buf); } void loop() { // put your main code here
-
Thread
Serieller Ausgabesalat
einfacher Aufruf zur Ausgabe von einem String mit Variablen sieht bei mir so aus: [c] serialString_P(PSTR("Steurungswert: ")); serialNumberDigits(parameter.a, 1); serialString_P(PSTR(";")); [/c] wie kann ich das den Prüfen und worin besteht das das Problem, sprich wo kommen die falsch ausgegebenen
-
Thread
string aus RAM an LCD-Ausgabefunktion übergeben
irgendwas im Umgang mit Strings falsch: Folgendes funktioniert einwandfrei: N3310_PutStr(PSTR("Beispieltext")); Wenn ich das PSTR weglasse, oder wenn ich einen String übergeben möchte, den ich vorher über den UART des ATmega ins RAM eingelesen habe, wird aber nur ein schwarzer Balken angezeigt. Dass mit PSTR der Text "Beispieltext" vom Compiler im Flash abgelegt wird, glaube ich, verstanden zu haben, was schief läuft, wenn man es weglässt, verstehe ich allerdings nicht. Kann mir jemand sagen, was ich
-
Thread
Laufzeit Optimierung AtMega2560 als Frequenzgenerator
Original myFiles.load(0, 0, 800, 480, "Start-Screen.raw", 1 , 1); // Neu strcpy_P(filename, PSTR("Start-Screen.raw")); myFiles.load(0, 0, 800, 480, filename, 1 , 1); [/c] 4.) Die Arrays mit den systematischen Namen kann man in diesem Fall einsparen und die Dateinamen berechnen. Etwa so.
itoa(counter_Hertz*10, filename, 10); // Index in ASCII-String umwandlen strcat_P(filename, PSTR("Hz.raw"")); // Endung anfügen itoa((counter_Power+1)*5, filename, 10); strcat_P(filename, PSTR("%.raw"")); itoa(counterSekunden, filename, 10); strcat_P(filename, PSTR(".raw""))
-
Thread
70000 / 5 = 888
zwei Zahlen vergleichen wollte. z.b. [c] if ( ByteCounter < ( 1024l*1024l ) ) printf_P( PSTR(" %ld kBytes "), ByteCounter / 1024 ); [/c] und [c] if ( ByteCounter < ( 1024*1024 ) ) printf_P( PSTR(" %ld kBytes "), ByteCounter / 1024 ); [/c] Das erste Beispiel geht, das zweite
-
Thread
Auf einem Gra-LCD TM24064B ADC-Wert ausgeben
wäre mit den anderen Antworten längst gelöst. z.B. in main.c statt T6963cPutStringXY_P(0, 0, PSTR("Hi!")); [C] { char Buffer[20]; int i = 25; itoa( i, Buffer, 10 ); // http://www.mikrocontroller.net/articles/FAQ T6963cPutStringXY(0, 0, Buffer); // ohne _P ! } [/C] Zu Beginn
Was es mit dem _P auf sich hat, kannst du im AVR-GCC Tuturial unter den Stichworten PSTR und PROGMEM nachlesen.
-
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
Leeren String als Argument übergeben?
die einen Pointer auf char erwartet, einen leeren String ("") zu übergeben? Bsp.: void foo (char *pstr) -> foo (""); Wenn ja, was macht der Compiler daraus? Ist "" eine Konstante mit dem Inhalt '\0'?
einen Pointer auf char erwartet, > einen leeren String ("") zu übergeben? Bsp.: void foo (char *pstr) -> > foo (""); Ja. > Wenn ja, was macht der Compiler daraus? Er übergibt der Funktion die Adresse einer im Speicher stehenden Null. PS: Ich hoffe nur, du denkst nicht, dass man diesen
-
Thread
Menüstruktur mit Text im Atmel
kann ich diese Strings in den Flash bringen? Für Strings gibt es ein Makro: [c] usb_puts_P(PSTR("Menu active"))); [/c] Das PSTR sorgt automatisch dafür, dass der String dahinter im Flash abgelegt wird, ABER ACHTUNG: die Funktion usb_puts kannst du dann nicht mehr wie sie jetzt ist verwenden
Ich habe mal mit dem PSTR experimentiert. Wenn ich das vor eine Variable schreibe, dann verringert sich der "Data" Bereich bei Memory Usage. Also Data bezeichnet den RAM, richtig? D.h. dass die Variable nun nur noch im Flash
-
Thread
Port IAR -> AVR GCC
Projekt vom IAR zum GCC. Problem: Es gibt viele printf_P(...) im Projekt. Beim IAR gibt es aber das PSTR Makro nicht. Dort heißt es also z.B. printf_P("Hallo Welt"); Nun kann ich per Define folgendes machen: #define printf_P(X) printf_P(PSTR(X)) Das klappt dann bestens; zumindest für strcpy_P
#elif defined (__GNUC__) // GCC # include <avr/pgmspace.h> # define PRINTF_P(fmt, ...) printf_P(PSTR(fmt), __VA_ARGS__) #else # error "Unknown compiler" #endif [/c] Die Variante, alles String-Konstanten im ROM unterzubringen, ist aber bei IAR auch nicht der Standard, da sie inkompatibel zum
-
Thread
Parameter an Funktion
MyString[] = PROGMEM "Hello World!\n\r" //String im Flash // oder direkt als Parameter mit dem PSTR() Macro sendString_P(PSTR("Ich komm aus dem Flash!\n\r")); // im FLASH //--------------------------------------------------------- // Für Strings im FLASH braucht es eigene Funktionen // für
-
Thread
GCC, WinAVR, AVR-Studio 4.18: String im Flashspeicher
Hallo Gerd. Ich denke du suchst nach dem, was PSTR() tut. Siehe http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html#ga05ca900ebf7cd121be73c654d9ccb3eb Aber Achtung, die Verwendung klappt nur in den oberen 64K des Flashs zuverlaessig
#define F PSTR
-
Thread
String im Flash speichern
AVR? [C] snprintf_P( tempstr, BUFFER_SIZE-1, PSTR("Receive %d voltage of channel 0"), Voltages[0]); [/C] http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Strings_lesen http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Vereinfachung_f.C3
entsteht, wenn das dritte Argument ein Define-String ist. snprintf_P( tempstr, BUFFER_SIZE-1, PSTR("Receive %d voltage of channel 0"), G_ERROR); #define G_ERROR "undefined channel"
-
Thread
GCC ARM: Problem mit "\n" am Stringende
folgende Verschachtelung der Aufrufe main.c: printf("\nHallo\n") => puts(const char *pStr) => pStr @ 0x8002bb4 => "\nHallo\0" (ohne \n) printf.c: puts() => fputs(pStr, stdout) printf.c: fputs(const char *pStr, FILE *pStream) => fputc(*pStr, pStream) printf.c: fputc(signed int c, FILE *pStream
> main.c: printf("\nHallo\n") => puts(const char *pStr) > => pStr @ 0x8002bb4 => "\nHallo\0" (ohne \n) > > printf.c: puts() => fputs(pStr, stdout) Dann lass doch mal dein puts aus printf.c ansehen! Dort muss nach dem String noch ein \n ausgegeben werden.