Compilerfehler oder Programmfehler AVR

Gast #3980939
Lesenswert?
• ▲
▼
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
void sms_schreiben_handler(uint8_t fall)
2
{
3
  //Fall 1 = Heizung Fehler
4
  //Fall 2 = Bestätigung nach Nummer geändert
5
  
6
  uint8_t i =0;
7
  char buff_c [100];
8
  uint8_t save = 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:" );
33
    
34
    switch(eeprom_nummern.anzahl)
35
    {
36
      case 1:
37
      strcat( buff_c, eeprom_nummern.nummer1);
38
      break;
39
      
40
      case 2:
41
      strcat( buff_c, eeprom_nummern.nummer1);
42
      strcat( buff_c,";");
43
      strcat( buff_c, eeprom_nummern.nummer2);
44
      break;
45
      
46
      
47
      case 3:
48
      strcat( buff_c, eeprom_nummern.nummer1);
49
      strcat( buff_c,";");
50
      strcat( buff_c, eeprom_nummern.nummer2);
51
      strcat( buff_c,";");
52
      strcat( buff_c, eeprom_nummern.nummer3);
53
      break;
54
      
55
      case 4:
56
      strcat( buff_c, eeprom_nummern.nummer1);
57
      strcat( buff_c,";");
58
      strcat( buff_c, eeprom_nummern.nummer2);
59
      strcat( buff_c,";");
60
      strcat( buff_c, eeprom_nummern.nummer3);
61
      strcat( buff_c,";");
62
      strcat( buff_c, eeprom_nummern.nummer4);
63
      break;
64
      
65
      
66
    };  
67
    
68
    strcpy(sms.text,buff_c);
69
    
70
    sms_schreiben(1); //Null ist Nummer 1
71
    
72
    
73
    
74
  };
75

76
};
1
void sms_schreiben(uint8_t nummer)
2
{
3
  char buff_schreibe_c[20];
4
  
5
  
6
  
7
  
8
  EIMSK=0x00;
9
  
10
  cli();
11
  sim_guthaben();
12
  wait_sekunden(2);
13
  
14
  uart_puts("AT+CMGF=1"); // Text mode
15
  _delay_ms(100);
16
  
17

18
  
19
  
20
strcpy(buff_schreibe_c,"AT+CMGS="); // Ziel Nummer
21
  
22
  
23
  switch(nummer)
24
  {
25
    case 1:    
26
    strcat(buff_schreibe_c,eeprom_nummern.nummer1);
27
    break;
28
    
29
    case 2:
30
    strcat(buff_schreibe_c,eeprom_nummern.nummer2);
31
    break;
32
    
33
    case 3:
34
    strcat(buff_schreibe_c,eeprom_nummern.nummer3);
35
    break;
36
    
37
    case 4:
38
    strcat(buff_schreibe_c,eeprom_nummern.nummer4);
39
    break;
40
    
41
    
42
    
43
  };
44
  
45
  uart_puts(buff_schreibe_c);
46
  _delay_ms(100);
47

48
  uart_puts(sms.text);
49
  uart_puts(sms.guthaben);
50
// zu testzwecken auskommentiert  uart_putc(0x1A);
51
  
52
  wait_sekunden(5);
53
  
54
  
55
  
56

57
  return;
58
};
(Firma: Brainit GmbH) #3980946
Lesenswert?
• ▲
▼
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.
#3980972
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.