Hallo Leute!
Ich möchte gerne mit meinem Mikrocontroller einen 1ms Interrupt
erzeugen. Jetzt hab ich grad n kleines Problem...
Mein Aufbau ist folgendermaßen:
1 | XT2 3.6864MHz XT1 32.768kHz
|
2 | || ||
|
3 | --------------------------------
|
4 | | |
|
5 | | MSP430 |
|
6 | --------------------------------
|
Der XT2 ist logischerweise der Systemtakt, der Uhrenquarz soll die Zeit
zählen. XT2 ist wegen UART usw. ein Baudratenquarz mit dieser krummen
Frequenz.
Jetzt hab ich zwei Probleme:
1.)
Um eine genaue Zeitbasis von 1ms zu bekommen, bräuchte ich ja nun
entweder vom XT1 einen Zählwert von 32,768 -> geht nicht, also 32 (zu
schnell) oder 33 (zu langsam) :-\ ungünstig dafür
Der XT2 eignet sich ebensowenig, da auch aus ihm keine genaue
1ms-Zeitbasis generiert werden kann. Hier könnte ich jetzt immer bis
3686,4 zählen, was aber selbiges Problem wie oben ist.
Mir scheint, als ist der Baudratenquarz dafür ungeeignet und man sollte
lieber eine gerade Zahl nehmen und den UART modulieren.
Eigent sich der Uhrenquarz NUR für ganze Sekunden? Ich raffs nicht so
ganz - ich muss hier doch nen Denkfehler haben. Wieso dann genau
32.768kHz und nicht auch eine gerade Zahl - gut vergesst die Frage -
wegen binärem Teilen.
2.)
Wenn ich den Timer mit 32 oder 33 laufen lasse, um ~1ms zu erhalten,
dann ist mein uC zumindest in meiner momentanen vorgehensweise nicht in
der Lage, diesen Timer hochzuzählen, da er zu langsam ist. Konnte ich
mir irgendwie nicht so wirklich vorstellen, aber kann das sein?
Software:
1 | timer_flag;
|
2 |
|
3 | main
|
4 | {
|
5 | ...mach bisschen was;
|
6 | ...mach noch bisschen was anderes;
|
7 |
|
8 | if( timer_flag )
|
9 | {
|
10 | timing_advance_ms_counter();
|
11 | timer_flag = 0;
|
12 |
|
13 | KONTROLL_LED_TOGGLEN; // HIER MESSE ICH MIT DEM OSZILLOSKOP
|
14 | }
|
15 |
|
16 | ...
|
17 | }
|
18 |
|
19 |
|
20 | timer_ISR
|
21 | {
|
22 | if( 1ms_timer )
|
23 | {
|
24 | timer_flag = 1;
|
25 | }
|
26 | }
|
27 |
|
28 |
|
29 | void timing_advance_ms_counter( void )
|
30 | {
|
31 | TIMING.milliseconds++;
|
32 |
|
33 | if( TIMING.milliseconds > 999 )
|
34 | {
|
35 | TIMING.milliseconds = 0;
|
36 | TIMING.seconds++;
|
37 |
|
38 | if( TIMING.seconds > 59 )
|
39 | {
|
40 | TIMING.seconds = 0;
|
41 | TIMING.minutes++;
|
42 |
|
43 | if( TIMING.minutes > 59 )
|
44 | {
|
45 | TIMING.minutes = 0;
|
46 | TIMING.hours++;
|
47 |
|
48 | if( TIMING.hours > 23 )
|
49 | {
|
50 | TIMING.hours = 0;
|
51 | TIMING.days++;
|
52 |
|
53 | if( TIMING.days > 99 )
|
54 | {
|
55 | TIMING.days = 0;
|
56 | }
|
57 | }
|
58 | }
|
59 | }
|
60 | }
|
61 | }
|
Was der Controller sonst noch so gerade macht ist nicht viel - n paar
Buffer für den UART vorbereiten, paar Integer-Berechnungen.
Jedenfalls bekomme ich am Kontroll-Punkt eine Frequenz von ~200Hz - hier
sollten wegen des Togglens natürlich 500Hz sein.
Mein Controller ist mit seinen 3.6MHz also zu lahm dafür? :\