PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vergleich zweier Werte führt zu merkwürdigem Verhalten



chris@franke
27.01.2010, 11:57
Hallo,
ich habe ein sehr merkwürdiges Problem. Es geht einfach darum, dass ich zu Debugzwecken einen Wert an den PC schicken möchte sobald sich dieser ändert. Eigentlich keine große Sache, wie man auch am Code sieht. Dummerweise ändert sich der ausgegebene Wert (input_diff) ohne mir ersichtlichen Grund auf absolut unrelaistische Werte, sobald ich den Vegleich auf Änderung mache. Kommentiere ich die IF-Zeile und die Klammern aus, bekomme ich zwar eine endlose Flut an Werten geschickt, es ist aber kein einziger dabei, der unplausibel ist.




volatile int input_diff;
volatile unsigned char tempstring[10];
volatile int last = 0;

// Irgendwo in der Hauptschleife:

if (last != input_diff)
{
last = input_diff;
itoa( input_diff,tempstring,10);
USARTSendLine(tempstring);
}



Ich kann mir das absolut nicht erklären, woher dieser Nebeneffekt kommt. Die Variable input_diff wird nur in der Hauptschleife, also vor der Abfrage auf Änderung, gesetzt. Kann ein Interrupt während des Vergleichs soviel Choas anrichten, dass der Inhalt einer Variablen, die im Interrupt überhaupt nicht genutzt wird, geändert wird?

sast
27.01.2010, 13:13
Kannst du unrealistische Werte und plausible Werte mal etwas genauer spezifizieren.
Leider hast du ja nur ein Stück Code mitgeschickt, was allerdings für sich gesehen okay aussieht. Jedenfalls ist mir auch nach zehnmaligem Draufsehen nichts aufgefallen.

Manchmal hilft es, etwas mehr vom Code preiszugeben. Vorallem wenn man sich selbst sicher ist, dass der Codeschnipsel den man postet okay ist.

Hast du den Code hier rein kopiert, oder noch mal neu geschrieben?

Wie kommst du darauf, dass ein Interupt für die falschen Werte verantwortlich ist, wenn du mit der if-Abfrage arbeitest, aber sonst deine Variable in Ruhe läßt? Da müssten dann ja ebenfall Fehler auftreten, wenn du direkt alle Werte ausgeben läßt.

sast

markusj
27.01.2010, 13:48
Klingt nach Timing-Problemen - ich sehe auch nicht, wo du Interrupts vor dem Betreten des kritischen Abschnittes deaktivierst bzw. danach wiederherstellst.

mfG
Markus

hm_heli
27.01.2010, 16:50
habe leider keine Zeit mich tiefer damit zu befassen:
1. warum nimmst Du nicht sprintf?
2. funzt die Routine in einem kleinen Testprogramm um die
"komplexe" Umgebung auszuschliessen?
3. ich bin nicht sicher, ob itoa damit happy ist, dass Du
unsigned char verwendest