-
Thread
Variable auf LCD ausgeben
geht nicht: ks0108Puts_P(PSTR( Buffer2 )); da kommt ks0108Test.c:76: error: invalid initializer
Klar. PSTR liefert einen Pointer auf einen konstanten String im FLASH. Ich sehe in deinem geposteten Code die Definition buffer2 nicht. Aber ich könnte wetten, dass zu 99,9999% buffer2 kein Pointer auf einen
-
Thread
Daten aus dem Flash
TEXT3 im Flash gespeichert sein. // Ausgabe void printLCD (PGM_P texte[3]) { printf_P(PSTR("%s"), texte[0]); printf_P(PSTR("%s"), texte[1]); printf_P(PSTR("%s"), texte[2]); } // Funtionsaufruf ??? printLCD(texte); [/c] was ist noch falsch?
>void printLCD (PGM_P texte[3]) Eher so void printLCD (PGM_P texte[][6]) > printf_P(PSTR("%s"), texte[0]); printf_P(PSTR("%s"), &texte[0]); MfG Falk
-
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
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
2 Dateien gleichzeitig öffnen (Roland Riegel LIB)
struct fat16_file_struct* fd1 = open_file_in_dir(fs, dd, "temp.txt"); if(!fd1) { uart_puts_p(PSTR("error opening1 ")); } //search file in current directory and open it struct fat16_file_struct* fd2 = open_file_in_dir(fs, dd, "temp2.txt"); if(!fd2) { uart_puts_p(PSTR("error opening2 "))
-
Thread
WinAVR hilfe zu \r\n und Optimierung
eben an \r nicht automatisch ein \n angehangen wird. Also noch einmal: [c] while(1) { puts_P(PSTR("\r\nAVR>")); get_command(&cmds, &cmdl); cmdp = cmds; switch(*cmdp++) ... } Die Zeile puts_P(...) gibt das besagte AVR> aus. Die Absicht dahinter ist, dass man bei den ganzen Kommandos und deren
-
Thread
SD-Karten Initalisierung - ACMD41 gibt nur 0x01 zurück
SPI_CLK)|(1<<SPI_MOSI); MMC_DDR&=~(1<SPI_MISO); // POWER OFF #if MMC_DEBUG printf_P(PSTR("\nMMC: Start...\n")); printf_P(PSTR("\nMMC: Power Off...")); #endif PORTC&=~(1<<PC4); MMC_PORT&=~(1<<MMC_CS); _delay_ms(1000); // POWER ON #if MMC_DEBUG printf_P(PSTR(
0x00; cmd[2] = 0x00; cmd[3] = 0x00; cmd[4] = 0x00; cmd[5] = 0x95; #if MMC_DEBUG printf_P(PSTR("MMC: Send CMD0...\n")); #endif // Command CMD 0 RES should be 0x01 for IDLE STATE res=255; while(res!=1) { res=send_cmd(1); #if MMC_DEBUG printf_P(PSTR("MMC: CMD0
-
Thread
Problem mit C und API (LineTo etc)
**********/ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hWnd; MSG msg; WNDCLASS wc; char szAppName[] = "API Testprogramm"; double time; int wert,wert1; wc.cbClsExtra
-
Thread
Webserver ATmega32/644DIP ENC28J60
],"LED1=1\0")!=0){PORTA ^= (1<<PA0);} ersetzen durch if{ strcasestr_P((char*)ð_buffer[a],PSTR("LED1=1"))!=0){PORTA ^= (1<<PA0);} Und memmove(&var_conversion_buffer, "EIN\0", 4); ersetzen durch strcpy_P(var_conversion_buffer, PSTR("EIN")); Gruß holger
habe das Servo nur zum Test ganz Primitiv eingebunden: [c]if(strcasestr_P((char*)ð_buffer[a],PSTR("LED3=3"))!=0){tmp |=(1<<PA2);} if(strcasestr_P((char*)ð_buffer[a],PSTR("LED4=4"))!=0){tmp |=(1<<PA3);} if(strcasestr_P((char*)ð_buffer[a],PSTR("LED5=5"))!=0){tmp |=(1<<PA4
-
Thread
printf_P aus Flash funktioniert scheinbar nicht
Nachtrag: printf_P(PSTR("Hallo !"));
[c] #define myprintf(fmt, ...) printf_P(PSTR(fmt), ##__VA_ARGS__) [/c]
-
Thread
Webserver mit UIP Stack und NTP-Client
/ UTC +1h conv_time(timestamp, ¤t_time); // in struct time umrechnen printf_P(PSTR("NTP: Time is %02d.%02d.%04d %02d:%02d:%02d Day=%d\r\n"), current_time.day, current_time.month, current_time.year, current_time.hour, current_time.minute,
u16_t *ntpserver) { if(ntp_conn != NULL) { uip_udp_remove(ntp_conn); } printf_P(PSTR("NTP uses Server %d.%d.%d.%d\r\n"), ntpserver[0] & 0xFF, ntpserver[0] >> 8, ntpserver[1] & 0xFF, ntpserver[1] >> 8); ntp_conn = uip_udp_new(ntpserver, 123); } /*----
-
Thread
String aneinander reihen
für Ausgabe von unsigned int reichen itoa(Zahl1, string, 10); buf[0] = '\0'; strcat_(buf, PSTR("Drehzahl: ")); strcat(buf, string); strcat_P(buf, PSTR(" U/min ")); strcat_P(buf, PSTR(" Spannung: ")); itoa(Zahl2, string, 10); strcat(buf, string); strcat_P(buf, PSTR("Volt
Ausgabe von unsigned int reichen itoa(Zahl1, string, 10); buf[0] = '\0'; strcat_P(buf, PSTR("Drehzahl: ")); strcat(buf, string); strcat_P(buf, PSTR(" U/min ")); strcat_P(buf, PSTR("Spannung: ")); itoa(Zahl2, string, 10); strcat(buf, string); strcat_P(buf,
-
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
String-Arrays im Flash-Memory bei AVR-GCC?
aReg16Names[][] PROGMEM = { "abc", "def", "ghi"}; .. geht nicht const char *aReg16Names[] PROGMEM = { PSTR("abc"), "def", "ghi"}; ..: "error: braced-group within expression allowed only inside a function" Wie könnte es gehen? Robert
-
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
Nur Teile eines struct in den Flash
einfach dann um den String von Florian noch ein PSTR drumherum und schon ist es im Flash... geht doch ganz einfach ;-)
const char* blub; } test; test testvariable = { 0xff, PSTR("String1") }; [/C] ../Forum9.c:12: error: braced-group within expression allowed only inside a function Wenn ich mir das PSTR Makro ansehe [C] # define PSTR(s) (__extension__({static char
-
Thread
Überlauf?
Hilfsmakros und "Ersatz"-Funktionen. Ein Beispiel ist zum Beispiel der Funktionsaufruf ala "printf_P(PSTR("%u"), MyVal);" Zu beachten ist hier das PSTR() Makro, was den String per Sections vom Linker in den Flash-Bereich legt. Weiterhin das Suffix _P was für "Progmem" (denke ich mal) steht. Dieser Funktion
automatically storing string constant in program memory */ #define lcd_puts_P(__s) lcd_puts_p(PSTR(__s)) [/c]
-
Thread
Strings vergleichen wenn Sonderzeichen enthalten sind
Rückgabe eines Wertes aus einer `brace group') übrigens wirklich, siehe die Implementierung des PSTR-Makros in der avr-libc. Dort ist es aber ein Makro, mit dem explizit im ROM Speicher angefordert wird.
-
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
expected initializer before progmem - Problem
Header. Das ganze sieht jetzt so aus: cpp-Datei: const struct menu myMENU[] PROGMEM = { {PSTR("Test1"), &SetMenu, test1}, {PSTR("Test2"), &bar, NULL}, {PSTR("Test3"), &foobar, NULL}, {PSTR("zurück?"), NULL, NULL}, {PSTR(""), NULL, NULL} }; Prototyp
Pkt1: PSTR(...) ist als Typecast definiert, darf aber nicht zur Initialisierung von PROGMEM Elementen verwendet werden.
-
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
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
Die pseudo-Havard-Architektur
Thread, wo überhaupt der Unterschied zwischen funktionsname("Hallo Welt!"); und funktionsname(PSTR("Hallo Welt!"); liegt. Beides wird im µC im gleichen Speicher untergebracht bloß im ersten Fall am Ende, im zweiten Fall mitten drin. Welche Vorteile/Nachteile bietet dieses Prinzip? Warum legt
-
Thread
AVR Texte im SRAM, Überlauf??
> Das PSTR(xxx) liefert mir ja einen Pointer auf den Text im Flash zurück, > oder irre ich mich da? [c] #define PSTR (s) ((const PROGMEM char *)(s)) [/c] Used to declare a _static_ pointer to a string
. Das PSTR ist nur ein Makro, dass dir erlaubt Texte 'on the fly' in den Flash zu verlagern. Also in Fällen wie lcd_writetext( PSTR( "Dies ist ein Text" ) ); Normalerweise würde "Dies ist ein Text"
-
Thread
Stack-Überlauf durch externe Variable?
Mit bisschen Geschick kannst du das einfacher schreiben als: [c] send_string_uart0_P(PSTR("Press any key to continue")); [/c] Der _P-Suffix ist dabei die übliche Kennzeichnung dafür, dass die Funktion einen progmem-String bekommt. Die Funktion ist dabei selbst dafür verantwortlich, die Daten aus dem Progmem zu ziehen (letztlich mittels LPM-Anweisungen). Der PSTR-Makro ist ein wenig Magie, die den String in den Progmem legt und dessen Adresse gleich zurückgibt. Der String selbst bildet dabei sowas wie eine anonyme Array-Variable.
-
Thread
Liste von Zeigern auf Strings im Flash
Wie würdet ihr das Problem lösen? Mit dreimal P... : PGM_P padressen[][10] PROGMEM = { PSTR("Broadcast"), PSTR("Zimmer 1") }; Oliver
-
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
unterschied fprintf_p und fprintf
es sich wirklich um einen im ROM stehenden String handelt. Dies erledigt beispielsweise das Macro PSTR(). Der String wird dann auch nicht ins RAM kopiert. Er ist jedoch mit normalen C-Befehlen (Arrayzugrif etc.) nicht ohne weiteres ansprechbar, da diese auf die entsprechende Stelle im RAM zugreifen
-
Thread
Wie ermittle ich die Position eines Zeichens?
subtrahieren. So müsstest du an den Index des Zeichens kommen. [C] char str[]="Hallo;Leute"; char* pstr; int index; pstr = strchr(str, ';'); index = str - pstr; [/C]
[c] char str[]="Hallo;Leute"; char* pstr; int index; pstr = strchr(str, ';'); index = str - pstr; [/c] Das Problem liegt in der letzten Zeile, das ergibt nämlich negative Werte. Angenommen, die Adresse, an der str beginnt, wäre 10