-
Thread
eeprom_write_block und Fleury urat lib Problem
pgmspace.h> #include <avr/eeprom.h> #include "uart.h" #define PRINT(string, ...) printf_P(PSTR(string), ##__VA_ARGS__) uint8_t Vdata[3]; uint8_t eedata[] EEMEM = { 18, 3, 72 }; int putchar__(char c, FILE *stream) { uart_putc(c); return 0; } FILE mystdout = FDEV_SETUP_STREAM(putchar
-
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
"0" in vorschieben wenn nur einstellig.
mail_auth_str)+1); memcpy_P(ð_buffer[TCP_DATA_START_VAR+strlen(mail_auth_str)],PSTR("\r\n"),2); [/c] ist einfach nur grober Unfug.
> sprintf_P( &mail_buffer[z], PSTR("\r\n\r\nDämmerung: %02i:%02i:%02i"), > (int)iDaemmerung_hh),(int)iDaemmerung_mm),(int) > iDaemmerung_ss ); was soll eigentlich diese int casterrei? http://www.gnu.org/software/libc
-
Thread
Retro Fieber: Z80 oder 68000 ?
Anpassungen machen: [c] #ifdef unix #include <termio.h> #include <fcntl.h> #define PROGMEM #define PSTR(x) (x) #define pgm_read_byte(s) (*s) #elif defined (DEIN_Z80_KRITERIUM) // NEU #define PROGMEM // NEU #define PSTR(x) (x) // NEU #define pgm_read_byte(s) (*s) // NEU #else #include <avr/io.h> #include <avr/pgmspace.h> #include <avr/interrupt.h
-
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
was passiert bei fehlerhafter Adresse im I2C-Bus?
status = I2C_init(I2Cx); // initialize I2C peripheral if(status) goto error; printf_P(PSTR("\fScan I2C adresses\n\a")); /* Check for I2C devices */ printf_P(PSTR("I2C=\a")); for(uint8_t i=0x00; i<0x7F; i++) { printf_P(PSTR("0x%2x\a"),i<<1); status = I2C_ping(I2Cx,i<
fallthrough default: // Unterwarte Faelle I2C_reset(I2Cx); printf_P(PSTR("TO=%2x,%2x \a"),i<<1,status); } delay_us(50000); } printf_P(PSTR("\b\b\b\bdone. \a")); while(!key_getstroke()); return; error: I2C_reset(I2Cx); printf_P(PSTR
-
Thread
STM32F4 printf für float implementieren
char, if you want to use printf(), * you need implement this function * * @param pStr Storage string. * @param c Character to write. */ void PrintChar(char c) { if (c == '\n') { while (!(USART1->SR & 0x0080)); USART1->DR = 0x0D; } while (!(USART1
* * @param pStr Storage string. * @param pSource Source string. * @return The size of the written */ signed int PutString(char *pStr, const char *pSource) { signed int num = 0; while (*pSource
-
Thread
Keine GPS Datenanzeige auf GLCD Display (Navilock 552ettl)
ob Schleife bis hierher gelangt, wenn ja, wird uart_gets abgearbeitet lcd_puts_p(small_font,PSTR("Line")); _delay_ms(12000); lcd_clear(); _delay_ms(1500); } return 0; } [/C]
-
Thread
Arduino Serial ganze wörter abfragen
MY_EEP_VAR.backlicht])); con_hell_stat(true); } else { sprintf_P(s_out_str, PSTR("hellxx (%d)-(%d)"), MIN_BL, MAX_BL); Serial.println(s_out_str); } } // if( !strcmp(serial_in_command, "hell??") ) } // if( strstr(serial_in_command, "hell") ) #include "c-source\eif_con.c
-
Thread
__flash Variable als Parameter
von PROGMEM nach __flash umschreiben will. I.d.R. bekommt man zu viele Warnungen, zum Beispiel für PSTR, das ja formal immer noch im Address-Space "generic" liegt.
-
Thread
was bewirkt "usart_write_P(PSTR(format) , ## args"
schrieb im Beitrag #3671081: > in usart.h: > #define usart_write(format, args...) usart_write_P(PSTR(format) , ## > args) Wichtig ist dabei, daß nach ## /kein/ Zeilenumbruch erfolgt, also [c] #define usart_write(format, args...) usart_write_P(PSTR(format) , ##args) [/c] Eine weitere
Der Übersichtlichkeit wegen ohne expandiertes PSTR Makro.
-
Thread
Probleme mit Übergabe eines Arrays
Operationen benutzen, die die Zusicherung geben, den String nicht zu verändern [c] const char* pStr = uart_return_rx_buffer_address(); size_t len = strlen( pStr ); // Ist ok, denn strlen gibt die Zusicherung // den String nicht zu verändern [/c] du kannst ihn aber nicht dazu benutzen, den String zu verändern [c] const char* pStr = uart_return_rx_buffer_address(); pStr[0] = 'a'; // Fehler. pStr zeigt auf einen konstanten String strcpy( pStr, "Hallo" ); // Fehler: der ganze String in pStr ist nicht änderbar
-
Thread
Minimal UART für Attiny gesucht
(ch)) return -1; s++; } return 0; } #define dbg_serial_print_P(__s) dbg_serial_print_p(PSTR(__s)) #define dbg_serial_print_P_nonblock(__s) dbg_serial_print_p_nonblock(PSTR(__s)) void dbg_serial_print_maxlen (char * s, unsigned int maxl) { unsigned char ch; //unsigned int ii; //while
-
Thread
AVR-GCC: PSTR(__func__)
ich habe gerade mal wieder ein Verständnisproblem mit den Flash-Makros: [c] fprintf_P(stderr,PSTR("hallo")); // geht fprintf_P(stderr,PSTR(__func__)); // geht nicht fprintf_P(stderr,PSTR(__DATE__)); // geht fprintf_P(stderr,PSTR(__LINE__)); // geht nicht (da Integer) [/c] Was ist am Makro __func__ so besonderes, daß es im Zusammenhang mit "PSTR" nicht funktioniert? Viele Grüße W.T.
-
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
Umstieg von ATmega16 auf ATmega32
= 0; } if (u8NN == 7) { flagge7 = 1; } // uart_puts_p( PSTR("TimerTick=")); // PrintLongCR( gu32_Ticks ); }; // Tickcounter }; //main loop Ende }; // ******************* MAIN END ******************************************** }[/c]
-
Thread
Unterschied #define und Funktion?
später tretminenartig für Probleme sorgen... > Ich kann leider kein C++, aber wie kriegst du das PSTR() da rein? Kommt drauf an wie das mit dem PSTR funktioniert... Im Zweifelsfall immer im Usercode (vergessen resultiert ja hoffentlich in einem Compiler-Error), denn da gehört die Speicherart sowieso
definiert sind, möchte man Makros lieber gleich ganz verbieten. >> Kommt drauf an wie das mit dem PSTR funktioniert... Im Zweifelsfall >> immer im Usercode (vergessen resultiert ja hoffentlich in einem >> Compiler-Error), denn da gehört die Speicherart sowieso hin. > > #define PSTR(s) ((const PROGMEM
-
Thread
ATmega resettet dauernd
Beitrag #3602947: > uart_puts_P("Hallo\n"); Wahrscheinlich sollte das uart_puts_P(PSTR("Hallo\n")); lauten, oder täusch ich mich?
dafür gibts ja #define uart_puts_P(__s) uart_puts_p(PSTR(__s)) im header.
-
Thread
avr-gcc progmem immer noch?
(a) (*a) #define flash #define PSTR(a) (a) #define strlen_P strlen #define strncpy_P strncpy #define snprintf_P _snprintf // _snprintf nicht ganz kompatibel zu #define snprintf _snprintf // snprintf, aber hier reicht
String direkt (ohne eine Variable erstellen zu müssen) im Flash abzulegen, also ein Äquivalent zum PSTR() Makro? Edit: Auch ich hätte wohl erstmal genau gucken sollen. Die Antwort findet sich im Wiki und lautet: FSTR(), wobei es trotzdem noch einmal Unterschiede zu PSTR() gibt. So ganz einschätzen
-
Thread
Switch mit Vergleichsoperatoren Marke Eigenbau
c] if (position >= 10000) //100er Stelle lcd_puts_p(numbersbig,PSTR(".")); else if (position >= 1000) //10er Stelle lcd_puts_p(numbersbig,PSTR("./")); else if (position >= 0) //1er Stelle lcd_puts_p(numbersbig,PSTR
,PSTR("/")); [/c]
-
Thread
AVR-GCC: const __flash struct mydata_t *[4]
kleines Mock-up gemacht: [c] // Struct und seine Inhalte void dummyfkt(void) { glcd_putstr_P(PSTR("Ich schreibe also bin ich")); glcd_drawnow(); } int16_t dummyvar = 0; const __flash char TEXT1[] = "Hallo"; const __flash char TEXTN[] = {'\0'}; typedef struct { const __flash
}; // Test void test(const __flash mydata_t *(data[])) { snprintf_P(glstr_Buf,N_TEXTBUF,PSTR("hallo")); glcd_putstr(glstr_Buf); glcd_drawnow(); voidFcn_t fkt; fkt = data[1]->fktpointer; fkt(); // Geht schief snprintf_P(glstr_Buf,N_TEXTBUF,&(data[1]->text)); // Geht auch
-
Thread
STM32: Suche Hilfe zu ADC
ADC-Routinen (Multiplex und Interrupt-Aufruf) */ void edm_test_adc(void) { printf_P(PSTR("\fTest EDM-ADC \n" "Beenden durch Knopfdruck\a")); edm_adc_init(); printf_P(PSTR("Init OK\n\a")); edm_adc_start(); printf_P(PSTR("Start OK\n\a")); while(!key_getstroke()
ADC1ConvertedValues[7], ADC1ConvertedValues[8],ADC1ConvertedValues[9]); printf_P(PSTR("|%4u,%u|"),gl_a,gl_b); printf_P(PSTR("\n\a")); } } [/c] Warum steht in "gl_a" 19? Nirgendwo wird hineingeschrieben, die Variable kommt in keiner anderen Datei vor und globale Variablen werden
-
Thread
STM32 ADC sättigt zu früh
ADC_Cmd(ADC1,ENABLE); ADC_SoftwareStartConvCmd(ADC1,ENABLE); adc_calib(ADC1); printf_P(PSTR("\fADC Test Poti 1 \n\a")); // Kann als Dauerschleife angesehen werden while(!key_getstroke()) { value = ADC_GetConversionValue(ADC1); glcd_setpos(128); printf_P(PSTR("val=%6i\a"),value); delay_us(100); } printf_P(PSTR("\b\b\b\bdone. \a")); return; error: printf_P(PSTR("\nError \a")); while(!key_getstroke()); } // end function [/c] Erläuterung: - key_getstroke() liefert immer 0 zurück
-
Thread
STM32 I2C mit EEPROM - funktioniert nur zuverlässig mit Bus-Sniffer
das Warten auf das Busyflag vor dem Senden der Startbedingung ausgelagert wurde. "printf_P" und "PSTR" sind nur definiert, um Kompatibilität mit einem AVR zu behalten und sind definiert als: [c] #define PSTR(a) (a) #define printf_P printf [/c]. Die Funktion key_getstroke() wartet auf einen Tastendruck
-
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
Programm von mega32 auf mega328P convertieren
code] void sendHeader(uint8_t toAddr, uint8_t myAddress) { char buffer[6]; uartPuts_p(PSTR("@")); uartPuts(uint8ToAh(buffer, toAddr)); uartPuts(uint8ToAh(buffer, myAddress)); } [/code] Ich denke man versteht was ich hier mache. Sowas kommt öfters vor, also verschachtelte Funktionen
-
Thread
werbserver uip easyweb datenaustausch ethernet arm
application_state *app_state)) { PSOCK_BEGIN(&app_state->socket); PSOCK_SEND_STR_P(&app_state->socket, PSTR("Welcome\n")); PSOCK_END(&app_state->socket); } // Process TCP connection. This is called by inetd in case of events // related to a connection and also periodically. void socketd_appcall