Forum: Mikrocontroller und Digitale Elektronik MSP430 - seltsames verhalten eines Zählers


von Lilalaunebär (Gast)


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...

von Achim M. (minifloat)


Lesenswert?

Lilalaunebär schrieb:
> WDTCTL   = WDTPW|WDTHOLD;

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

von Lilalaunebär (Gast)


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...

von Lilalaunebär (Gast)


Lesenswert?

10^4 pf war ein Schreibfehler. Ich meinte 100 nF. Danke übrigens für den 
Tipp!

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.