SD16_A liefert messwerte nur im debug modus.

OP #2047666
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
}
#2047818
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.
OP #2047922
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.