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