-
Thread
IRMP Atmega168 Signal wird falsch übergeben?
for (;;) { if (irmp_get_data (&irmp_data)) { uart_puts_P (PSTR("protocol: 0x")); itoxx (buf, irmp_data.protocol); uart_puts (buf); #if IRMP_PROTOCOL_NAMES == 1 uart_puts_P (PSTR(" ")); uart_puts_P (pgm_read_word
(PSTR(" flags: 0x")); itoxx (buf, irmp_data.flags); uart_puts (buf); uart_puts_P (PSTR("\r\n")); } } } /*--------------------------------------
-
Thread
AVR strings im flash mit progmem, direkt als argumente an funktionen?
Siehe PSTR in der AVR-Libc
4.7: [c] #include <avr/pgmspace.h> const char * volatile p; int main (void) { p = PSTR ("Hallo"); p = PSTR ("nochmal Hallo"); return 0; }[/c] mit -Os -fmerge-all-constants wird daraus: [avrasm] main: ldi r24,lo8(__c.1515) ldi r25,hi8(__c.1515) sts p+1,r25
-
Thread
c/c++ array in bereits reserviertem Speicher anlegen
preallocateBuffer = malloc(preallocateBufferSize); // Stream-File-Buffer Serial.printf_P(PSTR("Adresse Buffer: %X\n"), preallocateBuffer); Serial.printf_P(PSTR("Buffer reserviert: - Free mem=%d\n"), ESP.getFreeHeap()); titelliste = (char*)preallocateBuffer; for (i=0; i<20; i++) { titelliste[i] = i + 'a'; Serial.printf_P(PSTR("Adresse: %X Wert: %c\n"), titelliste+i, titelliste[i]); } titelliste[i]='\0'; Serial.printf_P(PSTR("Array beschrieben: - Free mem=%d\n"), ESP.getFreeHeap()); Serial.print(titelliste
-
Thread
Zwei gleiche Codeschnipsel = volkommen verschiedene Ergebnisse
Vollständigkeit halber hier noch den Sollbyte-Manipulator [c] else if (strncmp_P(auswertstring,PSTR("east"),4)==0) {volatile extern unsigned char motorsollbyte; setbit(motorsollbyte,0); clearbit(motorsollbyte,1); ausgabefehler = 0;} else if (strncmp_P(auswertstring,PSTR("west"),4)==0) {volatile
motorsollbyte,1); clearbit(motorsollbyte,0); ausgabefehler = 0;} else if (strncmp_P(auswertstring,PSTR("stop"),4)==0) {volatile extern unsigned char motorsollbyte; motorsollbyte = 0x00; ausgabefehler = 0;} else if (strncmp_P(auswertstring,PSTR("up"),2)==0) {volatile extern unsigned char motorsollbyte
-
Thread
va_list an vsprintf() weiterreichen
0' == c) return; if ('%' == c) { ... } void put_PSTR (const char * fmt, ...) { va_list vlist; va_start (vlist, fmt); put_va (fmt, vlist); va_end (vlist); } [/c] Die Format-String muss im Flash liegen. Um nicht jedesmal PSTR
c] #include <avr/pgmspace.h> // mind the blank before the colon! #define put_P(y,z...) put_PSTR (PSTR(y) , ##z) extern void put_PSTR (const char *, ...); [/c]
-
Thread
problem mit string zu float konvertierung und umgekehrt
char c = 0; char buffer[buffersize]; unsigned int dec = 5; clr_screen(); uart_puts_p (PSTR("Koeffizient Y(k-1) = ")); input_string(buffer, buffersize); coeff_y_alt1 = atof(buffer); uart_puts_p (PSTR(" >> Kontrollausgabe: ")); uart_puts(dtostrf(coeff_y_alt1, buffersize, dec, buffer)); uart_puts_p (PSTR("\r\n")); uart_puts_p (PSTR("Koeffizient Y(k-2) = ")); input_string(buffer, buffersize); coeff_y_alt2 = atof(buffer); uart_puts_p (PSTR(" >> Kontrollausgabe: ")); uart_puts(dtostrf
-
Thread
[AVR] compiler optimiert strings nicht richtig
automatically storing string constant in program memory */ #define lcd_puts_P(__s) lcd_puts_p(PSTR(__s)) #define ERROR_SD_READ "Error SD_read" if( 0 != getSDinfos(&sdInfo) ){ lcd_init(LCD_DISP_ON); lcd_puts_P( ERROR_SD_READ ); HALT; } if(0 != SD_readSingleBlock
extern void foo1 (const char*); extern void foo2 (const char*); void foo (void) { foo1 (PSTR ("hallo")); foo2 (PSTR ("hallo")); } [/c] Wird expandiert zu [c] void foo (void) { foo1 ((__extension__({static char __c[] __attribute__((__progmem__)) = ("hallo"); &__c[0];})))
-
Thread
Array mit printf_P als Hexzahlen ausgeben
f16_open(EIBlogStatus.log_datei,"a"); if (logfile) { f16_printf_P(logfile,PSTR("%2i.%2i.%2i;%2i:%2i:%2i;"), TM_DD, TM_MM, TM_YY, TM_hh, TM_mm, TM_ss, Telegramm); for(i=0;i<Length_save+8;i++) f16_printf_P(logfile,PSTR("%x;"),Telegramm[i]); f16_printf_P(logfile,PSTR("\r\n")); f16_close(logfile); } } } [/c]
-
Thread
STK500 Serial Port String senden
usart_init ( MYUBRR ); // dump some strings to the screen at power on usart_pstr("Ready to rock and roll!\n\r"); usart_pstr("Type in a character, and I will transpose it up by 1:\n\r"); // main loop while(true) { // if a key has been pressed, then process
unsigned char b; b=0; if(UCSRA & (1<<RXC)) b=1; return b; } void usart_pstr(char *s) { // loop through entire string while (*s) { usart_putchar(*s); s++; } } [/c]
-
Thread
ARM Cortex-M0: re-enter Interrupt
seconds++; if ( ! (seconds % 60)) { seconds = 0; minutes++; } sersendf_P(PSTR("%su:"), minutes); if (seconds < 10) serial_writechar('0'); sersendf_P(PSTR("%su\n"), seconds); // Be busy sometimes. if ( ! (seconds % 5)) delay_ms(2000); }
seconds++; if ( ! (seconds % 60)) { seconds = 0; minutes++; } sersendf_P(PSTR("%su:"), minutes); if (seconds < 10) serial_writechar('0'); sersendf_P(PSTR("%su\n"), seconds); if ( ! (seconds % 5)) { SCB->ICSR = SCB_ICSR_PENDSVSET_Msk; //
-
Thread
HT16K33 schnelltest LED Blink :P
der ganze block nur zur Sicherheit, um das Device abziehen zu können. lcd_printlc_P(1, 1, PSTR("TEST AN")); lcd_light(true); lcd_printlc_P(2, 1, PSTR("TEST ")); HT16K33_ClearDisplay(0); HT16K33_ClearDisplay(1); HT16K33_ClearDisplay(2); HT16K33_ClearDisplay(3); HT16K33_ClearDisplay(4); wait_10ms(500); lcd_printlc_P(1, 1, PSTR("TEST ")); lcd_light(false); lcd_printlc_P(2, 1, PSTR("TEST AUS")); HT16K33_FillDisplay(0); HT16K33_FillDisplay(1); HT16K33_FillDisplay(2); HT16K33_FillDisplay
-
Thread
avr-gcc: Format für Flash-String-Ausgabe?
Probier mal lieber so. const char *getstring(); Oder teste mal einfach so. sprintf(pBuf, "%S", PSTR("Hello World")); Außerdem bietet sich sprintf_P an, damit sparst du RAM, denn der Formatstring ist ja konstant. > warning: format ‘%S’ expects argument of type ‘wchar_t *’, but argument > 9
if (pTask == NameTable[i].taskAddr) return NameTable[i].name; return PSTR("***"); } [/c]
-
Thread
GPS NMEA Libary für Atmega32
0) while (*p++ != ',') ; // if (strlen(sentence)>=99) { // printf_P(PSTR("sentence zu lang: %d\n%s\n"),strlen(sentence),sentence); // } strncpy (result, p,100); result[99]=0; p = result; while (*p && *p != ',' && *p != '*' && *p != '\r')
chksum[2]=0; csnum=strtol(chksum, NULL, 16); if (csnum!=value) { printf_P(PSTR("NMEA CS ! %s %02x\n"),chksum,value); return; } oldLat = gpspos.lat; oldLon = gpspos.lon; gpspos.lat=atof(readFieldByNumber(data, 2)); d=gpspos.lat/100
-
Thread
#define Konstante in String einbauen
Die Ausgabe [c] #define LCD_CHAR 126 ... // Ausgabe LCD_string_P(PSTR("Zeichen: ")); LCD_data(LCD_CHAR); [/c] könnte ich doch auch so schreiben [c] LCD_string_P(PSTR("Zeichen: \126")); [/c] Kann ich auch beide irgendwie vereinigen (ohne sprintf)? [c] #define LCD_CHAR 126 ... // Ausgabe irgendwie so? LCD_string_P(PSTR("Zeichen: \" LCD_CHAR)); [/c] ??? Danke karl
-
Thread
Einen Flash-String "ganz normal" verwenden
swiftFlashStrBuf; } extern void consolePrintln (char* s); consolePrintln (getSwiftFlashStr (PSTR ("Hallo Welt"))); [/C] ich hoffe, dass das jemand gebrauchen kann. Grüße Ralf
aber was spricht gegen: char swiftFlashStrBuf [21]; consolePrintln (strcpy_P(swiftFlashStrBuf ,PSTR ("Hallo Welt"))); Oliver
-
Thread
ESP8266_NONOS_SDK: Welche Strings im RAM?
h, "tri_tra_trallala", 16) Dann steht "testtesttest" im RAM! Richtig wäre: > strncasecmp(h, PSTR("tri_tra_trallala"), 16) Sowas (ganz allgemein, nicht nur mit strncasecmp, was nur ein Beispiel war) würde ich gerne automatisch finden können.
Tim schrieb im Beitrag #6753318: >> strncasecmp(h, PSTR("tri_tra_trallala"), 16) > > Sowas (ganz allgemein, nicht nur mit strncasecmp, was nur ein Beispiel > war) würde ich gerne automatisch finden können. strncasecmp() wäre hier falsch, richtig
-
Thread
Array vom PROGMEM aufs Display
wie wär's mit PSTR ? [c] #include <avr/pgmspace.h> strcpy_P (buffer, PSTR("TestString")) [/c]
Rainer B. schrieb im Beitrag #4669931: > wie wär's mit PSTR ? Ja danke, das funktioniert. Wie soll da einer draufkommen .... Ich hab es mir vorher im Header-File angeschaut und bin nicht drübergestolpert.
-
Thread
Problem bei negativen Temperaturen mit Temperatursensor DS18S20
Temperatur in String uart_puts(Buffer); // String zur Uart uart_puts_P(PSTR(" Grad Celsius\r\n")); // Ausgabe der Einheit } int main(void){ uart_init(); uart_puts_P(PSTR("\r\nProgrammstart\r\n")); // Startmeldung // Testausgabe siehe Datenblatt
25 Grad Celsius PrintTemp2Uart(0xFF, 0x92); // -55 Grad Celsius uart_puts_P(PSTR("Fertig\r\n")); // Endemeldung for(;;); }[/c] Gruß Rene
-
Thread
ISR-Rücksprungadresse feststellen
char c = uart_getchar(); switch (c) { case 0x1b: uart_puts_P(PSTR("\r\nREBOOT\r\n")); while (1) // reboot ; case '#': // fill SaveArea.stack with text uart_puts_P(PSTR("Text: "));
break; case '~': // print SP uart_puts_P(PSTR("SP = ")); uart_hex_putchar(SPH); uart_hex_putchar(SPL); uart_puts_P(PSTR("\r\n")); break; default:
-
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
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
Atmega16 Speicher bald voll Program / Data Unterschied ?
Das geht nicht? struct MenuEntry MainMenu[] PROGMEM = { ... PSTR bringt hier natürlich nichts, ist aber auch nicht nötig, weil char[] statt char*.
Horden von pgm_xxx() Funktionen für jeden Strukturzugriff abkämpfen zu müssen. Jedenfalls in C - PSTR inmitten der Initialisierung ging zumindest in der damaligen avr-gcc Version nur in C, nicht aber in C++.
-
Thread
Ist mein Mega 128 Kaputt
ort.testort,ort.plz,ort.latitude,ort.lontitude); send_UART1(&uartbuffer[0]); besser: send_UART1_P(PSTR("Kennung")); send_UART1(ort.kennung) send_UART1_P(PSTR(" \r\nOrtschaft:")); ... Die SendUART1_P musst evtl neu programmieren, damit sie Konstanten vom pgmspace lesen kannst. ein send_UART1(
int i) schreibt einen Integer an der aktuellen Cursorposition, sieht dann z.B. so aus: lcd_puts_P(PSTR("Wert: ")); lcd_puti(wert); Gruß Roland
-
Thread
Printf und String im Flash
<avr/pgmspace.h> #include <stdio.h> int main(void) { Uart_init(); while(0) { printf(PSTR ("Hallo Welt!")); } } [/c] Gruß, Marian
sagt, dass ein String aus dem Flash kommt printf( "%S", PSTR("Hallo Welt" ) ); (Ich weiss jetzt gar nicht, ob es einen printf_P gibt, der den Format String im Flash erwartet, dann würde das direkt gehen printf_P( PSTR("Hallo Welt" ) ); ) > einen
-
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
PIC Register setzen
; }; struct { unsigned :6; unsigned CMPL0:1; unsigned CMPL1:1; }; } PSTR1CONbits; Microchip arbeitet nicht mit #defines sondern mit Unions und Bitfeldern. #defines sind ja nicht typsicher, weil die ja am Compiler vorbei laufen. Unions und Structs sind typsicher, das checkt der Compiler. Du kannst also nicht nur sagen: PSTR1CON &= ~CMPLMASK; sondern auch PSTR1CONbits.CMPL=0; > Ich könnte auch einige Denkanstöße zu den Problemen gebrauchen. Auch > weil mein Englisch nicht ausgereit hat, um die Funktionen von LATx laut
-
Thread
Kompilieren in Abhängigkeit vom Target-System
unterschiedlich deklarierst. So ala #ifdef PC #define usart_write(format, args) usart_write_PC(PSTR(format) , ## args) #eldeif #define usart_write(format, args) usart_write_UC(PSTR(format) , ## args) #endif Damit brauchst du keine ifdef Orgie im code machen...
verstanden, dann kommt eine Funktionmit zwei Parametern, diese wird im Code ersetzt durch usart_write_PC(PSTR(format) , ##args), aber was machen die ##?