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 }
Keine Ideen? hat niemanden Erfahrung damit gemacht?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.