Der Wert, der in Register 21 geladen wird, ist die Größe des jeweiligen
Arrays (in diesem Fall ATS18 mit 10 Zeichen plus NUL am Ende, also
insgesamt 11 Bytes), das an at_send() übergeben werden soll. Offensicht-
lich werden die Daten jedesmal vor Benutzung ins RAM ab Adresse 0x00A0
kopiert und diese Adresse dann an at_send() übergeben.
Wenn nun in Register 21 statt der 11 eine 0 steht, werden statt der 11
Bytes 256 Bytes kopiert, was sehr wahrscheinlich mit anderen Daten im
RAM kollidiert und damit zum Fehler führt.
Das Problem tritt in jedem Case der Switch-Anweisung außer dem ersten
(INIT_RESET) auf. Dort ist der auszugebende String (ATF="AT&F") so kurz,
dass der Compiler keine Schleife anlegt, um die Daten zu kopieren,
sondern dan RAM-Bereich mit mehreren aufeinanderfolgenden MOV*-Befehlen
mit den Daten füllt.
Wie jetzt aber die einzelne zusätzliche Leerzeile im Zusammenhang mit
der fehlerhaften Anzahl der Schleifendurchläufe bei der Kopieraktion
steht, erschließt sich mir auch nicht. Möglicherweise ist es ein Compi-
ler-Bug.
Nebenbei: Deine Include-Hierarchie ist ziemlich krumm:
1 | funk.c
|
2 | |
|
3 | +——16f688.h
|
4 | |
|
5 | +——defines.h
|
6 | |
|
7 | +——globals.h
|
8 | |
|
9 | +——int.c
|
10 | | |
|
11 | | +——globals.h
|
12 | | |
|
13 | | +——defines.h
|
14 | |
|
15 | +——string.h
|
Von int.c werden defines.h und globals.h in der verkehrten Reihenfolge
includiert (globals.h benutzt eine Definition aus defines.h). Das Ganze
funktioniert aber zufälligerweise trotzdem, da beide Header zuvor schon
von funk.c in der richtigen Reihenfolge aufgerufen wurden.
Jede Quellcodedatei sollte immer alle Header includieren, von denen sie
direkt abhängig ist. Dann ist auch die Reihenfolge der Include-Direkti-
ven egal.
Folgende Hierarchie wäre also besser:
funk.c:
1 | #include <string.h>
|
2 | #include <16f688.h>
|
3 | #include "defines.h"
|
4 | #include "globals.h"
|
5 | #include "int.c"
|
int.c:
1 | #include <16f688.h>
|
2 | #include "defines.h"
|
3 | #include "globals.h"
|
defines.h:
globals.h:
Wenn int.c getrennt kompiliert wird, was sinnvoll ist, fällt das letzte
Include in funk.c weg, der Rest bleibt gleich.