Forum: Mikrocontroller und Digitale Elektronik MSP430 RTC via IRQ abfragen


von MSP_Newbie (Gast)


Lesenswert?

Hallo Zusammen,

ich habe ein kleines Programm geschrieben, dass den MSP430FR5729 in den 
LPM 3.5 versetzt. Über einen Interrupt am P 3.1 lässt er sich wieder 
aufwecken. Im Falle eines Interrupts soll das Register RTCSEC der RTC 
abgefragt werden, die im Hintergrund läuft:

1
#pragma vector=PORT3_VECTOR
2
__interrupt void Port_3(void)
3
{
4
  second = RTCSEC;
5
  P3IFG &= ~BIT0;
6
  __bic_SR_register_on_exit(LPM3_bits + GIE);
7
}

Der Wert der Variable "second" zeigt dabei aber völlig sinnfreie Werte 
(z.B. 32456). Der Wert im Register bewegt sich zwischen 0 und 60.

Was mache ich falsch? Ich habe schon die Datentypen "unsigned char" und 
unsigned int" für second ausprobiert.

Oder löst man sowas besser über Pointer?

Beste Grüße

von Jim M. (turboj)


Lesenswert?

Hast Du auch mal folgendes probiert:
1
volatile unsigned char second;

von MSP_Newbie (Gast)


Lesenswert?

Ja, das führt dann zu Ergebnissen wie "," oder "."

Ich hab nur bisher noch keine funktionierende Typenkonvertierung von 
char nach int gefunden.

von Erik (Gast)


Lesenswert?

Hallo MSP_Newbie

RTC modul konfiguriert als dezimal oder Hex ?

was kommt bei " second = RTCTIM0 "   raus :Sekunden und Minuten ?


bei Assembler    mov.b   second,&RTCSEC


in der  +++.h Datei  steht ...

#define RTCSEC              RTCTIM0_L
#define RTCMIN              RTCTIM0_H


mfg Erik

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

MSP_Newbie schrieb:
> Ja, das führt dann zu Ergebnissen wie "," oder "."

> Ich hab nur bisher noch keine funktionierende Typenkonvertierung
> von char nach int gefunden.

Da muss nichts konvertiert werden, ein "char" kann (sofern das mit dem 
Vorzeichen sichergestellt ist) direkt einem int zugewiesen werden.

Wenn Du aber Ergebnisse wie "," oder "." erhältst, dann hast Du kein 
Typkonvertierungs-, sondern ein generelles Verständnis- und 
Darstellungsproblem.

"," ist 44, "." ist 46. Beides passt (denn 0 ≤ 44 ≤ 59).

Deine hier nicht gezeigte Funktion, mit der Du Deinen Sekundenwert 
irgendwohin ausgibst, scheint hier das Problem zu sein.

von MPS_Newbie (Gast)


Lesenswert?

Zunächst einmal Danke für die Antworten.

Ich bin ein Stück weiter gekommen. Man kann die RTC Register nicht 
einfach abfragen wie man möchte, sonst entstehen "invalid values", wie 
es so schön im Handbuch steht.

Entweder man pollt auf das RTCRDY flag und übernimmt bei ansteigender 
Flanke den Wert der Register oder man löst das Ganze Interrupt 
getrieben.

Einzelheiten stehen im Handbuch auf S. 385. Falls Jemand ähnliche 
Probleme hat ;-)

Beste Grüße

von sdf (Gast)


Lesenswert?

while(!RTCRDY);  // solange Read-ready nicht gesetzt ist soll er hier 
verbleiben
  return RTCSEC;

man kann den Zustand pollen, dann bekommt man immer korrekte Werte 
ausgegeben.

Vorrausgesezt natürlich man hat das RTC Modul etc alles richtig 
konfiguriert.

von MPS_Newbie (Gast)


Lesenswert?

Danke für den Hinweis! :-)

Ich habe das RTC Modul wie folgt konfiguriert:
1
void init_RTC()
2
{
3
    RTCCTL0 |= RTCRDYIE;
4
    RTCYEAR = 0x7DE;                        // Year = 2014
5
    RTCMON = 0x0C;                          // Month = Dezember
6
    RTCDAY = 0x1C;                          // Day = 28
7
    RTCHOUR = 0x0E;                         // Hour = 0xA
8
    RTCMIN = 0x02;                          // Minute = 10
9
    RTCSEC = 0x00;                          // Seconds = 0
10
    RTCCTL01 &= ~(RTCHOLD);                 // Start RTC
11
}

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.