-
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 ##?
-
Thread
Fehler nach Einfügen einer Else-Anweisung
Wenn ich diese Funktion verwende: [c] lcd_stringCenter_P((PSTR)"ID unknown.", 1); [/c] Er schmeißt dann aber bei mir einen Feher raus: Error 6 too few arguments to function 'lcd_stringCenter_P'
Es muss heißen: [c]lcd_stringCenter_P(PSTR("ID unknown."), 1);[/c]
-
Thread
AVR Webserver Radig eingabe speichern
schon gar nicht mehr die Seite auf. Den Text den er ausgeben soll ist: [code] sprintf_P(data, PSTR(" <div class=\"eingabe\">%i FREI: %i Raum:%i Ein am:%i.%i.%i um %i:%iUhr AUS:%i.%i.%i um %i:%iUhr</div> "),i,Time_Speicher[i].Frei, Time_Speicher[i].Raum, Time_Speicher[i].EIN_Day,Time_Speicher[i].EIN_Month
kann Code auch umbrechen und muss nicht alles in einer Zeile reinknüdeln [c] sprintf_P( data, PSTR(" <div class=\"eingabe\">%i " "FREI: %i " "Raum:%i " "Ein am:%i.%i.%i um %i:%iUhr " "AUS
-
Thread
Arduino 328P Resettet sich bei Programmstelle
andere läuft einwandfrei. aus dem flash oder aus dem SRAM? nutzt du progmem für die Strings und PSTR()?
einwandfrei. > > aus dem flash oder aus dem SRAM? > > nutzt du progmem für die Strings und PSTR()? Yupp..... daher muss ich auch unterscheiden wo was her kommt [c] const char flash_sms_empty[] PROGMEM = "Batterie leer! Powerdown!"; const char flash_admin[] PROGMEM = "Admin OK
-
Thread
Arrays, Strings und Flash bzw. SRAM
struct mystruct { prog_char* pText; }; const struct mystruct test[] PROGMEM = { { PSTR ( "Test 1" ) }, { PSTR ( "Test 2" ) }, { PSTR ( "Test 3" ) }, { PSTR ( "Test 4" ) } }; // ---------------------------------------------------------------------- // Variante 3 // Oder
-
Thread
Arduino: if(String == "ein") funktioniert nicht
an... zu dem bemängeltem Code war vom ESP der 512k SRAM hat deswegen fehlte auch strcmp_P und PSTR()
aber ich prüfe ja wieviel Byte frei sind und kann entscheiden ob ich aus dem flash lese mit strxxx_P PSTR() oder nicht!
-
Thread
Zeiger auf Strings
verschicken */ uart_putc(Zeichen); text++; } } int main(void) { writeString_p(PSTR("Hallo")); writeString_p(PSTR("hier")); writeString_p(PSTR("Tasten")); } [/c]
-
Thread
Riesige Änderungen zwischen WinAVR 030913 und der aktuellen Version? Gesperrt
einer 2007er und einer 2008er Version nicht mehr funktioniert. Bei der 2007er habe ich zB. keine PSTR verwenden können. Da wurde wild im Speicher herumgelesen. Bei der 2008er funktionieren die PSTR zwar wieder, aber dafür habe ich das Problem auf ungerade Adressen im EEProm zuzugreifen. Heute Mittag
durcheinander geht, aber prinzipiell funktioniert der Code. >Bei der 2007er habe ich zB. keine PSTR >verwenden können. Da wurde wild im Speicher herumgelesen. Gibt es dafür auch ein Beispiel? Oliver
-
Thread
Probleme mit printf_P
Ich habe ein Problem mit der printf-P - Funktion. Der Code ist wie folgt : printf_P(PSTR("\n\rBrennerstart : %6u\n\r"), Brenner_Start_Zeit); printf_P(PSTR("Start:;%02i:%02i:%02i ;"), Brenner_Start_Zeit/3600, (Brenner_Start_Zeit
das, was du wolltest): */ printf_P(PSTR("Start:;%02u:%02u:%02u ;"), (int16_t)(Brenner_Start_Zeit/3600), (int16_t)((Brenner_Start_Zeit/60)%60), (int16_t)(Brenner_Start_Zeit %60));
-
Thread
C Programmierung
Wörter ersetzt? unsigned int Replace2(char *pStr, char replace, char newChar) was wäre den pSTR , replace , newChar? newChar = ersetzendes Wort replace = zu ersetzendes Wort pSTR = ? Vielen Dank schon einmal für die Mühe
Dich. Falls Du es verstanden hättest, würdest Du sehr wahrscheinlich so etwas: > was wäre den pSTR , replace , newChar? > newChar = ersetzendes Wort > replace = zu ersetzendes Wort nicht fragen. Denn es würde klar sein, das char nur für ein einzelnes Zeichen steht und ergo, der Parameter newChar
-
Thread
Wie splitte ich ein Byte richtig auf?
void checkbyte(char c) { if (c & 0b11110000 == hw_GetTWIAddr() ) { printf_P(PSTR("Funktioniert")); printf_P(PSTR("%c"), c); } else printf_P(PSTR("Läuft nicht, falsche Adresse")); } die Funktion soll das byte was vom Uart des contrllers kommt (char c) aufsplitten
-
Thread
AVRStudio6.1 Compiler meckert (warnt) bei Struct-Pointer-Übergabe
dir oben gepredigt habe. PSTR ist ein Makro aus [c] #include <avr/pgmspace.h> [/c] das Header File verwendet PSTR, also müsste das Header File diesen Header inkludieren. Tut es aber nicht, statt dessen macht es die test_uart.c
Zu dem PSTR Problem. Ich weiß nicht, wo die Warnung herkommt. Ich hab sie bei mir nicht und ich sehe in den Headerfiles auf meinem System auch keinen Grund, warum die kommen würde. Ich kann sie aber, wenn
-
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
Ulrich Radigs LCD Ansteuerung
die Funktion einen String im Flash erwartet. Deiner liegt aber im RAM. Du kannst den String mit PSTR ins Flash verfrachten, also z.B. so: PSTR("Hallo") http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Vereinfachung_f.C3.BCr_Zeichenketten_.28Strings.29_im_Flash
was ich genau ändern müsste? Ich dachte eigentlich, das hätte ich bereits. lcd_print_P(0,0,PSTR("Time: %2i:%2i:%2i"),hh,mm,ss);
-
Thread
Retro-Projekt: NE555 basierter Elektronischer Würfel in THT
SerialPrintInputOutput(){ snprintf_P( PrintString, countof( PrintString ), // PSTR( "%5d Eingang: A=%c B=%c C=%c D=%c X=%d / Ausgang: M=%c L=%c R=%c Q=%c" ), // rowCnt, cntOut[A], cntOut[B], cntOut[C], cntOut[D], FP, decOut[M], decOut[L], decOut[R], decOut[Q] ); PSTR( "Eingang: A=%c B=%c C=%c D=%c X=%d / Ausgang: M=%c L=%c R=%c Q=%c" ), cntOut[A], cntOut[B], cntOut[C], cntOut[D], FP, decOut[M], decOut[L], decOut[R], decOut[Q] ); Serial.println
-
Thread
avr und c: lcd-anzeige und nutzung von variablen
(code-mäßig), aber einfach: [c] #define STRLEN 15 char s[STRLEN]; int i = 5; sprintf_P(s, PSTR("i = %d"), i); lcd_string(s); [/c]
hinweis. so bin ich jetz auch zu einem prositiven ergebnis gekommen (die variante mit: sprintf_P(s, PSTR("i = %d"), i); wars noch nicht). also allen helfenden nochmal ein dankeschön. bis zur nächsten frage - schöne grüsse vom anfänger
-
Thread
HTML teil des inhalts eines iframes auslesen
EtherShield es=EtherShield(); uint16_t http200ok(void) { return(es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n"))); } uint16_t http404(void) { return(es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 404 OK\r\nContent-Type: text/html\r\
schrieb im Beitrag #2767667: > uint16_t http200ok(void) > { > return(es.ES_fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n"))); > } Also: [c] HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\nAccess-Control-Allow-Origin: *\r\
-
Thread
Stringverknüpfung C/C++
display_item( char* buffer, char* header, uint16_t val, char* > footer) > { > sprintf_P(buffer, PSTR("%S %d %S\n"), header, val, footer); > } > > void test(char* buffer) > { > display_item(buffer, header_1, 1234, footer_1); > } > [/c] > > header, footer können auch als Array mit fester
!= 0) { free(p); } else { size=0; } return sprintf_P(buffer,PSTR("%5u"),size); } [/c]
-
Thread
String aus Progmem lesen
Hallo ihr C-Gurus, ich hätte da mal ein Problem im Atmel Studio 6. Ich möchte einen mittels PSTR im Flash abgelegten String in eine Variable lesen um diesen zu bearbeiten und später anzuzeigen. Ich habe zur Dokumentation mal folgenden (nicht zwingend sinnigen) Testcode geschrieben: [c] int8
} // weitere Verarbeitung von msg_str } void print_str_from_progmem(void) { print_msg(PSTR("Test")); } [/c] Beim Kompilieren erhalte ich dann in der Zeile print_msg(PSTR("Test")); folgende Fehler: Error 1 invalid conversion from 'const char*' to 'char*' [-fpermissive] Error
-
Thread
Speicher voll durch Multiplikation
------------------------------------------------------ #define PRINT(string, ...) printf_P(PSTR(string), ##__VA_ARGS__) static int putchar__(char c, FILE *stream) { uart_putc(c); return 0; } static FILE mystdout = FDEV_SETUP_STREAM(putchar__, 0, _FDEV_SETUP_WRITE); // -------
------------------------------------------------------ #define PRINT(string, ...) printf_P(PSTR(string), ##__VA_ARGS__) static int putchar__(char c, FILE *stream) { uart_putc(c); return 0; } static FILE mystdout = FDEV_SETUP_STREAM(putchar__, 0, _FDEV_SETUP_WRITE); // -------
-
Thread
USART Frage zu Bibliotheken
PORTD |= LED1; while(1) { PORTD ^= LED1 | LED2; _delay_ms(1000); char* pstr = "Hallo\0"; if(bUseLib) { uart0_putstr(pstr); } else { for(const char* pP = pstr; *pP != '\0'; ++pP) { while ( !( UCSRA & (1<<UDRE)) ) {}
-
Thread
c: gcc/avr gleiche/ungleiche varianten of string declarartion
Die Strings müssen mit PSTR auch ins Flash. So liegen nur die Zeiger auf die Strings dort.
weiter rumgesucht laut https://ewiki.e-dschungel.de/software/avr-gcc geht nur variante1?! das PSTR macro kann hier nicht verwendet werden. ... ich will aber die blonde variant2 und bekomm sie nicht, gemein! mt
-
Thread
Char innerhalb einer Funktion in PROGMEM ablegen
Habe folgende Lösung implementiert #define lcd_print_p(__s, __a, __b, __c, __d, __e) lcd_print_P(PSTR(__s), __a, __b, __c, __d, __e) void lcd_print_P( const char* pgmString, int x,int y,int size,unsigned char fc,unsigned char bc ) { char string[40]; strcpy_P( string, pgmString ); lcd_print
define LCD_PRINT_RAM(STR,X,Y) lcd_print (STR, 0, X, Y) #define LCD_PRINT_FLASH(STR,X,Y) lcd_print (PSTR(STR), 1, X, Y) [/c] Ist aber auch Geschmackssache. Schliesslich böte sich noch an, ne eigene, printf-ähnliche Funktion zu schreiben, in der per %-Kommando die print-Koordinaten gesetzt werden
-
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