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!
RAM. Ich arbeite mit dem ATmega32. Gibt es noch andere Möglichkeiten ausser: 1) PrintString(PSTR("Hallo")); oder 2) #define PrintString(__pstr,x) PrintString_P((PSTR(__pstr)),x) PrintString("Hallo"); Danke für alle Hilfe. :)
Header-File als Schnittstelle liefern: void PrintString (uint8_t *String); anstatt: #define PrintString(__pstr,x) PrintString_P((PSTR(__pstr)),x) Ist das irgendwie hinzubekommen? :)
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
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
buffer,10); writeString(buffer); } int main() { initLCD162C(); writeStringP(PSTR("Hello World")); while(1){} } [/c] Das geht so. Aber wenn ich in der initLCD162C() anstatt [c] cmd4(CMD_CONFIG | CONFIG_2LINE);[/c] folgendes [c]cmd4(CMD_CONFIG | CONFIG_1LINE | CONFIG
Ersetze alle Vorkommnisse von strcmp (Variable, "abcdefgh") durch strcmp_P (Variable, PSTR("abcdefgh")) Dann bleiben die Stringkonstanten im Flash. Das Makro PSTR liefert eine Adresse aus dem Flash und nicht aus dem RAM zurück, strcmp_P() ist die äquivalente Form von strcmp, liest aber
to automatically put a string constant into program memory */ #define uart_puts_P(__s) uart_puts_p(PSTR(__s)) /** @brief Initialize USART1 (only available on selected ATmegas) @see uart_init */ extern void uart1_init(unsigned int baudrate); /** @brief Get received byte of USART1 from ringbuffer. (only
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]
display oder viel "strings" ? Dann bestudiere dich mal die F() funktion von Arduino oder print_P(PSTR()) funktionen von C. http://playground.arduino.cc/Learning/Memory Dabei denke ich das mann besser z.B. einen 2/4/8 Gb sd-karte benutzen kann als extra memory. Flexibeler und heutzutage mehr standard
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
*_impure_ptr = &r; /** * @brief Writes a character inside the given string. Returns 1. * * @param pStr Storage string. * @param c Character to write. */ signed int PutChar(char *pStr, char c) { *pStr = c; return 1; } /** * @brief Writes a string inside the given string. * * @param pStr Storage string
to automatically put a string constant into program memory */ #define uart_puts_P(__s) uart_puts_p(PSTR(__s)) /** @brief Initialize USART1 (only available on selected ATmegas) @see uart_init */ extern void uart1_init(unsigned int baudrate); /** @brief Get received byte of USART1 from ringbuffer. (only
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( '*' ); }
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.
indication that this function is going to accept a "program-space string". Note also the use of the PSTR() macro. Back to FAQ Index. 11.21 Why does the compiler compile an 8-bit operation that uses bitwise opera- tors into a 16-bit operation in assembly? Bitwise operations in Standard C will automatically
als auch auf Ram aufgelöst und separat behandelt werden können. Z.B. so: Uart << "TextImRam" << PSTR("TextImFlash"); Wahrscheinlich geht das nicht, da ja letztendlich beide Pointer gleich aussehen (word auf die Adresse). Wenn ich aber den << Operator wie folgt deklariere: CUart& operator << (
(z.B. Uart << (flChar_t)PSTR("TextImFlash");) Gibt es vielleicht doch eine halbwegs elegante Lösung für dieses Problem?
; }; 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
value .endmacro .macro pmsg ;print message at @0 using z ldi zl,low(@0<<1) ldi zh,high(@0<<1) rcall pstr .endmacro .macro outw ;output word @1 to @0 using z ldi zl,low(@1) ldi zh,high(@1) out @0h,zh ;word order high first out @0l,zl .endmacro ; reset and interrupt vectors ; jmp reset ; Reset handler jmp
to automatically put a string constant into program memory */ #define uart_puts_P(__s) uart_puts_p(PSTR(__s)) /** * @brief Return number of bytes waiting in the receive buffer * @param none * @return bytes waiting in the receive buffer */ extern int uart_available(void); /** * @brief Flush bytes waiting
mischmasch_t m; memcpy_P(&m, mischmasch_array + i, sizeof(*mischmasch_array)); printf_P(PSTR("i = %u, a = %u, b = %i, c = %u, d = %i\n"), i, m.a, m.b, m.c, m.d); } }[/c]
to automatically put a string constant into program memory */ #define uart_puts_P(__s) uart_puts_p(PSTR(__s)) /** @brief Initialize USART1 (only available on selected ATmegas) @see uart_init */ extern void uart1_init(unsigned int baudrate); /** @brief Get received byte of USART1 from ringbuffer. (only
to automatically put a string constant into program memory */ #define uart_puts_P(__s) uart_puts_p(PSTR(__s)) /** @brief Initialize USART1 (only available on selected ATmegas) @see uart_init */ extern void uart1_init(unsigned int baudrate); /** @brief Get received byte of USART1 from ringbuffer. (only