Forum: Mikrocontroller und Digitale Elektronik SD16_A liefert messwerte nur im debug modus.


von Wahib F. (wahib_f)


Lesenswert?

Hallo

ich versuche über 2 shunts der stromverbrauch zu messen, dazu verwende 
ich den s.g SD16_A Modul, MSP430F47166.

im Debug modus funktioniert alles wunderbar, im freilaufenden mode 
bekommen ich immer null, sprich beim auslesen der SD16MEM0 und SD16MEM1 
wird irgendwie nicht richtig ausgeführt, ist unten in Blau markiert.

das folgende Quellcode bietet einen überblick über meine kodierung.
ich bin für jeden Hinweis dankbar.

LG


unsigned int ChA0Value , ChA1Value
void main()
{

  SD16CTL = SD16REFON+SD16SSEL_0;     // 1.2V ref, ACLK
  // CH A0.0+
 SD16INCTL0|=SD16INCH_0+SD16INTDLY0;  //Interrupt on 4th sample
  SD16CCTL0  |= SD16UNI;              // Enable interrupt
 // SD16CCTL0  |= SD16UNI + SD16SC +SD16SNGL+SD16IE;

  // CH A1.0+
  SD16INCTL1|=SD16INCH_1+SD16INTDLY0; //Interrupt on 4th sample
  SD16CCTL1  |= SD16UNI;              // Enable interrupt
  //SD16CCTL1  |= SD16UNI + SD16SC +SD16SNGL+SD16IE;

  for (int i = 0; i < 0x3600; i++);    // Delay for 1.2V ref startup

 currentMeasurement();

while(1)
{
  _NOP();
}

}

void currentMeasurement()
{
  /*
  //spgdiff   = ((A0-A1)*0,6)/65535   ==> in V
  //stromdiff = spgdiff / 10ohm       ==> in A
  //stromdiff = stromdiff * 10000000  ==> in uA
  */

  A0_HIGH();
  A1_HIGH();

  SD16CCTL1|=SD16SC;
  SD16CCTL0|=SD16SC;

  usCurrentConsumeuA=0;
  ChA0Value=0;
  ChA1Value=0;


>>ChA0Value = SD16MEM0;                       // save A0 value
>>ChA1Value = SD16MEM1;                       // save A1 value

  usCurrentConsumeuA  = (unsigned long)(ChA0Value - ChA1Value)*6;
  usCurrentConsumeuA *= 10000;
  usCurrentConsumeuA /= 0xFFFF;

  A0_LOW();                             // disable A0
  A1_LOW();                             // disable A1
}

von Wahib F. (wahib_f)


Lesenswert?

Keine Ideen?
hat niemanden Erfahrung damit gemacht?

von Karl H. (kbuchegg)


Lesenswert?

Wahib F. schrieb:
> Keine Ideen?
> hat niemanden Erfahrung damit gemacht?

Eines vorweg.
Von deinem µC hab ich keine Ahnung.

Aber wenn sich Programme im Release Modus (also mit Optimierung) nicht 
so verhalten wie im Debug Modus, dann ist das meistens eine von 3 
Ursachen

* man hat etwas programmiert, was in C nicht definiert ist.
  Der Compiler kann dann im Release Modus etwas anderes daraus
  machen, wie im Debug Modus

* uninitialisierte Variablen

* Timing Sachen, die über ungenügende Hilfsmittel realisiert werden


Und in deinem Code sticht sofort das hier ins Auge:

  for (int i = 0; i < 0x3600; i++);    // Delay for 1.2V ref startup


Im Debug mag die Schleife eine bestimmte Zeit brauchen. Im release Mode 
ist die Zeit aber eine andere. Bis hin zu effektiv 0, weil der Optimizer 
das komplett rauswirft.

von Wahib F. (wahib_f)


Lesenswert?

Problem selber gelöst,

es lag einfach daran, dass die SD covension ein bisschen zeit braucht, 
ich lese praktisch bevor die Hardware fertig ist.

Lösung:

 while ((SD16CCTL1 & SD16IFG)==0); //warten bis die SD covension fertig 
ist

>  hal_SD16_ChA0Value = SD16MEM0;
>  hal_SD16_ChA1Value = SD16MEM1;

  SD16CCTL0 &=~(SD16IFG + SD16SC);
  SD16CCTL1 &=~(SD16IFG + SD16SC);


LG

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.