-
Thread
XMega DMA transfers zu UART
); return len; } int main(void) { DMA_Enable(); uart_dma_init(); DBG(PSTR("test\n")); DBG(PSTR("test1\n")); DBG(PSTR("test-test-test\n")); while(1); } [/c] lg, stef
(new_data_len>maxlen) len=maxlen; else len=new_data_len; //printf_P(PSTR("DMA_CH0_vect: starting transfer (%i of %i)\n"), len, tx_ringbuf.new_data_len); // set source address src_addr = ((uint16_t)tx_ringbuf.buf) + read_index; DMA_TX_CHANNEL.SRCADDR0 =
-
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
ATXMega128A1: 32-bit quadrature decoder mit compare match ?
printf_P(PSTR("up OV: %i\n"), TCC0.CNT); // send an increment event, see Table 6-2 EVSYS.DATA |= (1<<1); EVSYS.STROBE |= (1<<1); } } // otherwise we're counting down else { if (TCC0.CNT>0) { printf_P(PSTR("dn OV: %i\n"), TCC0.CNT); // send a decrement event EVSYS.DATA &= ~(1<<1); EVSYS.STROBE |= (1<<1); } } } [/c]
-
Thread
AVR PROGMEM Spezifikt im Quellkode ersetzen
Hi, Alf, schaut auf den ersten Blick gut aus. Lediglich hier > #define PSTR(s) s stolpere ich, ob es nicht *s heissen sollte? Der eine uP trennt Datenspeicher von Programmspeicher und nutzt sie gleichzheitig, der andere packt alles ins SDRAM. Ciao Wolfgang Horn
#2352931: > Hi, Alf, > > schaut auf den ersten Blick gut aus. > > Lediglich hier >> #define PSTR(s) s > stolpere ich, ob es nicht *s heissen sollte? Müsste schon stimmen. Die typische Verwendung von PSTR ist ja lcd_puts( PSTR("Hallo World") ); wobei der PSTR dafür sorgt, dass der
-
Thread
putchar funktion soll auf Progmem umgebaut werden
Die sache ist das PSTR() es nicht im RAM ablegt, somit geht wenn ich das richtig verstanden habe auch kein pointer auf den RAM.. und da liegt mein Problem, ich brauche irgendwie die Möglichkeit die Funktion auch mit PSTR
Sowas? [code]void uart_usb_send_buffer_P (const char *pstr) { size_t len = strlen_P (pstr); char str[len]; strcpy_P (str, pstr); uart_usb_send_buffer (str, len); }[/code]
-
Thread
avr-libc Fehlermeldung beim compilen
include/avr/pgmspace.h Zeile 255 die PSTR definition war auch static und nicht const. Compiled nun wunderbar
-
Thread
Mein erstes WinAPI Programm
mehrmals.\""; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { int iAntwort = MessageBox(NULL, szWitz, "Ha, ha, ha, ha...", MB_ICONINFORMATION | MB_OKCANCEL | MB_DEFBUTTON1); if (IDOK == iAntwort) { MessageBox(NULL
-
Thread
Umlaute und Sonderzeichen auf GLCD zeichnen
zwei Punkten, das ein ä sein soll, von Hand zeichnen? Nur wie binde ich das nun ein? ks0108Puts_P(PSTR("Gerät")); will nicht funktionieren, jedenfalls wird das ä nicht dargestellt. Und wenn ich schon mal dabei bin: Wie funktioniert das mit Sonderzeichen? Z.B. wenn ich bei 0x80 das Zeichen "<->" erstelle
geht nur bis 0x7F. Daran könnte es liegen! ;) Erweitertes ASCII... Und der Befehl ks0108Puts_P(PSTR("Gerät")); wird dann im AVR-Studio 4 mit der letzten WinAVR-Version funktionieren und auch ein ä darstellen? Werde es heute Nachmittag mal ausprobieren und berichten. Schon mal besten Dank! Henry
-
Thread
Atmega16 Speicher bald voll Program / Data Unterschied ?
Das geht nicht? struct MenuEntry MainMenu[] PROGMEM = { ... PSTR bringt hier natürlich nichts, ist aber auch nicht nötig, weil char[] statt char*.
Horden von pgm_xxx() Funktionen für jeden Strukturzugriff abkämpfen zu müssen. Jedenfalls in C - PSTR inmitten der Initialisierung ging zumindest in der damaligen avr-gcc Version nur in C, nicht aber in C++.
-
Thread
strcmp_P für einzelne chars eines Strings
Der Vergleich kompletter Strings funktioniert, also z.B. folgendes: if (!strcmp_P (stringbuffer, PSTR ("\n\rHallo_alle"))) // funktioniert genauso auch: static char Empfang_test[13] PROGMEM = "\n\rHallo_alle"; if (!strcmp_P (stringbuffer, Empfang_test)) // funktioniert Was _nicht_ funktioniert
-
Thread
printf bei Handy-SMS Code aus Artikel geht nicht?
Ichbinimflash[] PROGMEM = "%s"; printf_P(Ichbinimflash); ?????? [/c] Oder einfach so: [c]printf_P(PSTR("at+cclk?\r\n"));[/c] > (Kennt jemand eigentlich mal so eine Art Dokumentation zu diesen > merkwürdigen printf-Funktionen? Ich weiß eigentlich gar nicht genau, was > die machen...?!) http://
-
Thread
Peter Fleury LCD Lib für AT90USB162?
automatically storing string constant in program memory */ #define lcd_puts_P(__s) lcd_puts_p(PSTR(__s)) /*@}*/ #endif //LCD_H [/c] und hier die lcd.c [c]/**************************************************************************** Title : HD44780U LCD library Author: Peter Fleury
-
Thread
Uart Interrupt Problem
LCD_PutString((const char*)uart_string); uart_puts((const char*)uart_string); LCD_PutString_P(PSTR("\r\n")); LCD_PutString_P(PSTR("Erfolg \r\n\n")); uart_puts((const char*)uart_string); uart_str_complete=0; } Update_LCD(); //_delay_ms(1000); }
LCD_PutString((const char*)uart_string); uart_puts((const char*)uart_string); LCD_PutString_P(PSTR("\r\n")); LCD_PutString_P(PSTR("Erfolg \r\n\n")); uart_puts((const char*)uart_string); uart_str_complete=0; } Update_LCD(); //_delay_ms(1000); }
-
Thread
avr-libc: relocation truncated to fit
Pferdefuß ist, daß das eine bestimmte Version der avr-libc in gcc vorausetzt -- was aber mit dem PSTR-Fix ja auch schon de facto der Fall ist. Ein -mavr-libc wäre ja nur dann sinnvoll, wenn es standardmässig aktiviert ist.
-
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
1. Funktionsaufruf alles wunderbar 2. Funktionsaufruf => Absturz
Ohne den Rest-Code gesehen zu haben: Ram/Stack-Problem? pgmspace.h und dessen PSTR-Makro helfen.
Ich habe nun alle strings mit PSTR übergeben. Das löst das Problem allerdings auch nicht. Nach etwas herumprobieren und auskommentieren, habe ich herausgefunden, dass der eigentlich Knackpunkt wohl die spi_send_byte() Funktion ist. Warum
-
Thread
Umgeschriebene Funktion funktioniert nicht
*dest++ = *src++; ++len; } else { ++src; if(strncasecmp_P(src,PSTR("TIME"),4)==0) { sprintf_P(dest, PSTR("%2.2d:%2.2d:%2.2d"), Time.Hour, Time.Minute, Time.Second); src += 4; } else { // nix gefunden -> '%' speichern
hier funktioniert nicht: [c] uint8_t checkString(char* src, char* dest) { if(strncasecmp_P(src,PSTR("TIME"),4)==0) { sprintf_P(dest, PSTR("%2.2d:%2.2d:%2.2d"), Time.Hour, Time.Minute, Time.Second); return 4; } else if(*src == '%') { *dest = '%'; return 1; } return
-
Thread
Eclipse: was bedeutet diese Fehlermeldung?
*p; } char get_4 (char **p) { return **p; } int main (void) { return a + pstr[2] + l[1]; }[/c] Wieviel Aufwand wäre das für die avr-libc? [c]#ifndef _PGM #define _PGM const #endif #define printf_P(FMT,x...) __printf_P((_PGM char*)FMT , ##x)[/c] Die Implementierung
__pgm char * get_pstr (void) { return (const __pgm char*) PSTR ("abc"); }[/c] Die eine Variante funktioniert nur ausserhalb von Funktionen, die andere nur innerhalb. > Wenn es sich darauf herunterbrechen ließe
-
Thread
LCD Ansteuerung Atmel ATxmeag 128 A3
> #define PROGMEM __ATTR_PROGMEM__ #define PSTR (s) ((const PROGMEM char*)(s)) // Snippet 3 // display "Hello World" on LCD first line lcd_line_one(); lcd_write_string_p(PSTR("Hello World\0")); // message from flash space //////////
// Snippet 3 // display "Hello World" on LCD first line lcd_line_one(); lcd_write_string_p(PSTR("Hello World\0")); / message from flash space Quelle: http://blog.frankvh.com/2010/10/18/atmel-xmega-hd44780-lcd-support/ Meine Einbindung (vielleicht auch falsch): #define PSTR (s)
-
Thread
AVRGCC nach Keil C166
auch einfach irgendwo im Header folgendes machen, dann musst du im Code nichts ändern: #define PSTR #define PROGMEM
"*" macht kein Cast, sondern eine Dereferenzierung. In deiner Anwendung kannst du einfach das PSTR weglassen bzw. [code]#define PSTR(S) S[/code]
-
Thread
KS0108 - Thiele Library - Anzeige verhunzt
ks0108ReadFontData, BLACK); // Set a position ks0108GotoXY(1,1); // Print some text ks0108Puts_P(PSTR("Hallo Welt -> 1")); // a nice little round rect ks0108DrawRoundRect(5, 5, 117, 20, 8, BLACK); wait(1); ... ------------- Richtig eingebunden sind die Dateien, denn immerhin bekomme
-
Thread
AtMega168 zu wenig RAM ?
Compiler. Hat da zufällig jemand einen Workaround für mich bei der ich die praktisch einfache PSTR Routine beibehalten kann ?
-1.6.1) I've done some checking and found a solution, or work around, I'm not sure which one. PSTR is defined as (pgmspace.h): Code: # define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];})) If I change the definition to Code: # define PSTR(s) (__extension__({static
-
Thread
WinAVR: Einzelne Strings aus dem Flash auslesen
sieht dein USART_TxString_P aus? (Ich hege den Verdacht, dass da mittels Makro noch ein implizites PSTR drinnen steckt)
-
Thread
PROGMEM Problem
besser ein C-Buch, nämlich dein ganz persönliches C-Buch zu Rate ziehen > const char *linetwo = PSTR(a); > Du kannst hier nicht PSTR benutzen. PSTR ist ein Makro, welches einen konstanten Text während des Compilierens ins Flash verschiebt und einen Pointer darauf liefert. Du hast hier keinen konstanten Text! Die Verschiebung, und damit die Anwendung des PSTR muss bereits der Aufrufer der Funktion machen. Derjenige, der die Stringkonstante hat, muss sie mittels PSTR ins Flash verlagern. D.h. der Aufrufer der Funktion gibt dir bereits den korrekten Pointer
-
Thread
Problem mit AVR NEt IO und Eingänge
break; } if(b) { strcpy_P(var_conversion_buffer, PSTR("ledon.gif")); } else { strcpy_P(var_conversion_buffer, PSTR("ledoff.gif")); } str_len = strnlen(var_conversion_buffer,CONVERSION_BUFFER_LEN);
-
Thread
Single PWM mit PIC18F26, kein ausgangs signal im Simulator am PORTA
Set TMR2 MOVWF T2CON,0 MOVLW 0x1F MOVWF PSTR1CON,0 LOOP NOP ;TEST LOOP GOTO LOOP END
-
Thread
uAC Consolenfunktionalität
String "%s" arbeiten, aber es ist einfacher nur uac_printf (textimram) anzugeben als uac_printf (PSTR ("%s"), textimram).
-
Thread
Kommerzieller AVR C Compiler
die Tonne. Wenn man nicht einmal die Speicherzugriffe richtig im Griff hat. Ich sage nur printf_P(PSTR... und dieser ganze Schwachsinn. Ich war irgendwann davon so genervt dass ich Geld in die Hand genommen habe und mir eine IAR Workbench gekauft habe. Damit bin ich voll und ganz zufrieden.
Tonne. Wenn man nicht einmal die Speicherzugriffe richtig im > Griff hat. Ich sage nur printf_P(PSTR... und dieser ganze Schwachsinn. Das ist natürlich kompletter Schwachsinn. Das liegt nicht am gcc, sondern an der für C-Programmierung ungeeigneten Harvard-Architektur der AVRs. Wenn IAR das verbirgt
-
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
#define mit 2 Werten
anweisung aussehen damit ich diesen Funktionsaufruf bewerkstelligen kann. T6963cPutStringXY_P(0,2, PSTR("Ti:")); Im define sollen die Werte 0,2 sein. Wenn ich es so probiere #define wert (0,2) und dann die Funktion aufrufe mit T6963cPutStringXY_P(wert, PSTR("Ti:")); bekomme ich Fehlermeldungen
umzubenennen hilft auch nicht weiter so schon eher #define _CALL_ T6963cPutStringXY_P(0, 2, PSTR("Ti:")) //#define _CALL_ T6963cPutStringXY_P(5, 7, PSTR("Ti:")) //wahlweise auszukommentieren
-
Thread
MEGA32, Speicher schon voll?
im Flash, einmal für eine komplett unnötige Kopie desselben Strings im eh schon knappen RAM! => PSTR, pgmspace.h, ... und, wie ist "AbsDelay" definiert? hoffentlich als Variante von [c] void AbsDelay(uint16_t x) { while (x--) _delay_ms(1.0); } [/c] und nicht als [c] void AbsDelay(uint16
-
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
XMega bleibt "hängen"?
über Interrupts ausgegeben, sondern relativ straight forward: Meine Debugfunktion ist diese hier (PSTR für das ablegen der Strings im PROGMEM): #define Debug_Str(_str) ( dputsP (PSTR(_str)) ) die Funktion dputsP sieht folgendermassen aus: inline void dputsP (const char * str) { while (pgm_read_byte
-
Thread
Wiefiel Platz ist in einem AVR Mega16?
..... if(Flags & DebugFlag){ // Schleife für Debugging durch Flag aktivieren uart_puts_p( PSTR("neuer String empfangen") ); ... // Variablenwert ausgeben } [/C] und der Text "neuer String empfangen" belegt dir keinen Speicher im SRAM mehr. richtig schön wird das dann noch mit einem Makro [C] #define uart_puts_P(s) uart_puts_p(PSTR(s)) [/C] denn dann brauchst du nur noch in [C] uart_puts( "neuer String empfangen" ); [/C] den Funktionsaufruf ändern zu [C] uart_puts_P( "neuer String empfangen" ); [/C] und der String