MSP430 - seltsames verhalten eines Zählers

Gast #2240822
Lesenswert?
• ▲
▼
Hi,

Ich möchte mit einem MSP430G2211 7-Seg-Anzeigen ansteuern. Das geht auch 
ganz gut, aber sobald ein Takt dazukommt wirds einfach nur strange.

Hier mein Code:
1
void main (void)
2
{
3
  short s = 0;
4
  short ts = 0;
5
  short min = 0;
6
  short tmin = 0;
7
  int i = 0;
8
  
9
  WDTCTL   = WDTPW|WDTHOLD;       //Watchdog stoppen
10

11
  P1DIR   = 255;           //127d = 1111111b -> 7 aktive Outputs an P1
12
  P1OUT   = 0;            
13

14
  BCSCTL1 &= ~XTS;        // Low Frequency Mode für den externen Quarzeingang setzen
15
  BCSCTL3 &= ~(LFXT1S0 | LFXT1S1);// 32768 Hz Modus einstellen
16
  BCSCTL3 |= XCAP1;          // 12.5 pF einstellen
17

18
  TACCTL0 = 0;            
19

20
  TACCR0   = 32767;               //Obere Zählgrenze für Timer
21
  TACTL  = MC_1|TASSEL_1|TACLR;   //Timer einstellen und starten
22
                            //Bedeutung: MC=Modus, hier 1=Aufwärtszählen
23
                            //TASSEL=Clock source select, hier: 1 = ACLK
24
                            //TACLR=Timer A clear= Zähler zurücksetzen
25
                               
26
 while(1)              //Immerwährender Zählprozess
27
{
28
  while((TACTL & 1)==0)      //TAIFG (Timer A Interrupt Flag) checken
29
  {
30
    P1OUT = 0;
31
    writedigit(s);
32
    P1OUT = DIGIT_S;
33
    for(i=5000; i>0; i--){}
34
    
35
    P1OUT = 0;
36
    writedigit(ts);
37
    P1OUT = DIGIT_TS;
38
    for(i=5000; i>0; i--){}
39
  }                  //nach 1s Schleife verlassen
40
    TACTL &= ~1;        //TAIFG nullen
41
    s++;
42
}
43

44
}

Zweck des Programms: Die Anzeige soll die Sekunden- und 
10-Sekunden-Stelle einer Uhr bedienen und multiplex ansteuern. Die 
Sekunden-Stelle fängt auch an hochzuzählen. Allerdings springt sie 
unvorhersehbar ständig auf null zurück. Mal zählt sie bis 1 und springt 
zurück, mal bis 7, mal zählt sie auch durch bis 9. Was läuft hier 
schief? Der Sekundenvariable wird am Anfang des Programms der Wert null 
initial zugewiesen, danach kann sie eigentlich nur noch steigen. Wieso 
geht sie auf null zurück? Wenn man die Timings verkürzt (z.B. 200 statt 
5000), was für einen flimmerfreien Betrieb eigentlich nötig wäre, 
verschärft sich das Problem, und die Sekunden zählen(wenn überhaupt) 
noch bis 1. Mein erster Gedanke war, die Variable mit "static" zu 
versehen, aber es nützte nichts...
Gast #2240917
Lesenswert?
• ▲
▼
Mini Float schrieb:
> Kann man in WDTCL eventuell nur Konstanten rein schieben?
> Schreib doch mal ein "+" statt des oder-Operators, wie in den Beispielen
> auch.
>
> Spannungsversorgung in Ordnung, keine negativen Spikes?
> mfg mf

Habs probiert, mit dem WD hat es aber vermutlich nichts zu tun.
Der Tip mit der Vcc scheint sich hier zu bewahrheiten. Da ich leider 
kein Messgerät habe, kann ich da nur Mutmaßungen anstellen. Fakt ist 
aber, ich hatte bisher die Vcc mit 10^4 pf geglättet. Ohne 
Glättungskondensator tut sich gar nix. Mit zwei von der Sorte scheint 
der Fehler behoben zu sein. Wenn ich dann die Umschaltfrequenz erhöhe 
könnten noch mehr Fahhrads nötig werden...

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.