Hallo,
ich hab was sehr seltsames bei meinem ATmega88PA bemerkt.
Zum Hintergrund:
es ist ein Programm zum steuern eines GSM Modules, dass im Fehlerfall,
sprich Heizung ist kaputt, eine SMS an max. 4 Nummern versendet.
Die erste SMS wird an Nummer1 ohne Probleme versendet.
Bei der zweiten SMS wird die Funktion sms_schreiben mit i=2 aufgerufen.
Nicht wie erwartet geht es nach Ende der Funktion zurück sondern beginnt
wieder am Anfang des GESAMTEN Programmes. Zudem ist mir aufgefallen bei
der 2ten SMS wird auch buff_schreibe_c Fehlerhaft bearbeitet.
Wie kann ich das Beheben oder den Fehler mehr eingrenzen. Ich habe einen
ICE3 Debugger.
Program Memory Usage: 4738 bytes 57,8 % Full
Data Memory Usage: 756 bytes 73,8 % Full
hier wird Fall 1 aufgerufen
1
voidsms_schreiben_handler(uint8_tfall)
2
{
3
//Fall 1 = Heizung Fehler
4
//Fall 2 = Bestätigung nach Nummer geändert
5
6
uint8_ti=0;
7
charbuff_c[100];
8
uint8_tsave=0;
9
10
if(fall==1)
11
{
12
13
for(i=1;i<=(eeprom_nummern.anzahl);i++)
14
{
15
save++;
16
strcpy(sms.text,"Die Heizung meldet einen Fehler");
17
sms_schreiben(i);
18
if(save==4)
19
{
20
return;
21
};
22
};
23
24
return;
25
};
26
27
28
29
if(fall==2)
30
{
31
32
strcpy(buff_c,"Es wurden folgende Nummern eingetragen:");
Du kannst mit an Sicherheit grenzender Wahrscheinlichkeit davon ausgehen
dass es sich nicht um einen Compilerfehler handelt.
Markus schrieb:> Bei der zweiten SMS wird die Funktion sms_schreiben mit i=2 aufgerufen.> Nicht wie erwartet geht es nach Ende der Funktion zurück sondern beginnt> wieder am Anfang des GESAMTEN Programmes.
Reset aufgrund nicht existenten Interrupt-Handlers oder aufgrund eines
Stack overflows, oder watchdog, oder...
Markus schrieb:> cli();> sim_guthaben();> wait_sekunden(2);
das cli() ist zumindest verdächtig
Ich tippe aber auf stack overflow.
Ja, ich hoffe es les liegt an mir dann kann ich es beheben.
Wie soll ich das am besten mit Sei()/cli() lösen?
Ist es besser die Interrupts direkt zu deaktivieren?
Markus schrieb:> Ja, ich hoffe es les liegt an mir dann kann ich es beheben.> Wie soll ich das am besten mit Sei()/cli() lösen?
Die Interrupts immer nur so kurz wie irgend möglich sperren. cli() und
sei() immer paarweise benutzen. Wo ist das sei() zu dem cli() in
sms_schreiben?
> Ist es besser die Interrupts direkt zu deaktivieren?
Schwer zu sagen, da unbekannt ist, welche Interrupts es bei dir
überhaupt gibt, was sie machen und wie sie mit dem restlichen Programm
zusammenarbeiten.
Ansonsten: Einen Stackoverflow kann ich mir auch vorstellen, da dein
Speicher ja mit statischen Variablen schon recht voll ist und die
gezeigten Funktionen auch nicht sehr sparsam damit umgehen.
Ein Stacküberlauf ist sogar sehr wahrscheinlich. Aber wie man schon an
dem kurzen Codeauszug sehen kann, gibt es massenhaft Speicherbereiche,
die man problemlos in den Flash verschieben kann.
Schau dir den code ruhig weiter an. Meine Handynummer lässt dein
buff_schreibe_c überlaufen. Und mit so einem noblen Debugger solltest du
auch mal spielen.