Hallo zusammen,
ich habe folgenden Code der allerdings nur mit LPM0 und LPM1
funktioniert:
1
#include <msp430.h>
2
#include <msp430g2553.h>
3
#include "TI_USCI_I2C_master.h"
4
5
unsigned long cnt1 = 0;
6
void main( void )
7
{
8
while(1)
9
{
10
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
11
_EINT();
12
13
// Timer A configuration
14
TA0CCTL0 = CCIE; // Enable interrupts
15
// TASSEL_2: Set clock to internal DCO
16
// MC_1 : TA0CCR0 ist Frequenzteiler (Zähler)
17
// ID_3 : divide by 8
18
// TAIE : Interrupts
19
TA0CTL = TASSEL_2 + MC_1 + ID_3; // + TAIE;
20
TA0CCR0 = 15535; // bei MC_1 Frequenzteiler (Zähler)
21
22
__bis_SR_register(GIE + LPM1_bits);
23
}
24
return;
25
}
26
27
#pragma vector=TIMERA0_VECTOR
28
__interrupt void Timer_A (void)
29
{
30
if (cnt1 > 100)
31
{
32
cnt1 = 0;
33
__bic_SR_register_on_exit(LPM1_bits + GIE);
34
}
35
cnt1++;
36
}
Den gleichen Effekt habe ich mit dem Watchdog (funktioniert nur mit LPM0
und LPM1).
Was muss ich ändern damit der Code auch unter LPM2 und höher
funktioniert?
Liegt es vielleicht an den gesetzten Werten von TA0CCTL0?
Welchen Denkfehler begehe ich?
Andreas V. schrieb:> // TASSEL_2: Set clock to internal DCO
Korrekt wäre "Set clock source to SMCLK".
Und Abschnitt 2.3 des User's Guide sagt:
> The low-power modes 0 to 4 are configured with the ... bits in the status> register. [...]> When setting any of the mode-control bits, the selected operating mode> takes effect immediately (see Figure 2-9). Peripherals operating with any> disabled clock are disabled until the clock becomes active.
In LPM2 wird SMCLK angehalten. Du solltest dich freuen, dass der Timer
jetzt überhaupt keinen Strom mehr verbraucht. ?
Wenn der Timer in LPM2 laufen soll, dann brauchst du ACLK als Clock
Source. (Und das spart Strom nur, weil ACLK mit LFXT1/VLOCLK statt dem
DCO läuft.)
Du könntest auch SMCLK auf die selbe Clock wie ACLK konfigurieren, dann
wäre der Stromverbrauch in LPM0 und LPM2 der selbe.
Das bedeutet:
- Mit der internen Clock bring ich den MSP430 aus LPM2 und höher nicht
mehr zum Aufwachen!
- Einzige Möglichkeit den MSP430 aus LPM2 und höher wieder zum Leben zu
erwecken ist ein externe Taktquelle.
=> Standalone macht dann nur noch LPM0 und LPM1 Sinn, weil eine extra
Taktquelle auch Strom verbraucht. Bei einer ohnehin vorhandenen Clock
ist das naürlich super!
=> Ein System das keinen Strom verbraucht macht auch nix!
Habe ich das richtig verstanden?
Andreas V. schrieb:> - Mit der internen Clock bring ich den MSP430 aus LPM2 und höher nicht> mehr zum Aufwachen!
Doch, mit VLO → ACLK → Timer.
> Standalone macht dann nur noch LPM0 und LPM1 Sinn, weil eine extra> Taktquelle auch Strom verbraucht.
Laut Datenblatt braucht der DCO 30× mehr Strom als ein 32kHz-Quarz an
LFXT1.
Danke für die Info!
Der User Guide des MSP430 ersetzt wirklich jede Literatur. Selten las
ich bessere Doku. Das Blockbild der Oszillatoren (siehe Anhang) hat es
echt gebracht.
Ich ersetzte den Code oben durch folgenden und es funktioniert.
1
#include <msp430.h>
2
#include <msp430g2553.h>
3
#include "TI_USCI_I2C_master.h"
4
unsigned long cnt1 = 0;
5
6
void main( void )
7
{
8
while(1)
9
{
10
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
11
_EINT();
12
13
// Timer A configuration
14
TA0CCTL0 = CCIE; // Enable interrupts
15
// TASSEL_1: Set clock to internal DCO
16
// MC_1 : TA0CCR0 ist Frequenzteiler (Zähler)
17
// ID_1 : divide by 1
18
// TAIE : Interrupts
19
TA0CTL = TASSEL_1 + MC_1 + ID_1; // + TAIE;
20
TA0CCR0 = 65535; // bei MC_1 Frequenzteiler (Zähler)
21
22
BCSCTL3 |= LFXT1S_2; // VLO setzen
23
24
// WDT Timer
25
WDTCTL = WDT_MDLY_8;
26
27
// enable interrupts
28
IE1 |= WDTIE;
29
__bis_SR_register(GIE + LPM3_bits);
30
}
31
return;
32
}
33
34
//__interrupt void Timer_A0 (void)
35
#pragma vector=TIMERA0_VECTOR
36
__interrupt void Timer_A (void)
37
{
38
cnt1 = 0;
39
__bic_SR_register_on_exit(LPM4_bits | GIE); // zurück in aktiven Modus
40
cnt1++;
41
}
42
43
#pragma vector=WDT_VECTOR
44
__interrupt void WDT_ISR (void)
45
{
46
static unsigned int cnt = 0;
47
cnt++;
48
__bis_SR_register_on_exit (LPM4_bits | GIE);
49
}
Ich konnte den Stromverbrauch auf 3,3µA (LPM3) senken. Er läuft jetzt
aber auch erheblich langsamer!
Allerdings bleibt er im LPM4 immer noch hängen und wacht nicht auf!
Der MSP430 hat mir schon immer gefallen, aber momentan werde ich ein
richtiger Fan von dem Teil.
Gerade bin ich am Überlegen ob man eine Low Energy RTC wie die
RV-1805-C3 anzapfen kann. Ein System ohne RTC ist oft schwierig...
Ich hoffe ich kann mit meinem Beitrag auch weiterhelfen!
Andreas V. schrieb:> Allerdings bleibt er im LPM4 immer noch hängen und wacht nicht auf!
Im LPM4 gibt es ja auch keine Clocks mehr; Aufwachen geht nur, wenn ein
externes Signal am Pin wackelt.
Andreas V. schrieb:> Gerade bin ich am Überlegen ob man eine Low Energy RTC wie die> RV-1805-C3 anzapfen kann.
Wenn Du es geschafft hast, würde ich gern davon etwas absahnen.
Ich möchte den 32,7kHz Quarz des MSP430 irgendwie durch den genaueren
und kalibrierten RV1805 ersetzen.
Viel Erfolg.
wolle g. schrieb:> Andreas V. schrieb:>> Gerade bin ich am Überlegen ob man eine Low Energy RTC wie die>> RV-1805-C3 anzapfen kann.>> Wenn Du es geschafft hast, würde ich gern davon etwas absahnen.> Ich möchte den 32,7kHz Quarz des MSP430 irgendwie durch den genaueren> und kalibrierten RV1805 ersetzen.> Viel Erfolg.
Schau Dir mal slaa225a, Seite 1 an!
siehe Anhang!
Ich teste gerade den TinyRTC. Der scheint über 10 Jahre zu halten.
Die Angaben in den Datenblättern scheinen falsch zu sein. Wenn eine
Batterie 48mAh hat (siehe
https://www.sparkfun.com/datasheets/Components/DS1307.pdf) und 10 Jahre
im TinyRTC hält, dann braucht das Teil 0,5µA!
wolle g. schrieb:> Wenn Du es geschafft hast, würde ich gern davon etwas absahnen.> Ich möchte den 32,7kHz Quarz des MSP430 irgendwie durch den genaueren> und kalibrierten RV1805 ersetzen.> Viel Erfolg.
Beim DS1307 kann man die Frequenz an SQW/OUT abgreifen.
siehe https://www.sparkfun.com/datasheets/Components/DS1307.pdf
Und zwar je nachdem was im Control Register eingestellt ist zwischen 1Hz
und 32768Hz.
wolle g. schrieb:> Andreas V. schrieb:>> Gerade bin ich am Überlegen ob man eine Low Energy RTC wie die>> RV-1805-C3 anzapfen kann.>> Wenn Du es geschafft hast, würde ich gern davon etwas absahnen.> Ich möchte den 32,7kHz Quarz des MSP430 irgendwie durch den genaueren> und kalibrierten RV1805 ersetzen.> Viel Erfolg.
Der RV-1805 hat +/-100ppm Genauigkeit - das ist das Niveau eines
schlechten Quarzes.
Denkanstoß bzgl. Stromverbrauch, wenn Du das Taktsignal einschleifen
willst: Ein typischer IO-Pin hat ca. 5pF Eingangskapazität; bei 3V
Versorgung heißt das mindestens (!) 5pF*3V*32768Hz=500nA Verbrauch nur
fürs Takten, zzg. ca. 80nA, die der Chip selbst benötigt.
Ich hoffe wir reden vom gleichen Szenario.
Ich dachte an so was ähnliches wie das hier:
Beitrag "MSP430 mit externer Taktquelle betreiben"
Also SQW/OUT(RTC) an XIN(MSP430). Dann hat man Datum und Uhrzeit und 56
Byte EEPROM zum Speichern von Config Bytes noch. Angeblich hat der
TinyRTC +-40ppm Genauigkeit.
Allerdings weiss ich nicht wie der MSP430 Oszillatoreingang damit
zurechtkommt und ob da noch eine Anpassung erfolgen muss!
Andreas V. schrieb:> SQW/OUT
Mit Pullup, igitt.
> Allerdings weiss ich nicht wie der MSP430 Oszillatoreingang damit> zurechtkommt
Abschnitt 5.2.3 des User's Guide sagt:
> LFXT1 may be used with an external clock signal on the XIN pin in either> LF or HF mode when LFXT1Sx = 11, OSCOFF = 0, and XCAPx = 00. When used> with an external signal, the external frequency must meet the data sheet> parameters for the chosen mode
... nämlich f_LFXT1,LF,logic, also 10–50 kHz.
Clemens L. schrieb:> Andreas V. schrieb:>> SQW/OUT>> Mit Pullup, igitt.>
Nein, der TinyRTC gibt ein Rechtecksignal immer an SQW/OUT aus.
Wäre das so viel Mehrverbrauch? Das kann ich nicht glauben. Der XIN des
MSP dürfte doch wegen der kleinen Ströme relativ hochohmig sein.
Das Rechtecksignal kann je nach Bit0 und Bit1 im Controlregister des RTC
eine Frequenz zwischen 1Hz und 32768Hz haben.
Bit 1 Bit0 Frequenz
0 0 1 Hz
0 1 4096 Hz
1 0 8192 Hz
1 1 32768 Hz
>> Allerdings weiss ich nicht wie der MSP430 Oszillatoreingang damit>> zurechtkommt>> Abschnitt 5.2.3 des User's Guide sagt:>> LFXT1 may be used with an external clock signal on the XIN pin in either>> LF or HF mode when LFXT1Sx = 11, OSCOFF = 0, and XCAPx = 00. When used>> with an external signal, the external frequency must meet the data sheet>> parameters for the chosen mode>> ... nämlich f_LFXT1,LF,logic, also 10–50 kHz.
Theoretisch sollten elektrisch 4096 Hz, 8192 Hz, 32768 Hz möglich sein.
Nutzen würde ich allerdings nur die Uhrenfrequenz von 32kHz wollen.
Andreas V. schrieb:> Clemens L. schrieb:>> Andreas V. schrieb:>>> SQW/OUT>>>> Mit Pullup, igitt.>>> Nein
SQW ist ein Open-Drain-Ausgang. Wie willst du da ohne Pullup einen
High-Pegel bekommen?
> Vergesst den TinyRTC!> Da kommen über 34kHz statt 32768 Hz heraus!
Wie hast du das gemessen?
Jürgen W. schrieb:> Der RV-1805 hat +/-100ppm Genauigkeit - das ist das Niveau eines> schlechten Quarzes.
Mein Datenblatt sagt zur Ganggenauigkeit: bei 25°C werkseitig auf +-2ppm
abgeglichen
Eigene Messungen (Ausgang auf 1Hz eingestellt) durch Vergleich mit DCF77
zeigen nach etwas Korrektur mittels Register sogar ca. + 0,6ppm bei
Zimmertemperatur. (Lege aber meine Hand nicht ins Feuer)
Dazu auch etwas mehr unter:
Beitrag "Erklärung DCF 77-Empfang nachts häufiger gestört als am Tag"
Ich bin mir nicht sicher, ob die 32768Hz schon mit abgeglichen werden
oder erst die herunter geteilten Frequenzen in die Kalibrierung mit
einbezogen werden.
Kommando zurück! Ich nehme alles zurück und behaupte das Gregenteil!
Ich messe die niedrigen Frequenzen wie 32kHz mit meinem Billig-Oszi
China Kracher. Der zeigt die Werte normalerweise normalerweise auch
recht gut an.
Mein Frequenzmesser fängt erst bei 100kHz an zu messen.
Problem: Ich nahm zum Messen ein ungeschirmtes Kabel. Da war wohl noch
eine Frequenz drauf. Also schaltete ich zum Schluss mein gutes altes
Hameg 305-2(35 Mhz) an und bekam mit geschirmten Kabel 32,7 kHz heraus.
Das konnte man beim China Kracher optisch nicht sehen.
Zu allerletzt hab' ich dann doch noch mal mit dem Tektronix TDS 380(400
MHz) mit geschirmten Kabel gemessen. => 32,78 kHz.
Auch der Chinakracher zeigt mit dem geschirmten Kabel immer noch mehr
an.
=> 32,696 kHz bis 32,802kHz war alles dabei. Meistens war es mehr.
Eigentlich sollte es mit 2ppm bei 32,768 kHz bleiben!
Wer misst misst Mist....
Mit meinen Mittel bekomme ich es momentan nicht heraus.
Du hast wahrscheinlich direkt am Quarz gemessen. Vergleiche mal die
Kapazität des Oszi-Eingangs mit der, die du für XIN/XOUT konfiguriert
hast.
Um die Frequenz nicht zu beeinflussen, miss ACLK an P1.0.
Clemens L. schrieb:> Du hast wahrscheinlich direkt am Quarz gemessen. Vergleiche mal die> Kapazität des Oszi-Eingangs mit der, die du für XIN/XOUT konfiguriert> hast.>> Um die Frequenz nicht zu beeinflussen, miss ACLK an P1.0.
Schrödingers Katze lebt noch! Nur alles Messwerkzeug war nicht geeignet.
Ich habe am SQW/OUT abgegriffen (siehe Oszi-Bild im Anhang). Der
funktioniert ohne Pullups!
Ich habe mir einen über 30 Jahre alten Universalzähler vom ELO-Magazin
besorgt. Der geht bis 1 GHz. Den gabs damals nur als Bausatz.
Bezahlbare, brauchbare Multimeter oder andere Frequenzzähler fand ich
nicht.
Ergebnis: Nach 5 Minuten Einarbeitung hatte ich die Messung fertig
(siehe Anhang).
Andreas V. schrieb:> Ich habe am SQW/OUT abgegriffen (siehe Oszi-Bild im Anhang).
Das ist eine wunderschöne R-C-Kurve.
> Der funktioniert ohne Pullups!
Benutzt du den Chip direkt, oder auf einem Modul (mit eingebautem
Pullup)?
Wir reden vom Ausgang des Moduls (siehe Anhang roter Kreis) oder?
rot: 3,3V
blau: GND
gelb: CLK
weiss: SDA
grau: SQW/OUT
Ich sah keine Pullups....
Aber beim DS1306 gilt:
Square Wave/Output Driver. When enabled, the SQWE bit set to 1, the
SQW/OUT pin outputs one of four square-wave frequencies (1Hz, 4kHz,
8kHz, 32kHz). The SQW/OUT pin is open drain and requires an external
pullup resistor. SQW/OUT operates with either VCC or VBAT applied.
Clemens L. schrieb:> Das ist eine wunderschöne R-C-Kurve.
Mit dem 1:10 Teiler der Meßspitze des Frequenzzählers sieht die Kurve
schon anders aus. Ich finde das Signal sieht gar nicht so schlecht aus.
Aber hoch belasten darf man den SQW/OUT halt nicht.
TinyRTC zieht bei 3,3V als Taktquelle 600µA Strom extra!
Ca. 1% Messfehler bei Strom und Spannung! Frequenz ist halt kritischer
zu messen. Mit dem 30 Jahre altem Teil von ELO aber auch nicht mehr. :-)
Bei 2,2V sind es übrigens 360µA.
NiCa-Akkus mit 2,4V(2 x 1,2V) wären wohl ideal, aber von denen bin ich
aus diversen bekannten Gründen abgekommen. Leider haben Lipo-Akkus 3,7V
oder mehr Spannung. Zwei Dioden in Reihe zur Batterie oder step-down
Converter sind nicht so toll. Dann bleiben noch 3V Lithiumbatterien
übrig.
Sorry, ich will dir nicht ans Bein pinkeln, aber ...
... dein erster Post mit dem grottigen Programm lässt einem keinem Wahl:
Basics, Basics, Basics, ....
Es sieht sehr oberflächlich - schlampig? - aus. Da mag man nichts
glauben, was du gemessen, berechnet, ermittelt hast. Sorry!
Aber keine Sorge, jetzt bin ich raus (aus deinem Thread).
while (1) not needed schrieb:> Sorry, ich will dir nicht ans Bein pinkeln, aber ...>> ... dein erster Post mit dem grottigen Programm lässt einem keinem Wahl:> Basics, Basics, Basics, ....>> Es sieht sehr oberflächlich - schlampig? - aus. Da mag man nichts> glauben, was du gemessen, berechnet, ermittelt hast. Sorry!>> Aber keine Sorge, jetzt bin ich raus (aus deinem Thread).
@while(1) not needed
Was sollen Deine Posts? Die tun nichts zur Sache! Offenbar geht es
manchen Leuten eben gerade darum andere herunterzumachen.
Was soll Deine Bemerkung zu
> TA0CCR0 = 65535; // bei MC_1 Frequenzteiler (Zähler)
bedeuten?
Es geht hier um Beispiele die man verbessern kann. Wenn das der Weisheit
letzter Schluss wäre würde ich hier nicht schreiben. Mess die Werte doch
nach! Dann wirst Du sehen dass sie stimmen. Alles was falsch war habe
ich korrigiert.
Update:
TinyRTC unterscheidet zwischen Backup-Mode und Normal-Mode.
Falls eine geringfügig höhere Spannung an Vcc anliegt, dann fliessen im
"normalen Modus" Ausgleichsstrome zur Batterie. Ein 200 Ohm Widerstand
und eine Diode zur Batterie deuten darauf hin dass das eine
Ladeschaltumg sein soll.
Schaltet man den Taktausgang SQW/OUT aus (Controlregister hat Wert 80,
81, 82 oder 83 bzw.), dann kann man den Stromverbrauch des TinyRTC auf
unter 100µA senken (Ausgang = High).
Der Wert 40, 41, 42 oder 43 im Controlregister bringt wegen des Pullups
1030µA bei ausgeschaltetem Taktausgang (Ausgang = Low).
Die RTC läuft bei ausgeschaltetem SQW/OUT normal weiter.
Ich hätte noch einen anderen Vorschlag:
dieser wäre den Takt für den MSP430 nicht vom RTC abzuleiten, sondern
den MSP430 in den Mode LP4 zu schalten und ihn regelmäßig über einen
Portpin aufzuwecken.
Die meisten RTC's verfügen über einen 1 Sekunden-Takt-Ausgang.
Vorteile der Lösung:
- LP4 Mode des MSP430 bietet das größte Stromeinsparpotential, da im
MSP430 der Takt komplett abgeschaltet wird.
- die Lösung verbraucht nur einen Portpin des MSP430 statt zwei.
- die Geschwindigkeit des MSP430 ist unabhängig vom RTC.
Ich habe diese Methode noch stärker abgespeckt, da ich keine genaue
Ruhezeit des MSP430 benötigt habe, indem ich an dem Portpin ein RC-Glied
angeschaltet und auf den RTC verzichtet habe. Der Kondensator 10
Microfarad wird vom Portpin entladen und über den Widerstand von 1Mohm
langsam aufgeladen. Der geladene Kondensator löst einen Portinterrupt
aus und weckt damit den MSP430 auf. Bevor sich der MSP430 mit dem LP4
Modus neu schlafen legt, entlädt er den Kondensator und der Vorgang
beginnt von Neuem.