Msp430 Echtzeituhr Variable Problem

OP #2639832
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!
#2640435
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.