Der Mega8 hat neben seinen 32 Registern 1024 Bytes SRAM (das ist schon
recht viel).
Da du in C programmierst, werden alle deine Variablen im SRAM abgelegt.
Jedes Char braucht ein Byte, jedes Int zwei Bytes, bei Arrays schlägt es
richtig zu.
Dann gibt es noch den Stack, der natürlich auch im SRAM liegt und bei
jedem Interrupt oder Funktionsaufruf Platz braucht. Und wenn ich mich
nicht irre, dann führt C noch einen weiteren Stack zur
Parameterübergabe bei Funktionsaufrufen. Auch das braucht SRAM.
Ich würde mal sagen, dass dein SRAM knapp wird und daher dein Stack in
den Variablenbereich wächst, was natürlich zu undefiniertem Verhalten
des Controllers führt. Ein AVR ist kein PC mit unendlichen Ressourcen,
man sollte also effizient mit den wenigen vorhandenen Ressourcen
umgehen und die Programme so schreiben, dass sie nicht mehr Speicher
brauchen als zur Verfügung steht.
Du suchst noch Platz für Chars. Was soll das werden? Sind das
Konstanten (die sich zur Laufzeit nicht ändern, z.B. Menütexte)?
Dann kann man diese im Flash ablegen, das spart SRAM.
...