Chris schrieb:
Hmm.
Meine ursprüngliche Vermutung war, dass du irgendwo ein Array
niederbügelst und wild in den Speicher schreibst und dabei zufällig den
String erwischt hast.
Das einzige in dieser Richtung könnte hier stecken:
> int main( void )
> {
> init_usart();
> init_servo();
>
> //enable global interrupts to enable the ISR
> sei();
>
> // Pointer auf aktuelle ServoWerte
> p = &lastPoint;
Interrupts sind schon freigschaltet.
Wenn die USART vor deiser Zuweisung an p bereits einen Empfangsinterrupt
gefeuert hat, besteht die Chance, dass p benutzt wird noch ehe es einen
Wert erhalten hat.
Ich gebe zu, dass ist nicht besonders wahrscheinlich.
Trothdem sollte man es korrigieren:
Den sei() macht man immer erst, wenn ausnahmslos alles initialisiert
ist. Sonst verliert man schnell den Überblick, ob man schon darf oder
nicht. Am besten kommt der sei() als letzter Funktionsaufruf vor die
Hauptschleife
1 | int main()
|
2 | {
|
3 | Initialisierung
|
4 | Grundzustand herstellen
|
5 |
|
6 | sei()
|
7 | while( 1 ) {
|
8 | und los gehts
|
9 | }
|
10 | }
|
da gibts am wenigsten Überraschungen.
Aber abgesehen davon ist mir jetzt nichts aufgefallen, was den Effekt
erklären könnte.
Noch Manöverkritik
1 | switch(UDR)
|
2 | {
|
3 | case 0x61: // 'a'
|
schreibs doch gleich so
1 | switch(UDR)
|
2 | {
|
3 | case 'a':
|
dann brauchts keinen Kommentar und man sieht auch im Code, was
angestrebt wird.