2009-02-26 7 views
3

Ich entwickle Druckmessgerät. Ich habe den MSP430F133-Chip verwendet und IAR Embedded Workbench verwendet. Es zeigt Druck in 3 verschiedenen Einheiten.MSP 430 falsche Werte werden angezeigt

Ich nehme 32 Proben und Mittelung es. Die Einheitenauswahl auf P5 wird entsprechend dem ausgewählten Ausgangswert der Einheit berechnet und auf dem LCD angezeigt.

Jetzt zeigt eine Einheit "IN WC" den binären gemittelten Wert des Eingangs an, nur zur Analyse.

Das Problem: in Standardeinheiten (MM WC) Werte sind richtig, aber in einer Testsituation anzeigt, wenn der Druck freigegeben wird es geht nach unten und LCD wie unten

+31.8 
+31.7 
+31.6 
+31.5 
+31.4 
+31.3 
+31.2 
+31.2 
+31.1 
+31.5 (wrong reading randomly between *.4 to *.7) 
+30.9 

lesen Wie Sie es ein falscher Wert ist, können angezeigt wird, kann ich den Grund nicht herausfinden.

+0

Sie müssen das Problem isolieren. Beginnen Sie zuerst mit dem Senden der ADC-Rohwerte an das Display und verwenden Sie dann Excel, um die Konvertierung durchzuführen und die Werte zu überprüfen. Wenn Sie Platz auf dem Display haben, geben Sie sowohl den ADC als auch die berechneten Werte aus. Alle Konstanten oder Variablen, die Sie ebenfalls ausgeben. –

+0

Quelle nicht mehr verfügbar. – eaanon01

Antwort

1

Das sieht fischig aus, das || wahrscheinlich sollte & & sein:

 for (i=0; i<= 3||res[i]!='\0'; i++) 

Aber ich sehe nicht, wie es Ihr Problem verursacht.

Außerdem sollten Sie Ihren Code aufräumen und vereinfachen. So wie es ist, ist es sehr schwer zu lesen.

4

Im folgenden Code ptiveValue = Wert und d1 = Wert so d2 ist immer 0, dann in der Schleife Sie for (i = 0 haben;! I < = 3 || res [i] = '\ 0'; i ++) die for (i = 0 sein sollte; i < = 3 & & res [i] = '\ 0';! i ++) so es druckt immer das, was in dem Puffer übrig war nicht das, was Sie wollen

Bad Code:

if (cntd <= 4) 
{ 
    d2 = (unsigned int) abs((ptiveValue - d1) * 10000); // get 4 digits of real part 
    itoa1(d2, res, &cntreal); 
    for (i=0; i<= 3||res[i]!='\0'; i++) 
    { 
     wr_lcd_dr(res[i]); 

    } 
} 

Fest Code

Sie überschreiben auch Ihren Puffer und möglicherweise seltsames Verhalten.

unsigned short Adcinb[32]; 
for (i = 0; i <= 63; i++) 
Adcinb[i] = 3180; 

Sollte

unsigned short Adcinb[32]; 
for (i = 0; i < 32; i++) 
Adcinb[i] = 3180; 
+0

Er überschreibt anderen Speicher, der dieses Ergebnis möglicherweise liefert oder nicht, aber es passiert nur einmal am Anfang des Programms. Etwas, das sicherlich behoben werden muss, aber wahrscheinlich nicht die Ursache des Problems ... –

+0

Da der MSP430 keinen Stack oder Heap für den Speicher hat, der Variablen kennt, ist er übergewichtig. Aber ich stimme wahrscheinlich nicht der Quelle des Problems zu. –

+0

Einige Varianten von MSP430 haben Puffer/Stack. – Sharique

0

Mit Blick auf den Code, die ich Ihnen diesen Wert bekommen würde keinen besonderen Grund sehen, wenn sie die tatsächlichen Werte erfasst wird reflektiert.

Können Sie das Programm ausführen und jeden der 32 Werte vor der Mittelwertbildung für die Nummer ausgeben, die das Problem hat, die Nummer davor und die Nummer danach?

Alternativ schreiben Sie die neue Probe jedes Mal, wenn Sie eine Probe erhalten und geben Sie uns diese Daten.

-Adam

2

Leider keine der beiden Verbindungen zu den Source-Code funktioniert nicht mehr. Aber von dem, was ich sehe, könnte die Ursache die Tatsache sein, dass die erwartete 'richtige' letzte Stelle an dieser Stelle eine Null ist. Meine Vermutung ist, dass irgendwo im Berechnungs- oder Visualisierungscode diese Null fälschlicherweise als Stoppbedingung genommen wird und eine zufällige Ziffer an ihrer Stelle angezeigt wird. (nur ein ‚31‘ ist mit dem Ausgang vorgesehen, aber 3 Stellen werden an die Anzeige gesendet)

Die ‚||‘/‚& &‘ Ausgabe oben zeigt, dass der Code nicht sehr geradlinig und wenn dies Das gilt auch für den Rest, eine falsche Stop-Bedingung hier und eine Schleife fester Länge könnte dies verursachen.

Nur ein "wild rate" (TM) aber das Beste, was ich geben kann, ohne den eigentlichen Code zu kennen.

1

Ich werde voran gehen und vorschlagen, eine Art von ADC 101-Lösung, die Sie versuchen könnten. Abhängig von der Art des Sensors, den Sie verwenden, müssen Sie möglicherweise Ihr eigenes Entprellen durchführen, um Ihre Probenwerte zu bereinigen. Ich habe in der Vergangenheit auf diesen Artikel hingewiesen und finde es sehr hilfreich für das Erlernen dieser Technik: A Guide to De-bouncing by Jack G. Ganssle!

Wie ich bereits erwähnt habe, obwohl dies voraussetzt, dass Ihre Hardware entprellt, aber der Leitfaden sollte Ihnen helfen, dies zu identifizieren. Selbst wenn Sie es nicht benötigen, können Sie es trotzdem interessant finden!

Zusätzlich: Nur damit Sie den Grund dafür kennen, dass Sie erwähnt haben, dass die seltsamen Messwerte aufgetreten sind, als der Druck freigegeben wurde. Entprellungsfehler sind bei der Abtastung während der Betätigung von mechanisch basierten Schaltern und Sensoren offensichtlich.

+1

Ich nahm nur die ganze Zeit, um eine Frage von 2009 zu beantworten ... seufz ... – Fz3