-
Thread
Kritischen Pfad für den Datenspeicher herausfinden?
kopiert. Schreib die Funktion als lcd_string(const __flash char *) und ruf sie mit lcd_string(PSTR("123456789")) auf. Nun bleibt der String im Flash und braucht kein RAM.
Bibliothek Funktionen anbietet, die direkt aus dem Programmspeicher lesen. ( meist sb lcd_stringP( PSTR("Hallo"));) Gruß Roland
-
Thread
Anzahl der zeichen in String angeben Printf %S
Sooo.. SR ist der string wo ich nur 4 Zeichen ausgeben möchte.. printf_P(PSTR("%-2d %s %-7lu %-2.1f %s %d\r"), address, NA_STRING, system_GetSerialNumber() == 0xFFFFFFFF ? 0 : system_GetSerialNumber(), system_GetHardwareRevision(),
, GetTotalNumberOfErrors()); Mein Ansatz war jetzt: char shortSR[4] = SR; printf_P(PSTR("%-2d %s %-7lu %-2.1f %s %d\r"), address, NA_STRING, system_GetSerialNumber() == 0xFFFFFFFF ? 0 : system_GetSerialNumber(), system_GetHardwareRevision(),
-
Thread
" in String Konstante verwenden? Gesperrt
angeben, wie stellt man das an weil es sind ja gleichzeitig die "Begrenzer"? strcpy_P(buf_main, PSTR("Das ist "der" Test...")); Danke für jeden Hinweis. Grüße AVRli...
strcpy_P(buf_main, PSTR("Das ist \"der\" Test..."));
-
Thread
Frage zur verwendung von strncat
5 ; i++ ) { { strncat(S2, S1[i], 24); /* the next word attach the rear */ strncat_P(S2, PSTR(" "), 24); /* insert space*/ } } ich möchte , dass S2 so aussieht: FF AA BB CC danke
+ ) > { { > strncat(S2, S1[i], 24); /* the next word attach the rear */ > strncat_P(S2, PSTR(" "), 24); /* insert space*/ > } > } > ich möchte , dass S2 so aussieht: FF AA BB CC In Textform oder sollen ersten 4 Bytes von S2 so aussehen? du musst erst mal damit anfangen zwischen
-
Thread
Aus '\n' wird '\0'
CooCox bei. Und so sieht sie aus: [c] /** * @brief Outputs a string on stdout. * * @param pStr String to output. */ signed int puts(const char *pStr) { return fputs(pStr, stdout); } /** * @brief Implementation of fputs using the DBGU as the standard output. Required * for printf(). * * @param pStr String to write. * @param pStream Output stream. * * @return Number of characters written if successful, or -1 if the output * stream is not stdout or stderr. */ signed int
-
Thread
zu wenig RAM ?
#include <avr/pgmspace.h> Statt sprintf() nimmst du dann sprintf_P() sprintf_P(zeit,PSTR("%2i.%2i.%2i %2i:%2i:%2i\t"),y,m,d,h,min,sek); Texte dann mit PSTR("text") umgeben.
-
Thread
Variablen uint16_t hat falsche Werte
sind da nunmal begrenzt. Also Strings kurz halten und brav im Flash liegen lassen via PROGMEM bzw. PSTR
Beitrag #3129795: > Also Strings kurz halten und > brav im Flash liegen lassen via PROGMEM bzw. PSTR ... oder die ganze Sache noch etwas intelligenter (und fauler :-) angehen. [C] void printStars( uint8_t number ) { uint8_t i; for( i = 0; i < number; i++ ) uart_putc( '*' ); }
-
Thread
Flash Speicher wird eng HILFE?
Hi, ich verwende hier ein [c] lcd_puttext(strcpy_P(string20, PSTR("Hello world !"))); [/c] Welches nur Flash-Platz benötigt. Der string20 ist ein "Unversalstring", den ich nach Bedarf nutze ... Damit habe ich gute Erfahrungen gemacht ... Gruß Andreas
lcd_puts_S(prog_char *)" gleichzeitig zur Verfügung zu haben, dann entfällt z.B. bei [c]lcd_puts_S(PSTR("blub"))[/c] die Initialisierung des Strings im RAM. Das wirkt sich üblicherweise positiv auf den RAM- und den Flash-Verbrauch aus. Vierter Punkt: Solche unnötigen Animationen sind doch einfach
-
Thread
gcc gibt Fehlermeldung, auf anderem PC nicht
initialisiert sein */ fdevopen(Send_char_via_USART, NULL, 0); /* string aus dem FLASH */ printf_P ( PSTR("-----------------------------------------\r\n")) ; printf_P ( PSTR( "* START * " __DATE__" " __TIME__ "\r\n")) ; /* HAUPTSCHLEIFE: Run forever */ for (;;) { } /* Ende for (;;) */
-
Thread
Empfangenen asci string als c-code ausführen
zuweisen. Also etwas so [c] char *left, *right; parseInput(&left, &right); if(strcmp_P(left, PSTR("period")) == 0) period = atoi(right); else if(strcmp_P(left, PSTR("andereVariable")) == 0) andereVariable = atoi(right); else uart_puts("Fehler: Variable nicht vorhanden!\n"); [/c
-
Thread
ks0108-atmega32
ks0108ReadFontData, BLACK); // Set a position ks0108GotoXY(15,10); // Print some text ks0108Puts_P(PSTR("KS0108-Treiber")); // a nice little round rect ks0108DrawRoundRect(5, 5, 117, 20, 8, BLACK); // Once again :) // Select a font ks0108SelectFont(Corsiva_12, ks0108ReadFontData, BLACK); // Set a position ks0108GotoXY(5,30); // Print some text ks0108Puts_P(PSTR("http://www.apetech.de\nmailto:me@apetech.de")); while(1); } auf dem datenblatt ist das lcd mit dem lpt verbunden und dabei ist reset fest auf 5V, das wäre dann doch quasi activ high, oder?
-
Thread
scanf_p unsigned char / Einlesen von Werten 0-255
einlesen? Ich habe es bisher nur für char Werte geschafft. uint8_t temp2[MESSAGE_LENGTH]; scanf_P(PSTR("%s"),&temp2); Ich möchte Nachrichten nicht im Klartext übertragen, sondern den vollen Zahlenvorrat nutzen. Eine Nachricht wie z.B. FF FF FA soll auch so in temp2 abgelegt werden. Kontroller:
Sebastian W. schrieb im Beitrag #2678779: > uint8_t temp2[MESSAGE_LENGTH]; > scanf_P(PSTR("%s"),&temp2); > > Ich möchte Nachrichten nicht im Klartext übertragen, sondern den vollen > Zahlenvorrat nutzen. Eine Nachricht wie z.B. FF FF FA soll auch so in > temp2 abgelegt werden.
-
Thread
flash struct mit flash string pointern auslesen
geschoben wird b) Der ganze Ausdruck als die Adresse von "c-im_Flash" evaluiert. Sieh dir an, wie zb PSTR in pgmspace.h definiert ist. [C] # define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];})) [/C] da muss schon etwas mehr Aufwand getrieben werden, um etwas inline ins Flash zu
String angelegt! Das müsste doch dann [C] const ST_BYTE_RESLV g_stCmdBase[] PROGMEM = { { PSTR( "+" ), GSM_CmdExt0 }, [/C] lauten. Also einen String, statt einem einzelnen Character.
-
Thread
string an Funktion übergeben - Problem Speicherverbrauch RAM
welchen Speicher er zeigt. Normalerweise geht man vom RAM aus. Sparen kann man so: [c] puts_P(PSTR("Hallo")); [/c] PSTR sagt dem Compiler, dass dieser String NICHT ins RAM kopiert werden soll. Da puts jedoch nicht aus dem Programmspeicher lesen kann (da er über andere Maschinen-Befehle angesprochen
-
Thread
UART Problem mit Fleury Lib
stehen: [c] /* * Transmit string from program memory to UART */ uart_puts_P(PSTR ("String stored in FLASH\n")); [/c] ^^^^^^ ^ Gruß Carsten
stehen: Tut er. uart_puts_P ist bei Fleury ein Makro #define uart_puts_P(x) uart_puts_p( PSTR(x) )
-
Thread
AVR startet neu beim Lesen von Strings im Flashspeicher
komisches Problem beim Programmieren meines atmega32. Wenn ich eine bestimmte Anzahl an Strings mit dem PSTR() Makro in den Flashspeicher lade, startet der AVR beim Ausgeben des letzten Strings neu. Das ist reproduzierbar, also wenn ich einen String auskommentiere kann ich dafür einen neuen Einfügen. So habe
Grafikeinheit und MMC-Reader) eh abbricht. Auf jeden Fall ist es einfach so dass anscheinend zu viele dieser PSTR() strings vorhanden sind. Hat jemand Erfahrungen mit diesem Problem?
-
Thread
Wie Strings aus dem PROGMEM holen
mit kleinem p) übergeben wird. Gemacht ist es so [C] #define LCD_printf_P(x) LCD_printf_p( PSTR(x) ) [/C] Das PSTR Makro sorgt dafür, dass der konstante Text im Flash bleibt.
-
Thread
AtMega ehwiges Fuse Thema 16 Mhz Quarz
automatically put a string constant into program memory */ #define uart1_puts_P(__s) uart1_puts_p(PSTR(__s)) /**@}*/ #endif // UART_H [/code] gruß daniel
im RAM. Du kannst mit der Lib aber auch Texte aus dem Flash ausgeben. Das sollte mit uart1_puts_p(PSTR("STRING IM FLASH")) gehen. cu Georg
-
Thread
AVR Flash jenseits der 64kB
wieder Inline-Assembler Makros. Richtig? Nö, eigentlich nicht. Außer du brauchst Äquivalente zu PSTR bzw. FSTR. Die __flashN und __memx Adressen können alle via __memx zugegriffen werden, und __memx verdaut auch RAM-Adressen, ist allerdings aufwändiger mit seinen 3-Byte Adressen. Eine Linkerskipt-Erweiterung
Inline-Assembler Makros. Richtig? > > Nö, eigentlich nicht. Außer du brauchst Äquivalente zu PSTR bzw. FSTR. Falsch gedenkt: Auch für Äquivalente zu PSTR / FSTR braucht man natürlich /kein/ Inline-Asm.
-
Thread
KS0108_Library
ks0108ReadFontData, BLACK); // Set a position ks0108GotoXY(15,10); // Print some text ks0108Puts_P(PSTR("KS0108-Treiber")); // a nice little round rect ks0108DrawRoundRect(5, 5, 117, 20, 8, BLACK); // Once again :) // Select a font ks0108SelectFont(Corsiva_12, ks0108ReadFontData, BLACK); // Set a position ks0108GotoXY(5,30); // Print some text ks0108Puts_P(PSTR("Hallo")); while(1); }[/c] Hätte da jemand noch eine Idee was ich tun bzw wie ich am besten anfange bin bissel ratlos.
-
Thread
itoa in sprintf
nicht ist? Das _P ist die Kennung dafür, dass das ein Makro ist, welches seinerseits wieder ein PSTR auf das erste Argument einfügt. Keine ahnung ob das heute noch gebräuchlich ist. Ich habs das erste mal bei P.Fleury gesehen.
? > > Das _P ist die Kennung dafür, dass das ein Makro ist, welches > seinerseits wieder ein PSTR auf das erste Argument einfügt. > Keine ahnung ob das heute noch gebräuchlich ist. Ich habs das erste mal > bei P.Fleury gesehen. Halt. Kommando retour. Stimmt nicht. Ist kein Makro. Gute
-
Thread
AVR "verhakt" sich
folgendes ab: [c] if (!(ok = smbatt.Read(SMC_VOLTAGE, &u_ist))) continue; sprintf_P(str, PSTR("%-12s: %i mV\r\n"), "U Ist", u_ist); uart_puts(str); [/c] Dieser Block steht öfters (ca. 13 mal) nacheinander, nur eben mit anderen Registern (SMC_VOLTAGE...). Am Ende dieses Blocks wird geregelt
Werner schrieb im Beitrag #2357325: > sprintf_P(str, PSTR("%-12s: %i mV\r\n"), "U Ist", u_ist); > uart_puts(str); Wie ist "str" definiert?
-
Thread
Problem mit Binärübertragung - minicom dran schuld?
{ if (i%16 == 0) { // Adressen alle 16Byte anzeigen uart_puts_p(PSTR("\n")); uart_putdw_hex(i); uart_puts_p(PSTR(": ")); } // Zeichen einlesen uint8_t c = uart_getc(); // Ausgeben, wenn druckbar if (c > 0x1F && c <
-
Thread
Arduino delay(ms) in ISR?
die liegt dann im RAM. Am besten sieht man das IMO bei Strings. Es gibt bei den AVRs ja das Makro PSTR(string). Hinter PSTR verbirgt sich aber nur eine Anweisung für den Compiler den String nicht ins RAM zu kopieren, was er sonst machen würde, sondern ihn im Flash zu lassen.
-
Thread
delay auf atmega für onewire
zusammen, daher habe ich folgendes gemacht ------ #include <avr/delay.h> . . . printf_P (PSTR("=> start 5sec\r\n")); _delay_us(5000000); printf_P (PSTR("=> stop 5sec\r\n")); ------ das sollte doch 5 sec pause machen, oder? auch die quellen von http://www.siwawi.arubi.uni-kl.de/avr_projects
-
Thread
Fliesskomma ARM7 GCC
short i=65; float f; f=i*1.23; sprintf (str, "Aktueller ADC-Wert: %d %f\r\n", i, f); DbguPStr(str); Ich glaube, es liegt am makefile. Habe in google etwas über mfloat-abi gelesen, aber nicht verstanden, wo das hin soll. Weiss da jemand Rat? Danke Hannes
(); f=i*1.23; sprintf (str, "Aktueller ADC-Wert: %d %f\r\n", i, f); DbguPStr(str); } }
-
Thread
ihex vs binary unterschiedlicher Code
[1], dns_server_ip[2], dns_server_ip[3]); #define usart_write(format, args...) usart_write_P(PSTR(format) , ## args) void usart_write_P(const char *Buffer,...){ va_list ap; va_start (ap, Buffer); int format_flag; char str_buffer[10]; char str_null_buffer[10]; char move
ist ein [c] usart_write_char("Test"); [/c] kommt vollständig an aber ein [c] usart_write_P(PSTR(format) , ## args) [/c] nur verstümmelt. Es fehlen die ersten chars. Ich werde mal versuchen das auf einen Atmega64 zu testen. Aber wie Jörg schon sagte sind beide Files gleich. @Jörg Wie
-
Thread
Erweiterter NEC IR Empfänger
get_nec_data(); if (necdata != IRNEC_NOREC) { set_cursor(0,0); lcd_pstring (PSTR ("NEC: ")); if ((((uint8_t)(necdata >> 8) & 0xff) ^ (uint8_t)(necdata & 0x00ff)) != 0xff) { lcd_pstring (PSTR ("error")); } else {
-
Thread
Librarys einbinden - glcd (Ks0108) Test
ks0108ReadFontData, BLACK); // Set a position ks0108GotoXY(15,10); // Print some text ks0108Puts_P(PSTR("KS0108-Treiber")); // a nice little round rect ks0108DrawRoundRect(5, 5, 117, 20, 8, BLACK); // Once again :) // Select a font ks0108SelectFont(Corsiva_12, ks0108ReadFontData, BLACK); // Set a position ks0108GotoXY(5,30); // Print some text ks0108Puts_P(PSTR("http://www.apetech.de\nmailto:me@apetech.de")); while(1); } Fragen: 1:include Wie muss der #include Befehl aussehen? Hier steht bei mir noch: #include "ks0108.h" Reciht das "ks0108
-
Thread
ADC Programm
einen long: unsigned int Vin = ADC*3300L/1024; // Result in mV und zur Ausgabe: printf_P(PSTR("Vin = %d.%03dV\r\n"),Vin/1000,Vin%1000); Man beachte das dezente 'L' hinter '3300'.
@Rolf Das mit div() scheint interessant zu sein: printf_P(PSTR("Vin = %d.%03dV\r\n"),div(Vin,1000)); ist fies, könnte aber zum erhofften Ergebnis führen, da der struct gleich wieder exakt in der gewollten Reihenfolge auf den Stack kommt. Aber das nur am Rande
-
Thread
assembler-routinen in C++: function-names
lcd.o mprintf.o uuprintf.o unter KDevelop übersetzt. In avrthermometer2.c steht u.a: const char pstr1[] PROGMEM = "Temp = %\000C "; extern void uuprintf_P(char *s, const char *ff, uint16_t n); ... int main(void) { ... char A[20]; uuprintf_P(A, pstr1, (uint16_t) ScratchPad[0]>>1)
-
Thread
Löscher einzelner Werte auf einem Graphikdisplay
ks0108SelectFont(Arial8, ks0108ReadFontData, BLACK); ks0108GotoXY(28,20); // Angabe Position ks0108Puts_P(PSTR(" ")); // Ausgabe P ks0108GotoXY(30,20); ks0108Puts(Buffer); [/c] Leider wird bei dem nächsten Lauf der alte Messwert nicht überschrieben. Einzelne Pixel bleiben weiter sichtbar. Nach ca 5 bis 10 Durchlauf ist nur noch ein schwarzer Fleck auf dem Display. [c] ks0108Puts_P(PSTR(" ")); // Ausgabe P [/c] Mit dieser Zeile wollte ich eigentlich den alten Messwert löschen, geht aber nicht. Das ganze Display kann ich auch nicht löschen und jedesmal neu schreiben.Die
-
Thread
Arduino mit "ethercard" Library
basteln. Da gibt es einen Befehl mit dem man per HTTP Webseiten abrufen kann... ether.browseUrl(PSTR("/foo/"), "bar", website, my_callback); Diesen Befehl will ich nutzen um eine Variable per HTTP GET an meinen Server zu übertragen. Funktioniert auch technisch wenn ich z.B. einen String eingebe... ether.browseUrl(PSTR("/script.php?daten="), "test", website, my_callback); ...ich bekomme anstelle von "test" jedoch keine Variable hin. Arduino 1.0 gibt mir immer eine Fehlermeldung aus: invalid conversion from 'int
-
Thread
optimierung und itoa
Strings [c] lcd_text( (u8*) "Ex Interval:"); [/c] in "ExI" o.Ä. Saubere Lösung: pgmspace.h, PSTR, lcd_text_P.
> lcd_text( (u8*) "Ex Interval:"); > [/c] > in > "ExI" o.Ä. > > Saubere Lösung: pgmspace.h, PSTR, lcd_text_P. genau, PROGMEM für diese Konstanten verwenden, dann landen die im Flash. Dann ggf. den Pointer drauf holen und weiterverwenden: char *pText = .... Strings sind - wie mein Vorredner
-
Thread
Strings in .data sichtbar machen per avr-nm
Hallo! Angenommen ich verwende auf dem AVR printf("foo") statt printf_P(PSTR("foo")), dann wird der const char* ja im Flash ablegt, dann aber von der startup-Routine in die .data-Sektion kopiert (die im SRAM liegt). Wenn ich mir das mit avr-size ansehe, sehe ich da auch den
Ja, ich hatte das mit den durch PSTR generierten Symbolen verwechselt, die bekommen einen Namen. Die .data-Symbole haben keinerlei Debug- Information, davon übernimmt der Assembler keinerlei symbolische Information in die Objektdatei