Hallo,
ich schreibe mit Energia an einem kleinen Programm zur Spannungs-/
Strommessung.
Ziel ist es mittels eines Timer-Interrupts alle 100ms (funktioniert) die
Werte aufzunehmen und alle 1s den Mittelwert zu bilden und diesen dann
auszugeben, bzw. aufzuaddieren.
Der Interrupt funktioniert und ich kann mir auf den Display testweise
die Zeit anzeigen lassen.
Zum ADC: Ich habe auf den Eingängen A0, A1, A4 und A5 die Analogwerte
anliegen. Diese wollte ich mit dem ADC continuierlich sampeln und
mittels DTC auf ein Array schreiben.
Aus diesem Array hätte ich dann bei einem Interrupt den gerade
darinstehenden Wert genommen.
Soweit der Plan... Leider funktionert das ganze noch nicht. Scheinbar
wird nichts in das Array geschrieben (?).
Danke für die Hilfe!
MfG
Markus
1
#include<LiquidCrystal.h>
2
#include<msp430.h>
3
4
5
6
LiquidCrystallcd(19,18,14,13,12,11);
7
constintbuttonPin=PUSH2;
8
9
intspannung=0,mwspannung=0;
10
intstrom=0,mwstrom=0;
11
intzaehler=0;
12
intverbrauch=0;
13
intgesamt=0;
14
unsignedintresults[6];
15
16
17
18
voidsetup(){
19
lcd.begin(16,2);
20
21
WDTCTL=WDTPW+WDTHOLD;// Disable watchdog reset
22
23
ADC10CTL0&=~ENC;
24
ADC10CTL1|=CONSEQ_3+INCH_5;
25
ADC10CTL0|=ADC10SHT_1+ADC10ON+MSC;
26
ADC10AE0|=0x33;// select channel A0,A1,A4,A5
27
ADC10SA=(int)results;
28
ADC10DTC0|=ADC10CT;
29
ADC10DTC1=0x06;
30
ADC10CTL0|=ADC10SC+ENC;// start conversions
31
32
33
34
35
TA0CTL&=~MC_1;
36
37
TA0CCR0=0x9C34;//rechnerisch: 9C40, aber Korrektur, da zu langsam
38
TA0CCTL0=CCIE;
39
TA0CTL=TASSEL_2+ID_3+MC_1;
40
_EINT();
41
42
43
44
45
46
}
47
48
voidloop(){
49
//lcd.clear();
50
51
52
lcd.setCursor(3,0);
53
lcd.print(results[0]);//Test ob Array beschrieben wird
Hallo,
danke, aber der TI Code, bzw. die hier im Forum liegenden Codes sind mir
bekannt. (denke zumindest alles gefunden zu haben)
TI-Init:
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
ADC10CTL1 = INCH_2 + CONSEQ_1; // A2/A1/A0, single sequence
ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE;
ADC10DTC1 = 0x03; // 3 conversions
ADC10AE0 |= 0x07; // P2.2,1,0 ADC10 option
select
P1DIR |= 0x01; // Set P1.0 output
Mein Init:
WDTCTL = WDTPW + WDTHOLD; // Disable watchdog
reset
ADC10CTL0 &= ~ENC; // ADC aus
ADC10CTL1 |= CONSEQ_3+ INCH_5; // Kont. Samplen,
A5-A0
ADC10CTL0 |= ADC10SHT_1 + ADC10ON + MSC; //
ADC10AE0 |= 0x33; // select channel A0,A1,A4,A5
ADC10SA = (int)results;
ADC10DTC0 |= ADC10CT;
ADC10DTC1 = 0x06;
ADC10CTL0 |= ADC10SC + ENC; // start conversions
Meine Frage geht gerade in die Richtung, ob die Zeile:
ADC10SA = (int)results;
So funktioniert. Ansonsten gibt es ja nicht viele Ansätze a) ADC geht /
geht nicht -> init falsch
b) Arrayzuweisung geht nicht ->keine Werte da
Vergleich mal ganz genau, was hier passiert:
TI:
> ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE;
Du:
> ADC10CTL0 &= ~ENC; // ADC aus> ADC10CTL0 |= ADC10SHT_1 + ADC10ON + MSC; //
Das TI-Beispiel initialisiert das komplette ADC10CTL0-Register, Du aber
belässt es im Reset-Zustand und änderst nur einige Bits darin.
Das muss nicht die Ursache Deines Problems sein, kann aber.
Bei der Initialisierung muss nach dem disablen aufs Busy gewartet
werden.
1
ADC10CTL0&=~ENC;
2
while(ADC10CTL1&BUSY);
Rufus Τ. Firefly schrieb:> Das TI-Beispiel initialisiert das komplette ADC10CTL0-Register, Du aber> belässt es im Reset-Zustand und änderst nur einige Bits darin.
Das sollte natürlich auch geprüft werden.
Hallo,
danke für die Hilfe, das mit dem verodern ... da wollte ich einfach auf
Nummer sicher gehen nichts wichtiges zu überschreiben. Ich habs jetzt
mit Blick aufs Handbuch geändert, leider will er immer noch nicht :(
Hier ein hoffentlich verständliches Testprogramm
Oha,
beim ganzen probieren vergessen... Danke
aber &(results[0]) führt zur Fehlermeldung
und (int)&(results[0]) führt auch nicht zur gewünschten Funktion