-
Thread
ATtiny44 -Software Uart - nur senden
// Macro to send strings stored in program memory space #define PRINT(format, ...) printf_P(PSTR(format), ## __VA_ARGS__) // Write a character to the serial port static int serial_write(char cData, FILE *pxStream) { // Recursive function to prepend a carriage return before
-
Thread
I2C Slave mit dem Attiny 841
TWSSRA = 1<<TWBE; // reset bus error xmit_string(PSTR("BUS ERROR"), 0); } } [/c] Und im Watchdog-Interrupt gibts eins auf die Nuss, wenn I2C zu lange aktiv ist, weil dann der WDT /nicht/ zurückgesetzt wird:
-
Thread
ESP32 A1S Eval
## void setup() { Serial.begin(115200); Serial.println("\r\nReset"); Serial.printf_P(PSTR("Free mem=%d\n"), ESP.getFreeHeap()); Serial.printf("Total heap: %d \r\n", ESP.getHeapSize()); Serial.printf("Free heap: %d \r\n", ESP.getFreeHeap()); Serial.printf("Total PSRAM: %d \r\n"
WL_CONNECTED) { Serial.print("."); delay(100); } wifi_flag = true; Serial.printf_P(PSTR("Connected\r\nRSSI: ")); Serial.print(WiFi.RSSI()); Serial.print(" IP: "); Serial.println(WiFi.localIP()); // Start AC101 Serial.printf("Connect to AC101 codec... "); while (not
-
Thread
Infinite Loop STM32 Zeichen ersetzen
#5836613: > ich bekomme bei folgendem Code ein infinite Loop. Zwei Moeglichkeiten: a) Worauf pStr zeigt, ist kein C-String, i.e. nicht durch NUL terminiert b) Du kaputtest diesen String irgendwo spaeter HTH leo
>> ich bekomme bei folgendem Code ein infinite Loop. > > Zwei Moeglichkeiten: > > a) Worauf pStr zeigt, ist kein C-String, i.e. nicht durch NUL terminiert > b) Du kaputtest diesen String irgendwo spaeter c) "replace" ist NUL, i.e. du vernichtest dein Stringende. > > HTH > leo
-
Thread
timer Probleme ctc OCRA/B
Initialisiert, Pins + timer1 and dann ist folgende Zeile eingefügt worden: [c] for(;;delay(1000)) p0(PSTR("\nMILLIS = "),(word)millis()),nl();[/c] p0 verwendet atoi der AVR lib Delay ist wie folgt definiert: [c] void delay(word ms) { while(ms--) _delay_loop_2(3999); } [/c] Ausserhalb von Timer1
-
Thread
WinApi Hauptschleife
LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR const szAppName[] = TEXT("Klassenname"); HWND hWnd; MSG msg; WNDCLASSEX wndclassex; wndclassex.cbSize = sizeof
-
Thread
sketch stört webserver - wer kann helfen?
ist mir noch aufgefallen, dass du viele relativ grosse Zeichenketten im RAM hast. Benutze PROGMEM, PSTR() und F() damit die Strings nur im Flash Speicher liegen, nicht im RAM. https://arduino-esp8266.readthedocs.io/en/latest/PROGMEM.html
mir noch aufgefallen, dass du viele relativ grosse > Zeichenketten im RAM hast. Benutze PROGMEM, PSTR() und F() damit die > Strings nur im Flash Speicher liegen, nicht im RAM. > https://arduino-esp8266.readthedocs.io/en/latest/PROGMEM.html Das sollte beim ESP32 doch eigentlich egal sein, da dieser
-
Thread
Speicher/Array kommt durcheinander/wird überschrieben ?
dem Flash Speicher zu verwenden, anstatt RAM zu belegen: [c] snprintf_P(buffer, sizeof(buffer), PSTR("\twert_min[9] %u \t wert_max[9] %u\n"), wert_min[9], wert_max[9]); [/c] Wenn du die serielle Schnittstelle als Konsole (stdout) einrichtest, kannst du die Strings direkt mit printf_P() ausgeben
-
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
Größe einer char wird überschritten?
Mehrere Pakete : if ( bfill.emit_p(PSTR( "Etwas Text" )) ) { bfill.emit_p(PSTR( "Mehr Text" )) ) ; } else { bfill.emit_p(PSTR( "Fehlercode 1" )) ) ; return -1; } Ich bin leider nur "Hacker" , kein Programmierer ..
Hau Wech schrieb im Beitrag #5712251: > Mehrere Pakete : > > if ( bfill.emit_p(PSTR( "Etwas Text" )) ) { > bfill.emit_p(PSTR( "Mehr Text" )) ) ; > } else { > bfill.emit_p(PSTR( "Fehlercode 1" )) ) ; > return -1; > } > > > Ich bin leider nur "Hacker" , kein Programmierer
-
Thread
ISR-Rücksprungadresse feststellen
char c = uart_getchar(); switch (c) { case 0x1b: uart_puts_P(PSTR("\r\nREBOOT\r\n")); while (1) // reboot ; case '#': // fill SaveArea.stack with text uart_puts_P(PSTR("Text: "));
break; case '~': // print SP uart_puts_P(PSTR("SP = ")); uart_hex_putchar(SPH); uart_hex_putchar(SPL); uart_puts_P(PSTR("\r\n")); break; default:
-
Thread
Dummy für __flash bzw PROGMEN
pgm_read_word(a) (*(a)) #define pgm_read_pointer(a) (*(a)) #define constflash const #define PSTR(a) (a) #define strlen_P strlen #define strncpy_P strncpy #define vsnprintf_P vsnprintf #define printf_P printf #define fprintf_P fprintf #define fputs_P fputs
-
Thread
Variablen eindeutig benennen damit der Typ eindeutig ist
meine_variable_ist_schoen Ersteres mit der ungarischen Konvention gepaart kann dann so aussehen: [c] pstrMeineVariableIstSchoen = "Bla"; dwMeineVariableIstSchoen = 0xFFEEDDCC; iMeineVariableIstSchoen = 6; dblMeineVariableIstSchoen = 12.34E4; [/c] Wie gesagt, das liegt im Auge des Betrachters.
Rufus Τ. F. schrieb im Beitrag #5679872: > pstrMeineVariableIstSchoen = "Bla"; > dwMeineVariableIstSchoen = 0xFFEEDDCC; > iMeineVariableIstSchoen = 6; > dblMeineVariableIstSchoen = 12.34E4; Schöne Beispiel :) Meine Erfahrungen: Falls Konventionen
-
Thread
Lebensdauer von lokalen Variablen
Hier haut das nicht hin mit dem Makro, gibt nur Müll auf der seriellen.... nehme ich das PSTR weg ist alles wieder gut. /* Setze 9600 baud */ SIM800_SendAT(PSTR("AT+IPR=9600\r\n"),"OK"); /* Meldungen abschalten */ SIM800_SendAT(PSTR("AT+CCWA=0\r\n"),"OK"); /* Echo abschalten */ SIM800_SendAT(PSTR("ATE0\r\n"),"OK"); da ich gut 100 dieser Sequenzen haben sind das die größten Ram Fresser.
-
Thread
Arduino 328P Resettet sich bei Programmstelle
andere läuft einwandfrei. aus dem flash oder aus dem SRAM? nutzt du progmem für die Strings und PSTR()?
einwandfrei. > > aus dem flash oder aus dem SRAM? > > nutzt du progmem für die Strings und PSTR()? Yupp..... daher muss ich auch unterscheiden wo was her kommt [c] const char flash_sms_empty[] PROGMEM = "Batterie leer! Powerdown!"; const char flash_admin[] PROGMEM = "Admin OK
-
Thread
LED Glühbirne
Augenempfindlichkeitskurve wodurch man die LER (luminous efficacy of radiation) bekommt. lm/LER=Strahlungsleistung. Pstr/Pel=Wirkungsgrad. Wie Stefanus schon erwähnt hat, wird dieser mit steigendem Strom immer schlechter. Hier kommt dabei in der realen Anwendung auch die Chiperwärmung noch ins Spiel, da man die Temperatur
-
Thread
Einstieg in die µC-Welt
foundDate) { display.scroll_up(8,20); display.draw_string_P(0,24,PSTR("No date received")); display.display(); } } else { display.scroll_up(8,20); display.draw_string_P(0,24,PSTR("Connect failed")); display.display
-
Thread
Stringverknüpfung C/C++
display_item( char* buffer, char* header, uint16_t val, char* > footer) > { > sprintf_P(buffer, PSTR("%S %d %S\n"), header, val, footer); > } > > void test(char* buffer) > { > display_item(buffer, header_1, 1234, footer_1); > } > [/c] > > header, footer können auch als Array mit fester
!= 0) { free(p); } else { size=0; } return sprintf_P(buffer,PSTR("%5u"),size); } [/c]
-
Thread
Mikrocontroller über Ethernet verbinden
timer = millis() + 5000; Serial.println(); Serial.print("<<< REQ "); ether.browseUrl(PSTR("/foo/"), "bar", website, my_callback); Serial.println(); Serial.print(ether.browseUrl(PSTR("/foo/"), "bar", website, my_callback)); } }[/c] Das mit IOBroker schau ich mir aufjedenfall
-
Thread
PID-Regler: Wie schnell ist schnell genug?
itoa(OCR0B,valueToPrint,10); sendString(valueToPrint); sendString_p(PSTR(",")); dtostrf(voltage, 6, 4, valueToPrint); TCCR1B &= ~(1 << CS10); sendString(valueToPrint); sendString_p(PSTR(
-
Thread
RS485 von ms - immer noch Einschaltprobleme
dass am Log genau abgelesen werden kann, welche Codeabschnitte warum durchlaufen wurden. Benutze PSTR, PROGMEM und die _P Funktionen um RAM zu sparen. Wenn die Strings nicht in den Flash Speicher passen, dann musst du dich Schrittweise an den Kern des Problems heran tasten, anstatt alle Debug Meldungen
-
Thread
FatFS auf Atmega644
großartig anders wäre. Wie hast du denn deine String-Konstanten geschrieben? Sind Dir die Makros PSTR() und PROGMEM bekannt?
-
Thread
c/c++ array in bereits reserviertem Speicher anlegen
preallocateBuffer = malloc(preallocateBufferSize); // Stream-File-Buffer Serial.printf_P(PSTR("Adresse Buffer: %X\n"), preallocateBuffer); Serial.printf_P(PSTR("Buffer reserviert: - Free mem=%d\n"), ESP.getFreeHeap()); titelliste = (char*)preallocateBuffer; for (i=0; i<20; i++) { titelliste[i] = i + 'a'; Serial.printf_P(PSTR("Adresse: %X Wert: %c\n"), titelliste+i, titelliste[i]); } titelliste[i]='\0'; Serial.printf_P(PSTR("Array beschrieben: - Free mem=%d\n"), ESP.getFreeHeap()); Serial.print(titelliste
-
Thread
ADXL345 und ESP8266: Echtzeitdatenergassung mit konstanter Abtastrate und Interrupts
softSerial_sendChar(c); text++; } } // Send a char array from program memory, use with PSTR(). void softSerial_sendStr_P(PGM_P text) { char c; while ((c=pgm_read_byte(text))) { softSerial_sendChar(c); text++; } } [/c] Empfangen kannst du damit nichts
-
Thread
ATmega328/P ADXL345 i2c Sampling Rate SD-Karte
// set device address and write mode uart_puts_p(PSTR("WRITE ADDRESS\n")); i2c_write(0x2D); // write address = POWER_CTL of ADXL uart_puts_p(PSTR("SET MEASUREMENT BIT ON D3\n")); i2c_write((1<<3)); // Set
(((int)buff[5]) << 8) | buff[4]; itoa(x, s, 10); uart_puts(s); uart_puts_p(PSTR(" \t")); itoa(y, s, 10); uart_puts(s); uart_puts_p(PSTR(" \t")); itoa(z, s, 10); uart_puts(s); uart_puts_p(PSTR("\n")); if (m_flag == DO_MEASUREMENT
-
Thread
Arduino digitalWrite durch C-Code ersetzen
} // void backlight_m(void) void con_hell_stat(boolean zueep) { sprintf_P(s_out_str, PSTR("con=%02d hell=%02d"), MY_EEP_VAR.contra, MY_EEP_VAR.backlicht); myGLCD.print(s_out_str, LEFT, COHE_LINE); if(zueep) { my_i2c_eeprom_wait_ready(); my_i2c_eeprom_write_buffer( sizeof
-
Thread
AVR Tutorial Frage: Lesen vom Flash
string_im_ram gleich "Hallo Welt" ist. */ oder wenn true bleiben soll return !strcmp_P (string_im_ram, PSTR ("Hallo Welt")); dann können die von mir/dir engefügten Kommentare auch raus Die nachfolgende Funktion liefert 0 zurück, wenn string_im_ram gleich "Hallo Welt" ist. Mit strcmp (String Compare)
-
Thread
Sprechende Lampe
, 80)) { display.scroll_up(8,20); display.draw_string_P(0,24,PSTR("Connected")); display.display(); // Sent HTTP request client.print(F("GET / HTTP/1.1\r\nHost: ")); client.print(SERVER); client.print(F("\r\nConnection
foundDate) { display.scroll_up(8,20); display.draw_string_P(0,24,PSTR("No date received")); display.display(); } } else { display.scroll_up(8,20); display.draw_string_P(0,24,PSTR("Failed")); display.display
-
Thread
Unterschiede zwischen ARM und ATmega in der Programmierung
RAM. Und die bei AVR bekannten Methoden, die das Kopieren verhindern, entfallen ebenfalls: PROGMEM, PSTR, und die ganzen "_P" Funktionen wie printf_P().
des C-Compilers und dessen Library. Der tut es > halt, sofern du nicht ausdrücklich PROGMEM oder PSTR benutzt. Oh Entschuldigung. Diese Einschränkung des C-Programmierens war mir nicht bewusst. Kannte ich als ein Asm-Programmierer mit allen Freiheiten noch nicht :)
-
Thread
Library für BME280
Graphik-LCD und für SPI-LCD, oder auch für SPI-farb-TFT. Ich brauche nur statt [c]lcd_intern_string_P(PSTR("Ich bin Maxim!")); [/c] [c]graph_128x64_string_P(PSTR("Ich bin Maxim!")); [/c]oder [c]tft9341_string_P(PSTR("Ich bin Maxim!")); [/c] [c]i2c_lcd_string_P(PSTR("Ich bin Maxim!")); [/c] zu schreiben