www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Msp430 Echtzeituhr Variable Problem


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Jonas Enderlin (joenten)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.
#include <msp430g2232.h>
#include "init.h"

unsigned short ush_RTCsec = 0;
unsigned short ush_RTCmin = 0;
unsigned short ush_RTChour = 0; 

  
void main(void)
{
  init_main();
  while (1)
  {
    _delay_cycles(40000);
  }
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR (void)
{
   TACTL &= ~TAIE;
   if (ush_RTCsec >= 59 )
  {
     if (ush_RTCmin >= 59)
     }     
       if (ush_RTChour >= 23)
       }     
         ush_RTChour = 0;
       }
       else
       {
         ush_RTChour ++;
       }
     }
     else
     {
       ush_RTCsec = 0;
       ush_RTCmin **;
     }
  }
  else
  {
    ush_RTCsec ++;
  }

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

Autor: Mark Brandis (markbrandis)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Was ist die Fehlermeldung? Und was soll die Zeile hier:

ush_RTCmin **;

darstellen?

Autor: Krapao (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
>        ush_RTCmin **;

Was macht diese Zeile?

Autor: Krapao (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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).

Autor: Krapao (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
definiert => definiert sind

Autor: Mark Brandis (markbrandis)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Mit der Klammerung bei den ifs stimmt auch was nicht.

Autor: Jonas Enderlin (joenten)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Beitrag #2640382 wurde vom Autor gelöscht.
Autor: Jonas Enderlin (joenten)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
ok hab den Fehler gefunden, die if-Klammern waren schuld.
Danke für die schnelle Antwort!

Autor: Falk Brunner (falk)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
@  Jonas Enderlin (joenten)

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

Nicht nur. Es fehlt volatile, siehe Artikel Interrupt.

MFG
Falk

Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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 ....
  ...
  ush_RTCsec++;

  if( ush_RTCsec == 60 )
  {
    ush_RTCsec = 0;
    ush_RTCmin++;

    if( ush_RTCmin == 60 )
    {
      ush_RTCmin = 0;
      ush_RTChour++;

      if( ush_RTChour == 24 )
        ush_RTChour = 0;
    }
  }

  ...

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.

Autor: Jonas Enderlin (joenten)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
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.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net