Hallo,
ich befasse mich mal wieder mit dem AVR nach langer Zrit, eine
Umstellung wenn man vom STM32 kommt.
Da kein richtiges JTAG Debugging möglich ist ist es schwer
Programabstürze einzukreisen, vor allem wenn sie hier mit dem
Verschicken von sms erzeugt werden. Nach dem versenden der sms "aus dem
RAM", resettet sich der 328P. Die Routine kann mit PROGMEN Inhalten
befüllt werden aber eben auch mit RAM.
Im DebugMode, wo keine sms verschickt wird, sondern nur der Inhalt per
debugln() dargestellt wird resettet er sich nicht.
Wenn ich mich recht erinnere kommt dieser Reset gerne vor, wenn das RAM
knapp wird oder der Stack in den RAM rein läuft. Den WDT habe ich auf
eine ISR umgelegt.
Wie könnte ich es festellen, ob
int SIM800_SendSMS(const char* text,int mode)
SIM800_CheckForSMS()
und dann noch sprintf vielleicht zu viel RAM brauchen? Die sind ja
abhängig voneinander. Die Ausgabe beim Kompilieren sagt mir
954 global
1500 für lokale Variablen frei.
Hat das schon mal jemand gehabt und es gelöst?
Gruss,
Christian
1 | else if (strstr(buf,"info"))
|
2 | {
|
3 | char tm[6];
|
4 | if (flags.AlarmEnable) strcpy(tm,"ON");
|
5 | else strcpy(tm,"OFF");
|
6 | sprintf(buf,"Mode: %d\rAlarm: %s\rCelsius: %d Grad\rBatterie: %02u%%",modus,tm,(int)Temperature,BattProzent);
|
7 | SIM800_SendSMS(buf,RAM);
|
8 | }
|
1 | /* Kopiert einen Text aus dem Flash ins Ram */
|
2 | void ReadFromFlash(char* target, const char* source)
|
3 | {
|
4 | for (word k = 0; k < strlen_P(source);k++) {
|
5 | *(target + k) = pgm_read_byte_near(source + k);
|
6 | *(target + k + 1) = '\0'; /* NUL Terminieren */
|
7 | }
|
8 | }
|