Forum: Mikrocontroller und Digitale Elektronik Msp430 Echtzeituhr Variable Problem


von Jonas E. (joenten)


Lesenswert?

Hallo zusammen,
ich bin noch relativ neu und unerfahren im Bereich Programmierung. Da 
ich es aber lernen möchte, will ich eine kleine Uhr mit einem MSP430G 
programmieren.
Ich dachte mir ich löse einfach jede Sekunde einen Timer-interrupt aus 
und setzt dann die Sekunden-Variable um eins nach oben. Minuten und 
Stunden wollte ich einfachen mit If-Anweisungen machen.
So weit so gut.
Jetzt hab ich leider das kleines Problem, das es irgendwie ein Problem 
mit den Variablen gibt.
1
#include <msp430g2232.h>
2
#include "init.h"
3
4
unsigned short ush_RTCsec = 0;
5
unsigned short ush_RTCmin = 0;
6
unsigned short ush_RTChour = 0; 
7
8
  
9
void main(void)
10
{
11
  init_main();
12
  while (1)
13
  {
14
    _delay_cycles(40000);
15
  }
16
}
17
#pragma vector=TIMER0_A0_VECTOR
18
__interrupt void TIMER0_A0_ISR (void)
19
{
20
   TACTL &= ~TAIE;
21
   if (ush_RTCsec >= 59 )
22
  {
23
     if (ush_RTCmin >= 59)
24
     }     
25
       if (ush_RTChour >= 23)
26
       }     
27
         ush_RTChour = 0;
28
       }
29
       else
30
       {
31
         ush_RTChour ++;
32
       }
33
     }
34
     else
35
     {
36
       ush_RTCsec = 0;
37
       ush_RTCmin **;
38
     }
39
  }
40
  else
41
  {
42
    ush_RTCsec ++;
43
  }

Ich benutze Code Composer Studio von TI als  Compailer und finde leider 
das Problem nicht.
Danke für eure Hilfe!

von Mark B. (markbrandis)


Lesenswert?

Was ist die Fehlermeldung? Und was soll die Zeile hier:

ush_RTCmin **;

darstellen?

von Krapao (Gast)


Lesenswert?

>        ush_RTCmin **;

Was macht diese Zeile?

von Krapao (Gast)


Lesenswert?

Wenn main() bzw. der Nicht-Interrupthandler-Code mehr Funktionalität 
erhält wird es ein Problem geben, weil die ush_RTC Variablen nicht 
volatile definiert: Warum das dann nötig ist, siehe Artikel 
Interrupt).

von Krapao (Gast)


Lesenswert?

definiert => definiert sind

von Mark B. (markbrandis)


Lesenswert?

Mit der Klammerung bei den ifs stimmt auch was nicht.

von Jonas E. (joenten)


Lesenswert?

Mark Brandis schrieb:
> Was ist die Fehlermeldung? Und was soll die Zeile hier:
>
> ush_RTCmin **;
>
> darstellen?

Das war ein schreibfehler es sollte ++ heißen.

von Jonas E. (joenten)


Lesenswert?

ok hab den Fehler gefunden, die if-Klammern waren schuld.
Danke für die schnelle Antwort!

von Falk B. (falk)


Lesenswert?

@  Jonas Enderlin (joenten)

>ok hab den Fehler gefunden, die if-Klammern waren schuld.

Nicht nur. Es fehlt volatile, siehe Artikel Interrupt.

MFG
Falk

von Karl H. (kbuchegg)


Lesenswert?

Jonas Enderlin schrieb:
> Mark Brandis schrieb:
>> Was ist die Fehlermeldung? Und was soll die Zeile hier:
>>
>> ush_RTCmin **;
>>
>> darstellen?
>
> Das war ein schreibfehler es sollte ++ heißen.

Dir ist klar, dass man sich mit Code, den man extra fürs Forum noch 
einmal neu tippt, enorm unbeliebt machen kann? Es ist praktisch kaum zu 
vermeiden, dass man da Tippfehler einbaut, die im realen Code nicht 
vorhanden sind. Die regelmässigen Helfer hier haben dann eine 
Riesenfreude, wenn sie dich auf Fehler aufmerksam machen, die in deinem 
realen Code gar nicht enthalten sind.


Dreh deine Logik in der Interrupt Routine ein wenig um. Das ist ein 
wenig arg vewrwirrend, was du da machst.
Erhöhe die jeweilige Variable und danach siehst du nach, ob du damit 
übers Ziel hinausgeschossen bist und korrigierst das entsprechend, indem 
du zb wieder bei 0 Sekunden anfängst und dafür 1 Minute mehr zählst. 
Sind die Minuten bei 60, dann gehen die wieder auf 0 und dafür wird 1 
Stunde mehr gezählt ....
1
  ...
2
  ush_RTCsec++;
3
4
  if( ush_RTCsec == 60 )
5
  {
6
    ush_RTCsec = 0;
7
    ush_RTCmin++;
8
9
    if( ush_RTCmin == 60 )
10
    {
11
      ush_RTCmin = 0;
12
      ush_RTChour++;
13
14
      if( ush_RTChour == 24 )
15
        ush_RTChour = 0;
16
    }
17
  }
18
19
  ...

siehst du um wieviel einfacher und durchschaubarer diese Logik ist? Bei 
deiner Logik muss man erst mal alle Möglichkeite in Gedanken abklappern, 
die du da mit den if's und else's aufgebaut hast um sich davon zu 
überzeugen, dass in allen Fällen auch wirklich das Richtige passiert.

von Jonas E. (joenten)


Lesenswert?

ja du hast recht, das ist echt viel übersichtlicher.
Danke für den guten Rat :-)

das mit dem abgetippten Code, werd ich mir zu Herzen nehmen.

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.