Hallo,

so ganz finde ich durch die Codeteile noch nicht durch.
Was mir beim durchschauen aufgefallen ist.
Wo wird LCD_lauftext etwas zugewiesen.
Mit
Code:
         for (uint8_t i=0; i<=strlen((const char *)LCD_lauftext); i++) { 
            LCD_lauftext[i]=LCD_lauftext[i+1]; 
         }
erzeugst du, wenn es dumm läuft, einen Überlauf.

Edit: Die obige Aussage von mir ist Blödsinn. Du greifst zwar ausserhalb von LCD_lauflicht zu, schreibst aber nicht.

Wird Timer2 überhaupt gestartet?

Am Anfang der Funktion rs232_open steht der Kommentar:
//alle unwichtigen interrupts beenden
Wo machst du da was?

Schieße ich auch mal ins Blaue. Passiert der Fehler auch, wenn du sei() auskommentierst?

Gruß

Jens